snort规则byte_extract选项详解

        byte_extract是snort规则语法中一个针对payload的算数逻辑运算规则选项,它的主要功能是从payload的指定位置获取指定长度的数据,并转换为数值,存储到指定的变量中,供规则中其它规则选项使用。

规则语法

规则样式

byte_extract: <num of bytes>, <offset> ,<var_name> , [,relative] [,multiplier  <mult-value> ] [,<endian>] [, dce] [, string [, <num_type>] [, align <align-value];

规则参数说明

参数

功能

<num of bytes>

从payload中选择提取的字节数

<offset>

从payload中开始提取内容的位置(offset若有relative修饰,则是当前位置加offset,若无relative修饰,则为payload开始位置偏移offset)

<var_name>

存储最终转换数值的变量名字

[relative]

Offset相对于最后一个匹配的content的偏移位置

multiplier <mult-value>

转换后的数值需要增加<mult-value>倍

<endian>

采用哪种模式处理指定内存中的数据:big/little

string <num_byte>

将字符串按照哪种进制转换成数值:hex(十六进制)/dec(十进制)/oct(八进制)

[dce]

允许DCE协议确定字节顺序(因为它自己确定字节序,故不能和endian类选项同时存在)

align <align-value>

按照align_value指定的数值对齐得到最终数值(align-value的取值只能是2或者4)

规则功能

         byte_extract的功能从payload的指定偏移的offset(offset若有relative修饰,则是当前位置加offset,若无relative修饰,则为payload开始位置偏移offset)位置,取nbytes个字符,按照字符串string(就是将字符串表示的值转换为对应的数值)或者大端或者小端的形式转换为数值a,然后将数值a乘以multiplier指定的mult_value值得到数值b,若设置了align选项,则按照align_value指定的数值对齐得到数值c,并将数值c设置到var_name代表的local_id中,供规则中其它选项使用,det_ctx->buffer_offset+nbytes (dce:针对dcerpc的检测,需要根据dcerpc的数据大小端处理方式,去处理内存中的数据)(若为little,则转换后得内存块内容不变,若为大端序,则内存块中的内容按照字节顺序颠倒)

注意:

       byte_extract、byte_math都是通过取指定位置的字节数运算得到结果,存储到规则临时变量中,供当前规则的其它选项使用。

实现原理

       关于byte_extract规则选项的实现原理,下面以suricata为例,展示byte_extract规则选项的语法功能实现原理。

规则选项编译

        选项编译即为获取规则中针对byte_extract规则选项的约束条件字符串,然后根据byte_extract规则选项的语法格式,对字符串进行解码。具体步骤如下:

  1. 获取byte_extract规则选项约束条件字符串;
  2. 对字符串以逗号为分割符,依次分割获取对应number of bytes/offset/value name这些基础信息字符串,并转换为对应的格式获取内容。
  3. 然后根据选择约束条件关键字依次判断是否含有该选择约束条件,并获取relative/ multiplier/endian/dce/ num_byte/align_value这几类选项的约束信息
  4. 将根据约束条件解码获取的信息存入新创建的DetectByteExtractData对象中
  5. 根据解码信息检测约束条件内容组合是否合规(如:若约束条件中含有dce属性,则不饿能含有endian属性,若同时含有则该约束选项不正确)

根据当前规则中已编译的byte_extract的数量,对当前规则选项DetectByteExtractData对象的local_id成员进行编号

规则选项检测

        在byte_extract规则选项检测过程中,根据待检测的payload内容,取一定的数值进行相关的操作,获取最终的数值存储到当前线程的byte_value对象中,供该规则的其它规则选项使用。具体检测逻辑如下:

  1. 获取待检测的payload数据;
  2. 根据选项约束条件中是否有relative及offset的值,确定数据的提取位置;
  3. 根据选项约束条件中的number bytes大小获取对应长度的待处理数据;
  4. 根据选项的约束条件中的endian配置,将指定长度的数据,按照指定的格式转换为数值;
  5. 根据选项的约束条件中的multiplier设置,将数值扩大指定的倍数,若未设置,则默认扩大一倍;
  6. 根据选项的约束条件中的align vlaue设置,确定数值是按照2的倍数还是4的倍数对齐,并对数值进行相应的对齐操作,若未设置,则默认不做对齐处理;
  7. 将处理后的数值,存入当前线程的byte_value对象中,供后续其它规则选项检测使用。

源码位置

suricata/src/detect-byte-extract.c

关键入口函数

  1. 规则编译入口函数: DetectByteExtractSetup
  2. 规则匹配入口函数: DetectByteExtractDoMatch
  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值