InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Поиск закладок 2. Борьба с adore

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

Решил я проверить это утверждение. Пошел, почитал форумы, купил пару номеров "Хакера". Все, как один, советуют брать Adore. Умеет всё и при правильной настройке его невозможно засечь.

Решил попробовать. Взял недавно установленный Gentoo, решил в нем установить руткит и затем попробовать найти его.

multik bad # wget http://teso.scene.at/releases/adore-0.42.tgz

Сборка его не представляет никаких проблем.

multik bad # tar zxvf adore-0.42.tgz multik bad # cd adore multik adore # ./configure multik adore # make multik adore # modprobe adore Warning: loading /lib/modules/2.4.20-gentoo-r6/misc/adore.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modules Module adore loaded, with warnings multik adore # modprobe cleaner multik adore # rmmod cleaner

Вот первая засада, которая поджидает неопытных хакеров. В соответствующих файлах нет волшебной строки MODULE_LICENSE("GPL"), поэтому в логах будет ругань. Но мы считаем, что никто ничего не заметил. После 3х волшебных команд руткит установлен. Как можно убедиться, в списке модулей его не видно.

multik adore # lsmod Module Size Used by Tainted: PF vmhgfs 34240 4 pcnet32 13600 1 mii 2160 0 [pcnet32] es1371 26728 0 (unused) soundcore 3364 4 [es1371] ac97_codec 9800 0 [es1371] usb-storage 55608 0 (unused) hid 12468 0 (unused) uhci 23008 0 (unused) usbcore 55264 1 [usb-storage hid uhci] BusLogic 84612 2

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

Так как искать троянцев лень, решаю назначить на эту почетную должность демона ssh. А чем не троянец? На порту висит, в процессах участвует и пользователя удаленно пускает.

Скрываем ssh из таблицы процессов.

multik adore # ps ax|grep ssh 8970 ? S 0:00 /usr/sbin/sshd 8985 ? S 0:00 sshd: root@pts/1 9124 pts/1 R 0:00 grep ssh multik adore # ./ava i 8970 Checking for adore 0.12 or higher ... Adore 0.42 installed. Good luck. Made PID 8970 invisible. multik adore # ps ax|grep ssh 8985 ? S 0:00 sshd: root@pts/1 9133 pts/1 R 0:00 grep ssh multik adore #

Как видим, операция удалась. Все видимые упоминания о ssh исчезли из таблицы процессов, /proc и так далее. Плюс ava автоматически скрыла тот каталог, из которого запускалась. Но ведь ssh работает, пускает пользователей и вообще ведет себя так, как будто ничего не случилось.

Посмотрим, как видится ssh для системных утилит.

multik adore # netstat -npl|grep 22 tcp 0 0 :::22 :::* LISTEN -

Вот и первый звоночек. Система не может понять, что за процесс слушает 22й порт. В принципе, наличие таких записей должно являться первым симптомом, что в системе что-то не так. Но пусть это будет маленькой недоработкой "трояна". Ведь в принципе никто не мешал ему пересобрать netstat. Или может быть в следующей версии adore появится скрытие портов ...

Однако от удаленного сканирования портов пока не спасает ничто. Даже если троянец будет отбрасывать все соединения, кроме "хозяйских", все равно разница между результатами от двух nmap с разными параметрами выдаст его. Но предположим, троянец вообще очень умный и сам связывается с хозяином по хитрому. То есть в общем случае снаружи его никак не обнаружить.

То есть мы пришли к выводу, которым растрясают хакеры: скрытый "модульным" руткитом троян невозможно обнаружить?

Однако стоит немного подумать (знающим - поглядеть в код adore - врага надо знать в лицо) и сама сила "модульных" руткитов становится их слабостью. У них большие проблемы: надо скрыть процесс от системных утилит и одновременно дать системе управлять процессом.

А ведь каждый процесс в системе имеет pid, держит открытым как минимум один файл (сам себя), использует память и другие ресурсы. Вот по ним и можно понять, что где-то что-то не то.

Вот я и решил сыграть на том, что каждый процесс имеет свой pid. Даже если он скрыт из общедоступных мест.

Написал маленький скрипт на perl, который забирает номера всех pid'ов из /proc, затем втупую перебирает весь доступный диапазон (кроме полученных pid'ов) и пытается перейти в каталог /proc/номер_pid/. Если это удалось, он считает, что нашел скрытый процесс и выводит его pid с дополнительной информацией. А уж ваше дело разобраться, что к чему.

Понятно, что перед "исследованием" надо притормозить всякие процессы, которые могут создать своих потомков во время тестирования. Ну или затем их вручную отсеять.

Я перегрузил машину и заново включил adore. Кстати, работает он довольно неустойчиво - иногда скрывает лишние процессы. На роль трояна я снова выбрал бедный ssh

multik adore # ps ax|grep ssh 1424 ? S 0:00 /usr/sbin/sshd 1440 ? S 0:00 sshd: root@pts/0 1454 ? S 0:00 sshd: root@pts/1 1477 pts/0 S 0:00 grep ssh multik adore # ./ava i 1424 Checking for adore 0.12 or higher ... Adore 0.42 installed. Good luck. Made PID 1424 invisible. multik adore # /root/test.pl possibly hidden process found. pid: 1424 CMD: /usr/sbin/sshd multik adore #

Как видите, скрипт поймал скрытый процесс. Что и требовалось доказать.

Я опять же повторюсь - это не единственный способ поймать руткит. Просто самый примитивный. Подобных способов много (и как обычно, я буду злым гоблином и не расскажу про них). Есть даже специальные программы, которые ищут руткиты. Но они, как и все остальное, бессильны перед разумом человека.

Да, я еще раз повторюсь. Уберите с систем все лишнее. К примеру, пересобери я ядро без поддержки модулей - и руткиту некуда было бы вставать. И так далее и тому подобное. В общем, мойте руки перед едой и думайте головой.

Ниже скрипт, который ищет скрытые adore процессы. Написан на коленке и только для демонстрации процесса, поэтому все претензии по поводу кода не принимаются.

#!/usr/bin/perl sub is_digit{ $query = shift; $query =~ s/^\s+//; $query =~ s/\s+$//; if ($query =~ /^\d+$/ ){ return 1; }else{ return 0; } } \\ is_digit opendir(DIR,"/proc") || die("Cannot open /proc\n"); @proc_cont=readdir(DIR); closedir(DIR); for($i=0;$i<=65535;$i++) {$good_pid{"$i"}=0;} foreach $file (@proc_cont) { if(!(($file eq ".") || ($file eq ".."))) { if(is_digit($file)==1) { $good_pid{"$file"}=1; } } } for($i=1;$i<=65535;$i++) { if($good_pid{"$i"}==0) { if(chdir("/proc/$i")==1) { print "possibly hidden process found. pid: $i \n"; open(CMD,"/proc/$i/cmdline"); read(CMD,$hid_cmd, 256); close(CMD); print "CMD: $hid_cmd \n"; } } }


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua