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

目录
  • 1. 题目描述
  • 2. 解决方案
    • 2.1 第一条检测规则
    • 2.2 第二条检测规则
  • 3. 检测规则

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~5 25[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~5 6553[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 正则表达式使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PHP正则表达式处理函数(PCRE 函数)实例小结

    本文实例讲述了PHP正则表达式处理函数.分享给大家供大家参考,具体如下: 有时候在一些特定的业务场景中需要匹配,或者提取一些关键的信息,例如匹配网页中的一些链接, 提取一些数据时,可能会用到正则匹配. 下面介绍一下php中的一些常用的正则处理函数. 一.preg_replace($pattern,$replacement,$subject) 执行一个正则表达式的搜索和替换. <?php echo "<pre>"; $str = "12,34:56;784;3

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

    目录 1. 题目描述 2. 解决方案 2.1 第一条检测规则 2.2 第二条检测规则 3. 检测规则 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) i

  • php中邮箱地址正则表达式实现与详解

    首先附上代码 复制代码 代码如下: ^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$ 在这段正则表达式中,"+"表示前面的字符串连续出现一个或多个:"^"表示下一个字符串必须出现在开头,"$"表示前一个字符串必须出现在结尾: "."也就是".",这里""是转义符:"{2,3}"表示前面的字符串可以连续出现2-3次.&quo

  • js中string之正则表达式replace方法详解

    replace方法是javascript涉及到正则表达式中较为复杂的一个方法,严格上说应该是string对象的方法.只不过牵扯到正则的时候比较多一些.需要我们灵活的使用. 语法: stringObj.replace(regexp/substr,replacement): 第一个参数:必需.字符串中要替换的子串或正则RexExp: 第二个参数:必需,一个字符串值,规定了替换文本或生成替换文本的函数. 返回值:注意它的返回值是一个新的字符串,并没有更改原有字符串,是用 replacement 替换了

  • C语言中的正则表达式使用示例详解

    正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE).正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 在c语言中,用regcomp.regexec.regfree 和regerror处理正则表达式.处理正则表达式分三步: 编译正则表达式,regcomp: 匹配正则表达式,regexec: 释放正则表达式,regfree. 函数原型 /* 函数说明:Regcomp将正则表达式字符串regex编译

  • python正则表达式中匹配次数与贪心问题详解(+ ?*)

    python中正则表达式中的匹配次数问题网上有很多解释,最多的就是*匹配0或者无数次,+匹配1次或无数次,?匹配0次或者1次.可是虽然这个文字描述很简单,但是真正用起来的时候大家有没有发觉还是需要谨慎使用才能发挥出这个匹配次数的真正功能,下面举几个简单例子参考: 首先是一个很简单的匹配: 字符串如下 我们直接匹配python,结果只匹配到一个 接下来我们把匹配次数的符号加进去,首先是*,结果如下: 匹配到了三处,即匹配到了所有的前缀有python的字符串 换成+再次匹配 结果和*的匹配一致,那使

  • Python正则表达式中group与groups的用法详解

    目录 1 .group函数 1.1 返回整个匹配结果 1.2 返回指定分组的匹配结果 1.3 处理没有匹配结果的情况 2. groups函数 3. group和groups的使用场景 在Python中,正则表达式的group和groups方法是非常有用的函数,用于处理匹配结果的分组信息.group方法是re.MatchObject类中的一个函数,用于返回匹配对象的整个匹配结果或特定的分组匹配结果.而groups方法同样是re.MatchObject类中的函数,它返回的是所有分组匹配结果组成的元组

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

    1        概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好. 前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正. 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用.因应用场景的不同,写出的正则也不同,复杂程度也自然不同.正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂

  • js正则表达式常用函数详解(续)

    正则表达式对象的方法 1.test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式.如果存在则返回 true,否则就返回 false. 2.exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组. 3.compile,把正则表达式编译为内部格式,从而执行得更快. 正则表达式对象的属性 1.source,返回正则表达式模式的文本的复本.只读. 2.lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置. 3.input ($_),返回

  • java 正则,object中两个方法的使用(详解)

    正则: "."和"\" "."点儿,在正则表达式中表示任意一个字符. "\"在正则表达式中是转意字符,当我们需要描述一个已经被正则表达式使用的特殊字符时,我们就可以通过使用"\"将其转变为原本的意思. "\"在正则表达式中也有一些预定义的特殊内容: \d:表示任意一个数字 \w:表示任意一个单词字符(只能是 数字,字母,下划线) \s:表示任意一个空白字符(\t \r \n \f \x0

  • javascript类型系统_正则表达式RegExp类型详解

    前面的话 前面已经介绍过javascript中正则表达式的基础语法.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,使用正则表达式可以进行强大的模式匹配和文本检索与替换.本文将介绍正则表达式的RegExp对象,以及正则表达式涉及 到的属性和方法 对象 javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法:另一种是构造函数写法 Perl写法 正则表达式字面量写法,又叫Perl写法,因为javascript的正则表达式特性

随机推荐