[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 工具 > 正文
Snort分析報告
本文出自:http://sinbad.dhs.org 作者:不詳 (2002-12-16 06:02:00)


1.--snort的簡介 
snort 是一個基libpcap的數據包嗅探器並可以作為一個輕量級的網絡入侵檢測系統( 
NIDS)。所謂的輕量級是指在檢測時盡可能低地影響網絡的正常操作,一個優秀的輕量 
級的NIDS應該具備跨系統平台操作,對系統影響最小等特征並且管理員能夠在短時間內 
通過修改配置進行實時的安全響應,更為重要的是能夠成為整體安全結構的重要成員。 
Snort作為其典型范例,首先可以運行在多種操作系統平台,例如UNIX系列和Windows 9 
X.(需要libpcap for Win32的支持),與很多商業產品相比,它對操作系統的依賴性比 
較低。其次用戶可以根據自己的需要及時在短時間內調整檢測策略。就檢測攻擊的種類 
來說,據最新數據表明(2000/12/4)snort共有21類(???)1271條檢測規則,其中包括 
對緩沖區溢出,端口掃描和CGI攻擊等等。SNORT集成了多種告警機制來提供實時告警功 
能,包括:syslog、用戶指定文件、UNIXSocket、通過SMBClient使用WinPopup對Windo 
ws客戶端告警。 Snort的現實意義維作為開源軟件填補了只有商業入侵檢測系統的空白 
,可以幫助中小網絡的系統管理員有效地監視網絡流量和檢測入侵行為。 

2.snort與其他工具的比較。 
Snort的主要用途就是網絡監視、數據包的記錄和檢測入侵行為,下面是與分別具有上述 
兩種功能的典型工具的比較。 

1)--snort與tcpdump的比較 
Tcpdump是最為經典的嗅探工具,主要是用記錄網絡數據,網絡故障的探測診斷工具。 
Snort與它的最大的共同之處在都是基libpcap的並且支持BPF過濾機制,所以本質上 
都是調用的捕獲數據包的庫函數,但是snort的目的不僅僅是在記錄這個數據包而是從 
安全的角度考慮出發區解析它,並且tcpdump主要是分析第二層或者第三層的報文來進行 
網絡故障診斷,而snort則主要針對應用層的數據進行分析從而實現檢測入侵行為。除 
此之外,由tcpdump旨在快速完整地記錄流量,所以它制定了特殊的輸出格式,速度快 
但是不易看懂,而snort就提供了更為友好的輸出格式,有利系統管理員的直接分析。 

--Figure 1 - Typical Snort telnet packet display: 
-------------------------------------------------------------------------- 
20:59:49.153313 0:10:4B:A9:66 -> 0:60:97:7:C2:8E type:0x800 len:0x7D 
192.168.1.3:23 -> 192.168.1.4:1031 TCP TTL:64 TOS:0x10 DF 
***PA* Seq: 0xDF4A6536 Ack: 0xB3A6FD01 Win: 0x446A 
FF FA 22 03 03 E2 03 04 82 0F 07 E2 1C 08 82 04 .."............. 
09 C2 1A 0A 82 7F 0B 82 15 0F 82 11 10 82 13 FF ................ 
F0 0D 0A 46 72 65 65 42 53 44 20 28 65 6C 72 69 ...FreeBSD (elri 
63 2E 68 6F 6D 65 2E 6E 65 74 29 20 28 74 74 79 c.home.net) (tty 
70 30 29 0D 0A 0D 0A p0).... 
--------------------------------------------------------------------------- 
--Figure 2 - The same telnet packet as displayed by tcpdump: 
--------------------------------------------------------------------------- 
20:59:49.153313 0:10:4b:d:a9:66 0:60:97:7:c2:8e 0800 125: 192.168.1.3.23 > 
192.168.1.4.1031: P 76:147(71) ack 194 win 17514 (DF) [tos 0x10] (ttl 64, 
id 660) 
4510 006f 0294 4000 4006 b48d c0a8 0103 
c0a8 0104 0017 0407 df4a 6536 b3a6 fd01 
5018 446a d2ad 0000 fffa 2203 03e2 0304 
820f 07e2 1c08 8204 09c2 1a0a 827f 0b82 
150f 8211 1082 13ff f00d 0a46 7265 6542 
5344 2028 656c 7269 632e 686f 6d65 2e6e 
6574 2920 2874 7479 7030 290d 0a0d 0a 
--------------------------------------------------------------------------- 

2)--snort與NFR的比較 
根據Denmac System公司1999年11月的現有商用網絡入侵檢測工具的調查結果表明,NFR 
的綜合性能指數高ISS公司的RealSecure和CA公司的SessionWall,所以其代表了目前 
國際上的IDS的最高水準,是一個比較成熟的商業產品。Snort的許多設計思想類似NF 
R,但是在很多方面都顯出不足之處,例如無法實現IP Defragmentation等功能,在探測 
規則語言的格式上來說,NFR採用的是一種深層次的腳本語言,SNORT與其相比就略顯單 
薄。但是snort的優勢就在它是開源軟件,全世界的愛好者都可以加入它的開發升級工 
作中來,其前景是無法限量的。 

2.--原理 
snort作為一個NIDS[注:基網絡的入侵檢測系統(NIDS),其工作原理為在基共享 
網絡上檢測原始的網絡傳輸數據,通過分析捕獲的數據包,主要工作為匹配入侵行為的 
特征或者從網絡活動的角度檢測異常行為,進而採取入侵的預警或記錄。從檢測模式而 
言,snort屬是誤用檢測(misuse detection)。[注:該方法對已知攻擊的特征模式 
進行匹配,包括利用工作在網卡混雜模式下的嗅探器被動地進行協議分析,以及對一系 
列數據包解釋分析特征。]從本質上上來說,snort是基規則檢測的入侵檢測工具,即 
針對每一種入侵行為,都提煉出它的特征值並按照規范寫成檢驗規則,從而形成一個規 
則數據庫。其次將捕獲得數據包按照規則庫逐一匹配,若匹配成功,則認為該入侵行為 
成立。目前,snort的檢測規則庫主要包括了以下幾類的入侵行為: 
snort的結構主要分為三個部分如圖n-1: 

l--數據包捕獲和解析子系統(Capture Packet Mechanism from link layer and the 
packet decoder ): 
該子系統的功能為捕獲網絡得傳輸數據並按照TCP/IP協議的不同層次將數據包進行解析 
。Snort利用libpcap庫函數進行採集數據, 該庫函數可以為應用程序提供直接從鏈路層 
捕獲數據包的接口函數並可以設置數據包的過濾器以來捕獲指定的數據。(的詳細介紹 
請參閱附錄N)。網絡數據採集和解析機制是整個NIDS實現的基礎,其中最關鍵的是要保 
証高速和低的丟包率,這不僅僅取決軟件的效率還同硬件的處理能力相關。對解析 
機制來說,能夠處理數據包的類型的多樣性也同樣非常重要,目前,snort可以處理以太 
網,令牌環以及SLIP等多種鏈路類型的包。 

l--檢測引擎(the detect engine) 
檢測引擎是一個NIDS實現的核心,準確性和快速性是衡量其性能的重要指標,前者主要 
取決對入侵行為特征碼的提煉的精確性和規則撰寫的簡潔實用性,由網絡入侵檢測 
系統自身角色的被動性只能被動的檢測流經本網絡的數據,而不能主動發送數據包 
去探測,所以只有將入侵行為的特征碼歸結為協議的不同字段的特征值,通過檢測該特 
征值來決定入侵行為是否發生。者主要取決引擎的組織結構,是否能夠快速地進行 
規則匹配。 

Snort採用了靈活的插件形式來組織規則庫,即按照入侵行為的種類劃分為相應的插件, 
用戶可以根據需要選取對應的插件進行檢測。目前包括的插件分別如下: 
每一類插件中包括了數十條的檢測規則,分別代表同一類型的不同入侵行為。對規則 
的定義,snort使用了一種簡單的,輕量級的規則描述語言,上述已經提及到檢測的最終 
行為就是檢測數據包中協議的不同字段,例如端口號就是重要的入侵線索。為了更為清 
楚地闡述這個問題,我們舉一例說明: 

攻擊名稱--NT IIS Showcode ASP 
攻擊種類--獲取非法訪問權限。 
攻擊描述--通過構造特定的URL請求可以非法閱讀服務器上的其他文件:http://attack 
host/msadc/Samples/SELECTOR/showcode.asp?source=/msadc/Samples/../../../../. 
./boot.ini 
入侵特征碼 --IP地址:保護網段以外的IP地址。 
--協議類型:TCP 
--端口:80 
--TCP標志位:PUS, ACK 
--數據段內容:/selector/showcode.asp 
CVE ID--CAN-1999-0736 
Bugtraq ID --167 

分析以上的這個入侵實例,我們可以看出其實檢測該入侵行為的關鍵是判斷端口號和數 
據段內容,IP地址、協議類型和TCP標志位只是輔助的特征碼。但是當開始分析原始數據 
包時,是否應該就直接匹配端口和數據段的內容?無疑針對該入侵行為上述做法的匹配 
效率是最高的。但是實際上這樣做會降低整體檢測的效率,因為入侵系統要對龐大的網 
絡數據逐一進行檢測,應該遵循先檢測所有入侵行為的共同特征其次才是個體特征的原 
則,例如如果首先檢測IP地址,一旦發現並不屬檢測范圍之內,就立即檢測下一個數 
據包而並非繼續檢測該包的其他字段。這樣既保証了檢測的快速性,又提高了報警的實 
時性。 

Snort正是按照上述原則定義規則的,將檢測規則劃分成兩個部分:規則頭和規則選項。 
前者是所有規則共有的包括IP地址、協議類型、端口號,者根據不同規則包括相應的 
字段關鍵字,例如TCP的標志位或者窗口大小等。檢測規則除了包括上述的關“要檢測 
什”還應該定義“檢測到了該做什”,snort定義了三種處理方式alert(發送報 
警信息),log(記錄該數據包)和pass(忽略該數據包)並定義為規則的第一個匹配關鍵 
字,這樣設計的目的非常簡單,旨在在程序中組織整個的規則庫,即將所有的規則按照 
處理方式組織成三個鏈表以用更快速準確地進行匹配,體現了設計者的巧妙之處。 
下面我們來舉一實例來具體說明規則的定義: 
alert tcp !$HOME_NET any -> $HOME_NET 80 (msg:"CAN-1999-0736 - IIS-showcode" 
;flagsA; content:"/selector/showcode.asp"; nocase 

該實例正式針對表(N)中所示的入侵行為所定義的檢測規則,通過該例可以看出snort 
的規則語言簡明實用,基本格式為: 
規則動作 協議類型 IP地址 端口號 -> 協議類型 IP地址 端口號 (規則選項) 
源發送方 目的接受方 

關規則的具體書寫規范不再贅述,下面就其關鍵和特別之處加以說明: 

1.-- 變量和操作符 
snort作為一個NIDS,主要的目的就是能夠保護本網段即及時發現外部網對內部網的攻擊 
,所以規則中的IP地址的定義主要是針對外部網和內部網地址兩種。由此snort引入了變 
量的機制,即可以在規則中用變量表示IP地址字段,用戶在運行前可根據實際的子網地 
址來定義該變量,這樣在解析檢測規則時snort會自動替換變量值,增加了規則的靈活性 
,不過只適應像IP地址這種基本所有規則都具有同一值。 
為了更為準確地表達規則和精確地表示檢測范圍,snort還定義了三類操作符: 
l--否定操作符“ ! ” 
用表示snort還增加了否定符“!”來區分內部網和外部網。例如例n的!$HOME_NET。 

l--方向操作符“->”和”<>” 
用表示傳輸的方向,分別表示單向和雙向傳輸。 
l--端口描述符“ : ” 
用表示端口的范圍。例如: “600:“表示大600的端口號。 

2. 規則選項 
規則選項作為檢測時的重要標準組成了snort入侵檢測引擎的核心,既易用又非常靈活強 
大。首先其靈活性是指可以根據不同的不同行為制定相應的檢測選項內容,其次其強大 
性是指不僅檢測具有一定的廣度和深度並且定義了檢測到時該做什 。snort中有15個 
規則選項關鍵字,其中有三個關鍵字是做為檢測到的回應: 
msg - 在報警和包日志中打印一個消息 
logto - 把包記錄到用戶指定的文件中而不是記錄到標準輸出 
resp - 主動反應(切斷連接等) 
Resp關鍵字可以對匹配一條Snort規則的流量進行靈活的反應(flexible reponse 
-FlexResp)。FlexResp代碼允許Snort主動地關閉惡意的連接。該模塊合法的參數如下 
: 
rst_snd - 向發送方發送TCP-RST數據包 
rst_rcv - 向接受方發送TCP-RST數據包 
rst_all - 向收發雙方發送TCP_RST數據包 
icmp_net - 向發送方發送ICMP_NET_UNREACH 
icmp_host - 向發送方發送ICMP_HOST_UNREACH 
icmp_port - 向發送方發送ICMP_PORT_UNREACH 
icmp_all - 向發送方發送上述所有的ICMP數據包。 

作為入侵檢測系統,理論上只需要檢測入侵,並不需要去回應入侵行為的。所以該功能 
應該是作為SNORT的附加功能,但是值得一提的是,發送RST和ICMP UNREACH數據包向攻 
擊方可以暫緩其對目標主機的攻擊,我們所研究的一個工具叫做dsniff中的tcpkill就是 
利用這個原理進行切斷非法連接,但是對一般的拒絕服務攻擊,該方法的作用就不甚 
明顯了。對SNORT來說,實現該功能必然會降低檢測的的效率尤其是在網絡流量特別大 
的時候。 

另外12中關鍵字都是針對協議中的不同字段設置的: 
關鍵字--檢測內容--主要針對的攻擊行為 
ttl--檢測ip頭的ttl的值 --用對traceroute探測的檢測 
id--檢測ip頭的分片id值--黑客的固定攻擊,例如設置為31337 
dsize--檢測包的淨荷尺寸的值--緩沖區溢出攻擊。 
content--在包的淨荷中搜索指定的樣式--最為重要的一個選項,用在數據包的數據段 
中搜索指定的內容並根據數據觸發響應,可以搜索包含混合的文本和二進制數據。並設 
置了三個輔助關鍵字:offset,dsize,nocase 
Flags--檢測tcp flags的值--非法端口掃描或者其他非法探測主機操作系統類型等。 
Seq--檢測tcp順序號的值--檢測主機發送的序列號集是否是固定的集合。入侵者可以利 
用該值冒充合法用戶向被入侵者發送數據,偽裝正常的通信以竊取信息或者其他非法活 
動。 
Ack--檢測tcp應答(acknowledgement)的值--Nmap的TCP PING會設置該項的值為0,從而 
判斷可能正在用Nmap進行非法掃描。 
Itype--檢測icmp type的值--拒絕服務攻擊。注:只作為其中的一種特征。 
Icode--檢測icmp code的值--可疑的流量。 
Session--記錄指定會話的應用層信息的內容--記錄在TCP會話中的會話數據。 
Icmp_id--檢測ICMP ECHO ID的值-- 
Icmp_seq--檢測ICMP ECHO 順序號的值-- 
Ipoption--監視IP option的特定代碼-- 
Rpc--監視特定應用/進程調用的RPC服務--檢測非法的RPC請求,查看RPC請求,並自動將 
應用(Application),過程(procedure)和程序版本(program version)譯碼,如果 
所有三個值都匹配的話,該規則就顯示成功。 

3.預處理程序 
預處理程序從Snort版本1.5開始引入,其代碼在檢測引擎被調用之前先被運行,為檢測 
做舖墊,從而提高檢測的準確性和速度。而且預處理機制採用插件形式,用戶和程序員 
能夠將模塊化的插件方便地融入Snort之中。目前snort現有的預處理程序模塊有以下三 
種: 
l--Minfrag 
Minfrag預處理程序檢查給定尺寸限制的分片數據包。數據包被分片通常是由源和目的主 
機之間的路由器引起的。一般說來,商業網絡設備不會產生小512字節的分片包。可以 
利用這個事實,來監控含有小分片的流量。 
l--HTTP Decode 
HTTP Decode用處理HTTP URI字符串,將串中的數據轉化為可讀的ASCII字串,用檢 
測HTTP的數據信息對付隱蔽的WebURL掃描器和惡意的入侵者。 
l--Portscan Detector 
Snort Portscan預處理程序的用處: 
向標準記錄設備中記錄從一個源IP地址來的端口掃描的開始和結束。 
如果指定了一個記錄文件,在記錄掃描類型的同時也記錄目的IP地址和端口。端口掃描 
定義為在時間T(秒)之內向超過P個端口進行TCP連接嘗試,或者在時間T(秒)之內向 
超過P個端口發送UDP數據包。端口掃描可以是對任一IP地址的多個端口,也可以是對多 
個IP地址的同一端口進行。現在這個版本可以處理一對一和一對多方式的端口掃描,下 
一個完全版本將可以處理分布式的端口掃描(多對一或多對多)。端口掃描也包括單一 
的秘密掃描(stealthscan)數據包,比如NULL,FIN,SYNFIN,XMAS等。如果包括秘密 
掃描的話,端口掃描模塊會對每一個掃描數據包告警。 
network to monitor - 監視端口掃描的目標網絡以network/CIDR表示 
number of ports - 在探測期間訪問的端口數目 
detection period - 以秒計數的端口訪問時間限制 
logdir/filename - 告警信息存放的目錄/文件名,告警也可以寫入標準的告警文件中。 

l--日志及報警子系統(logging/alerting subsystem) 
入侵檢測系統的輸出結果系統的必要特征是實時性和多樣性,前者指能夠在檢測到入侵 
行為的同時及時記錄和報警,者是指能夠根據需求選擇多種方式進行記錄和報警。一 
個好的NIDS,更應該提供友好的輸出界面或發聲報警等等。 
Snort是一個輕量級的NIDS,它的另外一個重要功能就是數據包記錄器,所以該子系統主 
要提供了方式: 
1.--fast model :採取TCPDUMP的格式記錄信息 
2. readable model :按照協議格式記錄,易用戶查看。 
3.alert to syslog: 向syslog發送報警信息。 
4.alert to text file :以明文形式記錄報警信息。 
值得提出的是,snort考慮到用戶需要高性能的時候,即網絡數據流量非常大,可以將數 
據包信息進行壓縮從而實習快速的報警。 

3.-- 程序結構 
1)--snort的整體結構 
snort作為優秀的公開源代碼的入侵檢測系統范例,其整個程序結構清晰,構思巧妙,我 
們對其版本1.6.3的源碼進行了深入的分析。Snort共有64個c文件和h文件,首先介紹 
程序的整體結構,其流程圖如下: 
其中最為關鍵的函數就是ProcessPacket(),--其流程圖如下: 
2)--數據結構-- 
snort的主要數據結構就是幾個鏈表,上述已經提及,snort組織規則庫的巧妙之處就是 
按照規則的處理動作來劃分成三個鏈表,其中每個鏈表又按照協議類型:TCP,IP和ICMP 
分成三個鏈表,所以所有的規則都會被分配到這個三個鏈表中。鏈表中的成員就是描述 
每條規則的結構RuleTreeNode,該結構中的一個重要成員就是記錄該規則的處理函 
數鏈表RuleFpList,一條規則有時候需要調用多個處理函數來進行分析。該結構中 
的另外一個重要成員就是規則選項的結構,該結構同樣包括該規則的選項信息以及其處 
理函數鏈表。 
值得提出的是,並不是每一條規則都分配一個RuleTreeNode結構,因為很多規則的選項 
前的頭部分是相同的,只需要根據不同的規則選項鏈取不同的選項函數處理鏈表。基本 
整體的結構如圖n所示,所有鏈表的初始化都是在捕獲數據包前進行的。 
除以上鏈表外,snort還定義了預處理、輸出的關鍵字和處理函數鏈表,設計鏈表的主要 
意圖是為了實現插件的思想,即用戶何以根據需求添加刪除預處理的功能模塊。其只要 
的數據結構如下: 
typedef struct _PreprocessKeywordNode 

char *keyword; 
void (*func)(char *); 
} PreprocessKeywordNode; 
// 預處理關鍵字信息結構。 
typedef struct _PreprocessKeywordList 

PreprocessKeywordNode entry; 
struct _PreprocessKeywordList *next; 
} PreprocessKeywordList; 
//預處理關鍵字鏈表。 
typedef struct _PreprocessFuncNode 

void (*func)(Packet *); 
struct _PreprocessFuncNode *next; 
} PreprocessFuncNode; 
//預處理函數鏈表。 
所有鏈表的初始化都是在捕獲數據包前進行初始化的,一旦鏈表都已建立完畢,開始捕 
獲數據包,每收到一個數據包都會現首先調用預處理程序鏈表中的函數進行處理,其 
次按照默認地順序遍歷AlertList,PassList和LogList三個鏈表。遍歷時首先根據數據包 
的協議類型定位規則鏈表,其次調用遞歸函數進行規則的逐一匹配,即首先匹配規則頭 
,若匹配則繼續遞歸匹配規則選項,若不匹配,直接匹配下一條規則。為了加快遍歷的 
速度,snort在規則選項中的”content”內容匹配時調用了Boyer-Moore算法。 

4.--改進 
1.--背景 
我們認為snort已經具備了NIDS的基本功能,由它本身定位在一個輕量級的入侵檢測工 
具,盡管與商業的入侵檢測工具比起來,它的規則語言略顯簡陋,在報警方式和圖形化 
使用界面上也顯露出不足之處,但是程序的整體結構清晰,規則語言簡單實用並提供插 
件的功能支持,用戶可以添加自己的檢測規則和處理函數,這對規則庫的及時更新有 
著極為現實的意義。 
通過分析,與商業的NIDS相比,SNORT 1.6.3沒有設置對IP 分片包的處理功能,即對 
例如“Teardrop”和“Ping of Death”兩類利用非法IP分片包進行的攻擊無法檢測: 
?--teadrop該攻擊是針對很多操作系統的TCP/IP協議棧沒有正確處理已分段的IP包 
的重組。其特征是發送2個或更多特別的分段IP數據報。第一個包是偏移量為0的段,數 
據段(分段長度)字節是N,並設置了MF位,第二個包是最一個分段(MF==0),但它的偏移 
量小N,所有造成兩個分段重疊了。為了重組這些包,有弱點的系統就會在TCP/IP棧中 
分配非常大的空間,因此導致目標系統因為內存耗盡而停止響應或者重啟。 
?--Ping of Death該攻擊的特正是向攻擊目標發送大量的ICMP分片數據包,當這些 
數據包重組時其數據段已經大65535個字節,系統會因為無法處理這種數據包而造成拒 
絕服務或者重啟。 
?-- 
2.--方案 
3.--實現 




  (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
怎樣使用Snort! (2001-09-11 07:00:01)
 

★  樊強制作 歡迎分享  ★