我需要使用grep / egrep / sed从SNORT规则字符串中提取某些部分。
给出一个字符串,格式为:
alert tcp any any -> any any (msg:"Some message";
content:"c1"; content:"GET /blah"; offset:0; depth:9; content:"something else";)
我如何才能提取以下内容:
content:"GET /blah"; offset:0; depth:9;
鉴于以下情况属实:
content:"GET "; offset:5; http_uri; depth:12;
规则可能会“格式错误”,即在内容有效期后,它可能会有两个或更多的分号,而不是单个分号。
到目前为止,我认为在其他正则表达式系统中可以使用的是:
(GET|POST).*?(?=content)
这背后的想法是.*?
在任何角色上都是不合时宜的匹配,并且在下一个术语“内容”中没有抓住(不确定是否是该术语)。
我相信如果没有以下内容术语,并且似乎没有在grep或egrep中提取任何内容,这会打破。
不知道该做什么,有什么想法吗?
答案 0 :(得分:1)
这应该可以解决问题:
grep -Po '\bcontent\s*:\s*"(GET|POST)\b[^"]*"((?!;\s*content\s*:)[^"]|"[^"]*")*;'
示例输入:
alert tcp any any -> any any (msg:"Some message";
content:"c1"; content:"GET /blah"; offset:0; depth:9; content:"something else";)
content:"GET "; offset:5; http_uri; depth:12;
输出:
content:"GET /blah"; offset:0; depth:9;
content:"GET "; offset:5; http_uri; depth:12;
说明:
content
,而是使用否定预测来消费除content
之外的任何内容。这样,行尾也可以作为比赛结束。正则表达式详细说明:
\b
- 字边界(以阻止匹配,例如othercontent
)content\s*:\s*
- 字面意思:内容后跟冒号;带有可选空格"
- 开场白(GET|POST)
- 其中一个动词\b
- 字边界(以阻止匹配,例如POSTAL
)[^"]*"
- 所有内容,包括收尾报价(
- 开始重复子模式(?!;\s*content\s*:)
- 负面预测,以确保我们在任何后续content
之前停止[^"]
- 任何非引用;空格,字母,冒号,分号...... |
- 或...... "[^"]*"
- 一些属性字符串;将此作为一个整体进行匹配,以防止负面前瞻在引号)*
- 结束重复子模式;零次或多次;
- 关闭分号