我需要Regex专家的帮助。 我正在尝试编写一个简单的解析器,可以对Snort规则(IDS / IPS软件)的选项列表进行标记化。 问题是,我似乎找不到可行的公式,以根据它们的终止分号拆分单个规则选项。 我想出的公式将括号之间的所有选项捕获到单个组中。 我正在使用GSkinner网站上优秀的 RegExr工具,并使用以下来自Emerging Threats的示例规则选项之一(我已解析掉了规则头 - 这很容易标记化)。
问题在于,它不能处理冒号。因此,上面两条规则的“content”选项将无法被正确解析。但是在RegExr上,每个选项都将以蓝色突出显示,包括终止分号,但不包括分号后面的空格。如果我将其输入.NET,则应该能够进行Regex.Split并正确地拆分所有标记。
如果我将冒号添加到字符列表中,则在RegExr上,整个规则集将被标记为单个文本块,这不是我想要的。进一步调整公式的尝试导致Adobe Flash崩溃,这表明我正在遇到Flash或RegExr中的错误。
我没有排除编写自己的字符串标记器,但我希望正则表达式可以让我免于处理诸如计算我的开放引号、转义字符、空格等问题。
Snort规则选项通常采用以下格式:
在上面的内容中,每个选项都被突出显示为一个独立的分组,除了
编辑2:这就是解决方法:
(msg:"ET DELETED Majestic-12 Spider Bot User-Agent (MJ12bot)"; flow:to_server,established; content:"|0d 0a|User-Agent\: MJ12bot|0d 0a|"; classtype:trojan-activity; reference:url,www.majestic12.co.uk/; reference:url,doc.emergingthreats.net/2003409; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/POLICY/POLICY_Majestic-12; sid:2003409; rev:4;)
(msg:"ET DELETED Majestic-12 Spider Bot User-Agent Inbound (MJ12bot)"; flow:to_server,established; content:"|0d 0a|User-Agent\: MJ12bot"; classtype:trojan-activity; reference:url,www.majestic12.co.uk/; reference:url,doc.emergingthreats.net/2007762; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/POLICY/POLICY_Majestic-12; sid:2007762; rev:4;)
(msg:"ET POLICY McAfee Update User Agent (McAfee AutoUpdate)"; flow:to_server,established; content:"User-Agent|3a| "; http_header; nocase; content:"McAfee AutoUpdate"; http_header; pcre:"/User-Agent\x3a[^\n]+McAfee AutoUpdate/i"; classtype:not-suspicious; reference:url,doc.emergingthreats.net/2003381; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/POLICY/POLICY_McAffee; sid:2003381; rev:6;)
(msg:"ET DELETED Metacafe.com family filter off"; flow:established,to_server; content:"POST"; http_method; content:"Host|3a| www.metacafe.com"; http_header; fast_pattern:6,16; content:"submit=Continue+-+I%27m+over+18"; classtype:policy-violation; reference:url,doc.emergingthreats.net/2006367; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/POLICY/POLICY_Metacafe; sid:2006367; rev:7;)
这是公式:
([a-zA-Z0-9_:]+(?:[\w\s.,\-/=<>+!\[\]\(\)\{\}\"|\\;'?`~@#$%^&*])+;)
问题在于,它不能处理冒号。因此,上面两条规则的“content”选项将无法被正确解析。但是在RegExr上,每个选项都将以蓝色突出显示,包括终止分号,但不包括分号后面的空格。如果我将其输入.NET,则应该能够进行Regex.Split并正确地拆分所有标记。
如果我将冒号添加到字符列表中,则在RegExr上,整个规则集将被标记为单个文本块,这不是我想要的。进一步调整公式的尝试导致Adobe Flash崩溃,这表明我正在遇到Flash或RegExr中的错误。
我没有排除编写自己的字符串标记器,但我希望正则表达式可以让我免于处理诸如计算我的开放引号、转义字符、空格等问题。
Snort规则选项通常采用以下格式:
option:value;
option:"string value";
option:!"negated string value";
option:>num;
option:param1,param2,param3;
但是有些选项的值往往具有更加“奇特”的格式,比如byte_test。还有每个人都喜欢的“pcre”,它基本上是用于执行Perl兼容正则表达式的选项。因此,任何这样的分词器都必须避免在遇到带有正则表达式的“pcre”关键字时混淆。
你有什么想法?
编辑:
下面的内容非常接近:
([\w]+:?(?:[\x20]|)?(?:[\x00-\xff])*?;)
但是,根据RegExr的说法,它会被pcre语法弄乱:
(msg:"ET WEB_SPECIFIC_APPS Horde 3.0.9-3.1.0 Help Viewer Remote PHP Exploit"; flow:established,to_server; content:"/services/help/"; nocase; http_uri; pcre:"/module=[^\;]*\;.*\"/UGi"; classtype:web-application-attack; reference:url,www.milw0rm.com/exploits/1660; reference:cve,2006-1491; reference:bugtraq,17292; reference:url,doc.emergingthreats.net/2002867; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/WEB_SPECIFIC_APPS/WEB_Horde; sid:2002867; rev:9; http_method;)
在上面的内容中,每个选项都被突出显示为一个独立的分组,除了
]*\;.*\"/
。我认为\x00-\xff
可以覆盖所有内容,但似乎我使用了懒惰匹配。贪婪匹配会获取所有内容,包括选项之间的所有空格,但我不希望这样。因此,我需要修改正则表达式以处理pcre文本的标记化。编辑2:这就是解决方法:
([\w]+:?(?:[\x20]|)?(?<!\\)\"?.*?(?<!\\)\"?;)
我不得不使用一些适用于带引号字符串的正则表达式示例进行测试。最终意识到我正在查看避免被转义的引号的负向回顾。这似乎也解决了任何其他转义字符,因为转义字符只出现在未转义的引号内部。
pcre:"/[a-z0-9]/i";
。它通过链接到libpcre来处理任何需要的正则表达式解析。 - Kumba