Có vấn đề với phân tích các bản ghi Snort bằng mô-đun pyparsing.Phân tích cú pháp Snort Nhật ký với PyParsing
Vấn đề là tách nhật ký Snort (có nhiều mục nhập, được phân cách bằng một dòng trống) và nhận được pyparsing để phân tích từng mục nhập dưới dạng toàn bộ đoạn, thay vì đọc từng dòng và mong đợi ngữ pháp hoạt động với mỗi dòng (rõ ràng là không.)
Tôi đã thử chuyển đổi từng đoạn thành một chuỗi tạm thời, loại bỏ các dòng mới trong mỗi đoạn, nhưng từ chối xử lý chính xác. Tôi có thể hoàn toàn theo dõi sai, nhưng tôi không nghĩ như vậy (một biểu mẫu tương tự hoạt động hoàn hảo cho nhật ký kiểu nhật ký hệ thống, nhưng đó là các mục nhập một dòng và do đó bạn tự vay để xử lý dòng/xử lý tệp cơ bản của mình)
Dưới đây là một mẫu của các bản ghi và mã tôi có cho đến nay:
[**] [1:486:4] ICMP Destination Unreachable Communication with Destination Host is Administratively Prohibited [**]
[Classification: Misc activity] [Priority: 3]
08/03-07:30:02.233350 172.143.241.86 -> 63.44.2.33
ICMP TTL:61 TOS:0xC0 ID:49461 IpLen:20 DgmLen:88
Type:3 Code:10 DESTINATION UNREACHABLE: ADMINISTRATIVELY PROHIBITED HOST FILTERED
** ORIGINAL DATAGRAM DUMP:
63.44.2.33:41235 -> 172.143.241.86:4949
TCP TTL:61 TOS:0x0 ID:36212 IpLen:20 DgmLen:60 DF
Seq: 0xF74E606
(32 more bytes of original packet)
** END OF DUMP
[**] ...more like this [**]
và mã Cập nhật:
def snort_parse(logfile):
header = Suppress("[**] [") + Combine(integer + ":" + integer + ":" + integer) + Suppress("]") + Regex(".*") + Suppress("[**]")
cls = Optional(Suppress("[Classification:") + Regex(".*") + Suppress("]"))
pri = Suppress("[Priority:") + integer + Suppress("]")
date = integer + "/" + integer + "-" + integer + ":" + integer + "." + Suppress(integer)
src_ip = ip_addr + Suppress("->")
dest_ip = ip_addr
extra = Regex(".*")
bnf = header + cls + pri + date + src_ip + dest_ip + extra
def logreader(logfile):
chunk = []
with open(logfile) as snort_logfile:
for line in snort_logfile:
if line !='\n':
line = line[:-1]
chunk.append(line)
continue
else:
print chunk
yield " ".join(chunk)
chunk = []
string_to_parse = "".join(logreader(logfile).next())
fields = bnf.parseString(string_to_parse)
print fields
Bất kỳ sự giúp đỡ, gợi ý, RTFMs, bạn đang làm sai lầm, vv ., đánh giá cao.
Bạn là một vị thần. Đây là giải pháp vượt quá khả năng chuyên môn của tôi nhưng sẽ sớm được triển khai, ngay sau khi tôi tự mình hiểu tất cả các bộ phận hoạt động. Cảm ơn bạn! –
+1 - Câu trả lời hay ~ unutbu, đánh tôi với cú đấm! (Mã nhóm của bạn trông khá điên rồ, tôi sẽ phải sắp xếp thông qua nó khi tôi nhận được một vài phút.) – PaulMcG
+ nhiều chỉ cho việc sử dụng đáng yêu và thanh lịch của 'groupby'. – katrielalex