|
Масштабное сканирование за две минуты! Дмитрий Докучаев aka Forb Xakep, номер #055, стр. 055-056-4 sub killpidz { foreach (@forked) { chomp; ## По каждому процессу из списка waitpid($pid,0); ## Дожидаемся его завершения kill("TERM" => $_) ## А лишь затем убиваем его } undef @forked; ## Делаем массив @forked неопределенным } XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Все процессы, которые завершаются естественным образом, будут убиты exit'ом в конце главного модуля, либо exit'ом при неудачном соединении (в процедуре connectIP). Всех остальных ждет виселица от системного kill(), заботливо предоставленного процедурой killpidz(). ХХХ ЗАГОЛОВОК ХХХ Исходные данные Как всякий уважающий себя сканер, bannerscan.pl получает параметры сканирования прямо из командной строки. Если ты посмотришь сорцы скрипта или запустишь его без опций, то увидишь, какие исходные данные требует сканер. Они задаются без установки пробела после ключевой опции. 1. Шаблон подсети -n (обязательный параметр). Имеет вид XXX.XXX.XXX.XXX (неопределенные октеты заменяются звездочками). Пример использования: -n192.168.*.* 2. Порт для сканирования. За один раз сканируется только один сервис, поэтому твоя задача - указать порт для соединения. Он передается через опцию -p. По умолчанию выбран 22-ой порт. 3. Таймаут для соединения. После указанного количества секунд наступает таймаут при создании сокета (малое значение параметра может значительно ускорить работу скрипта). Ключевая опция -t, по умолчанию задается ограничение в 15 секунд. 4. Лог-файл. В этот файл будут сбрасываться баннеры, совпавшие с ключевой фразой. Передается через опцию -o. Значение по умолчанию: scan.log. 5. Собственно, ключевая фраза. Так как сравнение происходит regexp'ом, то никто не запрещает включить в эту фразу элементы регулярных выражений. Более того, есть возможность использования пробела. Символ пробела нужно заменять символом "~". Фраза передается через опцию -r. По умолчанию шаблон: ssh. ХХХ ЗАГОЛОВОК ХХХ Бета-тестирование Настало время проверить наш сканер в действии и убедиться, что он действительно работает. Заодно сделаем замеры времени сканирования. Проверять будем на обычном сегменте, который состоит из 254 ip-адресов. Для определения времени используем фичу time интерпретатора /bin/bash. Заходим на шелл с быстрым каналом (нам очень важна скорость) и пишем: $ time -p perl ./bannerscan.pl -n213.59.0.* -p21 -t10 -olog.txt -rProFTPD~1.2 Терпеливо ждем завершения процесса. Благодаря нашим потомкам ждать придется недолго. Сканер справится с задачей примерно за две минуты. Это доказывает строчка: Real 123.11. После появления заветной строки Scan is complete самое время посмотреть логи. Делаем cat log.txt и... убеждаемся, что сканер действительно работает так, как надо! Мы видим перед собой лог-файл со строками вида: "ip-адрес:порт : баннер сервиса". Вся эта инфа была заботливо записана процедурой logg() после определения удачного возврата баннера. Если ты не доверяешь возможностям этого сканера, предлагаю тебе протестить его самостоятельно на большой подсети. Я этого делать не стал, так как весь процесс скана занял бы уже не две минуты, а около часа (на самом деле это очень небольшое время для такой серьезной задачи). Поэтому мой тебе совет - запускай bannerscan в background, чтобы не торчать попусту на шелле, пока он работает. |