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规则选项的语法格式,对字符串进行解码。具体步骤如下:
- 获取byte_extract规则选项约束条件字符串;
- 对字符串以逗号为分割符,依次分割获取对应number of bytes/offset/value name这些基础信息字符串,并转换为对应的格式获取内容。
- 然后根据选择约束条件关键字依次判断是否含有该选择约束条件,并获取relative/ multiplier/endian/dce/ num_byte/align_value这几类选项的约束信息
- 将根据约束条件解码获取的信息存入新创建的DetectByteExtractData对象中
- 根据解码信息检测约束条件内容组合是否合规(如:若约束条件中含有dce属性,则不饿能含有endian属性,若同时含有则该约束选项不正确)
根据当前规则中已编译的byte_extract的数量,对当前规则选项DetectByteExtractData对象的local_id成员进行编号
规则选项检测
在byte_extract规则选项检测过程中,根据待检测的payload内容,取一定的数值进行相关的操作,获取最终的数值存储到当前线程的byte_value对象中,供该规则的其它规则选项使用。具体检测逻辑如下:
- 获取待检测的payload数据;
- 根据选项约束条件中是否有relative及offset的值,确定数据的提取位置;
- 根据选项约束条件中的number bytes大小获取对应长度的待处理数据;
- 根据选项的约束条件中的endian配置,将指定长度的数据,按照指定的格式转换为数值;
- 根据选项的约束条件中的multiplier设置,将数值扩大指定的倍数,若未设置,则默认扩大一倍;
- 根据选项的约束条件中的align vlaue设置,确定数值是按照2的倍数还是4的倍数对齐,并对数值进行相应的对齐操作,若未设置,则默认不做对齐处理;
- 将处理后的数值,存入当前线程的byte_value对象中,供后续其它规则选项检测使用。
源码位置
suricata/src/detect-byte-extract.c
关键入口函数
- 规则编译入口函数: DetectByteExtractSetup
- 规则匹配入口函数: DetectByteExtractDoMatch