我正在检查 Bro 日志,并希望找到一种使用 AWK 从跟踪器获取 IP 的方法关联并自动在 Bro 日志中搜索这些 IP,将每次匹配的结果打印到[custom-name].txt
文件中。
更多信息:
我是 awk 的新手,但试图将事情拼凑在一起。如果有更好的方法来做到这一点,我不感谢 awk。效率高就好了。
现在,我手动使用 Excel 函数将不良 IP 列(从链接定期更新)连接成超长 awk OR 字符串:
cat http* | awk '/123\.456\.789\.012/ || /2nd IP/ || /3rd IP/' | sort -n > file.txt
目前,http.log 具有正常的 Bro 标头... TS UID ID.orig_h ID.orig_p 等。
通俗地说,我想做的是:
如果第 1 行的 IP关联如果在http.log中找到,则打印结果到line_1_ip.txt,如果在http.log中找到链接第2行的IP,则打印结果到line_2_ip.txt等。
IP 的片段如下所示:
#############################################################################################
# abuse.ch ZeuS IP blocklist "BadIPs" (excluding hijacked sites and free hosting providers) #
# #
# For questions please refer to https://zeustracker.abuse.ch/blocklist.php #
#############################################################################################
103.230.84.239
103.241.0.100
103.26.128.84
103.4.52.150
103.7.59.135
104.218.48.99
104.219.232.12
104.236.55.19
107.150.58.84
108.61.193.211
它只是一个文本文件。
当涉及到实际引用远程网页来提取 IP 时,我真的不知道从哪里开始。但是,如果我可以从本地文本文件中提取它,这将为我提供一个工作起点。
答案1
我不完全确定你想要解析什么,因为我还没有看到输入格式,但是,如果你只想读取 IP 列表并打印到相应的输出文件,你可以尝试以下操作:
awk 'NR==FNR{a[$1]=NR; next} {
for(ip in a){
if($0~ip){
print >> "line_"a[ip]"_ip.txt"
}
}
}}' <(wget -O - "https://zeustracker.abuse.ch/blocklist.php?download=badips" 2>/dev/null |
grep -Ev "#|^ *$") http.log
但这有点复杂,所以让我们分解一下:
wget -O - https://zeustracker.abuse.ch/blocklist.php?download=badips 2>/dev/null | grep -Ev "#|^ *$"
:这将下载 IP 列表,删除任何包含#
或为空的行并打印到标准输出。<(command)
: 这就是所谓的流程替代和 是一些 shell(bash、zsh 和 ksh,但也可能是其他 shell)具有的技巧,它使您能够将进程的输出视为另一个命令的输入文件。- 因此,片段看到两个“文件”,第一个是命令管道
awk
的输出,第二个是文件。wget
grep
http.log
NR==FNR{a[$1]=NR; next}
: NR 是当前输入行号,FNR
相同但不同当前文件。仅当读取第一个文件时,两者才相等。因此,这将创建一个数组,a
其键是 IP,其值是当前行号。for(ip in a)
:迭代a
数组,将其每个键(IP)保存为ip
.if($0~ip){}
: 如果这一行 ($0
) 与此匹配ip
。print >> "line_"a[ip]"_ip.txt"
:将该行打印到名为 的文件中line_
,显示该 IP 的输入行号以及_ip.txt
.这>>
可确保文件被追加且不会被覆盖。
答案2
请注意,它bro
是bro-cut
从日志文件中提取数据的。
你可以这样做:
bro-cut id.orig_h id.resp_h < conn.log | grep -wFf <(
curl 'https://zeustracker.abuse.ch/blocklist.php?download=badips' |
grep '^[^#]'
)
和awk
:
awk '
NR == FNR {
if (/^[^#]/) bad[$0]=""
next
}
($1 in bad) || ($2 in bad)
' <(curl 'https://zeustracker.abuse.ch/blocklist.php?download=badips') \
<(bro-cut id.orig_h id.resp_h < conn.log)
(使用哈希表而不是在循环中进行艰苦的字符串匹配更有效)。
另请注意,新兴威胁规则集具有跟踪这些 Zeus 跟踪器列表(和其他列表)的规则。因此,如果除了 bro-ids 之外,您还使用带有该规则集的 snort/surricata,那么使用 bro 这样做最终会变得多余。