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

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})


值得说明的是:

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

    如:192.01.00.1等价于192.1.0.1

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

  2. 正则表达式的短路性质

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

    如: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和正则表达式的使用的更多相关文章

  1. ORACLE中的支持正则表达式的函数

    ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

  2. js中几个正则表达式相关函数使用时g标志的作用

    首先,javascript中涉及到正则表达式的函数总共有6个,可分为两种: 1.第一种是作为字符串对象的方法,即以 String.fun(); 形式调用,这里包括 split.search.match ...

  3. C#中Spli、正则表达式分解字符串详解

    一.String.Split方法提供了如下6个重载函数: 名称 说明 String.Split (Char[]) 返回包含此实例中的子字符串(由指定 Char 数组的元素分隔)的 String 数组. ...

  4. php中常用的正则表达式函数

    php中常用的正则表达式函数 * preg_match() * preg_match_all() * preg_replace() * preg_filter() * preg_grep() * pr ...

  5. C#中,使用正则表达式匹配获取所需数据

    .NET中,使用正则表达式匹配获取所需数据 需求:获取一串字符串中,正则匹配出需要的数据. 例如以下字符串: string temp ="ErrorCode:-1,Message:{&quo ...

  6. * 和 ?在 shell 命令行中与在正则表达式中的区别

    Linux 正则表达式 你有没有想过,在 shell 命令行中的 *,?和正则表达式中的*,?是否一样? 自打好多年前接触 DOS,就知道了* 和?这两个通配符(Wildcard),象 dir *.* ...

  7. PHP中的常用正则表达式集锦

    PHP中的常用正则表达式集锦: 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xf ...

  8. Visual Studio 中使用的正则表达式 说明

    Visual Studio 中使用的正则表达式 说明 2013-10-11 21:10:12|  分类: VB和VBA知识|举报|字号 订阅       参考:详解Visual Studio正则替换大 ...

  9. 在C语言中利用PCRE实现正则表达式

    1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...

随机推荐

  1. Java全栈学习路线、学习资源和面试题一条龙

    肝了一个月,终于把Java学习路线.面试题资源和电子书资源都整理好了. Java 从基础到微服务的学习路线,其中还包括科班知识.学习建议.后续的学习引导和相应的学习资源(视频.书籍.网站),还整理了J ...

  2. Python基础—装饰器(Day11)

    装饰器 1.装饰器是在不改变原函数的执行的情况下为原函数增额外的功能. 简单版装饰器import time def func1(): print('执行速度') def timmer(f): star ...

  3. MyBatisPlus根据ID修改对应的值,其他属性不变.如何实现?

    1.基本操作 // 修改订单的状态为已发货和已支付 Order order = new Order(); order.setSend(1); // 已发货 order.setPay(1); // 已支 ...

  4. [Java]Java入门笔记(二):数据类型、程序结构、数组、控制台输入

    二.基本语法 2.1 标识符 定义:给类.方法.变量等起的名字 规则: 可以使用字母(26个英文字母的大小写.各国的一些语言.-).数字.下划线.美元符号: 不能以数字开始(可以$开始): 不能是Ja ...

  5. 谁说EXCEL不能处理大数据?那是你用错了工具

    我是一名数据分析师,每天需要和各种各样的数据和表格打交道,是一名名副其实的"表哥",不仅需要制作和更新公司里的日报.周报和月报,有时候也要为公司的会议准备各种数据材料.由于公司的业 ...

  6. WPF 开发,优化 AvalonEdit 显示单行超长文本的性能。

    路遥工具箱内置了一个名为"JSON 格式化"的功能.通过该功能可以将 JSON 字符串进行美化和简化(设置缩进和取消缩进). 该功能上线后收到很多客户的反馈:大部分经由网络传输的J ...

  7. RESTful风格了解

    最近在学习springboot,一直听到一个词叫RESTful风格,今天找了一下书了解了一番.spring mvc除了支持json数据交互外,还支持RESTful风格 RESTful也称为REST(r ...

  8. 【windows 访问控制】十、词汇列表和对应C#类、枚举、命名空间

    principals:主体 主体包含标识(identity 对用来来说就是用户名,对程序来说就是SID)和用户角色(role 对用户来说就是 组名 对程序来说就是组SID)subject:主体.主语i ...

  9. IndexError:list assignment index out of range

    L=[] L[0]=2 L[1]=3 报错:IndexError: list assignment index out of range,列表超过限制 一种情况是:list[index]的index超 ...

  10. C语言中一些知识点

    1.学编程:找代码,读代码,改代码,写代码:少看书.但少看不是不看,看一本书要限制在一天内.任务是通读书中主要的概念,明白大致是干什么用的,形成一个大概的框架:然后一周内干掉书中全部代码,代码不理解再 ...