基於Snort的***檢測系統 3
- 2020 年 1 月 8 日
- 筆記
三章使用Snort規則 如同病毒,大多數***行為都具有某種特徵,Snort的規則就是用這些特徵的有關資訊構建的。在第1章中我們提到,你可以用蜜罐來取得***者所用的工具和技術的資訊,以及他們都做了什麼。此外,還有***者會利用的已知的系統弱點資料庫,如果***者試圖利用這些弱點來實施***,也可以作為一些特徵。這些特徵可能出現在包的頭部,也可能在數據載荷中。Snort的檢測系統是基於規則的,而規則是基於***特徵的。Snort規則可以用來檢測數據包的不同部分。Snort 1.x可以分析第3層和第4層的資訊,但是不能分析應用層協議。Snort v 2.x增加了對應用層頭部分析的支援。所有的數據包根據類型的不同按順序與規則比對。 規則可以用來產生告警資訊、記錄日誌,或使包通過(pass):對Snort來說,也就是悄悄丟棄(drop),通過在這裡的意義與防火牆或路由器上的意義是不同的,在防火牆和路由其中,通過和丟棄是兩個相反的概念。Snort規則用簡明易懂的語法書寫,大多數規則寫在一個單行中。當然你也可以行末用反斜線將一條規則劃分為多個行。規則文件通常放在配置文件snort.conf文件中,你也可以用其他規則文件,然後用主配置文件引用它們。 本章將提供給你不同類型規則的資訊以及規則的基本結構。在本章的最後,你可以找到一些用來檢測***活動的規則的例子。讀完本章以及後面兩章後,你所獲得的資訊就可以使你建立一個基本的Snort***檢測系統了。 3.1 TCP/IP 網路分層 在你開始書寫規則之前,我們先來簡要討論一下TCP/IP的網路層次結構nort規則是常重要的,因為Snort規則依賴於這些層中的協議。 TCP/IP協議族分為5層,這些層之間相互作用來完成通訊處理工作,它們是: 1、物理層 2、數據鏈路層,某些文章中也把它們叫做網路介面層。物理層和數據鏈路層由物理介質、網路介面適配器和網路適配器驅動所構成。乙太網地址在數據鏈路層定義。 3、網路層,也就是IP層。這一層負責點到點的數據通訊並提供數據完整性。在這一層,所有的主機以IP地址來區分彼此。除了IP協議之外,這一層的主要協議還有ICMP。關於IP協議的更多資訊參見RFC791,關於ICMP協議的更多資訊查看RFC792。 4、傳輸層,也就是TCP/UDP層。TCP(傳輸控制協議)用來建立從源到目的的可靠的、面向連接的數據傳輸。而UDP(用戶數據報協議)提供無連接的數據傳輸,UDP在進行數據傳輸的時候,並不提供數據送達的保證,常用在可以容忍數據丟失的情況下。參見RFC 768獲取UDP的更多資訊。參見RFC 793來獲得更多的關於TCP的資訊。 5、應用層,包含提供用戶與網路介面的應用程式,例如Telnet、Web瀏覽器、ftp客戶端等。這些應用程式常有自己用來進行數據通訊的應用層協議。 Snort規則可以在網路層和傳輸層進行操作,另外也有一些方法來探測數據鏈路層和應用層的異常。Snort規則的第二個部分顯示了對應的協議,你很快將了解如何書寫這些規則。 3.2 第一個不可用的規則 這裡有個非常不好用的規則,事實上,也許是最差的規則,但是它可以很好的檢測Snort是否正常工作,並可以產生告警: alert ip any any -> any any (msg: "IP Packet detected";) 你可以在你第一次安裝Snort的時候在snort.conf的末尾加上這條規則,這個規則可以使每當捕獲一個IP包都產生告警資訊,如果你就這樣離開的話,你的硬碟空間很快就會被填滿。這個規則之所以不可用,是因為它不信任任何資訊。難道你用一個永久規則的目的就是為了檢測Snort是否在工作嗎?它應該是用來在你安裝完Snort後做測試,以確定其工作正常,然後就去掉這條規則。下面的部分你可以了解Snort規則的不同部分,但為完整性起見,下面將簡要解釋一下剛才的那條規則所用的語句: l 「alert」表示如果包與條件匹配,就產生一個告警資訊。條件由下面的語句定義。 l 「ip」表示規則將被用在所有的IP包上。 l 第一個「any」是對IP包源地址部分的條件定義,表示來自任何一個IP地址的IP包都符合條件,任何IP包都符合本條件。 l 第二個「any」用來定義埠號,因為埠號與IP層無關,任何IP包都符合條件。 l 「->」符號表示數據包傳送的方向。 l 第3個「any」用來定義目的地址的條件,any表示這條規則並不關心所有包的目的地址。 l 第4個「any」用來定義目的埠條件,再說明一次,因為IP層與埠無關。 l 最後一部分是規則的選項,,並包含一條將被紀錄的告警消息。 下一條規則不想前面那個那麼糟糕,它將對所有捕獲的ICMP包產生告警。重申一次,這條規則也是來檢測Snort是否正常工作的。 如果你想測試Snort,就發送一個ping(在UNIX機器中,基本上是發送ECHO請求)包。再次重複,它應該是用來在你安裝完Snort後做測試,以確定其工作正常,然後就去掉這條規則。以下面的命令為例,你可以向你的網關或其他什麼主機發送ICMP包。 ping 192.168.2.1 注意,192.168.2.1是與Snort機器在同一網路的網關、路由器或其他機器。你可以在你安裝Snort的機器上運行這個命令,這個命令在UNIX和Windows機器上都可以運行。 3.3 CIDR RFC 1519定義了無類域間路由或稱CIDR。目前有將不同的地址類(比如A和B)做更好的利用的趨勢。在CIDR的支援下,你可以用任意長度的掩碼,這在基於地址類的網路中是不行的,因為基於類的網路中,掩碼的長度是固定的。使用CIDR的時候,網路地址的後面附加上掩碼所用的位數,例如192.168.1.0/24表示一個網路的網路地址是192.168.1.0,掩碼是24位。24位掩碼相當於255.255.255.0。表示一個主機可以用到所有的掩碼位,也就是32位。下面的規則表示:只有發送到IP地址為192.168.2.113的主機的ICMP包才會觸發告警: alert icmp any any -> 192.168.1.113/32 any (msg: "Ping with TTL=100"; ttl:100;) 3.4 規則的結構 你已經看到了一些規則,儘管它們不那麼好,但在某種意義上還是有用的。現在讓我們來看一下Snort規則的結構。所有的Snort規則都可以分為兩個邏輯組成部分:規則頭部和規則選項。參見圖3-1 規則頭部 規則選項
圖3-1 Snort 規則的基本結構。 規則的頭部包含規則所做的動作的資訊,也包含與包所比對的一些條件。選項部分通常包含一個告警消息以及包的那個部分被用來產生這個消息。一條規則可以用來探測一個或多個類型的***活動,一個好的規則可以來探測多種***特徵。 Snort規則頭部的主要結構如圖3-2所示: 動作 協議 地址 埠 方向 地址 埠
圖3-2 Snort規則頭部結構 動作部分表示,當規則與包比對並符合條件是,會採取什麼類型的動作。通常的動作時產生告警或記錄日誌或向其他規則發出請求。你可以來本章的後面了解關於動作的更多資訊。 協議部分用來在一個特定協議的包上應用規則。這是規則所涉及的第一個條件。一些可以用到的協議如:IP,ICMP,UDP等等。 地址部分定義源或目的地址。地址可以是一個主機,一些主機的地址或者網路地址。你也可以用這些部分將某些地址從網路中排除。後面將詳細討論。注意,在規則中有兩個地址段,依賴於方向段決定地址是源或者是目的,例如,方向段的值是「->」那麼左邊的地址就是源地址,右邊的地址是目的地址。 如果協議是TCP或UDP,埠部分用來確定規則所對應的包的源及目的埠。如果是網路層協議,如IP或ICMP,埠號就沒有意義了。 方向部分用來確定那一邊的地址和埠是源,哪一邊是目的。 例如,我們來看一下第2章曾經用到過的這樣一個規則,當它探測到TTL為100的ICMP ping包的時候,就會產生告警: alert icmp any any -> any any (msg: "Ping with TTL=100"; ttl: 100;) 括弧之前的部分叫做規則頭部,括弧中的部分叫做規則選項。頭部依次包括下面部分: l 規則的動作:在這個規則中,動作是alert(告警),就是如果符合下面的條件,就會產生一個告警。記住如果產生告警,默認的情況下是會記錄日誌的。 l 協議:在這個規則中,協議是ICMP,也就是說這條規則僅僅對ICMP包有效,如果一個包的協議不是ICMP, Snort探測引擎就不理會這個包以節省CPU時間。協議部分在你對某種協議的包應用Snort規則的時候是非常重要的。 l 源地址和源埠。在這個例子中,它們都被設置成了any,也就是這條規則將被應用在來自任何地方的ICMP包上,當然,埠號與ICMP是沒有什麼關係的,僅僅和TCP和UDP有關係。 l 方向。在這個例子中,方向用->表示從左向右的方向,表示在這個符號的左面部分是源,右面是目的,也表示規則應用在從源到目的的包上。如果是<-,那麼就相反。注意,也可以用<>來表示規則將應用在所有方向上。 l 目的地址和埠。這個例子中,它們也都是「any」,表示規則並不關心它們的目的地址。在這個規則中,由於any的作用,方向段並沒有實際的作用,因為它將被應用在所有方向的ICMP包上。 在括弧中的選項部分表示:如果包符合TTL=100的條件就產生一條包含文字:「Ping with TTL=100」的告警。TTL是IP包頭部欄位。參見RFC 791或者附錄C。 3.5規則頭部 如前面提到的,規則的頭部包括括弧前面的一些部分,現在讓我們從動作開始來詳細的看一下規則頭部的每個部分。 3.5.1規則動作 動作是Snort規則中的第一個部分,它表示規則的條件符合的時候,將會有什麼樣的動作產生。Snort有5個預定義的動作,你也可以定義自己的動作,需要注意的是,Snort 1.x和2.x對規則的應用是不同的,在1.x中,只要包符合第一個條件,它就會做出動作,然後就不再管它,儘管它可能符合多個條件;在2.x中,只有包和所有相應規則比對後,才根據最嚴重的情況發出告警。 3.5.1.1 pass 這個動作告訴Snort不理會這個包,這個動作在你不想檢查特定的包的時候可以加快Snort的操作速度。例如,如果你在網路中有一台包含一些弱點的主機,用來檢測網路安全漏洞,可能會希望不理會對這台機器的***,pass規則這時就可以用到了。 3.5.1.2 Log Log動作用來記錄包,記錄包有不同的方式,例如,可以記錄到文件或者資料庫,這將在以後討論。根據命令行參數和配置文件,包可以被記錄為不同的詳細程度。你可以用「snort – ?」命令來查看你所用版本Snort的命令行可用參數。 3.5.1.3 Alert Alert動作用來在一個包符合規則條件時發送告警消息。告警的發送有多種方式,例如可以發送到文件或者控制台。Log動作與Alert動作的不同在於:Alert動作是發送告警然後記錄包,Log動作僅僅記錄包。 3.5.1.4 Activate Activate動作用來產生告警然後激活其它規則來進行進一步的檢驗。如下面所說的,動態規則就是用於這個目的。當你需要對捕獲的包進行進一步檢驗的時候,就可以用activate動作。 3.5.1.5 Dynamic Dynamic規則動作由其它用activate動作的規則調用,在正常情況下,他們不會被用來檢測包。一個動態規則僅能被一個「activate」動作激活。 3.5.1.6 自定義動作 除了以上動作外,你也可以定義自己的動作,以用於不同的目的,例如: l 向Syslog發送消息。Syslog是系統日誌守護進程,它在/var/log中創建日誌文件,這些文件的位置可以通過修改/etc/syslog.conf來改變。你可以在UNIX系統中用命令「man syslog」或者「man syslog.conf」來獲得更多資訊。Syslog相當於Windows中的事件查看器。 l 向如HP OpenView或Open NMS(http://www.opennms.org)等網管系統發送SNMP trap。 l 在一個包上應用多個動作。如你前面所看到的,一個規則僅僅規定了一個動作,自定義動作可以用來產生多個動作。例如,你可以在發送SNMP trap的同時記錄Syslog。 l 將數據記錄到XML文件中。 將資訊記錄到資料庫中,Snort可以將數據記錄到MySQL, Postgress SQL, Oracle 和 Microsoft SQL server中。 這些新的動作類型在配置文件snort.conf中定義。一個新動作用下面的通用結構來定義: ruletype action_name { action definition } 關鍵字ruletype後面跟隨動作的名稱,兩個大括弧中是實際的動作定義,類似於C語言中的函數。例如,我們定義一個叫做smb_db_alert的動作,用來向workstation.list中的主機發送SMB告警,同時在MySQL中的「Snort」資料庫記錄,如下所示: ruletype smb_db_alert { type alert output alert_smb: workstation.list output database: log, mysql, user=rr password=rr dbname=snort host=localhost } 這些規則的類型我們會在下一章詳細討論,通常它們與配置和輸出插件有關。 3.5.2協議 協議是Snort規則中的第二部分,這一部分將顯示那種類型的包將與該規則比對。到目前為止,Snort可以支援以下協議: l IP l ICMP l TCP l UDP 如果協議是IP,Snort檢測包中的數據鏈路層頭部來確定包的類型,如果協議類型是其他任何一種,Snort檢測IP頭部來確定協議類型。不同的包頭部將在附錄C中討論。 協議部分僅僅在規則頭部的條件中起作用。規則中的選項部分可以附加與協議無關的條件。如下面協議為ICMP的規則: alert icmp any any -> any any (msg: "Ping with TTL=100"; ttl: 100;) 選項部分檢測TTL值,它並不是ICMP頭部的內容,而是IP頭部內容。這就是說選項部分可以檢測屬於其它協議的一些參數。常用協議的頭部和相關分析見附錄C。 3.5.3地址 在Snort規則中,有兩個地址部分,用來檢測包的來源和目的地。地址可以是一個主機地址或者網路地址。你可以用關鍵字any來指定所有的地址。地址後面用斜線來附加一個數字,表示掩碼的位數。比如192.168.2.0/24代表一個C類網路192.168.2.0,其子網掩碼是255.255.255.0。記住下面的一些子網掩碼: l 如果子網掩碼是24位,它是一個C類網路。 l 如果子網掩碼是16位,它是一個B類網路。 l 如果子網掩碼是24位,它是一個A類網路。 l 表示一個主機用32位掩碼。 根據CIDR的支援,你可以用任何位數的掩碼。參考RFC 791取得關於IP地址和子網掩碼的資訊。CIDR的更多資訊參考RFC 1519。 前面我們提到,Snort規則中有兩個地址段,其中一個是源地址,另外一個是目的地址。方向段指明那個是源地址,哪個是目的地址。參考方向段部分的敘述來了解更多資訊。 下面是一個在Snort規則中地址部分的例子: l 192.168.1.3/32定義一個地址為192.168.1.3的主機。 l 192.168.1.0/24定義從192.168.1.0到192.168.1.255的C類網路地址,子網掩碼是24位,相當於255.255.255.0。 l 152.168.0.0/24定義從152.168.0.0到192.168.255.255的B類網路地址,子網掩碼是16位,相當於255.255.0.0。 l 10.0.0.0/8定義從10.0.0.0到10.255.255.255的A類網路地址,子網掩碼是8位,相當於255.0.0.0。 l 192.168.1.16/28定義從192.168.1.16到192.168.1.31的網路地址,子網掩碼是28位,相當於255.255.255.240。在這16個地址中有14個可以用作主機地址,因為還有一個網路地址和一個廣播地址,注意,在任何網路中的一個地址總是網路地址,最後一個是廣播地址。在這個例子中192.168.1.16是網路地址,192.168.1.31是廣播地址。 例,你可以用下面的規則,使到web伺服器192.168.1.10/32的80埠的TTL為100的數據包觸發告警: alert tcp any any -> 192.168.1.10/32 80 (msg: "TTL=100"; ttl: 100;) 這個規則僅僅用來示例IP地址是如何在Snort規則中應用的。 3.5.3.1 排除某些地址 Snort提供一種機制,可以是你用否定符號「!」,也就是感嘆號,來排除某些地址,這個符號用來限制Snort 不對某些源或目的地址的包做檢測。例如,西面的規則將檢測除了來自C類網路192.168.2.0之外所有的包: alert icmp ![192.168.2.0/24] any -> any any (msg: "Ping with TTL=100"; ttl: 100;) 當你想測試不包括你自己的網路的其它的包的時候,這個規則非常有用,這也意味著你信任自己所在網路的所有人! 3.5.3.2 地址列表 你也可以在Snort規則中指定一個地址的列表,比如,你的網路中包含兩個C類網路:192.168.2.0和192.168.8.0,你想對除了這兩個網路之外的其它地址應用規則,你可以用下面的規則,其中兩個地址用逗號分隔: alert icmp ![192.168.2.0/24,192.168.8.0/24] any -> any any (msg: "Ping with TTL=100"; ttl: 100;) 注意,方括弧是與否定符號以器用的,如果沒有否定符號,你可以不用方括弧。 3.5.1埠號 埠號用來在進出特定的某個或一系列埠的包上運用規則,例如,你可以用源埠23來對來自Telnet伺服器的包應用規則。你可以用關鍵字any來對包應用規則,而不管它的埠號。段口號僅僅對TCP和UDP協議有意義,如果你選擇的協議是IP或者ICMP,埠號就不起作用。下面的規則用來檢測來自C類網路192.168.2.0/24中的Telnet伺服器,並包含「confidential」(機密)的包: alert tcp 192.168.2.0/24 23 -> any any (content: "confidential"; msg: "Detected confidential";) 同類的規則也可以用在這個網路中來自或者去向任何Telnet伺服器的包,我們改以下方向段為任何方向,如下所示: alert tcp 192.168.2.0/24 23 <> any any (content: "confidential"; msg: "Detected confidential";) 當你想僅對某種類型的包應用規則的時候,埠號是非常有用的。例如,一種***僅與HTTP web伺服器相關,你可以在規則中設置埠號80來檢測試圖進行這種***的人,這樣Snort規則僅僅監視web服務,不對其它的TCP包應用規則。制訂良好的規則一定能提高IDS的性能。 3.5.4.1 埠範圍 你也可以在規則中的埠段設置一系列的埠,而不只是一個。用冒號分隔起始和結束。例如下面的規則將對來自1024-2048的所有UDP包告警: alert udp any 1024:2048 -> any any (msg: 「UDP ports」;) 3.5.4.2 上限與下限 你可以僅用一個起始埠號或結束埠號來表示埠列表,例如:1024表示比1024小,包含1024的所有埠,1000:表示比1000大,包括1000的所有埠。 3.5.4.3 否定符 與地址段相同,你也可以在Snort規則中的埠段用否定符號來排除一個或多個埠。下面的規則將記錄除了53段口外的其它所有UDP通訊。 log udp any !53 -> any any log udp 但是你不能用逗號來分隔多個埠,如53,54這樣的表示是不允許的,但是你可以用53:54來表示一個埠範圍。 3.5.4.4 共用埠號。 共用埠號是提供給一些公用應用的,表3-1列舉了其中一些及應用。 埠號 描述 20 FTP數據 21 FTP 22 SSH或安全Shell 23 Telnet 25 SMTP或類似於Sendmail的e-mail伺服器 37 NTP(網路時鐘協議,用來同步網路主機時間) 53 DNS 伺服器 67 BootP/DHCP客戶端 68 BootP/DHCP伺服器 69 TFTP 80 HTTP,web伺服器 110 POP3,供類似於OE的郵件客戶端使用 161 SNMP 162 SNMP trap 443 HTTPS或安全HTTP 514 Syslog
在UNIX平台上,你可以查看/etc/services文件,可以看到更多的埠的定義。RFC 1700中包含詳細列表。目前ICANN負責管理這些埠號,你可以在http://www.icann.org獲得更多資訊。 3.5.5方向段 在Snort規則中,方向段確定源和目的。下面是方向段的相關規定: ->表示左邊的地址和埠是源而右邊的是目的。 <-表示右邊的地址和埠是源而左邊的是目的。 <>表示規則將被應用在兩個方向上,在你想同時監視伺服器和客戶端的時候,可以用到這個標示。例如,你可以監視往來POP或者Telnet伺服器的數據流。 3.6 規則選項 Snort規則的選項在頭部的後面,在一對圓括弧裡面,其中可能包含一個選項,也可能包含用分號分隔的多個選項,這些選項的關係是邏輯與的關係,只有當選項中的條件都滿足的時候,規則動作才會被執行。在前面的例子中,你已經來規則中應用了msg和ttl的選項。所有的選項都是由關鍵字來定義的,一些選項中還會包含變數值。一個選項包含兩個主要部分:一個關鍵字和變數值。關鍵字和變數值由冒號分隔。如你前面看到的: msg: "Detected confidential"; 在這個選項中,關鍵字是msg,而"Detected confidential"是變數值。 本部分的後面將敘述在Snort規則的選項部分的各種關鍵字: 3.6.1關鍵字ack Tcp頭部中包含一個32位的Acknowldege Number欄位,這個欄位表示希望對端發送的下一個Tcp包的序列號。僅當TCP頭部的ACK標誌位被設為1的時候,這個欄位才起作用。關於TCP頭部的詳細資料,參考附錄C或者RFC 793。 類似於nmap的工具用TCP頭部的這個特徵來掃描電腦,例如,在這些工具所用的技術中,它們向目標主機發送至80埠,ACK標誌為1,序列號為0的TCP包,這樣目標主機就不會接受這個包,並發回一個RST標誌為1的包,當nmap受到這個包的時候,就知道那台主機是存在的。當目標主機不對ICMP做出回應的時候,這個方法可以起到作用。 為了探測到這種TCP ping,你可以用類似於下面的規則來產生告警資訊: alert tcp any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: "TCP ping detected";) 這條規則的作用是在當你收到標誌位A為1而acknowledgement段的值為0的TCP包的時候,發送一個告警資訊。表3-2列舉了其他的TCP標誌位。在本規則中,定義包的目的是192.168.1.0/24,你可以用其它的值。關鍵字ack基本上用來探測這種類型的***,一般情況下,如果A位為1,Ack的值是不等於0的。 3.6.2關鍵字classtype Snort規則可以分配類別和優先順序以便區分,為全面了解關鍵字classtype,首先我們來看被snort.conf用include關鍵字所引用的classifacation.config文件,該文件的每一行都遵循下面的語法: config classification: name,description,priority 其中name用來表示類別名稱,在Snort規則中用classtype關鍵字來指定,description是對類別的簡單描述。Priority是這個類別的默認優先順序,用數字表示,並可以在Snort選項中用關鍵字priority改變。你也可以把這些語句放在snort.conf中。下面是一個例子: config classification: DoS,Denial of Service Attack,2 上面的一行中,定義了一個類別DoS,其優先順序為2。在第6章中,你將看到在基於web的Snort分析工具ACID中用到這個類別。現在讓我們在規則中應用這個類別,如下例,優先順序為默認值: alert udp any any -> 192.168.1.0/24 6838 (msg:"DoS"; content: "server"; classtype:DoS;) 我們改變這個規則,可以覆蓋默認優先順序: alert udp any any -> 192.168.1.0/24 6838 (msg:"DoS"; content: "server"; classtype:DoS; priority:1) 分類和優先順序的意義在於,我們可以了解告警是否緊急,這在我們要對威脅性高的告警提高警惕的時候非常有用。 如果你看到在第6章中討論的ACID瀏覽器窗口,就可以看到圖3-3中所示的classifacation欄,在窗口中間的第二列是所捕獲數據包的分類。其他的一些分析工具也用關鍵字classification來區分***行為的類別。典型的classification.conf文件如下所示,這個文件與Snort1.9.0共同發行,你可以在這個文件中增加自己的分類並在自己的規則中應用。 # $Id: classification.config,v 1.10 2002/08/11 23:37:18 cazz Exp $ # The following includes information for prioritizing rules # # Each classification includes a shortname, a description, and a default # priority for that classification. # # This allows alerts to be classified and prioritized. You can specify # what priority each classification has. Any rule can override the default # priority for that rule. # # Here are a few example rules: # # alert TCP any any -> any 80 (msg: "EXPLOIT ntpdx overflow"; # dsize: > 128; classtype:attempted-admin; priority:10; # # alert TCP any any -> any 25 (msg:"SMTP expn root"; flags:A+; # content:"expn root"; nocase; classtype:attempted-recon;) # # The first rule will set its type to "attempted-admin" and override # the default priority for that type to 10. # # The second rule set its type to "attempted-recon" and set its # priority to the default for that type. # # # config classification:shortname,short description,priority # config classification: not-suspicious,Not Suspicious Traffic,3 config classification: unknown,Unknown Traffic,3 config classification: bad-unknown,Potentially Bad Traffic, 2 config classification: attempted-recon,Attempted Information Leak,2 config classification: successful-recon-limited,Information Leak,2 config classification: successful-recon-largescale,Large Scale Information Leak,2 config classification: attempted-dos,Attempted Denial of Service,2 config classification: successful-dos,Denial of Service,2 config classification: attempted-user,Attempted User Privilege Gain,1 config classification: unsuccessful-user,Unsuccessful User Privilege Gain,1 config classification: successful-user,Successful User Privilege Gain,1 config classification: attempted-admin,Attempted Administrator Privilege Gain,1 config classification: successful-admin,Successful Administrator Privilege Gain,1 # NEW CLASSIFICATIONS config classification: rpc-portmap-decode,Decode of an RPC Query,2 config classification: shellcode-detect,Executable code was detected,1 config classification: string-detect,A suspicious string was detected,3 config classification: suspicious-filename-detect,A suspicious filename was detected,2 config classification: suspicious-login,An attempted login using a suspicious username was detected,2 config classification: system-call-detect,A system call was detected,2 config classification: tcp-connection,A TCP connection was detected,4 config classification: trojan-activity,A Network Trojan was detected, 1 config classification: unusual-client-port-connection,A client was using an unusual port,2 config classification: network-scan,Detection of a Network Scan,3 config classification: denial-of-service,Detection of a Denial of Service Attack,2 config classification: non-standard-protocol,Detection of a nonstandard protocol or event,2 config classification: protocol-command-decode,Generic Protocol Command Decode,3 config classification: web-application-activity,access to a potentially vulnerable web application,2 config classification: web-application-attack,Web Application Attack,1 config classification: misc-activity,Misc activity,3 config classification: misc-attack,Misc Attack,2 config classification: icmp-event,Generic ICMP event,3 config classification: kickass-porn,SCORE! Get the lotion!,1 config classification: policy-violation,Potential Corporate Privacy Violation,1 config classification: default-login-attempt,Attempt to login by a default username and password,2 3.6.3關鍵字content Snort的一個重要特徵就是它可以在包的裡面發現數據特徵,這些特徵可能以ASCII字元的形式出現,也可能是16進位字元所表示的二進位數據。如同病毒,***者的行為也通常會在數據包中表現某種特徵,關鍵字content就使用來發現這些特徵的。Snort1.x版本不支援應用層協議,但是用content與offset關鍵字聯合使用,也可以找到應用層的數據。 下面的規則可以檢測離開網路192.168.1.0並在數據段含有「GET」的TCP包。在HTTP相關的***中,GET是經常被用到的一個關鍵字。然而,這個規則僅僅能夠使你了解如何用關鍵字content來工作。 alert tcp 192.168.1.0/24 any -> ![192.168.1.0/24] any (content: "GET"; msg: "GET matched";) 以下的規則作用與上面一條相同,但是特徵以16進位表示。 alert tcp 192.168.1.0/24 any -> ![192.168.1.0/24] any (content: "|47 45 54|"; msg: "GET matched";) 16進值的數字47與ASCII字元G的值相等,45與E相等,54與T相等。你可以在同一條規則中同時用ASCII和16進位來進行特徵比對。用16進值表示時,應當用雙豎線||將字元包括進去。 在用content關鍵字的時候,要記住以下的原則: 內容比對是 3.6.34
3.7Snort配置文件
Snort通過配置文件來完成啟動配置,例如下面的啟動命令:
/opt/snort/snort -c /opt/snort/snort.conf
配置文件包括6個基本的部分:
變數定義,變數用於Snort規則和其他的目的,比如規則文件的路徑。
配置參數,指定Snort配置的選項,其中有些參數也可以用在命令行中。
預處理器配置。用來在探測引擎執行特定的動作前對包進行處理。
輸出模組配置。控制如何記錄數據。
定義新的動作類型。如果預定義的動作類型不能夠滿足你的要求你可以在配置文件中自定義動作。
規則配置和引用文件。儘管你可以在snort.conf中定義規則,將規則放在不同的文件中還是更加方便管理。你可以用關鍵字include來指定你所引用的規則文件。
3.7.1在規則中使用變數
在配置文件中,你可以使用變數,這樣會帶來一些方便。例如,你可以在配置文件中定義HOME_NET變數。
var HOME_NET 192.168.1.0/24
然後你就可以在你的規則中引用這個變數:
alert ip any any -> $HOME_NET any (ipopts: lsrr;
msg: 「Loose source routing attempt」; sid: 1000001;)
這樣做的好處是可以使配置文件用在不同環境中,你所做的只是改變變數的值,而不需要修改每個規則。
3.7.11在變數中使用網路列表
你也可以定義一個包含多個條目的變數,例如一個包含兩個網段的網路:
var HOME_NET [192.168.1.0/24,192.168.10.0/24]
不同的網路用逗號分隔。
3.7.1.2 在變數中使用網路介面名稱
在定義變數的時候,你可以用網路介面名稱:
var HOME_NET $eth0_ADDRESS
var EXTERNAL_NET $eth1_ADDRESS
3.7.1.3 使用關鍵字any
關鍵字any也可以成為一個變數。它匹配任何值,例如:
var EXTERNAL_NET any
在系統自帶的snort.conf文件中,已經定義了很多變數,你可以根據自己的需要修改。
3.7.2 配置指令
在snort.conf文件中用配置指令可以讓用戶配置Snort的全局設定。例如日誌文件的路徑,規則的應用順序等等。配置指令的大體格式如下:
config directive_name[: value]
表3-6是一個指令列表
指令 描述 Order 改變規則應用的順序,相當於命令行中的-o選項。 Alertfile 用來設置告警文件的名稱。 Classification 用來建立規則的分類。 Decode_arp 打開arp解碼,相當於命令行-a選項 Dump_chars_only 相當於命令行選項 –C Dump_payload 相當於命令行選項 –d,用來從包中獲得數據載荷的內容 Decode_data_link 相當於命令行選項 –e,用來數據鏈路層頭部的解碼。 Bpf_file 相當於命令行選項 –F Set_gid 相當於命令行選項 –g,用來設定運行Snort的組用戶ID Daemon 相當於命令行選項 –D,這樣用守護進程的模式調用Snort Reference_net 相當於命令行選項 –h.用來設置本地網路地址 Interface 相當於命令行選項 –i.用來設置Snort的網路介面。 Alert_with_interface_name 相當於命令行選項 –T,用來在告警消息的後面附加介面資訊。 Logdir 相當於命令行選項 –l. Umask 相當於命令行選項 –m,用來在運行Snort的時候設置Umask. Pkt_count 相當於命令行選項 –n,用來在接受到一定數量的包後退出Snort Nolog 相當於命令行選項 –N,用來停止告警以外的日誌。 Obfuscate 相當於命令行選項-O,用來在以偽裝的IP來向其他人發送消息,這樣可以掩藏自己的IP地址。 No_promisc 相當於命令行選項 –p,用來關閉混雜模式。 Quite 相當於命令行選項-q,用來關閉Snort啟動時候的歡迎資訊和統計資訊。 Chroot 相當於命令行選項-t,用來改變根目錄 Checksum_mod 用來檢驗特定類型的包的校驗值。 Set_uid 相當於命令行選項-u,用來設置運行Snort的用戶ID Utc 相當於命令行選項-U,用UTC時間代替本地時間作為日誌的時鐘。 Verbose 相當於命令行選項-v,在記錄日誌的同時,將日誌資訊輸出到標準輸出。 Dump_payload_verbose 相當於命令行選項-X,將原始包資訊傳送到標準輸出 Show_year 在日誌時間戳中加上年份 Stateful 設置stream4預處理器的聲明模式
3.7.3預處理器的配置
預處理器的配置格式如下:
preprocessor <preprocessor_name>[: <configuration_options>]
詳細內容在第四章解釋。
3.7.4輸出模組配置
輸出模組的配置格式如下:
output <output_module_name>[: <configuration_options>]
詳細內容在第四章解釋。
3.7.5定義新的動作類型
每個Snort規則的第一個部分都是動作。Snort有很多預定義的動作,但是如果這些動作仍然不能滿足你的要求,你可以定義自己的動作。
一個新的動作類型可以包含多個輸出模組。例如:
ruletype dump_database
{
type alert
output database: alert, mysql, user=rr dbname=snort
host=localhost
output log_tcpdump: tcpdump_log_file
}
新定義的動作類型同樣可以在規則種應用:
dump_database icmp any any -> 192.168.1.0/24 any
(fragbits: D; msg: "Don』t Fragment bit set";)
如上面的例子,日誌將同時被記錄到資料庫和日誌文件。
3.7.6 規則的配置
規則的配置往往是配置文件中的最後部分。你可以用include關鍵字將其他的規則文件引用。
3.7.8示例
下面是一個配置文件的示例,如果你修改了配置文件,就需要重新啟動Snort使之生效。
# Variable Definitions
var HOME_NET 192.168.1.0/24
var EXTERNAL_NET any
var HTTP_SERVERS $HOME_NET
var DNS_SERVERS $HOME_NET
var RULE_PATH ./
# preprocessors
preprocessor frag2
preprocessor stream4: detect_scans
preprocessor stream4_reassemble
preprocessor http_decode: 80 -unicode -cginull
preprocessor unidecode: 80 -unicode -cginull
preprocessor bo: -nobrute
preprocessor telnet_decode
preprocessor portscan: $HOME_NET 4 3 portscan.log
preprocessor arpspoof
# output modules
output alert_syslog: LOG_AUTH LOG_ALERT
output log_tcpdump: snort.log
output database: log, mysql, user=rr password=boota
dbname=snort host=localhost
output xml: log, file=/var/log/snortxml
# Rules and include files
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/telnet.rules
include $RULE_PATH/smtp.rules
include $RULE_PATH/rpc.rules
include $RULE_PATH/dos.rules
include $RULE_PATH/ddos.rules
include $RULE_PATH/dns.rules
include $RULE_PATH/tftp.rules
include $RULE_PATH/web-cgi.rules
include $RULE_PATH/web-coldfusion.rules
include $RULE_PATH/web-iis.rules
include $RULE_PATH/web-frontpage.rules
include $RULE_PATH/web-misc.rules
include $RULE_PATH/web-attacks.rules
include $RULE_PATH/sql.rules
include $RULE_PATH/x11.rules
include $RULE_PATH/icmp.rules
include $RULE_PATH/netbios.rules
include $RULE_PATH/misc.rules
include $RULE_PATH/attack-responses.rules
include $RULE_PATH/myrules.rules
3.8 基於動作的Snort規則包檢驗順序
5種類型的Snort規則可以歸為3個大類:
告警規則
通過規則
日誌規則
當Snort收到包的時候,會按照上面三種規則依次檢驗,這樣的設計是安全性非常高的。但是因為大多數包是正常的包,因此這樣做也會耗費一些系統資源,Snort提供一種方法改變順序來提高效率,但是這樣做也會使安全性降低。將順序改變為:
通過規則
告警規則
日誌規則
在改變規則的時候要仔細,因為可能一個比較差的規則就可能讓很多惡意的包通過。你可以在配置文件中用config order來實現順序的改變:
config order
如果你定義了自己的規則類型,它們一般會在監測順序的最後。
3.9自動升級Snort規則
有許多工具可以用來升級Snort的特徵庫,下面介紹兩個升級Snort規則的方法
39.1簡單的方法
這個方法包含一個簡單的shell腳本,你需要在你的系統中安裝wget程式。這個程式用來用HTTP協議來獲得文件的資訊,與瀏覽器類似,但是它用命令行來取得文件的資訊。
#!/bin/sh
# Place of storing your Snort rules. Change these variables
# according to your installation.
RULESDIR=/etc/snort
RULESDIRBAK=/etc/snort/bak
# Path to wget program. Modify for your system if needed.
WGETPATH=/usr/bin
# URI for Snort rules
RULESURI=http://www.snort.org/downloads/snortrules.tar.gz
# Get and untar rules.
cd /tmp
rm -rf rules
$WGETPATH/wget $RULESURI
tar -zxf snortrules.tar.gz
rm –f snortrules.tar.gz
# Make a backup copy of existing rules
mv $RULESDIR/*.rules $RULESDIRBAK
# Copy new rules to the location
mv /tmp/rules/*.rules $RULESDIR
下面讓我們來看這個腳本是如何工作的。下面的幾行是定義一些變數:
RULESDIR=/etc/snort
RULESDIRBAK=/etc/snort/bak
WGETPATH=/usr/bin
RULESURI=http://www.snort.org/downloads/snortrules.tar.gz
下面的3行用來刪除/tmp目錄下面的/tmp/rules並從$RULESURI變數中指定的URI下載snortrules.tar.gz文件然後用下面的兩行命令解壓並刪除它。
tar -zxf snortrules.tar.gz
rm -f snortrules.tar.gz
下面的一行用來備份現有的規則文件的拷貝,以便你需要使用它們。
mv $RULESDIR/*.rules $RULESDIRBAK
腳本中的最後一行將新的規則文件從/tmp/rules目錄移動到工作目錄./etc/snort這樣Snort就可以讀取它們了。
mv /tmp/rules/*.rules $RULESDIR
運行腳本之後要重新啟動Snort。
3.9.2 複雜的方法
這一部分介紹關於Oinkmaster的資訊。你可以在http:// www.algonet.se/~nitzer/oinkmaster/找到關於這個工具的資訊。這個工具是用perl寫的,所以你必須在運行Snort的機器上安裝Perl。
3.10 默認的Snort規則和分類
隨Snort發行版含有很多的規則,它們被存放到不同的文件中,每個文件代表一類規則。例如1.9.0附帶的規則文件:
attack-responses.rules
backdoor.rules
bad-traffic.rules
chat.rules
ddos.rules
deleted.rules
dns.rules
dos.rules
experimental.rules
exploit.rules
finger.rules
icmp-info.rules
icmp.rules
imap.rules
info.rules
local.rules
Makefile
Makefile.am
Makefile.in
misc.rules
multimedia.rules
mysql.rules
netbios.rules
nntp.rules
oracle.rules
other-ids.rules
p2p.rules
policy.rules
pop3.rules
porn.rules
rpc.rules
rservices.rules
scan.rules
shellcode.rules
smtp.rules
snmp.rules
sql.rules
telnet.rules
tftp.rules
virus.rules
web-attacks.rules
web-cgi.rules
web-client.rules
web-coldfusion.rules
web-frontpage.rules
web-iis.rules
web-misc.rules
web-php.rules
x11.rules
例如,所有和X-window***相關的規則都在x11.rules文件中。
# (C) Copyright 2001,2002, Martin Roesch, Brian Caswell, et al.
# All rights reserved.
# $Id: x11.rules,v 1.12 2002/08/18 20:28:43 cazz Exp $
#———-
# X11 RULES
#———-
alert tcp $EXTERNAL_NET any -> $HOME_NET 6000 (msg:"X11 MIT Magic
Cookie detected"; flow:established
; content: "MIT-MAGIC-COOKIE-1"; reference:arachnids,396;
classtype:attempted-user; sid:1225; rev:3;
)
alert tcp $EXTERNAL_NET any -> $HOME_NET 6000 (msg:"X11 xopen";
flow:established; content: "|6c00 0b
00 0000 0000 0000 0000|"; reference:arachnids,395; classtype:unknown;
sid:1226; rev:2;)
3.10.1local.rules文件
local.rules文件中沒有規則,它是用來存放管理員自定義的規則的。你也可以用其他文件來存放自定義的規則。
3.11一些默認的規則的樣板
這一部分分析一些隨Snort發行的預先定義的規則,這裡的規則都是來自於telnet.rules文件,現在讓我們來分析它們:
3.11.1監測telnet會話中的su嘗試
下面的規則探測嘗試在telnet進程中su超級用戶的嘗試:
alert tcp $TELNET_SERVERS 23 -> $EXTERNAL_NET any (msg:"TELNET
Attempted SU from wrong group"; flow:
from_server,established; content:"to su root"; nocase;
classtype:attempted-admin; sid:715; rev:6;)
在這個規則中,有很多地方需要注意:
變數是$TELNET_SERVERS在snort.conf中定義的Telnet伺服器列表。
規則僅僅監測telnet伺服器的回應,而不是請求
變數$EXTERNAL_NET是在snort.conf中定義的外部網路。規則將監測來自於外部的telnet會話,對於內部網路的telnet會話,就不會做出監測。
關鍵字flow用來將規則僅僅應用在已經建立的會話上面。
關鍵字content用來監測含有「to su root」的包,如果有,則產生告警。
關鍵字nocase使規則忽略包內容的大小寫。
關鍵字classtype給規則歸類
規則的ID是715
關鍵字rev顯示規則的版本
3.11.2 監測telnet會話中的登錄失敗
下面的規則與上個規則類似,它可以監測登錄Telnet伺服器的失敗嘗試:
alert tcp $TELNET_SERVERS 23 -> $EXTERNAL_NET any (msg:"TELNET login
incorrect"; content:"Login inco
rrect"; flow:from_server,established; reference:arachnids,127;
classtype:bad-unknown; sid:718; rev:6;)
它比上個規則多出了一個指定參考地址的關鍵字。
3.12寫有品質的規則
在Snort的發行版中有已經定義好的規則,這些規則對於你編寫優質的規則是個不錯的參考。儘管不是強制性的,但是你最好在每個規則的選項中用到下面的部分:
用msg關鍵字引導的消息
用classification關鍵字引導的規則分類
用sid關鍵字引導的的數字用來標示規則
用reference關鍵字引導的系統弱點參考URL
用rev來表明不同的規則版本
另外,你應該用不同的方法來***你的網路來測試你的規則,因為惡意用戶也會用各種方法來***網路。好的規則應該能夠探測到各種***。