Масштабное сканирование за две минуты!

Пишем сканер дырявых сервисов

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

Xakep, номер #055, стр. 055-056-1

(forb@real.xakep.ru)

"Зачем мне еще один сканер? Мой виндовый Languard еще ни разу меня не подводил!" - возмутишься ты, прочитав заголовок статьи. Молодой человек! А в курсе ли вы, что сканирование портов является противозаконным действием и всегда оговаривается в регламенте вашего провайдера? Так что, если ты попробуешь сканить со своей тачки и будешь замечен в прощупывании удаленных портов, твой пров может без всяких предупреждения отключить тебя от инета...

Ведение логов еще никто не отменял, поэтому твой ip’шник обязательно запишется на просканенном сервере. Чтобы этого не случилось, необходимо либо воспользоваться stealth-сканером, либо скрыть свой реальный адрес. Первый вариант отпадает, так как "умных" сканеров довольно мало, а для stealth-прощупывания портов необходимы права рута. За их отсутствием мы ограничимся скромным юзерским шелл-аккаунтом на забугорном сервере. Именно там мы будем испытывать сканер нового поколения - bannerscan.pl.

Идея заключается в следующем: создается процедура генерации всех ip-адресов, которые необходимо просканить. Затем создается сокет с ip-адресом и производится попытка чтения баннера сервиса. В случае удачи этот баннер сравнивается с изначально заданным шаблоном и записывается в лог-файл. Если база ip-адресов кончается, то завершается и работа самого сканера. Вот, собственно, и весь алгоритм.

Все очень просто. Но так кажется только на первый взгляд. На самом деле этот сканер стоил мне массы потраченного времени и пары-тройки убитых серверов. Но обо всем по порядку.

ХХХ ЗАГОЛОВОК ХХХ

Генерируем адресную базу

Как ты уже понял, кодить мы будем на Perl, ибо этот язык отличается своей гибкостью и универсальностью. Первая наша задача - создание массива ip-адресов, которые должны быть просканированы. Шаблон подсети задается маской XXX.XXX.XXX.XXX, где последние три октета могут быть заменены символом "*", что означает определение всех возможных адресов.

Алгоритм создания адресов был выполнен только с помощью циклов. Внешние модули искать ломало, а другие способы в голову почему-то не приходили ;). Тем не менее, процедура работает исправно и весьма быстро.

Изначально мы имеем пять переменных:

$netmask - содержит в себе шаблон маски.

$n1, $n2, $n3, $n4 - та же маска, разделенная на четыре части (разделитель точка).

Имея эти данные, напишем простую процедуру генерации адресов.

XXXXXXXXXXXXXXXXXXXXXXXXX

Таблица 1: Процедура генерации базы адресов

XXXXXXXXXXXXXXXXXXXXXXXXX

sub check {

for ($i=0;$i<=254;$i++) { ## Открываем внешний цикл от 0 до 254

$ipi = $i; ## Устанавливаем второй октет ip-адреса = счетчику

if ($n2 ne '*') { $i = 254,$ipi = $n2 } ## Если второй октет не равен

звездочке - создаем условие для завершения цикла и оставляем часть адреса

без изменений

for ($j=0;$j<=254;$j++) { ## Открываем внутренний цикл от 0 до 254

$ipj = $j; ## Устанавливаем третий октет ip-адреса = второму счетчику

if ($n3 ne '*') { $j = 254,$ipj = $n3 } ## Тот же случай. При постоянной

части - выходим из цикла

for ($k=1;$k<=254;$k++) {

Содержание  Вперед на стр. 055-056-2
ttfb: 3.2789707183838 ms