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;)
在这种特殊情况下,这对您没有多大帮助(因为您只有一个目录深度),但是嵌套更深的目录很快就会变得不可读,因为所有转义 /
字符。
我想在有人访问 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;)
在这种特殊情况下,这对您没有多大帮助(因为您只有一个目录深度),但是嵌套更深的目录很快就会变得不可读,因为所有转义 /
字符。