Snort规则正则表达式匹配

4

我希望在snort中生成一个事件,每当有人访问类似以下结构的URL时:

site/year2015.pdf
site/year2014.pdf
:
:
site/year2000.pdf

为了避免在未来添加更多URL时编写多个Snort规则,我考虑使用PERC。 规则如下所示。

alert tcp any any -> any any(msg:"PDF is being downloaded"; pcre:"(/.*site\/year\d\d\d\d\.pdf)/i"; sid: 100003; rev:3;)

我尝试了很多不同的方法将正则表达式插入到上面的规则中,但它总是无法解析它。这个正则表达式在这里做得很好。整个问题开始失败,因为规则没有被解析。

收到的错误是:

Error: /etc/snort/rules/assignment.rules Line 3 => unable to parse pcre regex "(/.*site\/year\d\d\d\d\.pdf)/i"
Fatal Error Quitting..

3
什么错误?代码在哪里? - user557597
1
你要匹配的实际字符串是什么? - Barton Chittenden
2个回答

8
略微有些疯狂的语法是 pcre:"/regex/flags"。您想要放在里面的括号也是多余的。您还需要转义任何实际正则表达式中的斜杠,就像示例中一样
alert tcp any any -> any any(msg:"PDF is being downloaded"; pcre:"/.*site\/year\d\d\d\d.pdf/i"; sid: 100003; rev:3;)

虽然你可能应该删除多余的通配符.*并在末尾添加锚点$,同时转义句点以使其成为字面量。你还可以使用量词来指定恰好四个数字的重复。

alert tcp any any -> any any(msg:"PDF is being downloaded"; pcre:"/site\/year\d{4}\.pdf$/i"; sid: 100003; rev:3;)

你确定要使用 /i 标志使匹配不区分大小写吗?


1
作为Tripleee提到的,你的括号放错了位置...但我认为值得一提的是,由于这些是Perl正则表达式,您在使用正则表达式的分隔符方面有一定的灵活性:

语法

pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUBPHMCOIDKYS]";

表示您可以使用m运算符(代表“匹配”),后跟备用分隔符,而不是使用传统的/分隔符...在这种情况下,我正在使用[]

msg:"PDF is being downloaded"; pcre:"m[site/year\d{4}\.pdf$]i"; sid: 100003; rev:3;)

在这种特定情况下,这并没有给你带来太多的好处(因为你只有一个目录),但是更深层次的嵌套目录将很快变得难以阅读,因为所有转义的/字符。

哎呀...我对Perl中的正则表达式还很陌生。仅仅是规则解析就已经是一次胜利了,但是规则仍然没有触发任何事件。:( - Babar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接