Можно ли определить сопоставление имени хоста с IP-адресом в Linux без корневого доступа (т.е. изменить /etc /hosts) и DNS-сервера?
1 ответ
Это зависит от того, что вы пытаетесь сделать. В любом случае вам практически гарантировано, что вам нужно написать собственный код, поэтому, если вы не программист, возможно, вы захотите либо начать изучать, как быть одним из них, либо надеяться, что у вас есть такой друг.
Использование собственной инфраструктуры разрешения DNS
Если вы пишете свою собственную программу, вы можете полностью обойти разрешение DNS системы и сделать это самостоятельно.
Видите ли, разрешение DNS предоставляется как общесистемная служба, но нет (как правило) никаких ограничений, которые мешают вам создать собственную, отдельную архитектуру разрешения DNS. Фактическая активность разрешения DNS - это "просто" IP-пакеты, идущие по сети. Поэтому все, что вам нужно сделать, это использовать существующую библиотеку, которая понимает протокол DNS, но позволяет настраивать ответы или использовать файл hosts в пользовательском каталоге. Преимущество этого подхода заключается в том, что никаких "взломов" не требуется, но недостатком является то, что вы должны создавать свою собственную программу - будь то язык сценариев или родной язык программирования не имеет значения ... в любом случае, вам нужно создать новое программное обеспечение Вы не можете применить этот взлом к существующему программному обеспечению, особенно не скомпилированному коду, для которого у вас нет исходного кода.
Примером библиотеки C, которая просто выполняет кодирование / декодирование DNS-сообщений, является libdns из NMAP.
Переопределение разрешения DNS в существующих программах
Если вы запускаете программы, к которым у вас нет прав на запись, и у вас установлен root-права setuid, то нет - вам не повезло, если вы не хотите скопировать двоичный файл этой программы в другое место и удалить setuid (хотя некоторые программы отказываются запускаться, если они не имеют права root setuid).
Если программа, которую вы запускаете, не имеет права setuid root, то это должно быть возможно. Все, что вам нужно сделать, это сделать LD_PRELOAD
библиотеку, которая реализует стандартные функции разрешения DNS библиотеки C, и выполнить некоторую пользовательскую обработку для внесения желаемых изменений, прежде чем передать нераспознанные хосты реализации библиотеки C для системы " нормальное "разрешение".
Функции библиотеки C, которые вы должны переопределить с помощью LD_PRELOAD
, следующие:
gethostbyname(3)
(устарело, но многие программы все еще используют это)getaddrinfo(3)
getnameinfo(3)
Обратите внимание, что вы можете действительно запутать определенные программы, если вы сделаете это, потому что внесение произвольных изменений в возвращаемые значения этих функций может нарушить стандарт POSIX.1-2001. См. RFC 2553.
Если вы хотите включить это для всех запускаемых вами программ, вам придется экспортировать переменную среды LD_PRELOAD
в вашу оболочку или сеанс входа в систему, чтобы все начиналось с LD_PRELOAD
. К сожалению, это исключает такие программы, как Xorg
, потому что (я считаю) это setuid root. Кроме того, такие программы, как vmware-vmx
(основной двоичный файл для гипервизора VMware), имеют установленный root, поэтому у вас там такая же проблема.
Информация нижнего уровня
Это возможно благодаря тому, что установка переменной среды LD_PRELOAD для разделяемой библиотеки приводит к тому, что динамический компоновщик в Linux читает символы предварительно загруженной библиотеки перед тем, как он читает их из любой другой библиотеки. Так что если у вас есть символ (который, по сути, является сигнатурой функции) с именем foo
в libc.so.6
(реализация библиотеки C), и у вас также есть foo
в libevil.so
(ваша библиотека), и вы устанавливаете LD_PRELOAD=libevil.so
(вам необходимо указать полный путь), он загрузит foo
из вашего libevil.so
, поэтому, когда запущенная вами программа вызывает foo()
в коде, он вызовет libevil.so
, который затем может принять решение (если он хочет) использовать динамические функции компоновщика для вызова реализации libc.so.6
в foo()
- опционально.
Вам придется делать все эти взломы в C, скорее всего, из-за низкого уровня кода. Вы можете использовать служебные библиотеки, такие как GLib, чтобы упростить жизнь, поэтому вам не нужно придумывать алгоритмы для базовых операций, таких как манипуляции со строками и автоматически растущие массивы.