Нестандартные backdoor-ы в *nix. Как создать свой необычный backdoor

Xakep, номер #046, стр. 046-054-1


мараван (maravan@mailru.com)

Если подходить к вопросу взлома системы формально, то можно выделить три основных этапа этого процесса: изучение системы, проникновение в нее и удержание контроля. Встречаются, конечно, уникумы, которые ограничиваются только первыми двумя, а вместо третьего идет нечто вроде echo "hacked" > index.html или, что еще хуже, rm -rf /. Но мы не будем относить себя к этой категории, а сделаем как надо, то есть забэкдорим системы или реализуем третий этап на практике. Итак, поехали.

Типы бэкдоров

Существует куча способов остаться в системе. Сейчас в основном используется два подхода: подбор пароля и скачивание с очередного пакетсторма и последующая установка какого-нибудь навороченного бэкдора by w00w00. Первый способ, как вариант для самых одаренных, далее рассматриваться не будет. Второй хотя и имеет право на жизнь, тоже будет послан - мы как-никак творческие личности, и незачем нам использовать чужое добро :). К тому же, на самом деле, если даже забить на такое творчество, то все равно это достаточно опасный способ - никто не может дать гарантию, что свежескачанный руткит/бэкдор не ловится очередным чекруткитом. Что же нам остается? Правильно. Пойти третьей, непроторенной дорожкой: самим немного попариться и выдать в результате то, что принято сейчас называть private 133t w4r3z.

Далее будет рассмотрено всего несколько способов того, как можно более или менее оригинально забэкдорить систему. Хотя приведенная ниже информация относится к юникс системам, не существует никаких практических ограничений намутить то же самое и в продуктах от конторы с большой буквы "М".

Опять, несмотря на то, что это немного скучно, рассмотрим проблему формально. Какие действия должен выполнять хороший бэкдор? Во-первых, это действия для защиты от админа в пределах системы. Во-вторых же - защита от детектирования в пределах сети, где располагается порутанная машина - ведь админы, хотя они и админы, но не гнушаются различными снифферами, сканерами, другими утилитами, способными вывести нас на чистую воду.

Локальная защита от администратора

Пойдем по порядку. Как защититься от админа? Для этого надо представлять его логику. Что админ делает, когда у него возникают подозрения, а в логах, как это обычно бывает, пустота :)? Вот неполный список наиболее часто применяемых методик:

1. Проверка на наличие подозрительных процессов в системе.

2. Проверка на наличие подозрительных соединений с хостом.

3. Поиск "левых" записей в стандартных конфигах, таких, как /etc/inetd.conf, /etc/passwd, rc-файлы и т.д.

4. Проверка дат модификаций, размера и чексуммы критичных файлов (это и suid'ные файлы, демоны и т.д.) на случай того, что мы умудрились их пропатчить.

Существует, конечно, еще куча способов вычислить заразу на машине, но они либо являются вариациями вышеописанных, либо используются не так часто. Естественно, хороший бэкдор должен вообще не "светиться" при такого рода проверках либо свести эту "засветку" к минимуму.

Скрываемся из списка процессов

В Unix системах для просмотра процессов используется команда ps (небольшая заметка для тех, кто не знал :)). Здесь существует, как минимум, 3 варианта. Самый первый вариант, который приходит на ум, - пропатчить саму программу ps таким образом, чтобы она не показывала процесс, запускаемый из файла, скажем, /bin/backdoor, а также скрывала бы все порожденные от /bin/backdoor процессы (это на тот случай, если наш бэкдор делает fork, а потом exec ("/bin/sh")). Реализовать можно просто и не очень просто. Просто - взять сырцы существующего ps'а, смодифицировать его, чтобы он скрывал некоторые процессы, скомпилить и заменить оригинальный ps на новый. Не очень просто - сделать хитрый патчер, модифицирующий бинарий ps'a. Сделать это достаточно гиморно, так как бинарий от системы к системе может различаться. Возможный выход - примерно вычислить место в коде, где происходит call на printf, выводящий список процессов на экран, заменить этот call на свой и пропатчить текстовую строчку, адресуемую параметром-указателем (правда, для этого придется писать дизассемблер + еще кучу мишуры).

Содержание  Вперед на стр. 046-054-2