Snort预处理(部分)
以下均学习自https://www.wangan.com/docs/1166
1 预处理器简介
预处理器允许用户和程序员相当容易地将模块化插件放入Snort中,从而拓展了Snort的功能。在调用检测引擎之前,但在对数据包进行解码之后,将运行预处理器程序代码。可以使用此机制带外方式修改或分析数据包,可以察看Snort源代码doc目录中的README.PLUGN文件,也可以在templates目录中查看源代码示例。
使用preprocessor
关键字加载和配置预处理器,Snort配置文件中预处理器指令的格式为:
preprocessor <name>: <options>
2 预处理器分类
2.1 Frag3
frag3预处理器是Snort的基于目标的IP碎片模块整理。Frag3的设计目标如下:
- 1、快速执行,不需要复杂的数据管理
- 2、基于目标的主机建模防规避技术
2.1.1 Frag3配置
激活frag3至少需要两个预处理器程序指令,一个全局配置指令和一个引擎实例化。在启动时可以定义任意数量的具有其自身配置的引擎,但是只有一个全局配置。
全局配置:
- 预处理器名称
frag3_global
- 可用选项:注意:全局配置选项以逗号分隔。
max_frags <number>
要跟踪的最大同时碎片数,默认值为8192。memcap <bytes>
用于自我保存的内存上限。默认值为4MB。prealloc_memcap <bytes>
备用内存管理模式,使用基于内存上限的预分配片段节点(在某些情况下更快)prealloc_frags <number>
备用内存管理模式,使用预分配的片段节点(在某些情况下更快)disable
任何策略都允许使用此可选关键字以避免数据包处理,此选项禁用此配置的预处理器,但不禁用多个配置的其他实例。在基本配置中使用disable关键字可以为选项memcap
,prealloc_memcao
和prealloc_frags
指定值,而无需预处理器检查用于基本配置的流量。其他选项已解析但未使用,任何有效的配置都可能添加了“禁用”。
引擎配置:
- 预处理名称:
frag3_engine
- 可用选项:注意:引擎配置选项以空格分隔。
time <seconds>
片段超时,引擎中超过此时间段的片段将自动删除,默认值为60秒。min_ttl <value>
对于一个分段包的最小可接受的TTL值,默认为1,次选项的可接受范围是1-255detect_anomalies
检测片段异常bind_to <ip_list>
绑定此引擎的IP列表,该引擎仅对IP地址列表中包含目标地址的数据包运行,默认值为alloverlay_limit <number>
限制每个数据包的重叠片段数,默认值为“0”(无限制)。此配置选项采用等于或大于零的值,这是一个可选参数,必须配置detect_anomalies选项,此选项才能生效min_fragment_length <number>
定义应视为有效的最小片段的大小(有效负载大小)。如果还配置了detect_anomalies,。则小于或等于此限制的片段别认为是恶意的,并引发事件。默认值为“0”(无限制),最小值为“0”。这是一个可选参数,必须配置detect_anomalies选项,此选项才能生效。policy <type>
选择基于目标的碎片整理模式。可用的类型为first,last,bsd,bsd-right,linux,windows和solaris。默认类型为bsd
2.1.2 格式
请注意,在下面的高级配置中,指定了三个运行Linux的引擎,并分配了第一个和最后一个策略。前面两个引擎绑定到特定的IP地址范围,最后一个引擎适用于所有其他流量。不属于前两个引擎的地址要求的数据包将自动进入第三个引擎。
2.1.2.1 基本配置
preprocessor frag3_global
preprocessor frag3_engin
2.1.2.2 高级配置
preprocessor frag3_global: prealloc_nodes 8192
preprocessor frag3_engine: policy linux bind_to 192.168.1.0/24
preprocessor frag3_engine: policy first bind_to [10.1.46.0/24,172.16.8.0/24]
preprocessor frag3_engine: policy last detect_anomalies
2.1.3 Frag3警报输出
Frag3能够检测八种不同类型的异常,它的事件输出是基于数据包的,因此它将与Snort的所有输出模式一起使用。
2.2 Session
TODO
2.3 Modbus预处理器
Modbus预处理器是一个Snort模块,可对Modbus协议进行解码。他还提供了访问某些协议字段的规则选项,这使用户可以编写Modbus数据包规则,而无需使用一系列"content"和"byte_test"选项对协议进行解码。Modbus是SCADA网络中使用的协议。如果您的网络不包含任何启用了Modbus的设备,建议关闭此预处理器。
2.3.1 依赖性要求
为了使预处理器正常工作:
- 流会话跟踪必须启用,即stream5。必须在stream5中启用TCP或UDP。预处理器需要会话跟踪器来保留其数据。
- 必须启用协议感知刷新(PAF)。
- 应该启用IP碎片整理,即应该启用和配置frag3预处理程序。
2.3.2 预处理器配置
首先,必须启动Modbus预处理器。预处理器名称为modbus
。
preprocessor modbus
选项语法:
选项 | 语法 | 是否必要 | 默认 |
---|---|---|---|
ports | 没有 | portes |
选项说明:
-
ports
这指定在哪些端口上检查Modbus消息,通常,这将包括502.语法 ports { <ports> [<ports> <...>] } 示例 ports { 502 1233 3945 } 默认配置 preprocessor modbus
2.3.3 规则选项
Modbus预处理器添加了3个新规则选项。这些规则选项在Modbus表头的各个部分上匹配:
modbus_func
modbus_unit
modbus_data
必须启用预处理器才能是这些规则选项起作用。
modbus_func
次选项与Modbus头内部的功能代码匹配。该代码可以是数字(十进制格式),也可以是下面提供的列表中的字符串。
modbus_func:<code>
code = 0-255 |
"read_coils" |
"read_discrete_inputs" |
"read_holding_registers" |
"read_input_registers" |
"write_single_coil" |
"write_single_register" |
"read_exception_status" |
"diagnostics" |
"get_comm_event_counter" |
"get_comm_event_log" |
"write_multiple_coils" |
"write_multiple_registers" |
"report_slave_id" |
"read_file_record" |
"write_file_record" |
"mask_write_register" |
"read_write_multiple_registers" |
"read_fifo_queue" |
"encapsulated_interface_transport"
示例:
modbus_func: 1;
modbus_fucn: write_multiple_coils;
modbus_unit
次选项与Modbus标头中的Unit ID字段匹配。
modbus_unit: <unit>;
unit = 0 - 255;
示例:
modbus_unit: 1;
modbus_data
此规则选项将光标设置在Modbus请求/响应中"数据"字段的开头。
modbus_data
;
示例:
modbus_data; content: "badstuff";
2.3.4 预处理器事件
Modbus预处理将GID 144用于其预处理器事件。
SID | 描述 |
---|---|
1 | Modbus标头中的长度与所需的长度不匹配 |
-- | 每个Modbus功能都有用于请求和响应的预期格式 |
-- | 如果报文长度与预期格式不符,警报生成 |
2 | Modbus协议ID不为零 |
-- | 协议ID字段用于将其他协议与Modbus。由于预处理器无法处理其他协议,生成此警报 |
3 | 保留的Modbus功能代码正在使用中 |
2.4 DNP3预处理器
DNP3预处理器是一个Snort模块,可对DNP3协议进行解码。它还提供了访问某些协议字段的规则选项,这允许用户编写DNP3数据包的规则,而无需使用一些列"content"和"byte_test"选项对协议进行解码。DNP3是SCADA网络中使用的协议,如果您的网络不包含任何启用DNP3的设备,建议关闭此预处理器。
2.4.1 依赖性要求
为了使预处理器正常工作:
- 流会话跟踪必须启用,即stream5。必须在stream5中启用TCP或UDP。预处理器需要会话跟踪器来保留其数据。
- 必须启用协议感知刷新(PAF)。
- 应该启用IP碎片整理,即应该启用和配置frag3预处理器程序。
2.4.2 预处理器配置
首先,必须启用DNP3预处理器。预处理器程序名称是dnp3
。
preprocessor dnp3
选项 | 语法 | 是否必要 | 默认 |
---|---|---|---|
ports | 没有 | ports | |
memcap | 没有 | memcap262144 | |
check_crc | NONE | 没有 | 关 |
disable | NONE | 没有 | 关 |
选项说明:
port
这指定在哪些端口上检查DNP3消息。通常,这将包括20000。
句法: `ports { <port> [<port><...>] }`
例子: `ports { 20000 12345 11111 }`
注意: "{"和"}"之前和之后都有空格。
memcap
最大数量分配给DNP3预处理以进行会话跟踪的内存量。参数以字节为单位,每个会话大约需要4KB的跟踪内存,默认值为256KB。这使预处理器能够同时跟踪63个DNP3会话。将memcap设置为4144字节以下将导致致命错误,当使用多个配置时,非默认配置中的memcap将被默认配置配置中的memcap覆盖。如果默认配置不适用于检查DNP3流量的,请使用"disabled"关键字。check_crc
此选项使预处理器验证DNP3链接层帧包含的校验和,校验和无效的帧将被忽略,如果启用了响应的预处理器程序规则,则无效的校验和将生成警报。相应的规则是GID 145,SID 1。disable
次选项用于加载预处理器而不检查任何DNP3流量。在禁用时,DNP3预处理器在一个单独的策略已开启的关键字是唯一有用的。
默认配置: preprocessor dnp3
2.4.3 规则选项
DNP3预处理器添加了4个新规则选项,这些规则选项在DNP3标头的各个部分上匹配。
dnp3_func
dnp3_obj
dnp3_ind
dnp3_data
必须启用预处理器才能使这些规则选项起作用。
dnp3_func
该选项与DNP3应用程序层请求/响应标头中的功能代码匹配。该代码可以是数字(十进制格式),也可以是下面提供的列表中的字符串。
语法:
dnp3_func:<code>
code = 0-255 |
"confirm" |
"read" |
"write" |
"select" |
"operate" |
"direct_operate" |
"direct_operate_nr" |
"immed_freeze" |
"immed_freeze_nr" |
"freeze_clear" |
"freeze_clear_nr" |
"freeze_at_time" |
"freeze_at_time_nr" |
"cold_restart" |
"warm_restart" |
"initialize_data" |
"initialize_appl" |
"start_appl" |
"stop_appl" |
"save_config" |
"enable_unsolicited" |
"disable_unsolicited" |
"assign_class" |
"delay_measure" |
"record_current_time" |
"open_file" |
"close_file" |
"delete_file" |
"get_file_info" |
"authenticate_file" |
"abort_file" |
"activate_config" |
"authenticate_req" |
"authenticate_err" |
"response" |
"unsolicited_response" |
"authenticate_resp"
dnp3_data
当Snort处理DNP3数据包时,DNP3预处理器将收集链路层帧。并将其重新组合成应用层片段,次规则选项将光标设置在"应用程序层片段"的开头,已使其他规则选项可以处理重组后的数据。使用dnp3_data
规则选线,您可以基于分片中的数据编写规则。而无需拆分数据并每16个字节添加CRC。
句法: dnp3_data;
示例: dnp3_data; content: "badstuff_longer_than_16chars";
2.4.4 预处理器事件
DNP3预处理器将GID 145用于其预处理器事件。
里面很多是直接抄的,描述可能不准确,具体我也不知道是啥,以后看源码的时候会重新更新
|SID|描述|
--|--|--
1|链路层帧包含无效CRC
--|(在于处理器程序配置中启用check_crc
已获取此警报)
2|由于长度无效,DNP3链路层框架被丢弃
3|重组过程中删除了一个传输层段
--|当段的序列号无效时,会发生这种情况
4|在完整片段能够被清除之前,DNP3重组缓冲区被清除
--|重新组装
--|当带着"FIR"标志的端出现在某段之后,就会发送这种情况
--|其他细分市场已经排队
5|DNP3链路层帧大于260字节
6|DNP3链路层框架使用保留地址
7|DNP3请求或响应使用保留的功能代码