Snort规则正则表达式匹配

时间:2015-06-09 01:06:04

标签: regex pcre snort

每当有人访问类似

的网址时,我想在snort中生成一个事件
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;)

我在上面的规则中尝试了许多不同的方法来插入正则表达式,但总是无法解析它。正则表达式做得很好,我想做它here。整个事情开始失败,因为它没有启动规则未被解析的原因。

收到的错误是

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

2 个答案:

答案 0 :(得分:6)

(稍微疯狂)的语法是pcre:"/regex/flags"。无论如何,你想要放在那里的括号是多余的。您还需要转义任何斜杠,它是实际正则表达式like in the example的一部分。

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 :(得分:1)

正如三人提到的那样,你的括号错了......但我也认为值得一提的是,因为这些是 Perl 正则表达式,所以你在使用的分隔符中有一定的灵活性正则表达式:

语法

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

表示不使用传统的/分隔符,而是使用m运算符('匹配'的缩写),后跟备用分隔符...我正在使用{{1}在这种情况下}和[

]

在这种特殊情况下,这并没有给你带来多少好处(因为你只有一个目录很深),但是一个更深层次嵌套的目录很快就会被所有转义的msg:"PDF is being downloaded"; pcre:"m[site/year\d{4}\.pdf$]i"; sid: 100003; rev:3;) 字符无法读取。