以下均學習自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{502} |
選項說明:
-
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{20000} |
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請求或響應使用保留的功能代碼