Snort的工作原理


Snort 工作流程分為以下四個主要部分:

1、包捕獲/解碼引擎:首先,利用libpcap從網卡捕獲網絡上的數據包,然后數據包經過解碼引擎填入到鏈路層協議的包結構體中,以便對高層次的協議進行解碼,如TCP和UDP端口。

2、預處理器插件:接着,數據包被送到各種各樣的預處理器中,在檢測引擎處理之前進行檢查和操作。每個預處理器檢查數據包是否應該注意、報警或者修改某些東西。

3、規則解析和檢測引擎:然后,包被送到檢測引擎。檢測引擎通過各種規則文件中的不同選項來對每個包的特征和包信息進行單一、簡單的檢測。檢測引擎插件對包提供額外的檢測功能。規則中的每個關鍵字選項對應於檢測引擎插件,能夠提供不同的檢測功能。

4、輸出插件:Snort通過檢測引擎、預處理器和解碼引擎輸出報警。

 

詳細工作流程:

一、包捕獲/解碼引擎:

1、數據包捕獲:

Snort通過兩種機制來滿足網絡流量的需要:將網卡設置為混雜模式;利用libpcap從網卡捕獲網絡數據包。

網卡的默認工作方式是忽略所有不是自己的MAC地址為目的地址的流量。通過將網卡設置成混雜模式,可以監聽網絡中的所有流量。

數據包捕獲函數庫是一個獨立的軟件工具,數據包捕獲庫函數能直接從網卡獲取數據包。Snort就是通過調用該庫函數從網絡設備上捕獲數據包。它工作在OSI模型的數據鏈路層。在不同的平台上使用Snort系統,需要安裝不同版本的Libpcap,比如在Linux和Unix系統下需要安裝Libpcap,而在Windows系列系統下,就需要安裝Winpcap。

2、包解碼:

對已經到達網卡並且被lipcap庫函數捕獲的數據包,Snort需調用解碼引擎對數據鏈路層的原始數據包進行解碼。Snort能夠識別以太網、802.11(無線局域網協議)、令牌環以及諸如IP、TCP和UDP等高層協議。Snort將捕獲的數據包解析后,存儲在內存中指針指向的數據結構中。

二、預處理器:

Snort卓越的速度源於簡單的規則匹配,如果只對每個包進行數字和字符串的匹配,處理性能就能適應快速的高負載網絡。這種檢測系統的缺點是,如果攻擊模式很常見,就會產生很多誤報。如果模式過於特殊,又會產生漏報。造成這些缺陷的原因是特征語言的表達能力有限或IDS對協議的分析不夠,一些IDS通過復雜的方法解決這一問題。它們有些使用協議異常檢測來對不符合協議規范的包報警,有些則保持連接狀態,並只對處於以連接TCP會話中的包報警。

Snort則通過預處理器來實現這些功能,Snort有多個預處理器,包括frag2,stream4,http_decode,Telnet_negotiation,portscan,rpc_decode等常用的預處理器。這些預處理器的主要功能為:1)包重組;2)協議解碼;3) 異常檢測;。

1、包重組:

基於特征的檢測將包數據和定義良好的模式進行匹配。但是不能對跨包的數據進行檢測。通過frag2插件將分片重組到一個完整包中,可以確保攻擊者不能用IP分片來躲避檢測。通過stream4插件進行流重組,我們可以用單包特征機制在TCP會話中跨越多個包進行模式匹配。最后,通過stream4的狀態維護功能,特征匹配可以具備一些智能,來判斷哪些包應該丟棄,哪些包處於鏈接中。用一句話總結,包重組預處理器幫助Snort檢測匹配數據分布在多個包中的攻擊。

2、協議解碼:

基於規則的檢測提供簡單的串/位匹配的功能,但無法檢測HTTP協議中不同形式的URL,除非使用無限大的規則集。 http_de-code預處理器幫助Snort在規則匹配前規范化URL。簡單的規則匹配還可能因為數據中間插入的協議信息而失敗。Telnet_negoti-ation和rpc_decode預處理器去除數據中不應該進行模式匹配的部分,rpc_decode預處理合並RPC消息分片,Telnet_negotiation預處理器去除Telnet的協議協商過程。用一句話總結,協議解碼預處理對協議數據進行處理,使串匹配功能在更明確的數據上工作。

3、異常檢測:

基於規則的檢測由於其簡單性而工作可靠。它的過程精確,可以很容易地調整配置減少誤報,也容易進行優化。但是,有些攻擊無法通過這種模式來檢測。Snort發展了協議異常檢測:portscan預處理器允許Snort跟蹤在一個時間段內接收的掃描類型的包,對超過閾值的情況進行報警;BackOrifice預處理器使Snort不用巨大的規則集就可以檢測加密的BackOrifice流量。

 

三、規則解析和檢測引擎:

Snort規則是基於文本的,它通常存在於Snort程序目錄中或者子目錄中。在啟動的時候,Snort讀取所有的規則文件,並且建立一個三維的鏈表。Snort使用列表匹配包和檢測。

1、規則解析:

Snort規則是Snort入侵檢測系統的重要組成部分。規則集是snort的攻擊特庫,每條規則都對應一條攻擊特征,snort通過它來識別攻擊行為。

每一條規包括兩個部分:規則頭部(RuleHeader)和規則選項(RuleOption)。規則頭包含規則的行為、協議、源地址、目的地址、子網掩碼、源和目的端口信息。規則選項包含報警信息以及規則觸發時提供給管理員的參考信息。例如: alerttcpanyany->202.203.112.0/24any(content:“proxy-connection”;msg:“proxyuse”;) 這條規則述信息是:對任何訪問202.203.112網段,tcp報文中含有proxy-connection的流量報警。在這個例子中,左括號前面是規則頭。圓括號內的內容是規則選項,在規則選項中,content后面的內容為關鍵字,及需要匹配的字符串,msg后面的內容為規則觸發時將顯示的信息。Snort的規則定義中可以沒有規則體,它們只是用來更好地定義所要進行的某種處理(記錄、報警、忽略等)的數據包類型。只有當規則中的每一個元素都為真時,才能觸發對應的規則動作。

2、檢測引擎:

Snort把具有相同條件的規則鏈接到一個集合中,用RTN結構來描述;規則選項對應於規則選項結點OTN(OptionalTreeNode),包含一些特定的檢測標志、報警信息、匹配內容等條件,每個選項的匹配子函數(插件)放到FUNC鏈表中。只有當規則的各個條件都為真時才觸發相應的操作。

Snort解析規則時,分別生成TCP、UDP、ICMP和IP這4個不同的規則樹,每一個規則樹包含獨立的三維鏈表:RTN(規則頭),OTN(規則選項)和FUNC(指向匹配子函數的指針)。 當Snort捕獲一個數據報時,首先對其解碼,然后進行預處理,再利用規則樹對數據報進行匹配。在規則樹匹配過程中:根據該數據報的IP協議決定與哪個規則樹進行匹配;然后與RTN結點依次進行匹配,當與某個規則頭相匹配時,接着向下與OTN結點進行匹配。每個OTN結點都包含了一條規則的全部選項,它包含的一組函數指針就是用來實現對這些條件的匹配操作。當檢測得知數據報與某個OTN結點的所有條件相符合時,即判斷此數據報為攻擊報文。

為提高規則匹配的速度,Snort采用了Boyer-Moore字符串匹配算法、二維列表遞歸檢索(RTN和OTN)以及函數指針列表(稱為“三維列表”)等方法。

 

三、輸出插件:

抓包引擎從網絡獲取數據包並發送給分析模塊,如果包觸發了報警或日志事件,那么數據就發送給相應的輸出插件。輸出插件在預處理器和抓包引擎執行完之后調用Snort報警和日志子系統時執行。

Snort輸出插件的功能可以分為7個部分:版權和頭信息;頭文件、依賴關系和全局變量;關鍵字注冊;參數分析和函數列表鏈;數據處理,格式化和存儲;處理預處理器參數;清理和退出。下面詳細描述插件的各功能。

1、版權和頭信息現存的每一個輸出插件都含有鮮明的版權信息,版權信息可以由插件開發者自主添加。插件的頭詳細描述了插件的用途,需要的參數、結果以及其他注釋。

2、頭文件,依賴關系和全局變量就絕大部分應用而言,文件以及它們之間的依賴關系對程序至關重要,而且要自釋其意。全局變量在整個插件的任何部分都可以使用。

3、關鍵字注冊輸出插件通過配置文件和命令行引用和調用。用戶必須為插件定義關鍵字並把該關鍵字連接到Snort,以便分析該關鍵字時作相應的特殊處理。

4、參數分析和函數列表鏈大部分插件在聲明時需要傳遞參數,因此有必要寫一些代碼來處理這些數據。例如,當使用日志功能時,可能需要指定一個用於存儲日志的日志文件名。除了分析參數,插件還必須鏈接Snort主引擎內的函數。

5、數據處理、格式化和存儲數據處理、格式化和存儲是插件最主要的功能,可以這么說,如果沒有數據處理、格式化和存儲這些功能,輸出插件就不完整,沒有用。

6、處理預處理器參數在有預處理器參數存在時,必須寫數據處理代碼來處理這些參數,這樣在分析開始之前,Snort和輸出插件就能區分預處理器單元。

7、清理和退出,在絕大多數情況下,需要在插件中包含清理內存、應用連接以及打開套接字的退出處理代碼,這樣可以提高Snort的執行效率。 Snort能夠使用輸出插件來匯報和表示數據,Snort支持多種日志格式,包括直接的文本頭、PCAP、UNIXsyslog、XML文本數據庫和多種關系數據庫,這些輸出插件使得報警和日志以更加靈活的格式和表現形式呈現給管理員。如果沒有輸出插件來處理、存儲和格式化數據,包分析和流量分析是沒有任何意義的。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com