Каждый хакер браузит сайты сайты по безопасности и выкачивает оттуда свежие эксплойты. Наверное, за долгие годы он предпочитает брать их с любимых порталов. Вот я и подумал – почему же не облегчить и без того сложную жизнь взломщика, автоматизировав процесс добычи эксплойтов? Благо, средств для этого много, а написание скрипта-анализатора займет около 15 минут.
Алгоритм очень простой – вначале скачиваются файлы с последними эксплойтами, затем происходит их нехитрый анализ на наличие ссылок на эксплойты. После всего, эксплойты будут скачаны и предоставлены для осмотра.
Рассмотрим модули, которые нам понадобятся для выполнения поставленной задачи. Изобретать велосипед было ни к чему, поэтому я даже не думал писать собственный парсер и даунлоадер файлов. Это за меня сделали модули LWP и HTML.
Вначале рассмотрим процесс закачки файлов. Здесь и в дальнейшем я буду анализировать код в виде отдельных процедур, целый скрипт ты можешь скачать по ссылке:
http://kamensk.lael.ru/forb/1/x/exploits_get.tar.gz.
Итак, закачка. Эту проблему мне помогли решить три модуля: LWP::UserAgent, HTTP::Request и HTTP::Response. Их роль ты поймешь по ходу описания кода. Закачивает файл процедура get, занимая в скрипте около 20 строк кода:
sub get {
my $file = shift;
my $get=LWP::UserAgent->new();
$req=HTTP::Request->new(GET=>"$file");
$response=$get->request($req);
if ($response->is_error()) { $error=$response->status_line; return 0 }
($name=$file)=~s(^.*/)();
open(DUMP,">$name");
binmode DUMP;
$an=$response->as_string;
chomp($an);
$an=~m/\n\n(.*)/s;
print DUMP $1;
close(DUMP);
return 1
}
Что же происходит? Вначале мы вызываем конструктор UserAgent’а, создавая тем самым виртуальный браузер. Это необходимо для процесса скачивания файла. После этого создаем запрос GET на удаленный сервер и анализируем ответ. В случае ошибки – выходим из процедуры, иначе – сохраняем файл, предварительно включая бинарный режим. Метод as_string выводит весь скачанный файл в указанный дескриптор. Тут же происходит юзание регвыров, а именно – отделение хидера от самого файла и отделение имени файла от всей ссылки. Думаю, в этом ты разберешься сам.
Зачем нужен бинарный режим? Ведь мы выкачиваем только html-файлы. Забегая вперед, отвечу: этой же процедурой мы будем пользоваться для скачки самих эксплойтов. А там, ты знаешь, могут быть как c-скрипты, так и tar.gz-архивы.
В общем, следующий шаг – анализ уже скаченного файла на ссылки. Эту неблагодарную работу выполняет модуль HTTP::LinkExtor. Его возможности были реализованы в процедуре links().
sub links {
my $url = shift;
$links = HTML::LinkExtor->new(undef, $url);
$links->parse_file($url);
@links = $links->links;
foreach $each (@links) {
my @link = @$each;
my $type = shift @link;
my $get = $link[1];
if ($type eq "a" && $get=~/exploit|files/) {
get($get);
}
}
}
Здесь все просто – вызов конструктора, метода parse_file локального файла, а затем формирования массива @links со всеми ссылками из документа. Я совсем забыл сказать, что я люблю только два портала – security.nnov.ru и packetsrotmsecurity.nl ;). На этих сайтах эксплойты хранятся в каталогах files и exploits-data соответственно.
Массив состоит из двух элементов – тип ссылки (A, IMG и т.д.), а также значение – сам URL на файл. Анализируя эти параметры в цикле, добиваемся, чтобы ссылка содержала в себе строку exploit или files. Лишь после этого закачиваем файл... уже знакомой процедурой get().
Единственная проблема, с которой я столкнулся – невозможность стянуть файл http://www.security.nnov.ru/search/exploits.asp с помощью UserAgent. Дело в том, что сервер использует хитрое перенаправление, после которого скачивается корневой файл портала. Пришлось использовать команду wget для скачивания документа.
Скрипт я выложил. Смотри, оценивай, делись мнениями. Проект еще слишком сырой, чтобы претендовать на звание хорошего скрипта. Я не стал доводить его до более-менее сносного сценария – возлагаю это на твои плечи. А именно, предлагаю скачивать эксплойт вместе с его описанием (Perl умеет выдирать из HTML не только ссылки), а также регулировать количество эксплойтов. В общем, если это тебе надо – ты сделаешь. Моя задача – подкинуть идею и предложить на пальцах ее реализацию. Теперь твоя очередь думать, c00l x4k0r ;-).