Snort中pcre和正则表达式的使用详解

 更新时间:2022年03月30日 08:47:59   作者:c0ver1  
这篇文章主要介绍了Snort中pcre和正则表达式的使用,题目要求检测包含两个包的特定流,需要通过设置标记位,即flowbits来实现,感兴趣的朋友跟随小编一起看看吧

1. 题目描述

If snort see two packets in a TCP flow with

first packet has “login” or “Initial” in payload, destination port is 3399;and second packet has a “IPv4Address:Port”string(E.g. 123.45.6.7:8080) in payload. destination port is 3399;output an alert with msg “bot founded” and sid 1000001

2. 解决方案

题目要求检测包含两个包的特定流,需要通过设置标记位,即flowbits来实现。另外,题目中均要求检测特定的字符串或模式,所以还需要在pcre字段中通过正则表达式实现。

2.1 第一条检测规则

匹配特定字符串

pcre:"/login|Initial/";

正则表达式的两端需要加上限界符/

设置标志位,同时不发出警报。

flowbits:set,login_Initial;flowsbits:noalert;

2.2 第二条检测规则

2.2.1 匹配模式IPv4Address:Port

IPv4Address

IPv4地址使用点分十进制表示时,分为4组,每组的范围均为[0,255]。即从0.0.0.0到255.255.255.255。

我们先分析单独一组的特点:

区间限制表示
0~99没有任何限制\d{1,2}
100~199后两位也没有任何限制1\d{2}
200~249十位限制在0~4,个位没有限制2[0-4]\d
250~255个位限制在0~525[0-5]

可以发现表格中前两种情况可以合并为1?\d{1,2},所以可以用25[0-5]|2[0-4]\d|1?\d{1,2}来匹配0~255;

将其作为一个分组,再考虑到.,我们可以写出如下正则表达式匹配IPv4地址:

((25[0-5]|2[0-4]\d|1?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|1?\d{1,2})

值得说明的是:

这里我们认为数字前出现填充0的情况与非填充状态等价:

如:192.01.00.1等价于192.1.0.1

这种情况下才能使用\d{1,2},因为可能会出现00的情况。

正则表达式的短路性质:

|运算符分隔的多个表达式有一个匹配成功时,该表达式之后的表达式将不会继续匹配。

如:A|B|C|DB匹配成功了,将不会再看CD

所以上面匹配IPv4地址时,我们单独一个分组写成25[0-5]|2[0-4]\d|1?\d{1,2}而不是1?\d{1,2}|2[0-4]\d|25[0-5]

后者匹配255时,只会匹配到255,而不会匹配到255

同样后者构造的正则表达式去匹配255.255.255.255,只会匹配到255.255.255.25,缺少最后一个5

因为它匹配到最后一组的25时就判定匹配成功,直接跳到末尾,结束匹配。而前面几组255正确匹配的原因是:如果只匹配25,发现剩下的5.不匹配,之后会进行回溯,继续检查后面的条件,发现255匹配成功且.也匹配成功,不再回溯。

  • Port

端口号的范围是0~65535,我们同样可以分成不同的区间来匹配端口号。

区间限制表示
0~9999没有任何限制\d{1,4}
10000~59999后四位没有任何限制[1-5]\d{4}
60000~64999千位限制在0~4,后三位没有任何限制6[0-4]\d{3}
65000~65499百位限制在0~4,后两位没有任何限制65[0-4]\d{2}
65500~65529十位限制在0~4,个位没有任何限制655[0-2]\d
65530~65535个位限制在0~56553[0~5]

同样,我们可以将表格前两种情况合并为[1-5]?\d{1,4}。结合上面提到的短路性质,我们可以写出最终用于匹配端口号的正则表达式:

6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4}

2.2.2 检查标志位

flowbits:isset,bot_founded;

3. 检测规则

通过上述分析,我们可以写出如下检测规则:

alert tcp any any -> any 3399 (pcre:"/login|Initial/";flowbits:set,login_Initial;flowbits:noalert;sid:1000000)
alert tcp any any -> any 3399 (msg:"bot founded";pcre:"/((25[0-5]|2[0-4]\d|1?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|1?\d{1,2}):(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4})/";flowbits:isset,bot_founded;sid:1000001)

到此这篇关于Snort中pcre和正则表达式的使用的文章就介绍到这了,更多相关Snort pcre 正则表达式使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 匹配中文的正则(GB2312/utf-8)

    匹配中文的正则(GB2312/utf-8)

    下面列出了当前在 PCRE 中可能使用的修正符。括号中是这些修正符的内部 PCRE 名。修正符中的空格和换行被忽略,其它字符会导致错误。
    2009-08-08
  • 正则表达式中的反向预搜索实现

    正则表达式中的反向预搜索实现

    这几天在用正则表达式做一个小程序,需要替换内容中的某些特殊字符串。这些字符串的出现是有规律的,那就是在它左面总会特定的内容出现,右面却没有。于是自然就想到了反向预搜索。
    2009-09-09
  • 一文教会你用正则表达式校验日期时间格式

    一文教会你用正则表达式校验日期时间格式

    日期的格式多种多样,有如:"yyyy-MM-dd HH:mm:ss"、"yyyy/MM/dd HH:mm:ss"、"yyyyMMdd HH:mm:ss"等,当然也有的只记录到天,下面这篇文章主要给大家介绍了关于用正则表达式校验日期时间格式的相关资料,需要的朋友可以参考下
    2022-10-10
  • 浏览器中的正则表达式陷阱说明

    浏览器中的正则表达式陷阱说明

    js 内置对象 RegExp 我们用的很习惯 也很舒服 但是里面却有 严重的隐患 或者陷阱...原因在于 有些浏览器 对正则表达式直接量的优化.
    2010-05-05
  • js正则匹配markdown里的图片标签的实现

    js正则匹配markdown里的图片标签的实现

    这篇文章主要介绍了js正则匹配markdown里的图片标签的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 关于日期正则表达式的思路详解

    关于日期正则表达式的思路详解

    日期正则一般是对格式有要求,且数据不是直接由用户输入时使用。这篇文章主要介绍了日期正则表达式的思路详解,需要的朋友可以参考下
    2017-09-09
  • .NET正则基础之正则委托

    .NET正则基础之正则委托

    一般的正则替换,只能对匹配的子串做简单的处理,.NET的Replace()方法中的replacement参数,不仅可以是字符串,还可以是委托(delegate),在每次匹配成功时,都会调用委托方法,对匹配的子串进行处理之后,再作为替换文本返回
    2023-05-05
  • 关于内容的分离,正则抽出图片(一定要加精哦)

    关于内容的分离,正则抽出图片(一定要加精哦)

    我们在加内容时,无论你怎么样排版都好,我们都是无法将里面的图片或是别的什么东西抽出来的.
    2009-01-01
  • 让URL只允许一些字符的正则表达式

    让URL只允许一些字符的正则表达式

    让URL只允许一些字符的正则表达式,需要的朋友可以参考下
    2012-10-10
  • javascript 正则 判断是否是数字的脚本

    javascript 正则 判断是否是数字的脚本

    javascript 正则 判断是否是数字的脚本...
    2007-10-10

最新评论