當前位置:首頁 » 操作系統 » snort源碼分析

snort源碼分析

發布時間: 2022-12-09 05:09:42

linux下按裝snort遇到了包依賴關系.

要麼yum install snort;
要麼yum install rpmlib libdnet.1 libpcap.so.1 libsfbpf.so.0,然s後rpm -ivh snort-2.9.2.3-1.RHEL6.I386.RPM
要不rpm -ivh snort-2.9.2.3-1.RHEL6.I386.RPM --nodeps裝上,但不一定能用

㈡ type 8E是什麼文件系統

Snort分析報告
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與tcpmp的比較
Tcpmp是最為經典的嗅探工具,主要是用於記錄網路數據,網路故障的探測診斷工具。
Snort與它的最大的共同之處在於都是基於libpcap的並且支持BPF過濾機制,所以本質上
都是調用的捕獲數據包的庫函數,但是snort的目的不僅僅是在於記錄這個數據包而是從
安全的角度考慮出發區解析它,並且tcpmp主要是分析第二層或者第三層的報文來進行
網路故障診斷,而snort則主要針對於應用層的數據進行分析從而實現檢測入侵行為。除
此之外,由於tcpmp旨在快速完整地記錄流量,所以它制定了特殊的輸出格式,速度快
但是不易看懂,而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 tcpmp:
---------------------------------------------------------------------------
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),過程(procere)和程序版本(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.--實現

㈢ 一個較新的snort規則,講明其對抗何種黑客攻擊這種黑客攻擊的特徵是什麼並說明snort規則對抗

怎麼不用sinnfer,這個比較簡單!比較好用,圖形化的界面。功能也比較強大!

Snort是一個網路入侵檢測系統,它可以分析網路上的數據包,用以決定一個系統是否被遠程攻擊了。多數Linux發行版本都有Snort程序,因此通過urpmi、apt-get、yum等安裝Snort是一件很輕松的事情。Snort可以將其收集的信息寫到多種不同的存儲位置以便於日後的分析。此外,Snort可被用作一個簡單的數據包記錄器、嗅探器,當然它主要是一個成熟的IDIS(網路入侵檢測系統)。

在Snort安裝之後,就可以立即使用了。我們只需執行:

#snort –v

這就將Snort設置也了嗅探模式,數據通信會在屏幕上滾動,顯示Snort所看到的數據。要退出此程序,按下ctrl-c鍵就可以了,然後我們就會看到它所檢測到的內容的一個簡短分析。要看到如tcpmp那樣更為詳細的信息,就需要使用-vd選項。

要使用Snort記錄數據,可以告訴此程序將信息記錄到什麼地方。在下面的例子中,Snort會將信息記錄到/usr/local/log/snort目錄中,因此就確保此目錄真的存在:

# snort -l /usr/local/log/snort -d

Snort將以二進制方式記錄數據包,如:/usr/local/log/snort/snort.log.1199665001,要查看此記錄,可以使用-r選項來重新顯示所捕獲的數據。

# snort -r /usr/local/log/snort/snort.log.1199665001

要將Snort用作一個網路入侵檢測系統還需要花點兒工夫。我們必須正確配置Snort,並要使用配置文件/etc/snort/snort.conf。注意,這個配置文件非同一般。Snort網站上的一些規則可能與Snort一起打包了,這依賴於你所使用的Linux版本。

開源社團的Snort的規則對任何人都是可用的,並極有可能與供應商所提供的Snort的版本捆綁發布。你還可以從Sourcefire預訂、接收其更新,這樣就可以使規則保持不斷更新。

一旦下載了一個規則包,如Community-Rules-CURRENT.tar.gz,就要在系統中解開它,將其解到Snort配置所在的目錄中:

# cd /etc/snort

# tar xvzf Community-Rules-CURRENT.tar.gz

新的規則將出現在rules/ directory中。

要啟用之,需要編輯snort.conf文件並添加以下內容:

var RULE_PATH rules

include $RULE_PATH/sql.rules

include $RULE_PATH/icmp.rules

...

不管你喜歡哪些規則,現在就可以啟動Snort並裝載配置文件/etc/snort/snort.conf,這會依次裝載下載的規則:

# snort -c /etc/snort/snort.conf

此時,Snort將會列印其初始化的信息,將其顯示在屏幕上,然後開始記錄與規則匹配的數據包。這些規則將決定Snort可以記錄什麼,它將忽略哪些內容,因此這里不像將Snort作為一個嗅探器來運行那樣,它所生成的記錄要小得多,因為它只記錄所謂的「重要的」數據包。默認情況下,這些記錄將會被存儲到/var/log/snort/中,Snort將會用我們前面所說-r選項來分析之。

㈣ 配製snort的時候這個報錯怎麼解決

您好,是這樣的:
1、安裝一下libdnet試試看
2、編譯snort的時候man看看是否有類似--with-libdnet之類的參數,這個報錯就是找不到libdnet,
如果是64位系統的話find找一下,注意/lib和/lib64這兩個lib庫是否都有libdnet。
3、Snort 是一個開源的輕量級入侵監測系統,可以監測網路上的異常情況,給出報告;
安裝新版本的iptables軟體
可以到
http://www.netfilter.org
的網站下載最新版本的iptables源代碼,目前最新的版本是1.2.9。
從網站上下載的源代碼是「tar.bz2」格式的,編譯源代碼的第一步工作是解壓縮,命令如下:
#/bin/tar xjvf iptables-1.2.9.tar.bz2
解壓縮後,進入源代碼的安裝目錄,開始編譯:
# make install-devel KERNEL_DIR=/usr/include/linux/
如果一切正常,那麼iptables應該編譯好了,接下來可以進行安裝了,安裝命令非常簡單:
#make install KERNEL_DIR=/usr/include/linux/
#setup->firewall configure->enable
#vi /etc/sysconfig/iptables ;add ssh (tcp port 22).etc...
service iptables start
chkconfig --level 35 iptables start

㈤ 我的電腦不能用microsoft word 打開.doc文件怎麼辦

SNORT源碼分析(轉自SMTH)
Snort作為一個輕量級的網路入侵檢測系統,在實際中應用可能會有些力不從心,但如果想了解研究IDS的工作原理,仔細研究一下它的源碼到是非常不錯.
首先對snort做一個概括的評論。
從工作原理而言,snort是一個NIDS。[註:基於網路的入侵檢測系統(NIDS)在網路的一點被動地檢查原始的網路傳輸數據。通過分析檢查的數據包,NIDS匹配入侵行為的特徵或者從網路活動的角度檢測異常行為。] 網路傳輸數據的採集利用了工具包libpcap。snort對libpcap採集來的數據進行分析,從而判斷是否存在可疑的網路活動。

從檢測模式而言,snort基本上是誤用檢測(misuse detection)。[註:該方法對已知攻擊的特徵模式進行匹配,包括利用工作在網卡混雜模式下的嗅探器被動地進行協議分析,以及對一系列數據包解釋分析特徵。順便說一句,另一種檢測是異常檢測(anomaly detection)。]具體實現上,僅僅是對數據進行最直接最簡單的搜索匹配,並沒有涉及更復雜的入侵檢測辦法。

盡管snort在實現上沒有什麼高深的檢測策略,但是它給我們提供了一個非常
優秀的公開源代碼的入侵檢測系統範例。我們可以通過對其代碼的分析,搞清IDS 究竟是如何工作的,並在此基礎上添加自己的想法。

snort的編程風格非常優秀,代碼閱讀起來並不困難,整個程序結構清晰,函
數調用關系也不算復雜。但是,snort的源文件不少,函數總數也很多,所以不太
容易講清楚。因此,最好把代碼完整看一兩遍,能更清楚點。

*****************************************************
*****************************************************
下面看看snort的整體結構。展開snort壓縮包,有約50個c程序和頭文件,另有約30個其它文件(工程、數據或者說明文件)。[註:這里用的是snort-1.6-beta7。snort-1.6.3不在手邊,就用老一點的版本了,差別不大。]下面對源代碼文件分組說明。

snort.c(.h)是主程序所在的文件,實現了main函數和一系列輔助函數。

decode.c(.h)把數據包層層剝開,確定該包屬於何種協議,有什麼特徵。並
標記到全局結構變數pv中。

log.c(.h)實現日誌和報警功能。snort有多種日誌格式,一種是按tcpmp二進制的格式存儲,另一種按snort編碼的ascii格式存儲在日誌目錄下,日誌目錄的名字根據"外"主機的ip地址命名。報警有不同的級別和方式,可以記錄到syslog中,或者記錄到用戶指定的文件,另外還可以通過unix socket發送報警消息,以及利用SMB向Windows系統發送winpopup消息。

mstring.c(.h)實現字元串匹配演算法。在snort中,採用的是Boyer-Moore演算法。演算法書上一般都有。

plugbase.c(.h)實現了初始化檢測以及登記檢測規則的一組函數。snort中的檢測規則以鏈表的形式存儲,每條規則通過登記(Register)過程添加到鏈表中。

response.c(.h)進行響應,即向攻擊方主動發送數據包。這里實現了兩種響應。一種是發送ICMP的主機不可到達的假信息,另一種針對TCP,發送RST包,斷開連接。

rule.c(.h)實現了規則設置和入侵檢測所需要的函數。規則設置主要的作用是
把一個規則文件轉化為實際運作中的規則鏈表。檢測函數根據規則實施攻擊特徵的檢測。

sp_*_check.c(.h)是不同類型的檢測規則的具體實現。很容易就可以從文件名得知所實現的規則。例如,sp_dsize_check針對的是包的數據大小,sp_icmp_type_check針對icmp包的類型,sp_tcp_flag_check針對tcp包的標志位。不再詳述。

spo_*.c(.h)實現輸出(output)規則。spo_alert_syslog把事件記錄到syslog中;spo_log_tcpmp利用libpcap中的日誌函數,進行日誌記錄。

spp_*.c(.h)實現預處理(preprocess)規則。包括http解碼(即把http請求中的%XX這樣的字元用對應的ascii字元代替,避免忽略了惡意的請求)、最小片斷檢查(避免惡意利用tcp協議中重組的功能)和埠掃描檢測。

********************************************************************************************************** 下面描述main函數的工作流程。先來說明兩個結構的定義。

在snort.h中,定義了兩個結構:PV和PacketCount。PV用來記錄命令行參數,snort根據這些命令行參數來確定其工作方式。PV類型的全局變數pv用來實際記錄具體工作方式。結構定義可以參看snort.h,在下邊的main函數中,會多次遇到pv中各個域的設定,到時再一個一個解釋。

結構PacketCount用來統計流量,每處理一個數據包,該結構類型的全局變數pc把對應的域加1。相當於一個計數器。

接下來解釋main函數。

初始化設定一些預設值;然後解析命令行參數,根據命令行參數,填充結構變數pv;根據pv的值(也就是解析命令行的結果)確定工作方式,需要注意:

如果是運行在Daemon方式,通過GoDaemon函數,創建守護進程,重定向標准輸入輸出,實現daamon狀態,並結束父進程。

snort可以實時採集網路數據,也可以從文件讀取數據進行分析。這兩種情況並沒有本質區別。如果是讀取文件進行分析(並非直接從網卡實時採集來的),以該文件名作為libpcap的函數OpenPcap的參數,打開採集過程;如果是從網卡實時採集,就把網卡介面作為OpenPcap的參數,利用libpcap的函數打開該網卡介面。在unix中,設備也被看作是文件,所以這和讀取文件分析沒有多大的差別。

接著,指定數據包的拆包函數。不同的數據鏈路網路,拆包的函數也不同。利用函數SetPktProcessor,根據全局變數datalink的值,來設定不同的拆包函數。例如,乙太網,拆包函數為DecodeEthPkt;令牌環網,拆包函數為DecodeTRPkt,等等。這些Decode*函數,在decode.c中實現。

如果使用了檢測規則,那麼下面就要初始化這些檢測規則,並解析規則文件,轉化成規則鏈表。規則有三大類:預處理(preprocessor),插件(plugin),輸出插件(outputplugin)。這里plugin就是具體的檢測規則,而outputplugin是定義日誌和報警方式的規則。

然後根據報警模式,設定報警函數;根據日誌模式,設定日誌函數;如果指定了能夠進行響應,就打開raw socket,准備用於響應。

最後進入讀取數據包的循環,pcap_loop對每個採集來的數據包都用ProcessPacket函數進行處理,如果出現錯誤或者到達指定的處理包數(pv.pkt_cnt定義),就退出該函數。這里ProcessPacket是關鍵程序,

最後,關閉採集過程。

*****************************************************
現在看看snort如何實現對數據包的分析和檢測入侵的。

在main函數的最後部分有如下語句,比較重要:

/* Read all packets on the device. Continue until cnt packets read */
if(pcap_loop(pd, pv.pkt_cnt, (pcap_handler)ProcessPacket, NULL) < 0)
{
......
}

這里pcap_loop函數有4個參數,分別解釋:

pd是一個全局變數,表示文件描述符,在前面OpenPcap的調用中已經被正確地賦值。前面說過,snort可以實時採集網路數據,也可以從文件讀取數據進行分析。在不同情況打開文件(或設備)時,pd分別用來處理文件,或者網卡設備介面。

pd是struct pcap類型的指針,該結構包括實際的文件描述符,緩沖區,等等域,用來處理從相應的文件獲取信息。

OpenPcap函數中對pd賦值的語句分別為:
/* get the device file descriptor,打開網卡介面 */

pd = pcap_open_live(pv.interface, snaplen,
pv.promisc_flag ? PROMISC : 0, READ_TIMEOUT, errorbuf);

或者
/* open the file,打開文件 */
pd = pcap_open_offline(intf, errorbuf);

於是,這個參數表明從哪裡取得待分析的數據。

第2個參數是pv.pkt_cnt,表示總共要捕捉的包的數量。在main函數初始化時,預設設置為-1,成為永真循環,一直捕捉直到程序退出:

/* initialize the packet counter to loop forever */
pv.pkt_cnt = -1;

或者在命令行中設置要捕捉的包的數量。前面ParseCmdLine(解析命令行)函數的調用中,遇到參數n,重新設定pv.pkt_cnt的值。ParseCmdLine中相關語句如下:
case 'n': /* grab x packets and exit */
pv.pkt_cnt = atoi(optarg);

第3個參數是回調函數,該回調函數處理捕捉到的數據包。這里為函數
ProcessPacket,下面將詳細解釋該函數。

第4個參數是字元串指針,表示用戶,這里設置為空。

在說明處理包的函數ProcessPacket之前,有必要解釋一下pcap_loop的實現。我們看到main函數只在if條件判斷中調用了一次pacp_loop,那麼循環一定是在pcap_loop中做的了。察看pcap.c文件中pcap_loop的實現部分,我們發現的確如此:

int
pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
{
register int n;
for (; { //for循環
if (p->sf.rfile != NULL)
n = pcap_offline_read(p, cnt, callback, user);
else {
/*
* XXX keep reading until we get something
* (or an error occurs)
*/
do { //do循環

n = pcap_read(p, cnt, callback, user);
} while (n == 0);
}
if (n <= 0)
return (n); //遇到錯誤,返回
if (cnt > 0) {
cnt -= n;
if (cnt <= 0)
return (0); //到達指定數量,返回
}
//只有以上兩種返回情況
}
}

現在看看ProcessPacket的實現了,這個回調函數用來處理數據包。該函數是是pcap_handler類型的,pcap.h中類型的定義如下:
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);

第1個參數這里沒有什麼用;

第2個參數為pcap_pkthdr結構指針,記錄時間戳、包長、捕捉的長度;

第3個參數字元串指針為數據包。

函數如下:
void ProcessPacket(char *user, struct pcap_pkthdr *pkthdr, u_char *pkt)
{
Packet p; //Packet結構在decode.h中定義,用來記錄數據包的各種信息
/* call the packet decoder,調用拆包函數,這里grinder是一個全局
函數指針,已經在main的SetPktProcessor調用中設置為正確的拆包函數 */
(*grinder)(&p, pkthdr, pkt);

/* print the packet to the screen,如果選擇了詳細顯示方式,
那麼把包的數據,顯示到標准輸出 */
if(pv.verbose_flag)
{
...... //省略
}

/* check or log the packet as necessary
如果工作在使用檢測規則的方式,就調用Preprocess進行檢測,
否則,僅僅進行日誌,記錄該包的信息*/
if(!pv.use_rules)
{
... //進行日誌,省略
}
else
{
Preprocess(&p);
}

//清除緩沖區
ClearDumpBuf();

}

這里Preprocess函數進行實際檢測。

****************************************************************************
Proprocess函數很短,首先調用預處理規則處理數據包p,然後調用檢測
函數Detect進行規則匹配實現檢測,如果實現匹配,那麼調用函數CallOutput
Plugins根據輸出規則進行報警或日誌。函數如下:

void Preprocess(Packet *p)
{
PreprocessFuncNode *idx;

do_detect = 1;
idx = PreprocessList; //指向預處理規則鏈表頭

while(idx != NULL) //調用預處理函數處理包p
{
idx->func(p);
idx = idx->next;
}

if(!p->frag_flag && do_detect)
{
if(Detect(p)) //調用檢測函數
{
CallOutputPlugins(p); //如果匹配,根據規則輸出
}
}
}

盡管這個函數很簡潔,但是在第1行我們看到定義了ProprocessFuncNode
結構類型的指針,所以下面,我們不得不開始涉及到snort的各種復雜

的數據結構。前面的分析,我一直按照程序運行的調用順序,忽略了許多函
數(其實有不少非常重要),以期描述出snort執行的主線,避免因為程序中
大量的調用關系而產生混亂。到現在,我們還沒有接觸到snort核心的數據結構
和演算法。有不少關鍵的問題需要解決:規則是如何靜態描述的?運行時這些
規則按照什麼結構動態存儲?每條規則的處理函數如何被調用?snort給了
我們提供了非常好的方法。

snort一個非常成功的思想是利用了plugin機制,規則處理函數並非固定在
源程序中,而是根據每次運行時的參數設定,從規則文件中讀入規則,再把每個
規則所需要的處理函數掛接到鏈表上。實際檢測時,遍歷這些鏈表,調用鏈表上
相應的函數來分析。

snort主要的數據結構是鏈表,幾乎都是鏈表來鏈表去。我們下面做個總的
介紹。

我們有必要先回過頭來,看一看main函數中對規則初始化時涉及到的一些
數據結構。

在main函數初始化規則的時候,先建立了幾個鏈表,全局變數定義如下
(plugbase.c中):

KeywordXlateList *KeywordList;
PreprocessKeywordList *PreprocessKeywords;
PreprocessFuncNode *PreprocessList;
OutputKeywordList *OutputKeywords;
OutputFuncNode *OutputList;

這幾種結構的具體定義省略。這一初始化的過程把snort中預定義的關鍵
字和處理函數按類別連接在不同的鏈表上。然後,在解析規則文件的時候,
如果一條規則的選項中包含了某個關鍵字,就會從上邊初始化好的對應的鏈表
中查找,把必要的信息和處理函數添加到表示這條規則的節點(用RuleTreeNode
類型來表示,下面詳述)的特定域(OptTreeNode類型)中。

同時,main函數中初始化規則的最後,對指定的規則文件進行解析。在最
高的層次上,有3個全局變數保存規則(rules.c):

ListHead Alert; /* Alert Block Header */
ListHead Log; /* Log Block Header */
ListHead Pass; /* Pass Block Header */

這幾個變數是ListHead類型的,正如名稱所說,指示鏈表頭。Alert中登記
了需要報警的規則,Log中登記了需要進行日誌的規則,Pass中登記的規則在處
理過程忽略(不進行任何處理)。ListHead定義如下:

typedef struct _ListHead
{
RuleTreeNode *TcpList;
RuleTreeNode *UdpList;
RuleTreeNode *IcmpList;
} ListHead;

可以看到,每個ListHead結構中有三個指針,分別指向處理Tcp/Udp/Icmp包規則的鏈表頭。這里又出現了新的結構RuleTreeNode,為了說明鏈表的層次關系,下面列出RuleTreeNode的定義,但是忽略了大部分域:

typedef struct _RuleTreeNode
{
RuleFpList *rule_func;

...... //忽略

struct _RuleTreeNode *right;

OptTreeNode *down; /* list of rule options to associate with this
rule node */

} RuleTreeNode;

RuleTreeNode中包含上述3個指針域,分別又能形成3個鏈表。RuleTreeNode*類型的right指向下一個RuleTreeNode,相當於普通鏈表中的next域,只不過這里用right來命名。這樣就形成了規則鏈表。

RuleFpList類的指針rule_func記錄的是該規則的處理函數的鏈表。一條規則有時候需要調用多個處理函數來分析。所以,有必要做成鏈表。我們看看下面的定義,除了next域,還有一個函數指針:

typedef struct _RuleFpList
{
/* rule check function pointer */
int (*RuleHeadFunc)(Packet *, struct _RuleTreeNode *, struct _RuleFpList *);

/* pointer to the next rule function node */
struct _RuleFpList *next;

} RuleFpList;

第3個指針域是OptTreeNode類的指針down,該行後面的注釋說的很清楚,這是與這個規則節點相聯系的規則選項的鏈表。很不幸,OptTreeNode的結構也相當復雜,而且又引出了幾個新的鏈表。忽略一些域,OptTreeNode定義如下:

typedef struct _OptTreeNode
{
/* plugin/detection functions go here */
OptFpList *opt_func;

/* the ds_list is absolutely essential for the plugin system to work,
it allows the plugin authors to associate "dynamic" data structures
with the rule system, letting them link anything they can come up
with to the rules list */
void *ds_list[512]; /* list of plugin data struct pointers */

.......//省略了一些域

struct _OptTreeNode *next;

} OptTreeNode;

next指向鏈表的下一個節點,無需多說。OptFpList類型的指針opt_func指向
選項函數鏈表,同前面說的RuleFpList沒什麼大差別。值得注意的是指針數組
ds_list,用來記錄該條規則中涉及到的預定義處理過程。每個元素的類型是void*.在實際表示規則的時候,ds_list被強制轉換成不同的預定義類型。

--------------------------------------------------------------------------------------
Proprocess函數很短,首先調用預處理規則處理數據包p,然後調用檢測
函數Detect進行規則匹配實現檢測,如果實現匹配,那麼調用函數CallOutput
Plugins根據輸出規則進行報警或日誌。函數如下:

void Preprocess(Packet *p)
{
PreprocessFuncNode *idx;
do_detect = 1;
idx = PreprocessList; //指向預處理規則鏈表頭

while(idx != NULL) //調用預處理函數處理包p
{
idx->func(p);
idx = idx->next;
}

if(!p->frag_flag && do_detect)
{
if(Detect(p)) //調用檢測函數
{
CallOutputPlugins(p); //如果匹配,根據規則輸出
}
}
}

盡管這個函數很簡潔,但是在第1行我們看到定義了ProprocessFuncNode
結構類型的指針,所以下面,我們不得不開始涉及到snort的各種復雜
的數據結構。前面的分析,我一直按照程序運行的調用順序,忽略了許多函
數(其實有不少非常重要),以期描述出snort執行的主線,避免因為程序中
大量的調用關系而產生混亂。到現在,我們還沒有接觸到snort核心的數據結構
和演算法。有不少關鍵的問題需要解決:規則是如何靜態描述的?運行時這些
規則按照什麼結構動態存儲?每條規則的處理函數如何被調用?snort給了
我們提供了非常好的方法。

snort一個非常成功的思想是利用了plugin機制,規則處理函數並非固定在
源程序中,而是根據每次運行時的參數設定,從規則文件中讀入規則,再把每個
規則所需要的處理函數掛接到鏈表上。實際檢測時,遍歷這些鏈表,調用鏈表上
相應的函數來分析。

snort主要的數據結構是鏈表,幾乎都是鏈表來鏈表去。我們下面做個總的
介紹。

我們有必要先回過頭來,看一看main函數中對規則初始化時涉及到的一些
數據結構。

在main函數初始化規則的時候,先建立了幾個鏈表,全局變數定義如下
(plugbase.c中):

KeywordXlateList *KeywordList;
PreprocessKeywordList *PreprocessKeywords;
PreprocessFuncNode *PreprocessList;
OutputKeywordList *OutputKeywords;
OutputFuncNode *OutputList;

這幾種結構的具體定義省略。這一初始化的過程把snort中預定義的關鍵

字和處理函數按類別連接在不同的鏈表上。然後,在解析規則文件的時候,
如果一條規則的選項中包含了某個關鍵字,就會從上邊初始化好的對應的鏈表
中查找,把必要的信息和處理函數添加到表示這條規則的節點(用RuleTreeNode
類型來表示,下面詳述)的特定域(OptTreeNode類型)中。

同時,main函數中初始化規則的最後,對指定的規則文件進行解析。在最
高的層次上,有3個全局變數保存規則(rules.c):

ListHead Alert; /* Alert Block Header */
ListHead Log; /* Log Block Header */
ListHead Pass; /* Pass Block Header */

這幾個變數是ListHead類型的,正如名稱所說,指示鏈表頭。Alert中登記
了需要報警的規則,Log中登記了需要進行日誌的規則,Pass中登記的規則在處
理過程忽略(不進行任何處理)。ListHead定義如下:

typedef struct _ListHead
{
RuleTreeNode *TcpList;
RuleTreeNode *UdpList;
RuleTreeNode *IcmpList;
} ListHead;
可以看到,每個ListHead結構中有三個指針,分別指向處理Tcp/Udp/Icmp包規則的鏈表頭。這里又出現了新的結構RuleTreeNode,為了說明鏈表的層次關系,下面列出RuleTreeNode的定義,但是忽略了大部分域:

typedef struct _RuleTreeNode
{
RuleFpList *rule_func;

...... //忽略

struct _RuleTreeNode *right;
OptTreeNode *down; /* list of rule options to associate with this
rule node */

} RuleTreeNode;

RuleTreeNode中包含上述3個指針域,分別又能形成3個鏈表。RuleTreeNode*
類型的right指向下一個RuleTreeNode,相當於普通鏈表中的next域,只不過這里用right來命名。這樣就形成了規則鏈表。

RuleFpList類的指針rule_func記錄的是該規則的處理函數的鏈表。一條規則有時候需要調用多個處理函數來分析。所以,有必要做成鏈表。我們看看下面的
定義,除了next域,還有一個函數指針:

typedef struct _RuleFpList
{
/* rule check function pointer */
int (*RuleHeadFunc)(Packet *, struct _RuleTreeNode *, struct _RuleFpList *);

/* pointer to the next rule function node */
struct _RuleFpList *next;

} RuleFpList;

第3個指針域是OptTreeNode類的指針down,該行後面的注釋說的很清楚,這是與這個規則節點相聯系的規則選項的鏈表。很不幸,OptTreeNode的結構也相當復雜,而且又引出了幾個新的鏈表。忽略一些域,OptTreeNode定義如下:

typedef struct _OptTreeNode
{
/* plugin/detection functions go here */
OptFpList *opt_func;

/* the ds_list is absolutely essential for the plugin system to work,
it allows the plugin authors to associate "dynamic" data structures
with the rule system, letting them link anything they can come up
with to the rules list */
void *ds_list[512]; /* list of plugin data struct pointers */

.......//省略了一些域

struct _OptTreeNode *next;

} OptTreeNode;
next指向鏈表的下一個節點,無需多說。OptFpList類型的指針opt_func指向選項函數鏈表,同前面說的RuleFpList沒什麼大差別。值得注意的是指針數組
ds_list,用來記錄該條規則中涉及到的預定義處理過程。每個元素的類型是void*。在實際表示規則的時候,ds_list被強制轉換成不同的預定義類型。

㈥ snort 的具體使用

Snort不是很難使用,但是也存在著很多的命令行選項需要掌握,並且它們中許多很多時候並不能一起使用。這個文件的目的就是使新人能夠更簡單的使用snort。

在我們進行下一步之前,有一些關於snort的基本概念需要了解。snort能夠配置成三種模式運行:嗅探器(sniffer),包記錄器(packet logger)和網路入侵檢測系統(NIDS)。嗅探模式(sniffer mode)簡單的讀取網路中的數據包,並以連續的數據流顯示在控制台上。包記錄模式(packet logger mode)把捕獲的數據包記錄在磁碟上。網路入侵檢測模式(NIDS mode)是最復雜的、有機的配置,在這個模式下,snort分析網路中的數據,並通過使用用戶自定義的規則集進行模式匹配,並根據匹配的結果執行多種操作。

2.0 嗅探模式(sniffer mode)

首先,讓我們從基礎開始。如果你只是想要在屏幕上列印出TCP/IP的包頭信息(嗅探模式),使用下面的命令:
./snort –v
使用這個命令運行snort,將只顯示IP和TCP/UDP/ICMP頭信息,而不顯示任何其它信息。如果你想要查看傳輸的有效負載信息,可以使用如下命令:
./snort –vd
這條命令在列印協議頭信息的同時也列印相應的包數據。如果你想要一個更詳細的現實,可以使用下面的命令來列印出數據鏈路層頭信息:
./snort –vde

(註:這些選項參數能夠分開或者拆散成任和結合的方式。比如上一個命令也可以寫做這種方式:
./snort -d -v –e
來達到同樣的效果)

3.0 包記錄模式(PACKET LOGGER MODE)

好的,上面的命令運行的都相當的好。但是如果你想要記錄包到磁碟上,你需要指定一個記錄目錄,然後snort將自動的進入包記錄模式:
./snort -dev -l ./log
當然,這里假設你在當前目錄下有一個叫做「log」的目錄。如果沒有這個目錄,snort將退出並返回錯誤信息。當snort以這種模式運行,它收集所有捕獲的數據包,並根據數據包中一個主機的IP地址放入對應的目錄中。

如果你只是簡單的指定「-l」選項,你可能會發現snort有時使用遠程計算機的地址作為存放數據包的目錄,有時使用本地主機的地址。為了比較本地的網路,你需要告訴snort本地網路的信息:
./snort -dev -l ./log -h 192.168.1.0/24
這條指令讓snort能夠記錄數據鏈路信息和TCP/IP頭和應用數據到目錄./log,並且記錄和192.168.1.0段C類網路相關的包信息。所有進來的包將記錄到記錄文件夾中對應的子文件夾中,子文件夾以遠程主機(非192.168.1主機)的地址命名。注意,如果兩個主機都是在本地網路內,然後他們將根據兩個中高的埠號來記錄,在埠號相等的情況下,將使用源地址來記錄。

如果你在一個高速網路中,又或你想要使用一個更緊湊的格式來記錄數據包為以後的分析所用,你可以考慮使用「二進制模式」來記錄。二進制模式採用「tcpmp 格式」來記錄數據包到指定目錄下的單一二進制文件中。
./snort -l ./log –b
注意這里命令行的改變。我們不再需要指定一個本地網路,因為二進制模式記錄所有的數據到一個單一的文件中,而不再需要定義輸出的目錄結構。另外,你不再需要使用詳細(verbose)模式和指定-d/-e開關參數,因為在二進制模式下所有的包都會被記錄而不是其中的某些部分。進入二進制包記錄模式只需要做兩點,一是在命令行中使用-l開關來指定一個日誌目錄,二是使用-b開關選擇二進制模式代替ASCII文檔模式記錄包數據。

如果數據包以二進制文件的形式記錄,你可以使用任何支持tcpmp二進制格式的嗅探器從文件中讀取數據包信息,比如使用tcpmp或ethereal。snort也可以通過使用-r開關進入回放模式來讀取記錄的數據包信息。snort在任何運行模式下都能夠接受tcpmp格式的文件並進行處理。比如,如果你想要以嗅探器模式來分析處理一個二進制文件並把數據包信息列印在屏幕,你可以使用類似下面的命令:
./snort -dv -r packet.log
你還可以以多種方式操作二進制文件中的數據,比如包記錄模式和入侵檢測模式,你也同樣可以在命令行中使用BPF介面。比如,如果你只是想查看記錄文件中的ICMP數據包信息,可以在命令行中簡單的指定一個BPF過濾器:
./snort -dvr packet.log icmp
更多的BPF使用信息請參閱相應的man信息。

4.0 網路入侵檢測模式(NETWORK INTRUSION DETECTION MODE)

可以使用如下命令來啟用snort的網路入侵檢測模式(這個模式下,你不用記錄所有的數據包):
./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf
在這里snort.conf是你的規則文件名。這將對每一個數據包使用snort.conf文件中定義的規則集進行檢測,並根據文件中定義的行為進行處理。如果你沒有為程序指定輸出目錄,將使用默認的目錄「/var/log/snort」。

有一點需要注意的是,使用上一命令行形式進入NIDS模式運行速度稍慢,可以去掉「-v」開關來提高效率。往屏幕輸出數據速度很慢,在數據顯示的過程中可能會造成數據包的丟失。

同樣,對於大多數的應用而言,都不比要記錄數據鏈路層包頭信息,因此「-e」開關也是可以去掉的。最後命令如下:
./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf
這個命令能夠配置snort以最基礎的NIDS模式運行。它將以ASCII格式記錄規則指定的包信息到對應的目錄結構中(和包記錄模式中目錄結構一致)。

4.1 NIDS MODE輸出選項

在snort的NIDS模式中有幾種輸出方式可以配置。默認的記錄和報警以ASCII形式記錄,並使用「完全」報警。完全報警方式(full alert mechanism)輸出所有的包頭信息並在其後附上對應的報警信息。當然,在命令行中可以設置多種報警輸出模式和兩種日誌記錄格式。包信息可以以默認的ASCII格式記錄,也可以通過使用命令行開關「-b」來用二進制文件記錄。如果你想要完全禁用包記錄信息,可以使用命令行開關「-N」。

報警模式相對要復雜一些。在命令行中可以設置多種報警模式:full、fast、socket、syslog、console、cmg、和none模式。這六種模式可以使用命令行開關「-A」來設置。詳細如下:

u -A fast 快速報警模式,以一種簡單的格式記錄報警信息(時間、報警信息、源和目的主機的IP和埠)

u -A full 這是默認的報警模式,如果沒有指定報警模式,將自動使用這種報警模式

u -A unsock 發送報警信息到一個其它程序監聽UNIX套介面

u -A none 關閉報警

u -A console 列印快速報警信息到控制台(屏幕)

u -A cmg 觸發「cmg樣式」報警

還可以使用「-s」開關來設置syslog報警。默認的兩種syslog報警級別是LOG_AUTHPRIV和LOG_ALERT。如果你想要配置其它syslog日誌級別的話,可以在規則文件中使用輸出插件來設置(詳細信息參見snort.conf文件)。

下面是幾個輸出配置實例:

1、使用默認格式(ASCII)向syslog發送報警信息:
snort -c snort.conf -l ./log -s -h 192.168.1.0/24

2、使用默認格式和默認目錄(/var/log/snort)來向syslog發送報警信息:
snort -c snort.conf -s -h 192.168.1.0/24

3、使用二進制文件格式、快速報警模式、目錄/var/snort來記錄信息:
snort -c snort.conf -b -A fast -l /var/snort

4.2 性能配置

如果你想要提高snort運行效率(比如保持100Mbps網路環境下快速運行),可以使用「-b」和「-A fast」或者「-s」(syslog)選項。它將以tcpmp格式來記錄包,並產生較少的報警信息。比如:
./snort -b -A fast -c snort-lib
在這個配置下,snort能夠在100Mbps區域網內在80Mbps正常流量下檢測同時進行的多重掃描和工具在這個配置下,記錄將以二進制格式寫入tcpmp格式文件snort.log中。然後可以重新使用「-r」選項和其它常用的選項運行snort,來從數據文件中解析為正常的snort格式的數據信息。比如:
./snort -d -c snort-lib -l ./log -h 192.168.1.0/24 -r snort.log
一旦這條指令執行,所有的數據將以正常的格式記錄在日誌文件夾中。很酷,不是嗎?

4.3 其它信息

有很多人不喜歡snort默認的對包應用規則方式。在snort默認應用方式中,先使用報警(alert)規則,然後使用通過(pass)規則,最後使用記錄(log)規則。這個順序是違反直覺的,但是相對於允許用戶定義了很多報警規則卻因為使用了一條錯誤的通過規則而全部被禁止要簡單有效。對於一些用戶的需要,這里提供了「-o」開關來改變默認的規則應用順序為:先使用pass規則,然後是alert規則,最後是log規則。命令如下:
./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf -o

5.0 雜項信息

如果你想要以守護進程(daemon)模式運行snort,可以和其它選項一起加上「-D」開關設置。請注意,如果你想要向守護進程發送信號SIGHUP來重啟snort的話,你需要在命令行中使用snort二進制文件的完全路徑,比如你可以使用如下命令:
/usr/local/bin/snort -d -h 192.168.1.0/24 -l /var/log/snortlogs -c /usr/local/etc/snort-lib -s –D
由於安全關系,這里不提供對相對路徑的支持。

如果你想要發送包記錄信息到公共郵件列表,需要使用「-O」開關。這個開關將對包中輸出的IP信息進行混淆處理。這使得你能夠很容易的避免郵件列表中的用戶獲知相關的IP信息。你也可以把「-O」開關和「-h」開關聯合使用,這樣將只混淆本地網路中的主機地址。如果你不在意讓人看見攻擊主機的IP地址,這樣設置是很有效的。命令如下:
./snort -d -v -r snort.log -O -h 192.168.1.0/24
這將從記錄文件中讀取數據包信息,並在屏幕上顯示出來,在顯示的過程中僅僅混淆了C類網路192.168.1.0/24中的地址信息。

如果你想要在不停止進程去查看snort包統計信息,可以向snort進程ID發送SIGUSR1信號,然後snort將在屏幕上顯示統計信息,如果snort以守護進程模式運行,統計信息將發送到syslog中。你可以查看到snort檢測的協議信息、報警數目、記錄的包數、接收和丟棄的包數。這使得你能夠很方便的提高snort的性能。

㈦ 如何編寫snort的檢測規則

snort是一個強大的輕量級的網路入侵檢測系統。它具有實時數據流量分析和日誌IP網路數據包的能力,能夠進行協議分析,對內容進行搜索/匹配。它能夠檢測各種不同的攻擊方式,對攻擊進行實時報警。此外,snort具有很好的擴展性和可移植性。本文將講述如何開發snort規則。
1.基礎
snort使用一種簡單的規則描述語言,這種描述語言易於擴展,功能也比較強大。下面是一些最基本的東西:
snort的每條規則必須在一行中,它的規則解釋器無法對跨行的規則進行解析。注意:由於排版的原因本文的例子有的分為兩行。
snort的每條規則都可以分成邏輯上的兩個部分:規則頭和規則選項。規則頭包括:規則行為(rule's action)、協議(protocol)、源/目的IP地址、子網掩碼以及源/目的埠。規則選項包含報警信息和異常包的信息(特徵碼,signature),使用這些特徵碼來決定是否採取規則規定的行動。
這是一個例子:
alert tcp any any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"mountd access";)
表1.一條簡單的snort規則
從開頭到最左邊的括弧屬於規則頭部分,括弧內的部分屬於規則選項。規則選項中冒號前面的詞叫做選項關鍵詞(option keywords)。注意對於每條規則來說規則選項不是必需的,它們是為了更加詳細地定義應該收集或者報警的數據包。只有匹配所有選項的數據包,snort才會執行其規則行為。如果許多選項組合在一起,它們之間是邏輯與的關系。讓我們從規則頭開始。
1.1 include
snort使用的規則文件在命令行中指定,include關鍵詞使這個規則文件可以包含其它規則文件中的規則,非常類似與C語言中的#include。snort會從被包含的文件讀出其內容,取代include關鍵詞。
格式:
include <文件路徑/文件名>
注意:行尾沒有分號。
1.2 varriables
在snort規則文件中可以定義變數。
格式:
var
例子:
var MY_NET 192.168.1.0/24,10.1.1.0/24] $MY_NET any (flags:S;msg:'SYNMETA packet";)
表2.變數的定義和使用
規則變數名可以使用多種方式來修改,你可以使用$操作符來定義元變數(meta-variables)。這些修改方式可以結合變數修改操作符:?和-來使用。
$var:定義元變數
$(var):以變數var的內容作為變數名
$(var:-default):以變數var的內容作為變數名,如果var沒有定義就使用default作為變數名
$(var:?message):使用變數var的內容作為變數名,如果不成功就列印錯誤信息message並退出。
例如:
var MY_NET $(MYU_NET:-192.168.1.0/24) tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
表3.高級變數應用
2.規則頭(Rule Headers)
2.1 Rule Action
規則頭包含一些信息,這些信息包括:哪些數據包、數據包的來源、什麼類型的數據包,以及對匹配的數據包如何處理。每條規則的第一項就是規則行為(rule action)。規則行為告訴snort當發現匹配的數據包時,應該如何處理。在snort中,有五種默認的處理方式:alert、log、pass、activate和dynamic。
alert:使用選定的報警方法產生報警信息,並且記錄數據包
log:記錄數據包
pass:忽略數據包
activate:報警,接著打開其它的dynamic規則
dynamic:保持空閑狀態,直到被activete規則激活,作為一條log規則
你也可以定義自己的規則類型,把它們和一個或者幾個輸出插件聯系在一起。然後你就可以在snort規則中使用這些規則類型了。
這個例子將建立一個類型,它將只以tcpmp格式輸出日誌:
ruletype suspicious
{
type log
output log_tcpmp: suspocious.log
}
下面這個例子將建立一個類型,把日誌發送到syslog和MySql資料庫:
ruletype redalert
{
type alert
output alert_syslog:LOG_AUTH LOG_ALERT
output database:log,user=snort dbname=snort host=localhost
}
2.2 協議
每條規則的第二項就是協議項。當前,snort能夠分析的協議是:TCP、UDP和ICMP。將來,可能提供對ARP、ICRP、GRE、OSPF、RIP、IPX等協議的支持。
2.3 IP地址
規則頭下面的部分就是IP地址和埠信息。關鍵詞any可以用來定義任意的IP地址。snort不支持對主機名的解析。所以地址只能使用數字/CIDR的形式。/24表示一個C類網路;/16表示一個B類網路;而/32表示一台特定的主機地址。例如:192.168.1.0/24表示從192.168.1.1到192.168.1.255的地址。
在規則中,可以使用使用否定操作符(negation operator)對IP地址進行操作。它告訴snort除了列出的IP地址外,匹配所有的IP地址。否定操作符使用!表示。例如,使用否定操作符可以很輕松地對表1的規則進行改寫,使其對從外部網路向內的數據報警。
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"external mountd access";)
表4.使用IP地址否定操作符的規則
上面這條規則中的IP地址表示:所有IP源地址不是內部網路的地址,而目的地址是內部網路地址。
你也可以定義一個IP地址列表(IP list)。IP地址列表的格式如下:
[IP地址1/CIDR,IP地址/CIDR,....]
注意每個IP地址之間不能有空格。例如:
alert tcp ![192.168.1.0/24,10.1.1.1.0/24] any ->[192.168.1.0/24,10.1.1.0/24] 111 (content:"|00 01 86 a5|";msg:"external mountd access";)
2.4 埠號
在規則中,可以有幾種方式來指定埠號,包括:any、靜態埠號(static port)定義、埠范圍,以及使用非操作定義。any表示任意合法的埠號;靜態埠號表示單個的埠號,例如:111(portmapper)、23(telnet)、80(http)等。使用范圍操作符:可以指定埠號范圍。有幾種方式來使用范圍操作符:達到不同的目的,例如:
log udp any any -> 192.168.1.0/24 1:1024
記錄來自任何埠,其目的埠號在1到1024之間的UDP數據包
log tcp any any -> 192.168.1.0/24 :600
記錄來自任何埠,其目的埠號小於或者等於6000的TCP數據包
log tcp any :1024 -> 192.168.1.0/24 500:
記錄源埠號小於等於1024,目的埠號大於等於500的TCP數據包
表5.埠范圍示例
你還可以使用邏輯非操作符!對埠進行非邏輯操作(port negation)。邏輯非操作符可以用於其它的規則類型(除了any類型,道理很簡單)。例如,你如果要日誌除了X-window系統埠之外的所有埠,可以使用下面的規則:
log tcp any any -> 192.168.1.0/24 !6000:60 10
表6.對埠進行邏輯非操作
2.5 方向操作符(direction operator)
方向操作符->表示數據包的流向。它左邊是數據包的源地址和源埠,右邊是目的地址和埠。此外,還有一個雙向操作符<>,它使snort對這條規則中,兩個IP地址/埠之間雙向的數據傳輸進行記錄/分析,例如telnet或者POP3對話。下面的規則表示對一個telnet對話的雙向數據傳輸進行記錄:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
表7.使用雙向操作符的snort規則
activate/dynamic規則
activate/dynamic規則對擴展了snort功能。使用activate/dynamic規則對,你能夠使用一條規則激活另一條規則。當一條特定的規則啟動,如果你想要snort接著對符合條件的數據包進行記錄時,使用activate/dynamic規則對非常方便。除了一個必需的選項activates外,激活規則(activate rule)非常類似於報警規則(alert rule)。動態規則(dynamic rule)和日誌規則(log rule)也很相似,不過它需要一個選項:activated_by。動態規則還需要另一個選項:count。當一個激活規則啟動,它就打開由activate/activated_by選項之後的數字指示的動態規則,記錄count個數據包。
下面是一條activate/dynamic規則對的規則:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags:PA;content:"|E8C0FFFFFF|in|;activates:1;
表8.activate/dynamic規則對
這個規則使snort在檢測到IMAP緩沖區溢出時發出報警,並且記錄後續的50個從$HOME_NET之外,發往$HOME_NET的143號埠的數據包。如果緩沖區溢出成功,那麼接下來50個發送到這個網路同一個服務埠(這個例子中是143號埠)的數據包中,會有很重要的數據,這些數據對以後的分析很有用處。
3.規則選項
規則選項構成了snort入侵檢測引擎的核心,它們非常容易使用,同時又很強大和容易擴展。在每條snort規則中,選項之間使用分號進行分割。規則選項關鍵詞和其參數之間使用冒號分割。截止到寫本文為止(snort 1.7版),snort有23個規則選項關鍵詞:
msg:在報警和日誌中列印的消息
logto:把日誌記錄到一個用戶指定的文件,而不是輸出到標準的輸出文件
ttl:測試IP包頭的TTL域的值
tos:測試IP包頭的TOS域的值
id:測試IP分組標志符(fragment ID)域是否是一個特定的值
ipoption:查看IP選項(IP option)域
fragbits:測試IP包頭的分片位(fragmentation bit)
dsize:測試數據包包數據段的大小
flags:測試TCP標志(flag)是否是某個值
seq:測試TCP包的序列號是否是某個值
ack:測試TCP包的確認(acknowledgement)域是否為某個值
itype:測試ICMP數據包的類型(type)域
icode:測試ICMP數據包的編碼(code)域
icmp_id:測試ICMP回送包的標志符(ICMP ECHO ID)是否為某個值
content:在數據包的數據段中搜索模式(pattern)
content-list:在數據包的數據段中搜索模式清單
offset:設置開始搜索的偏移量
depth:設置搜索最大深度
nocase:大小寫不敏感匹配內容字元串
session:剝離一個對話的應用層信息
rpc:觀察RPC服務對特定應用程序的調用
resp:激活反應措施(斷開連接等)
react:激活反應措施(阻塞WEB站點)
3.1 msg
msg規則選項告訴日誌引擎在復制包時同時列印的信息,以及讓報警引擎輸出的警告消息。它只是一個簡單的文本字元串,使用作為轉義符。
格式:
msg:"";
3.2 logto
logto選項告訴snort把觸發某條規則所有的數據包都記錄到指定的文件。使用這個選項,對處理來自nmap掃描、HTTP CGI掃描的數據非常方便。注意如果使用二進制日誌模式,這個選項會失效。
格式:
logto:"<文件名>";
3.3 ttl
這個選項設置要測試的生命周期(time-to-live)值。只有數據包的TTL和這個選項設置的值精確匹配,測試才會成功。這個選項主要用來檢測路由企圖。
格式:
ttl:"";
3.4 tos
你可以使用tos關鍵詞檢查IP包頭的TOS(type of service)域是否是一個特定的值。也是只有在被檢測包TOS域的值和給定的值精確匹配時,這個測試才會成功。
格式:
tos:"";
3.5 ID
這個選項關鍵詞用來測試IP分片包頭的ID域。一些黑客工具為了不同的目的把這個域設置為特殊的值,例如:31337是在一些黑客中比較流行的值。使用這個選項就可以阻止這種攻擊。
格式:
id: "";
3.6 lpoption
如果IP包中有選項域,可以使用這個規則選項搜索IP包頭的特定選項,例如源路由。這個規則選項可以使用的參數如下:
rr:路由記錄
eof:End of list
nop:無操作
ts:時間戳
sec:IP安全選項
lsrr:寬松源路由(loose source routing)
ssrr:嚴格源路由(strict source roution)
satid:流標識符
最常被注意的IP選項是loose&strict source routing,不過在Internet上廣泛使用的任何應用程序中都沒使用這兩個選項。每條規則中只能設定一個IP規則。
格式:
ipopts: ;
3.7 fragbits

㈧ 入侵檢測軟體snort有哪些功能

Snort最重要的用途還是作為網路入侵檢測系統(NIDS)。
使用簡介
Snort並非復雜難以操作的軟體。 Snort可以三個模式進行運作:
偵測模式(Sniffer Mode):此模式下,Snort將在現有的網域內擷取封包,並顯示在熒幕上。
封包紀錄模式(packet logger mode):此模式下,Snort將已擷取的封包存入儲存媒體中(如硬碟)。
上線模式(inline mode):此模式下,Snort可對擷取到的封包做分析的動作,並根據一定的規則來判斷是否有網路攻擊行為的出現。
基本指令:偵測模式
若你想要在螢幕上顯示網路封包的標頭檔(header)內容,請使用
./snort -v
如果想要在螢幕上顯示正在傳輸的封包標頭檔內容,請使用
./snort -vd
如果除了以上顯示的內容之外,欲另外顯示數據鏈路層(Data link layer)的資料的話,請使用
./snort -vde

㈨ Snort入侵檢測實用解決方案的內容簡介

《網站入侵與腳本攻防修煉》從「攻」、「防」兩個角度,通過現實中的入侵實例,並結合原理性的分析,圖文並茂地展現網站入侵與防禦的全過程。全書共分8章,系統地介紹網站入侵的全部過程,以及相應的防禦措施和方法。其中包括網站入侵的常見手法、流行網站腳本入侵手法揭密與防範、遠程攻擊入侵網站與防範、網站源代碼安全分析與測試等。《網站入侵與腳本攻防修煉》尤其對網站腳本漏洞原理進行細致的分析,幫助網站管理員、安全人員、程序編寫者分析、了解和測試網站程序的安全性漏洞。《網站入侵與腳本攻防修煉》用圖解的方式對網站入侵步驟及安全防範設置都進行詳細的分析,並且對一些需要特別注意的安全事項進行重點提示,過程中還加入一些安全技巧。
隨書所配光碟內容包括書中涉及的源代碼、視頻教程和演示動畫,方便讀者學習和參考。
《網站入侵與腳本攻防修煉》適合於網路安全技術愛好者、網路管理員、網站程序編寫人員閱讀,也可作為相關專業學生的學習及參考資料。

㈩ 用winpcap來做入侵檢測,下載了好幾個入侵系統,但是對於規則的設定不理解,而且也找不到方法去理解,求幫忙.

你的主要目的是什麼?如果覺得winpcap不好操作可以換其它的,如果只是用來滲透踩點,完全可以用其它更好的。

熱點內容
美嘉演算法口訣 發布:2025-05-16 06:03:15 瀏覽:952
c程序編譯連接 發布:2025-05-16 06:02:36 瀏覽:964
腳本魔獸 發布:2025-05-16 06:01:52 瀏覽:330
文件夾python 發布:2025-05-16 06:01:43 瀏覽:627
電腦我的世界伺服器游戲幣 發布:2025-05-16 05:27:25 瀏覽:487
索尼手機為什麼不能用安卓10 發布:2025-05-16 05:18:46 瀏覽:784
蔚來es6選擇哪些配置實用 發布:2025-05-16 05:18:05 瀏覽:130
小米如何掃碼wifi密碼 發布:2025-05-16 05:13:38 瀏覽:807
樓層密碼是什麼意思 發布:2025-05-16 05:13:37 瀏覽:13
創建文件夾失敗 發布:2025-05-16 05:12:59 瀏覽:396