Пишем сканер портов на Perl — HackZona.Ru

Пишем сканер портов на Perl

Пишем сканер портов на Perl

Тип статьи:
Со старой ХакЗоны.
Приветствую читателей. Итак, сейчас мы напишем на нашем любимом Перле сканер, который будет отображать, какие порты открыты на удаленном компьютере. Давайте договоримся, что ip-адреса сканируемых компьютеров, тип протокола, начальный и конечный порты для сканирования будут храниться в любом файле в виде ip-адрес:: протокол(0 для udp, 1 для tcp):: начальный_порт:: конечный_порт, например:
127.0.0.1::0::0::1024
Сканер просканирует все компьютеры указанные в файле (информация об 1-м компьютере на 1 строчку). Еще нам потребуется файл для отображения результатов сканирования (если он не существует, будет создан новый (пользователи Unix, не забудьте позаботиться о правах)), в него будут занесены только удачные попытки. Также наш сканер будет отображать, какой компьютер он сканирует, все порты и информацию, открыт порт, или нет (если для вас это нежелательно, уберите участки кода, которые за это отвечают). Сканер будет запускаться из командной строки таким образом:
«название_скрипта файл_с_информацией_о_сканируемых_компьютерах файл_для_результатов».
Как же будет работать наш сканер? Он будет устанавливать соединение с каждым компьютером из списка, на каждом порту, если соединение будет установлено, то попытка будет считаться удачной. Но, как говорил один из компьютерных пионеров (вроде бы Брайан Керриган, но не помню точно), что лучший способ изучить язык программирования — писать на нем программы, чем мы собственно сейчас и займемся. Итак, поехали.

#!/usr/bin/perl
# Only for article
# 5p4x2knet a.k.a. Apocalyptic's scanner
use IO::Socket; # после того, как мы прошли все формальности, подключаем #сокеты.
if(@ARGV != 2) #если не указаны параметры, сообщаем как надо делать и выходим
{
print(«Скрипту должно быть передано 2 параметра: файл, в котором хранятся ip-адреса сканируемых компьютеров, протокол (1 для tcp, 0 для UDP), начальный и конечный порт в виде адрес:: протокол:: начальный_порт:: конечный_порт и файл, в который будут записываться результаты, например: scanner.pl ip.txt results.txt n нажмите для выхода»);

}
#К слову, при использовании скрипта в WINDOWS-системах лучше переписать этот #текст по-английски, иначе — проблемы с #кодировкой.
else #если все правильно
{
open(fl, "; #скидываем в массив
close(fl); #и закрываем
open(FILE, ">>$ARGV[1]"); #открываем файл для результатов
foreach $x (@ip) #и наш сканер начинает сканирование
{
($ip_addr, $protocol, $from, $to) = split(/::/, $x); #разделяем ip, протокол, начальный #и конечный порты для сканирования
print("$ip_addr… n"); #отображаем ip компьютера, который будем сканировать
if($protocol == 1) #определяем протокол
{
$z = 'tcp';
}
else
{
if($protocol == 0)
{
$z == 'udp';
}
}
print FILE " n open: n"; #пишем в файл для результатов #ip сканируемого компьютера и протокол
for($i = $from; $i new(Proto => $z, PeerPort => $i, PeerAddr => $ip_addr); #делаем соединение
if($socket) #если оно успешно, то
{
print (FILE "$i n"); #вписываем в файл для результатов и
print(«is open n»); #сообщаем, что порт открыт
}
else
{
print(«is not open n»); #в противном случае просто сообщаем, что порт закрыт
}
}
print (FILE " n"); #вписываем в файл с результатами информацию о #том, что сканирование данного компьютера
#закончено
print(«Done n»); #выводим надпись, что сканирование данного компьютера #закончено
}
close(FILE); #закрываем файл с результатами
}

Все, мы написали сканер. Разумеется, сканер не идеален, это лишь скелет полноценного сканера, на основе которого вы можете написать свои шедевры. Например, встроить возможность определения сервиса, висящего на порту. Именно определения, а не вывода информации о том, что висит на этом порту по дефолту, так как хитрые администраторы часто ставят сервис на нестандартный порт. Да много чего можно сделать. Предупреждаю, что если вы будете применять информацию, полученную из этой статьи в целях, противоречащих законам вашей страны, то всю ответственность несете вы. Простите, но я должен был это сказать :). Ладно, пока. Твори, удачи тебе.
Нравится
Не нравится

1 комментарий

02:48
Спасибо.