Давайте определимся, на чем основывается работа сканера. Мы подключаемся к хосту и запрашиваем какой-нибудь файл, а затем обрабатываем ответ и делаем выводы. Существуют два способа сделать запрос по HTTP - это использовать модуль LWP и функцию get($url) или же использовать для этого дела сокеты. Мы естественно выберем 2-ой способ. А сделали мы это по 2 причинам: Во-первых нам нужно научится работать с сокетами, а во-вторых скорость при отдельных GET запросах гораздо ниже чем при установлении связи с помощью сокетов. Разберем, что же мы должны сделать: - Подключиться к серверу.
- Послать запрос.
- Получить и обработать ответ.
- Вывести его пользователю.
Задача еще усложняется тем, что мы сначала должны принять входные данные от пользователя. Используем для этого форму в отдельном HTML документе. Итак, начнем: Для начала используем вот этот самый html код: < form method="post" action="/cgi-bin/cgi.pl"> Enter hostname: < input name="host" value="" size=20> < input type="submit" value="Submit"> < /form> < /body> < html> А теперь приступим к созданию самой программы. #!c:perlbinperl.exe (пример для WinNT) use Socket; # Указываем, что используем модуль Socket &GetFormInput; # Запускаем подпрограмму для получения данных из формы $host = $field{'host'};# и затем обрабатываем их присваивая значения поля host соответствующей переменной print "Content-type: text/htmlnn"; print qq] # Вместо кавычек Results for $host ]; #Здесь начинается самая главная часть скрипта. open (PPP,"< expl.txt"); #Открываем файл содержащий названия уязвимых скриптов. while (< PPP>) { chomp; $prot = getprotobyname('tcp'); # Указываем протокол, по которому будем конектиться socket(SOCK, PF_INET, SOCK_STREAM, $prot); # Создаем сокет. $i_addr = inet_aton("$host"); #Здесь мы специальной функцией обрабатываем значения переменной $host (подробнее об этой функции читайте в прошлых статьях) $p_addr = sockaddr_in(80, $i_addr); # Хост и порт, куда конектимся connect(SOCK, $p_addr); # осуществляем коннект send (SOCK, "HEAD $_ HTTP/1.0nn", 0); #запрашиваем файл $answer=< SOCK>; #Обрабатываем ответ print " $_ $answer< /td "; #Выводим полученные данные пользователю close(SOCK); # Закрываем файл, содержащий названия уязвимых скриптов. } close (PPP); # Закрываем файл print " "; # А вот та самая подпрограмма для получения данных от формы. Советую всем записать себе на будущее - очень пригодится. sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$buf,$ENV{'CONTENT_LENGTH'}); } else { $buf=$ENV{'QUERY_STRING'}; } if ($buf eq "") { return 0 ; } else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=~tr/+/ /; $val=~ s/%(..)/pack("c",hex($1))/ge; $name=~tr/+/ /; $name=~ s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; } } } return 4;} exit; exit;
|