Как хакеры пишут свои бэкдоры

Forb (forb@real.xakep.ru)

Xakep, номер #062, стр. 062-060-1

Переделка telnetd в невидимый бэкдор

Скажи по секрету: сколько раз ты терял свой хакнутый шелл только из-за того, что устанавливал на нем левый бэкдор? Ведь у всех бэкдоров есть один существенный недостаток – они отображаются в процессах и netstat-листах. Чтобы этого избежать, необходимо заранее пропатчить систему грамотным руткитом. Или написать хитрую реализацию бэкдора. Об этих реализациях и пойдет наш сегодняшний разговор.

Что должен уметь бэкдор?

Как я уже сказал, в задачу бэкдора должна входить не только функция по предоставлению рутового шелла. Нормальный инструмент также обязан уметь скрываться в процессах, не светить портов и поддерживать псевдотерминал. Можно, конечно, возмутиться, мол, как же все это реализуют, это ведь сложные вещи! На самом деле все просто. Никто даже не будет изобретать велосипед и кодить с нуля. Вспомни старый добрый пакет netkit-telnet, который содержит в себе все нужные функции: поддержка псевдотерминала и вызов шелла. Все остальное придется обработать напильником.

Подготавливаем плацдарм

Как я уже сказал, в качестве основы мы возьмем netkit-telnet. Сливается он с www.rpmfind.net. Но перед тем как устанавливать неткит, следует удовлетворить ряд зависимостей. Для netkit-telnet необходим ncurses и ncurses-devel. Без них telnet-демон никак не соберется. Поэтому убедись, что все установлено, и только потом переходи к следующему шагу.

А следующим шагом будет патчинг сорцов netkit-telnet. Собственно, это и есть самое главное действие. В принципе, нас все устраивает: шелл открывается, псевдотерминал также работает. Не устраивает лишь вот что: демон светится в процессах и постоянно ждет подключений. К тому же после коннекта он выдает не рутовый шелл, а лишь /bin/login. Но руки-то у нас прямые, поэтому мы без труда порешим все эти проблемы :).

Поехали. Распаковав netkit, ты увидишь две директории. В первой из них расположились сорцы сервера, во второй – исходники клиента. Нас интересует именно серверная часть. Так что смело заходи в каталог telnetd и создавай там файл main.c. Его мы напишем с нуля. Этот файл является основным для будущего бэкдора. Так что все свои силы мы потратим именно на него.

Сокет раз, сокет два!

Итак, что же будет находиться в файле main.c? Telnetd (на его основе сделан бэкдор) предназначен для запуска из inetd. Main.c содержит код, делающий вид, будто он работает из inetd. Для того чтобы бэкдора не было видно сканерами портов, он может работать в одном из двух режимов: невидимом и активном. В невидимом режиме бэкдор не держит никакие порты открытыми, и поэтому не детектируется сканерами портов и командой netstat. Он лишь ждет пакет, содержащий последовательность байт 01 70 17 01. Это позволяет сделать открытый сырой сокет – с его помощью прослушивается весь входящий трафик.

Код, открывающий сокет

int sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

/* открываем сырой сокет, слушающий весь трафик */

char buff[200]; /* буфер для пакетов */

int l, x; /* вспомогательные переменные */

optime=time(NULL);

/* optime - время последнего перехода в активное состояние */

Содержание  Вперед на стр. 062-060-2
ttfb: 3.0410289764404 ms