Почему при чтении из Perl файл журнала Snort отображается неправильно? - PullRequest
0 голосов
/ 25 марта 2011

Я пишу Perl-программу для чтения файла журнала Snort . Я запускаю Fedora 14 с помощью VMware.

При использовании команды /usr/loca/bin/snort -r /var/log/snort/snort.log.1299686068 получаю результат:

03/08-21:16:03.609258 172.16.115.87:4159 -> 205.181.112.67:80
TCP TTL:63 TOS:0x0 ID:3588 IpLen:20 DgmLen:385 DF
***AP*** Seq: 0xEB6DE4B0  Ack: 0xD00D0DA6  Win: 0x7D78  TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

03/08-21:16:03.627973 205.181.112.67:80 -> 172.16.115.87:4159
TCP TTL:64 TOS:0x0 ID:2458 IpLen:20 DgmLen:40 DF
***A**** Seq: 0xD00D0DA6  Ack: 0xEB6DE609  Win: 0x7E87  TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

03/08-21:16:03.651503 205.181.112.67:80 -> 172.16.115.87:4159
TCP TTL:64 TOS:0x0 ID:2459 IpLen:20 DgmLen:978 DF
***AP*** Seq: 0xD00D0DA6  Ack: 0xEB6DE609  Win: 0x7FE0  TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+^C

*** Caught Int-Signal
03/08-21:16:03.654590 205.181.112.67:80 -> 172.16.115.87:4159
TCP TTL:64 TOS:0x0 ID:2460 IpLen:20 DgmLen:40
***A***F Seq: 0xD00D1150  Ack: 0xEB6DE609  Win: 0x7FE0  TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

Указан IP-адрес назначения и источника, а также дополнительная информация, но когда я использую Perl для написания программы для их чтения, в списке появляется неизвестный символ.

Не защищен ли файл журнала Snort или в чем еще может быть проблема? Это не совсем 100% результат, такой же, как в первом примере, но, по крайней мере, ясно перечислить все.

Мой код:

#!/usr/local/bin/perl
use File::Tail;
opendir L_FOL, "/var/log/snort" || die "Could not open LOGFOLDER direcotry\n $!";
my @allrule = grep {/^snort.log./} readdir L_FOL;
close L_FOL;
foreach my $rulefile (@allrule) {
    open(LF, "/var/log/snort/$rulefile") or die "$!";
    while (<LF>) {
        print "$_\n";
    }
    close(LF);
}

1 Ответ

3 голосов
/ 25 марта 2011

Ваши файлы журналов Snort представлены в двоичном (tcpdump) формате.Вы не можете просто читать их как текст.

Если вы хотите это сделать, вам нужно указать snort написать их как ASCII с опцией -K ascii.

Проблемав том, что это может вызвать у вас проблемы со способностью фыркать.Лучший вариант - просто передать вывод snort в вашу perl-программу и прочитать:

open(LF, "/usr/local/bin/snort -r /var/log/snort/$rulefile|") or die "$!";

Обратите внимание, что это очень старый синтаксис perl, и его больше не следует использовать.Вы должны избегать голых слов и использовать три аргумента open()

open(my $lf, "-|", "/usr/local/bin/snort -r /var/log/snort/$rulefile") or die "$!";
while (<$lf>) {
...
}
...