Snort 规则正则表达式匹配

Snort rules regex matching

我想在有人访问 URL 结构如

时在 snort 中生成一个事件
site/year2015.pdf
site/year2014.pdf
:
:
site/year2000.pdf

我考虑使用 PERC,而不是编写多个 snort 规则,因为多年来将添加更多 URLs。规则写成.

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..

(有点疯狂的)语法是 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 标志使匹配不区分大小写吗?

正如 tripleee 提到的,你的括号放错了地方......但我也认为值得一提的是,因为这些是 Perl 正则表达式,你在分隔符中有一些灵活性您正在使用正则表达式:

语法

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

表示不使用传统的 / 分隔符,您可以使用 m 运算符('match' 的缩写),后跟备用分隔符...我正在使用[] 在这种情况下:

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

在这种特殊情况下,这对您没有多大帮助(因为您只有一个目录深度),但是嵌套更深的目录很快就会变得不可读,因为所有转义 / 字符。