【问题标题】:Regex rule match up to string正则表达式规则匹配字符串
【发布时间】:2017-09-07 21:49:36
【问题描述】:

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

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

【问题讨论】:

标签: sed grep pcre


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

【讨论】:

  • 几乎,尽管我不想保留任何没有 GET 的内容术语,或者实际上更具体地说是 GET 或 POST。但是我总是可以在你写的那个之后将它作为第二个 grep 运行,只保留带有 GET|POST 的那些。
  • 很抱歉;我会稍微完善一下。
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多