網絡安全實驗-入侵檢測-基於網絡入侵檢測系統

 實驗目的:   

1.掌握snort IDS工作機理

2.應用snort三種方式工作

3.熟練編寫snort規則

實驗原理:    

一.snort IDS概述

        snort IDS(入侵檢測系統)是一個強大的網絡入侵檢測系統。它具有實時數據流量分析和記錄IP網絡數據包的能力,能夠進行協議分析,對網絡數據包內容進行搜索/匹配。它能夠檢測各種不同的攻擊方式,對攻擊進行實時報警。此外,snort是開源的入侵檢測系統,並具有很好的擴展性和可移植性。

二.snort IDS體系結構

        snort IDS體系結構如圖1所示。

                                                     圖1  SnortIDS體系結構

       如上圖所示,snort的結構由4大軟件模塊組成,它們分別是:

    (1)數據包嗅探模塊——負責監聽網絡數據包,對網絡進行分析;

    (2)預處理模塊——該模塊用相應的插件來檢查原始數據包,從中發現原始數據的“行爲”,如端口掃描,IP碎片等,數據包經過預處理後才傳到檢測引擎;

    (3)檢測模塊——該模塊是snort的核心模塊。當數據包從預處理器送過來後,檢測引擎依據預先設置的規則檢查數據包,一旦發現數據包中的內容和某條規則相匹配,就通知報警模塊;

    (4)報警/日誌模塊——經檢測引擎檢查後的snort數據需要以某種方式輸出。如果檢測引擎中的某條規則被匹配,則會觸發一條報警,這條報警信息會通過網絡、UNIX socket、Windows Popup(SMB)、SNMP協議的trap命令傳送給日誌文件,甚至可以將報警傳送給第三方插件(如SnortSam),另外報警信息也可以記入SQL數據庫。

三.snort三種工作方式

        snort擁有三大基本功能:嗅探器、數據包記錄器和入侵檢測。嗅探器模式僅從網絡上讀取數據包並作爲連續不斷的流顯示在終端上,常用命令snort -dev。數據包記錄器模式是把數據包記錄到硬盤上,常用命令snort -b。網絡入侵檢測模式是最複雜的,而且是可配置的。我們可以讓Snort分析網絡數據流以匹配用戶定義的一些規則,並根據檢測結果採取一定的動作。

四.snort規則

1.snort規則定義

        snort使用一種簡單的規則描述語言,這種描述語言易於擴展,功能也比較強大。snort規則是基於文本的,規則文件按照不同的組進行分類,比如,文件ftp.rules包含了FTP攻擊內容。

    「注」 snort的每條規則必須在一行中,它的規則解釋器無法對跨行的規則進行解析。

        snort的每條規則都可以分成邏輯上的兩個部分:規則頭和規則體。

        規則頭包括4個部分:

        規則行爲

        協議

        源信息

        目的信息

        圖2是對於規則頭的描述。

                                            圖2  snort規則頭

        snort預置的規則動作有5種:

      (1)pass—動作選項pass將忽略當前的包,後繼捕獲的包將被繼續分析。

      (2)log—動作選項log將按照自己配置的格式記錄包。

      (3)alert—動作選項alert將按照自己配置的格式記錄包,然後進行報警。它的功能強大,但是必須恰當的用,因爲如果報警記錄過多,從中攫取有效信息的工作量增大,反而會使安全防護工作變得低效。

      (4)dynamic—動作選項dynamic是比較獨特的一種,它保持在一種潛伏狀態,直到activate類型的規則將其觸發,之後它將像log動作一樣記錄數據包。

      (5)activate—動作選項activate功能強大,當被規則觸發時生成報警,並啓動相關的dynamic類型規則。在檢測複雜的攻擊,或對數據進行歸類時,該動作選項相當有用。

        除了以上5種預置的規則動作類型,用戶還可以定製自己的類型。

        規則體的作用是在規則頭信息的基礎上進一步分析,有了它才能確認複雜的攻擊(snort的規則定義中可以沒有規則體)。規則體由若干個被分別隔開的片斷組成,每個片斷定義了一個選項和相應的選項值。一部分選項是對各種協議的詳細說明,包括IP、ICMP和TCP協議,其餘的選項是:規則觸發時提供給管理員的參考信息,被搜索的關鍵字,snort規則的標識和大小寫不敏感選項。

下面是一個規則實例。

        其中,alert表示規則動作爲報警。

        tcp表示協議類型爲TCP協議。

        !192.168.0.1/24表示源IP地址不是192.168.0.1/24。

        第一個any表示源端口爲任意端口。

        ->表示發送方向操作符。

        第二個any表示目的IP地址爲任意IP地址。

        21表示目的端口爲21。

        content: "USER"表示匹配的字符串爲“USER”。

        msg: "FTP Login"表示報警信息爲“FTP Login”。

        上面的規則也可寫成:

        方向操作符->表示數據包的流向。它左邊的數據包分別是源地址和源端口,目的地址和目的端口。此外,還有一個雙向操作符<>,它使snort對這條規則中,兩個IP地址/端口之間的數據傳輸進行記錄/分析,例如telnet或者POP3對話。下面的規則表示對一個telnet對話的雙向數據傳輸進行記錄:

        activate/dynamic規則對擴展了snort功能。使用activate/dynamic規則對,你能夠使用一條規則激活另一條規則,當一條特定的規則啓動,如果你想要snort接着對符合條件的數據包進行記錄時,使用activate/dynamic規則對非常方便。除了一個必需的選項activates外,激活規則非常類似於報警規則(alert)。動態規則(dynamic)和日誌規則(log)也很相似,不過它需要一個選項:activated_by。動態規則還需要另一個選項:count。當一個激活規則啓動,它就打開由activate/activated_by選項之後的數字指示的動態規則,記錄count個數據包。

        下面是一條activate/dynamic規則對的規則:

        當發現Telnet默認使用的23端口有通信,activate規則會被觸發並啓動dynamic規則,然後dynamic規則將遵循配置,記錄後面的20個數據包。

        在上面的例子裏activate規則的“activates”值爲111,dynamic規則的“activated_by”值爲111,這樣就把兩個規則關聯起來,而不是因爲這兩個規則有相同的規則頭。

2.預處理綜述

        預處理器在調用檢測引擎之前,在數據包被解碼之後運行。通過這種機制,snort可以以一種out of band的方式對數據包進行修改或者分析。

        預處理器可以使用preprocessor關鍵詞來加載和配置,常用到的預處理器如下:

      (1)HTTP decode預處器

        HTTP解碼預處理模塊用來處理HTTP URL字符串,把它們轉換爲清晰的ASCII字符串。

      (2)端口掃描器portscan

         端口掃描器會把由單個源IP地址發起的端口掃描從開始到結束的全過程記錄到標準日誌。

      (3)stream處理器

         stream處理器爲snort提供了TCP數據包重組的功能。在配置的端口上,stream處理器能夠對TCP數據包的細小片段進行重組,使之成爲完整的TCP數據包,然後snort可以對其可疑行爲進行檢查。

      (4)frag2處理器

        frag2預處理器爲snort提供了IP分片重組的功能。frag2預處理器能夠對分片包進行重組來定位分片攻擊,它的工作原理是將所有的分片重組構造成一個包含完整信息的數據包,再將這個包傳給檢測引擎。

五.snort應用

        snort採用命令行方式運行。格式爲:snort –[options] <filters>。options爲選項參數;filters爲過濾器。

1.snort主要選項參數

        -A <alert>設置報警方式爲full,fast或者none。在full方式下,snort將傳統的報警信息格式寫入報警文件,報警內容比較詳細。在fast方式下,snort只將報警時間,報警內容,報警IP地址和端口號寫入文件。在none方式下,系統將關閉報警功能。

        -a 顯示ARP包。

        -b 以tcpdump的格式將數據包記入日誌。所有的數據包將以二進制格式記錄到snort.log文件中。這個選項提高了snort的操作速度,因爲直接以二進制存儲,省略了轉換爲文本文件的時間,通過-b選項的設置,snort可以在100Mbps的網絡環境中正常工作。

        -c <cf> 使用配置文件<cf>。文件內容主要控制系統哪些包需要記入日誌,哪些包需要報警,哪些包可以忽略等。

        -C 僅抓取包中的ASCII字符。

        -d 抓取應用層的數據包。

        -D 在守護模式下運行snort。

        -e 顯示和記錄數據鏈路層信息。

        -F <bpf> 從文件<bpf>中讀取BPF過濾信息。

        -h <hn> 設置<hn>(C類IP地址)爲內部網絡。當使用這個開關時,所有從外部的流量將會有一個方向箭頭指向右邊,所有從內部的流量將會有一個左箭頭。這個選項沒有太大的作用,但是可以使顯示的包的信息格式比較容易察看。

        -i <if> 使用網絡接口文件<if>。

        -l <ld> 將包信息記錄到目錄<ld>下。設置日誌記錄的分層目錄結構,按接收包的IP地址將抓取的包存儲在相應的目錄下。

        -n <num> 處理完<num>包後退出。

        -N 關閉日誌功能,報警功能仍然工作。

        -p 關閉混雜模式的嗅探(sniffing)。這個選項在網絡嚴重擁塞時十分有效。

        -r <tf> 讀取tcpdump生成的文件<tf>,snort將讀取和處理這個文件。

        -s 將報警信息記錄到系統日誌,日誌文件可以出現在/var/log/messages目錄裏。

        -v 將包信息顯示到終端時,採用詳細模式。這種模式存在一個問題:它的顯示速度比較慢,如果你是在IDS網絡中使用snort,最好不要採用詳細模式,否則會丟失部分包信息。

        -V 顯示版本號,並退出。

2.Filters過濾器

        snort的<filters>是標準的BPF格式的過濾器。

        snort應用了BPF機制,可以在探測器上書寫和執行BPF規則的文件。BPF機制允許用戶書寫快速的包分析規則,這些規則主要基於源、目的、和其他的頭信息。通過嗅探和BPF,我們可以只捕獲需要的流量,這樣就減輕了需要處理的數據量。

        BPF機制很容易理解,可以用於分析TCP、UDP、IP和ICMP協議。規則語法很像自然的口語,使用“and”和“or”作爲規則操作符,用“not”作爲取反符,此處還可以用括號來告訴引擎將一系列數據作爲一個整體來處理。

        例如:

        ICMP捕獲:icmp。

        telnet請求數據包捕獲:tcp and dst port 23。

       記錄所有源自網絡192.168.0.0/24,目的是202.98.0.0/24的IP流量 :ip and "src net 192.168.0" and "dst net 202.98.0"

 實驗步驟:

首先使用“快照X”恢復Linux系統環境。
一.snort數據包嗅探
1.啓動snort
        進入實驗平臺,單擊工具欄“控制檯”按鈕,進入IDS工作目錄,運行snort對網絡接口eth0進行監聽,要求如下:
      (1)僅捕獲同組主機發出的icmp回顯請求數據包。
      (2)採用詳細模式在終端顯示數據包鏈路層、應用層信息。
      (3)對捕獲信息進行日誌記錄,日誌目錄/var/log/snort。

        snort命令 snort -i eth0 -dev icmp and src 222.25.29.44 -l /var/log/snort                                        
        本機執行上述命令,同組主機對當前主機進行ping探測,根據snort捕獲信息填寫表1。

                                                                                                                                                     表1

數據幀源MAC

同組主機MAC

數據幀目的MAC

本機MAC

IP上層協議類型

ICMP

數據包源IP

222.25.29.44

數據包目的IP

222.25.29.23

數據包總長度

0x62

IP報文頭長度

20

ICMP報文頭長度

8

ICMP負載長度

56

ICMP類型/代碼

8/0

2.查看snort日誌記錄。
    「說明」 默認snort日誌記錄最後一級目錄會以觸發數據包的源IP命名。可使用組合鍵Ctrl+C停止snort運行。
二.snort數據包記錄
    (1)對網絡接口eth0進行監聽,僅捕獲同組主機發出的Telnet請求數據包,並將捕獲數據包以二進制方式進行存儲到日誌文件中/var/log/snort/snort.log)。
   Snort命令snort -i eth0 -b tcp and src 222.25.29.44 and dst port 23                                      
    (2)當前主機執行上述命令,同組主機telnet遠程登錄當前主機。
    (3)停止snort捕獲(Ctrl+C),讀取snort.log文件,查看數據包內容。
    Snort命令snort -r /var/log/snort/snort.log.XXXX 

三.簡單報警規則
    (1)在snort規則集目錄ids/rules下新建snort規則集文件new.rules,對來自外部主機的、目標爲當前主機80/tcp端口的請求數據包進行報警,報警消息自定義。
    snort規則alert tcp any any -> 222.25.29.23 80 (msg: "XXX";) 

    根據規則完成表2的填寫。

                                                                                                                                                      表2

snort規則動作

tcp

規則頭協議

任意IP 任意端口

規則頭源信息

222.25.29.23 80

規則頭目的信息

當前主機爲接收端

方向操作

XXX

報警消息

tcp

(2)編輯snort.conf配置文件,使其包含new.rules規則集文件,具體操作如下:使用vim(或vi)編輯器打開snort.conf,切換至編輯模式,在最後添加新行包含規則集文件new.rules
    添加包含new.rules規則集文件語句include $RULE_PATH/new.rules(規則集文件路徑)  。        
    3)以入侵檢測方式啓動snort,進行監聽。
    啓動snort的命令snort -c snort.conf  。

    以入侵檢測方式啓動snort,同組主機訪問當前主機Web服務。
    根據報警日誌(/var/log/snort/alert)完成表3的填寫。

                                                                                                                                                     表3

報警名稱

XXX

數據包源IP

222.25.29.44

數據包目的IP

222.25.29.23

數據包源端口號

隨機

數據包目的端口號

80

四.字符串匹配
    說明:FTP服務接收來自客戶端的ftp請求(目標端口21/tcp)後,在應答數據包中將告訴客戶端自己所使用的FTP軟件及版本號,Fedora core5所使用的FTP服務器軟件是vsFTPd 2.0.4。換句話說,當網絡中傳輸的數據包含有“vsFTPd”字樣的內容時,極大的可能性是一個ftp用戶在遠程登錄Linux下的FTP服務器。通過入侵檢測系統對網絡數據包進行匹配,發現含有“vsFTPd”字樣的數據包,並記錄其後續的若干數據包,因爲若FTP會話是以明文方式進行的話,那麼這些數據包中會有用戶登錄所使用的用戶名及口令。
    (1)在snort規則集目錄/opt/ExpNIS/NetAD-Lib/Tools/ids/rules下新建snort規則集文件new2.rules,對網絡中由vsFTPd參與的通信進行報警,並在FTP服務器聲明身份後第一時間內捕獲FTP客戶端登錄用戶名及登錄口令。
    (2)利用activate/dynamic規則對實現。
    snort規則activate tcp any 21 -> any any (activates: 81; content: "vsFTPd"; msg: "FTP User Login"; )    

    (3)編輯snort.conf配置文件,使其包含new2.rules規則集文件。
    4)以入侵檢測方式啓動snort,進行監聽。需要特別說明的是:網絡傳輸數據中的FTP用戶名及口令數據是應用層(ISO七層協議)數據,默認情況下snort不顯示和記錄應用層數據,所以此處在啓動snort時應指定其抓取、記錄應用層數據。
    啓動snort的命令snort -d -c snort.conf  。 

同組主機遠程FTP登錄,登錄過程如圖1所示。

                                         圖1  FTP登錄

查看報警日誌(日誌文件所在目錄以遠程FTP登錄主機IP命名)提取出FTP客戶端登錄時所使用的用戶名及登錄口令。
五.端口掃描攻擊檢測
    (1)修改snort配置文件snort.conf啓動端口掃描預處理器,以入侵檢測方式啓動snort,對來自外部的端口掃描行爲進行檢測。
    預處理描述:preprocessor portscan: 172.16.0.0/24 4 3 /var/log/snort/portscan.log 

(2)同組主機使用Nmap(/opt/ExpNIS/NetAD-Lib/Tools/portscan/namp)對當前主機進行TCP端口掃描操作,待端口掃描完成,查看portscan.log報警日誌,回答下面問題。
    「注」 若第一次端口掃描後portscan.log沒有日誌,不要退出snort,請同組主機進行第二次端口掃描。
    portscan.log日誌記錄格式描述:日期 時間 攻擊源IP:源端口 -> 目標主機IP:掃描端口 SYN ******S*  。

    默認情況下,Nmap在進行目標主機TCP端口掃描時,掃描順序: 無序  。(有序/無序)。
六.IP分片重組檢測
    說明:IP協議在傳輸數據包時,將數據報文分爲若干分片進行傳輸,並在目標系統中進行重組。這一過程稱爲分片(fragmentation)。IP 分片(Fragmentation)發生在要傳輸的IP報文大小超過最大傳輸單位MTU(Maximum Transmission Unit)的情況。比如說,在以太網(Ethernet)環境中可傳輸最大IP報文大小(MTU)爲1500字節。如果要傳輸的報文大小超過1500字節,則需要分片之後進行傳輸。由此可以看出,IP分片在網絡環境中是經常發生的事件。但是,如果經過人爲的惡意操作的分片,會導致拒絕服務攻擊,成爲滲透路由器、防火牆或者網絡入侵檢測系統(NIDS)的一種攻擊手段。
    IDS對單包進行特徵檢測,一個攻擊者可以使用分片工具將一個包分解成多個分片,而每個單獨的分片都不會匹配特徵。snort的frag2預處理器能夠對分片包進行重組來定位這類攻擊。
    對IP碎片的探測不是基於規則匹配的,所以snort仍然需要預處理器對IP分片進行重組。在snort.conf配置文件中激活preprocessor frag2項,就可以實現對IP分片進行重組。實例說明如下:
    preprocessor frag2: timeout 60, memcap 4194304
    timeout選項指明瞭分片重組的超時時間。如果在這段時間裏沒有收到分片,就停止對這個包的重組。
    memcap選項限制了用於分片重組的內存數量。如果frag2用盡了這部分內存,它就會從分片表中淘汰不活躍的分片。
    操作概述:以主機A、B爲例,對實驗步驟進行說明。主機B利用fragroute構造分片數據包,並將特定負載數據拆分到分片數據包中,並通過eth0發送出去;主機A首先修改snort配置文件snort.conf啓動分片重組預處理器,接下來編寫報警規則對包含主機B特定負載數據的數據包進行報警,最後以入侵檢測方式啓動snort,對來自外部的IP分片攻擊進行檢測。
1.主機B構造併發送IP分片數據包
    利用fragroute對流經網絡接口的數據包進行指定大小的分片,操作方法如下:
    (1)切換當前工作目錄至/opt/ExpNIS/NetAD-Lib/Tools/fragroute/,編輯fragroute配置文件(默認目錄/opt/ExpNIS/NetAD-Lib/Tools/fragroute/fragroute.conf),修改“ip_frag”項確定分片數據包IP負載大小。
    「說明」 ip_frag指定的分片大小必須是8的整數倍,默認爲24。
    (2)執行命令:./fragroute -f fragroute.conf 主機A的IP,啓動fragroute。點擊控制檯按鈕,打開新的終端對主機A進行ping操作,fragroute會將icmp回顯請求數據包分片併發送出去。
    「說明」 若fragroute提示“fragroute: no route to 主機A的IP: No such process”信息,則先對目標主機A進行ping探測,而後繼續啓動fragroute即可。
2.主機A監聽檢測
    (1)主機A啓動snort以網絡嗅探方式進行監聽,捕獲分析分片數據包負載狀況。默認情況下如圖2所示。

                                                                                   圖2

「注」 ip_frag指定的分片大小不同,圖中劃線部分數據可能不同。
    從上圖分析可知,ping請求數據包是以分片方式發送出來的,其中數據串“15 16 17 18 19 1A”被分割到兩個數據包中單獨進行發送,接收方由TCP/IP的第三層(網絡層)對分片進行重組,進而纔將“15 16 17 18 19 1A”重組到一個數據包中。                          

    (2)添加snort檢測規則,對網絡中包含有“15 16 17 18 19 1A”數據串(應根據實際數據值來確定此處數據串,此處是以圖22-1-2爲例的)的數據包進行檢測報警。
    snort規則alert icmp any any -> any any (content: "|0D 0E 0F 10 11 12|"; msg: "Fragment Test"; )

    (3)修改snort配置文件snort.conf啓動分片重組預處理器,幷包含新規則集文件。
    預處理描述: preprocessor frag2: timeout 60, memcap 4194304 

    (4)以入侵檢測方式啓動snort,開始監聽。
    (5)同組主機繼續對當前主機進行ping探測,併成功對icmp回顯請求數據包進行分片。
    (6)當前主機查看snort報警日誌。若有“Fragment Test”報警消息,證明snort成功對分片數據包進行了重組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章