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{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請求或響應使用保留的功能代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM