Loading

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关键字可以为选项memcapprealloc_memcaoprealloc_frags指定值,而无需预处理器检查用于基本配置的流量。其他选项已解析但未使用,任何有效的配置都可能添加了“禁用”。

引擎配置:

  • 预处理名称:frag3_engine
  • 可用选项:注意:引擎配置选项以空格分隔。
    • time <seconds> 片段超时,引擎中超过此时间段的片段将自动删除,默认值为60秒。
    • min_ttl <value> 对于一个分段包的最小可接受的TTL值,默认为1,次选项的可接受范围是1-255
    • detect_anomalies 检测片段异常
    • bind_to <ip_list> 绑定此引擎的IP列表,该引擎仅对IP地址列表中包含目标地址的数据包运行,默认值为all
    • overlay_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请求或响应使用保留的功能代码

posted @ 2021-09-27 17:27  鱼儿叁  阅读(891)  评论(1编辑  收藏  举报