正则表达式规则匹配字符串

时间:2017-09-07 21:49:36

标签: sed grep pcre

我需要使用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中提取任何内容,这会打破。

不知道该做什么,有什么想法吗?

1 个答案:

答案 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之前停止
  • [^"] - 任何非引用;空格,字母,冒号,分号......
  • | - 或......
  • "[^"]*" - 一些属性字符串;将此作为一个整体进行匹配,以防止负面前瞻在引号
  • 之间拾取某些东西
  • )* - 结束重复子模式;零次或多次
  • ; - 关闭分号