В поисках эксплоитов

Дмитрий Докучаев aka Forb

Xakep, номер #052, стр. 052-060-2


Пример команды:

$ locate rootkit* >> /tmp/locate.log

Поздравляю, поиск завершен, можешь смело переходить к просмотру обнаруженных сплоитов.

2. Free Find

Усложняем задачу. Пусть тебе доступна команда find, а на домашних директориях по непонятным причинам стоит атрибут 755. Что нам это дает? В первую очередь, find без проблем сможет циклично просмотреть /home, придется только подождать, так как поиск по файловой системе занимает больше времени, чем по базе. Но решение этой задачи похоже на предыдущее, с той разницей, что в нагрузку тебе понадобится знание флагов find и отправление самого поиска в бэкграунд, так как если вебсервер завершит соединение с тобой по таймауту, то сдохнет и сам процесс find, что крайне нежелательно. Шаблоны для поиска остаются прежними (как, впрочем, и для всех предложенных здесь задач).

Пример команды:

$ find -name hack* -type f -print >> /tmp/find.log &

Не пугайся многострочных выводов при поиске. В дескриптор STDERR будет писаться только инфа об ошибках, а вот в сам /tmp/find.log - все найденные эксплоиты.

3. Permission denied

Еще усложним задачу, приблизив ее к реальности. Допустим, есть директория /home, в ней расположены все пользователи системы. В их каталогах с html-файлами, например, в директориях public_html (/home/user/public_html), установлены права 755. Но вручную искать по всем этим папкам (особенно если они исчисляются тысячами) очень накладно, поэтому доверим это Perl'у. Напишем программку, которая будет бегать по всем вложенным папкам public_html и искать в них сплоиты при помощи find.

#!/usr/bin/perl

## locate.pl <-- Script for find exploits by Forb

$what=$ARGV[0] || die "Use $0 what to\n"; ## Берем начальный аргумент как шаблон поиска, либо ругаемся и выходим

$to=$ARGV[1] || "find.log"; ## Берем логфайл как второй аргумент к скрипту или "find.log"

$find="/usr/bin/find"; ## Путь к программе find

$public_html='public_html'; ## Директория после /home/user, которая видна с веба

@files=init(); ## Получаем в init() список директорий для поиска

foreach (@files) { ## По каждому элементу из списка

if (($_ ne '..') && ($_ ne '.') && (-d "/home/$_") && (-x "/home/$_")) { ## Если он не равен корневой или верхней директории и туда возможен вход

system("$find /home/$_/$public_html -name $what -type f -print >> /tmp/$to"); ## Ищем там find'ом

}

}

sub init {

my (@files);

opendir(HOME,"/home") || die "Cant enter to /home\n"; ## Попробуем считать /home

@files=readdir(HOME); ## Составим список файлов

closedir(HOME); ## Закрываем директорию

return @files; ## И вернем их в основной модуль

}

Удостоверься, что в системе есть wget, чтобы тебе не печатать весь файл построчно. Кладем это творение в /tmp с какого-нибудь сервера (я надеюсь, ты позаботишься об этом самостоятельно), ставим на скрипт права 755 и пробуем выполнить его следующим образом:

$ perl /tmp/locate.pl wu* locate_perl.log &

Назад на стр. 052-060-1  Содержание  Вперед на стр. 052-060-3

Hosted by uCoz