Показать сообщение отдельно

  #20  
Старый 11.04.2009, 22:13
[underwater]
Познающий
Регистрация: 29.03.2009
Сообщений: 87
С нами: 9010027

Репутация: 308
По умолчанию

Если требуется быстро просканить некоторок количество сайтов и их ближайшие IP на маленький список возможных уязвимостей, то вот скрипт:

Код:
#! /usr/bin/perl -w

use Net::DNS;

if (@ARGV<2) {
   print <<END;
============================================================
            Usage: SCRIPT.PL TOP BOTTOM
                   ip4scan.pl 10 15 > out.txt
     TOP & BOTTOM: scope around ip
          example: ip = 64.125.86.120, TOP = 10  BOTTOM = 15
get range to scan: 64.125.86.105 ... 64.125.86.130

           in.txt: list hostnames for scan
       ipbase.txt: note base of scaned hostname
                   format hostname -> ip
============================================================
END
exit;}

open(IN, "<in.txt");
open(IPBASE, ">>ipbase.txt");
@hostname = <IN>;
chomp @hostname;

# Строим хэш $hostname -> $IP-адрес (только первый IP из возвращаемых)

foreach $hostname (@hostname) {
        $ip{$hostname} = &resolve($hostname);
}

# Записываем эти пары в одну кучу в файл без проверки на повторы

foreach $hostname (sort keys %ip) {
        print IPBASE "$hostname -> $ip{$hostname}\n";
}

# Строим диапазоны для сканирования вокруг целевых IP-адресов
# Нижнее и верхнее значение задается в параметрах, передаваемых скрипту

foreach $hostname (sort keys %ip) {
        $top = &ip2int( $ip{$hostname} ) + $ARGV[0];
        $bottom = &ip2int( $ip{$hostname} ) - $ARGV[1];

        @range = map {&int2ip($bottom + $_)} (0..$top-$bottom);
        print join ("\n", @range),"\n";
}

# Подпрограмма определения ip-адреса по имени хоста

sub resolve {
    my $res   = Net::DNS::Resolver->new;
    my $query = $res->search("$hostname");

    if ($query) {
       foreach my $rr ($query->answer) {
          next unless $rr->type eq "A";
          return $rr->address;
       }
    } else {
           warn "query failed: ", $res->errorstring, "\n";
    }
}

# Подпрограмма перевода IP-адреса в 32-разрядное число
# Лучше подпрограмм ip2int и int2ip не придумалось

sub ip2int {
    @a = split(/\./,$_[0]); 
    return $a[0]*256**3+$a[1]*256**2+$a[2]*256+$a[3];
}

# Подпрограмма перевода 32-разрядного числа в IP-адрес

sub int2ip {
    $d[0] = int($_[0]/256/256/256);
    $d[1] = int(($_[0]-$d[0]*256**3)/256/256);
    $d[2] = int(($_[0]-$d[0]*256**3-$d[1]*256**2)/256);
    $d[3] = int($_[0]-$d[0]*256**3-$d[1]*256**2-$d[2]*256);
    return join (".", @d);
}
Список с именами хостов находится в файле in.txt.На выходе в файле out.txt получаются диапазоны IP с заданными границами.