Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > снифер на perl, помогите разобраться


Автор: rainz 4.10.2010, 13:46
Код

#!/usr/bin/perl

$LIMIT = shift || 5000;

$|=1;
open (STDIN,"/usr/sbin/tcpdump -lnx -s 1024 dst port 80 |");
while (<>) {
    if (/^\S/) {
    last unless $LIMIT--;
    while ($packet=~/(GET|POST|WWW-Authenticate|Authorization).+/g)  {
        print "$client -> $host\t$&\n";
    }
    undef $client; undef $host; undef $packet;
    ($client,$host) = /(\d+\.\d+\.\d+\.\d+).+ > (\d+\.\d+\.\d+\.\d+)/
        if /P \d+:\d+\((\d+)\)/ && $1 > 0;
    }
    next unless $client && $host;
    s/\s+//;
    s/([0-9a-f]{2})\s?/chr(hex($1))/eg;
    tr/\x1F-\x7E\r\n//cd;
    $packet .= $_;
}


Начал учить perl, под руку попал исходник сниффера.. надо запускать из под рута, ./sniffer.pl > dump.. но он нихрена не хочет писать в файл дамп. читал маны что бы понять код. запускал tcpdump с теми же параметрами, в консоль выводит. еще мне интересно зачем писать $LIMIT = shift || 5000; если shift возвращает первый элемент массива, а в строчке просто выставляется максимум записей в файл? как эта строка работает на самом деле?

Автор: Egik2 4.10.2010, 14:45
Код

$LIMIT = shift || 5000;


Здесь shift возвращает первый параметр переданный скрипту, если его нет то 5000. 

Он будет что-то ловить если ты с машины, откуда его запускаешь устанавливаешь соединение на 80 порт удаленной машины.
Если ты не соединяешься не с кем, то ничего и не будет.

Код

 while ($packet=~/(GET|POST|WWW-Authenticate|Authorization).+/g)  {
        print "$client -> $host\t$&\n";
    }


Анализирует пакет - если в нем содержатся слова GET, POST, WWW-Authenticate или Authorization - то этот это печатается в выходной файл.
и т.д.

Вот обобщенно смысл скрипта.

Автор: rainz 4.10.2010, 15:40
Я думал он слушает 80 порт моей машины, запускал скрипт и начинал лазить браузером по инету.. ведь если запустить просто tcpdump в консоли с теми же параметрами, и лазить по сайтам, то в консоли отображается результаты tcpdump..

Автор: Egik2 4.10.2010, 16:00
tcpdump не слушает порт, а сниферит трафик который идет на 80 порт удаленной машины.
То есть по идее если ты лазишь в интернет, то что-то тебе в файл должно писаться.

Попробуй замени код на следующий:
Код

#!/usr/bin/perl
$LIMIT = shift || 5000;
$|=1;
open (STDIN,"/usr/sbin/tcpdump -lnx -s 1024 dst port 80 |");
while (<>) {
    if (/^\S/) {
    last unless $LIMIT--;

    print "$client -> $host\t$&\n";

    undef $client; undef $host; undef $packet;
    ($client,$host) = /(\d+\.\d+\.\d+\.\d+).+ > (\d+\.\d+\.\d+\.\d+)/
        if /P \d+:\d+\((\d+)\)/ && $1 > 0;
    }
    next unless $client && $host;
    s/\s+//;
    s/([0-9a-f]{2})\s?/chr(hex($1))/eg;
    tr/\x1F-\x7E\r\n//cd;
    $packet .= $_;
}


Просто убрали цикл while.
Посмотри будет ли что-нить выводить.


Автор: rainz 4.10.2010, 16:21
perl sniffer.pl > dump 

в файле теперь лежит вот такая муть: 
 ->    1
 ->    1
 ->    1
 ->    1
 ->    1
 ->    1
 ->    1
 ->    1
 ->    1
 ->    1
 ->    1
 ->    1

А что если в опере пустить трафик через прокси с 80 портом, по сути тогда должно заработать..

Автор: arto 4.10.2010, 20:14
# tcpdump -c5 -lnx -s 1024 dst port 80 or src port 80 | perl -lne 'chomp; if (m#^\S#) { $body =~ s#(\w\w)\s*#chr(hex $1)#ge; print "$from -> $to: $body" if ($body =~ m#\w{5,}#); ( $from,$to,$body ) = ( split ":?\\s+" )[2,4] } else { $body .= ( split ":\\s+" )[1]; }' M
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 1024 bytes
5 packets captured
47 packets received by filter
0 packets dropped by kernel
192.168.1.25.11038 -> 192.168.1.9.http: E^@^@[93]^MЛ@^@[80]^Fi^Fю╗^A^Yю╗^A      +^^^@P0:[9A]ЙTеk[P^XDp^G6^@^@GET /cgi/printenv.pl HTTP/1.0
User-Agent: Wget/1.11.4
Accept: */*
Host: arto
Connection: Keep-Alive

...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)