【问题标题】:Compare files and comment the same lines in new file比较文件并在新文件中注释相同的行
【发布时间】:2021-07-30 19:02:20
【问题描述】:

目标:我想比较两个 Suricata 规则文件,并从 file2 中的 file1 中注释掉相同的行(警报“SID”),除非它已经被注释掉。我知道使用 Suricata 阈值文件有更好的方法来做到这一点,但不幸的是,除了我在这里可以解释的之外,我没有那种奢侈。这是为了便于更新规则,其中规则可能会被更新,但“SID”的共性在两个文件中将是相同的。

我不知道从哪里开始。

示例文件 1 文本:

alert $home_net any > $External_net any (msg: example; content: something; sid: 12345; rev:1)
#alert $home_net any > $External_net any (msg: example; content: something; sid: 67895; rev:1)
alert $home_net any > $External_net any (msg: example; content: something; sid: 18975; rev:1)

示例文件 2 文本:

alert $home_net any > $External_net any (msg: example; content: something; sid: 12345; rev:1)
<insert #>alert $home_net any > $External_net any (msg: example; content: something; sid: 67895; rev:1)
alert $home_net any > $External_net any (msg: example; content: something; sid: 18975; rev:1)

编辑:提供的解决方案适用于我上面提供的初始示例数据,但它不适用于实际签名。所以我在下面提供实际签名。此外,规则在每行之间可能有也可能没有空格。

示例文件 1 文本:

#alert tcp $EXTERNAL_NET any -> $HOME_NET 2200 (msg:"ET EXPLOIT CA BrightStor ARCserve Mobile Backup LGSERVER.EXE Heap Corruption"; flow:established,to_server; content:"|4e 3d 2c 1b|"; depth:4; isdataat:2891,relative; reference:cve,2007-0449; reference:url,doc.emergingthreats.net/bin/view/Main/2003369; classtype:attempted-admin; sid:2003369; rev:3; metadata:created_at 2010_07_30, updated_at 2010_07_30;)

alert udp $EXTERNAL_NET any -> $HOME_NET 111 (msg:"ET EXPLOIT Computer Associates Brightstor ARCServer Backup RPC Server (Catirpc.dll) DoS"; content:"|00 00 00 00|"; offset:4; depth:4; content:"|00 00 00 03|"; distance:8; within:4; content:"|00 00 00 08|"; distance:0; within:4; content:"|00 00 00 00|"; distance:0; within:4; content:"|00 00 00 00|"; distance:4; within:4; content:"|00 00 00 00 00 00 00 00|"; distance:8; within:32; reference:url,www.milw0rm.com/exploits/3248; reference:url,doc.emergingthreats.net/bin/view/Main/2003370; classtype:attempted-dos; sid:2003370; rev:3; metadata:created_at 2010_07_30, updated_at 2020_08_20;)

#alert tcp $EXTERNAL_NET any -> $HOME_NET 1900 (msg:"ET EXPLOIT Computer Associates Mobile Backup Service LGSERVER.EXE Stack Overflow"; flow:established,to_server; content:"0000033000"; depth:10; isdataat:1000,relative; reference:url,www.milw0rm.com/exploits/3244; reference:url,doc.emergingthreats.net/bin/view/Main/2003378; classtype:attempted-admin; sid:2003378; rev:3; metadata:created_at 2010_07_30, updated_at 2010_07_30;)

示例文件 2 文本:

#alert tcp $EXTERNAL_NET any -> $HOME_NET 2200 (msg:"ET EXPLOIT CA BrightStor ARCserve Mobile Backup LGSERVER.EXE Heap Corruption"; flow:established,to_server; content:"|4e 3d 2c 1b|"; depth:4; isdataat:2891,relative; reference:cve,2007-0449; reference:url,doc.emergingthreats.net/bin/view/Main/2003369; classtype:attempted-admin; sid:2003369; rev:3; metadata:created_at 2010_07_30, updated_at 2010_07_30;)
alert udp $EXTERNAL_NET any -> $HOME_NET 111 (msg:"ET EXPLOIT Computer Associates Brightstor ARCServer Backup RPC Server (Catirpc.dll) DoS"; content:"|00 00 00 00|"; offset:4; depth:4; content:"|00 00 00 03|"; distance:8; within:4; content:"|00 00 00 08|"; distance:0; within:4; content:"|00 00 00 00|"; distance:0; within:4; content:"|00 00 00 00|"; distance:4; within:4; content:"|00 00 00 00 00 00 00 00|"; distance:8; within:32; reference:url,www.milw0rm.com/exploits/3248; reference:url,doc.emergingthreats.net/bin/view/Main/2003370; classtype:attempted-dos; sid:2003370; rev:3; metadata:created_at 2010_07_30, updated_at 2020_08_20;)
< insert #>alert tcp $EXTERNAL_NET any -> $HOME_NET 1900 (msg:"ET EXPLOIT Computer Associates Mobile Backup Service LGSERVER.EXE Stack Overflow"; flow:established,to_server; content:"0000033000"; depth:10; isdataat:1000,relative; reference:url,www.milw0rm.com/exploits/3244; reference:url,doc.emergingthreats.net/bin/view/Main/2003378; classtype:attempted-admin; sid:2003378; rev:3; metadata:created_at 2010_07_30, updated_at 2010_07_30;)

【问题讨论】:

  • 在我看来,您可能需要一个 Perl 或 Python 脚本,它们可以从注释掉的规则中解析 SID,然后在另一个文件中用相同的 SID 注释掉这些规则。抱歉,我没有任何单行类型的 shell 想法适合你。
  • @Jason 不要低估标准 Unix 工具的力量 :-) 如果 sed 无法做到这一点,那么 awk 将是一个很好的替代品。无需求助于高级语言。
  • 点了。我发现用 Python 做起来更容易,但我用 Python 编写了一个完整的规则管理工具。但总是对一些 sed 的掌握程度印象深刻!
  • 据我了解,您可能会使用suricata-update 工具来删除重复的规则,并且只生成一个文件suricata.rules 以供全球使用。这个工具足够聪明,可以管理规则。你不必做所有这些。

标签: bash text-processing suricata


【解决方案1】:

首先,检查第一个文件并找出哪些 sid 被注释掉了:

sed -En '/^#/ s/.*sid:([0-9]+).*/\1/p' file1

上面的命令打印出以# 开头的行的 sid,每行一个 sid。现在让我们汇总这些行并构建一个以| 分隔的 sid 列表:

sed -En '/^#/ s/.*sid:([0-9]+).*/\1/p' file1 | paste -sd '|'

好的,现在我们有了 sid1|sid2|...|sidN。正如它所写的那样,这可以用作正则表达式来识别 file2 中需要注释掉的行。让我们把这个正则表达式放在一个变量中:

sid_regex=$(sed -En '/^#/ s/.*sid:([0-9]+).*/\1/p' file1 | paste -sd '|')

现在,我们可以修改 file2 以便注释掉每行 1) 具有与正则表达式匹配的 sid 和 2) 尚未以 # 开头的行:

sed -E "/sid:($sid_regex);/ s/^[^#]/#&/" file2 > file2.new

瞧!总结一下:

$ sid_regex=$(sed -En '/^#/ s/.*sid:([0-9]+).*/\1/p' file1 | paste -sd '|')
$ sed -E "/sid:($sid_regex);/ s/^[^#]/#&/" file2 > file2.new

[更新] 你有这么多的注释行,结果巨大的正则表达式使命令太大(“参数列表太长”)。让我们尝试另一种方法:我们将构建一个多行 sed 程序,而不是使用巨大的正则表达式构建单行 sed 程序,每个 sid 一行。

第一个 sed 命令生成第二个 sed 程序:

sed -En '/^#/ s|.*(sid:[0-9]+;).*|/\1/ s/^[^#]/#\&/|p' file1

结果应该是这样的:

/sid:111;/ s/^[^#]/#&/
/sid:222;/ s/^[^#]/#&/
...
/sid:123456;/ s/^[^#]/#&/

现在我们为该程序提供第二个 sed 以处理 file2:

sed -En '/^#/ s|.*(sid:[0-9]+;).*|/\1/ s/^[^#]/#\&/|p' file1 | sed -f - file2 > file2.new

【讨论】:

  • 我想我上次出错了。我再次复制并粘贴,现在它输出 file2.new 但不包含更新的 cmets。
  • 好的,我发现这是我的错误。再次感谢这为我节省了很多时间。
  • 看来我将解决方案标记为正确还为时过早。它适用于我的示例数据,但是,当我使用真实世界的签名时,它似乎不起作用。我将更新帖子以包含真实的示例数据。
  • 所以......我又犯了一个错误,在真正的签名中,“sid:”和sid号之间没有空格。在我纠正它之后,它可以工作。但是,我确实收到一个错误,“参数列表太长”显然 sed 无法处理所有评论的规则......所以我可能不走运。除非有办法解决这个问题?
  • 是否会将第一个 sed 命令的结果放入单独的帮助文件中,然后使用 sed 进行处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多