从Perl读入时,为什么Snort日志文件显示错误?

时间:2011-03-25 01:52:23

标签: perl logging snort

我正在编写一个Perl程序来读取Snort日志文件。我使用VMware运行Fedora 14。

使用命令/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 个答案:

答案 0 :(得分:3)

您的Snort日志文件采用二进制(tcpdump)格式。你不能只把它们看作文本。

如果你想这样做,你需要告诉snort使用-K ascii选项将它们写成ASCII。

问题是,这可能会导致snort无法跟上问题。更好的选择是简单地将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>) {
...
}