歡迎您光臨本站 註冊首頁

強大的輕量級網路入侵檢測系統SNORT

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  1.簡介

在網路日益普及的今天,網路安全變的越來越重要,作為網路安全的一個重要組成部分網路入侵檢測系統(Network Intrusion Detection System,NIDS)也越來越顯示出其重要性。NIDS用來監視網路數據流動情況,當入侵發生時能夠提供報警。現在已經出現了很多商業的NIDS,但是它們大多比較複雜,比較難以掌握,而且比較昂貴,比較小的公司無法承受。本文將介紹一個出色的免費NIDS系統---snort,它基於GPL,作者是Martin Roesch。最新版本是1.70版。本文將介紹snort的技術特點及如何使用snort作為NIDS。


2.SNORT的特點

snort是一個強大的輕量級的網路入侵檢測系統。它具有實時數據流量分析和日誌IP網路數據包的能力,能夠進行協議分析,對內容進行搜索/匹配。它能夠檢測各種不同的攻擊方式,對攻擊進行實時報警。此外,snort具有很好的擴展性和可移植性。還有,這個軟體遵循通用公共許可證GPL,所以只要遵守GPL任何組織和個人都可以自由使用。

1).snort是一個輕量級的入侵檢測系統
snort雖然功能強大,但是其代碼極為簡潔、短小,其源代碼壓縮包只有大約110KB。

2).snort的可移植性很好
snort的跨平台性能極佳,目前已經支持Linux,Solaris,BSD,IRIX,HP-UX,WinY2K等系統。

3)。snort的功能非常強大
snort具有實時流量分析和日誌IP網路數據包的能力。能夠快速地檢測網路攻擊,及時地發出報警。snort的報警機制很豐富,例如:syslog、用戶指定的文件、一個UNIX套接字,還有使用SAMBA協議向Windows客戶程序發出WinPopup消息。利用XML插件,snort可以使用SNML(簡單網路標記語言,simple network markup language)把日誌存放到一個文件或者適時報警。

snort能夠進行協議分析,內容的搜索/匹配。現在snort能夠分析的協議有TCP、UDP和ICMP。將來,可能提供對ARP、ICRP、GRE、OSPF、RIP、IPX等協議的支持。它能夠檢測多種方式的攻擊和探測,例如:緩衝區溢出、秘密埠掃描、CGI攻擊、SMB探測、探測操作系統指紋特徵的企圖等等。

snort的日誌格式既可以是tcpdump式的二進位格式,也可以解碼成ASCII字元形式,更加便於用戶尤其是新手檢查。使用資料庫輸出插件,snort可以把日誌記入資料庫,當前支持的資料庫包括:Postgresql、MySQL、任何unixODBC資料庫,還有Oracle(對Oracle的支持目前處於測試階段)。

使用TCP流插件(tcpstream),snort可以對TCP包進行重組。snort能夠對IP包的內容進行匹配,但是對於TCP攻擊,如果攻擊者使用一個程序,每次發送只有一個位元組的TCP包,完全可以避開snort的模式匹配。而被攻擊的主機的TCP協議棧會重組這些數據,將其送給在目標埠上監聽的進程,從而使攻擊包逃過snort的監視。使用TCP流插件,可以對TCP包進行緩衝,然後進行匹配,使snort具備了對付上面這種攻擊的能力。

使用spade(Statistical Packet Anomaly Detection Engine)插件,snort能夠報告非正常的可疑包,從而對埠掃描進行有效的檢測。

snort還有很強的系統防護能力。使用FlexResp功能,snort能夠主動斷開惡意連接。

4).擴展性能較好,對於新的攻擊威脅反應迅速
作為一個輕量級的網路入侵檢測系統,snort有足夠的擴展能力。它使用一種簡單的規則描述語言。最基本的規則只是包含四個個域:處理動作、協議、方向、注意的埠。例如:
log tcp any any -> 10.1.1.0/24 79 。還有一些功能選項可以組合使用,實現更為複雜的功能。將有一篇單獨的文章討論如何寫snort規則。用戶可以從http://www.snort.org得到其規則集。另外,著名的黑客Max Vision在http://www.whitehats.com提供在線的技術支持。

snort支持插件,可以使用具有特定功能的報告、檢測子系統插件對其功能進行擴展。snort當前支持的插件包括:資料庫日誌輸出插件、碎數據包檢測插件、埠掃描檢測插件、HTTP URI normalization插件、XML插件等。

snort的規則語言非常簡單,能夠對新的網路攻擊做出很快的反應。發現新的攻擊后,可以很快根據Bugtraq郵件列表,找出特徵碼,寫出檢測規則。因為其規則語言簡單,所以很容易上手,節省人員的培訓費用。

5).遵循公共通用許可證GPL
snort遵循GPL,所以任何企業、個人、組織都可以免費使用它作為自己的NIDS。


3.安裝

3.1.如何獲得snort
可以從snort的站點http://www.snort.org獲得其源代碼或者RPM包。使用源代碼安裝snort需要libpcap庫,可以從ftp://ftp.ee.lbl.gov下載,

3.2.安裝snort

3.2.1.RPM包,可以使用下面的命令進行安裝:
bash#rpm -ihv --nodeps snort-1.7-1.i386.rpm

3.2.2.源代碼:

1).解壓libpcap包:
bash#uncompress libpcap.tar.Z
bash#tar xvf libpcap.tar
2).編譯libpcap庫:
bash#./configure
bash#make
3).解壓snort-1.7.0.tar.gz
bash#tar zxvf snort-1.7.0.tar.gz
4).進入到其所在目錄,編譯snort:
bash# ./configure --with-libpcap-includes=/path/to/your/libcap/headers
bash# make
bash# make install
5).configure腳本還有一些選項:--enable-smbalerts編譯SMB報警代碼;--enable-flexresp編譯Flexible Response代碼;--with-mysql=DIR支持mysql資料庫;--with-postgresql=DIR支持postsql資料庫;--with-odbc=DIR支持ODBC資料庫;--enable-openssl支持SSL。可以根據自己的實際情況選擇這些選項。


4.使用
現在,snort已經安裝完成。我們將在這一節討論如何使用snort。作為一個網路入侵檢測的軟體,snort有三種用途:數據包嗅探器(packet sniffer)、數據包分析器(packet analyser)以及網路入侵檢測系統。讓我們從最簡單的命令開始,輸入一個簡單的命令列出所有的命令行開關。

bash# snort -?
-*> Snort! <*-
Version 1.7
By Martin Roesch (roesch@clark.net, www.snort.org)
USAGE: snort [-options]
Options:
-A 設置報警模式:fast、full、none(只是使用報警文件)、
unsock(使用UNIX套接字記入日誌,出於測試階段)
-a 顯示ARP(Address Resolution Protocol,地址解析
協議)包
-b 日誌文件使用tcpdump格式(更快)
-c 使用規則文件rules
-C 只使用字元方式列印負載信息(不使用hex方式)
-d 複製應用層
-D 在後台運行snort(精靈狀態)
-e 顯示第二層(數據鏈路層)包頭信息
-F Read BPF filters from file
-g 初始化完成後,使snort的gid為gname
-h Home網路為hn
-i 在介面if上監聽
-I 把界面名加入到報警輸出界面。
-l 設置目錄ld為日誌目錄
-M 把SMB消息發送到文件wrkst列出的工作站中
(Requires smbclient to be in PATH)
-n 收到cnt個包後退出
-N 關閉日誌功能(警報功能仍然有效)
-o 把規則測試順序修改為:Pass|Alert|Log
-O 打亂被日誌的IP地址
-p 關閉混雜嗅探模式
-P 設置複製的包的長度為snaplen(默認: 1514)
-q 安靜模式。不輸出banner和狀態報告。
-r 讀取並處理tcpdump文件tf(回放功能)
-s 把所有警告信息記入syslog
-S 設置規則文件中的n的值等於v的值
-t
初始化完成後Chroot到dir目錄
-u 初始化完成後,把snort的uid設置為uname
-v 設置冗餘模式
-V 顯示版本號
-X 從鏈路層開始複製包的數據
-? 顯示幫助信息
<包過濾選項>基於BPF,可參考TCPDump

4.1.作為嗅探器
所謂的嗅探器模式就是snort從網路上讀出數據包然後顯示在你的控制台上。首先,我們從最基本的用法入手。如果你只要把TCP/IP包頭信息列印在屏幕上,只需要輸入下面的命令:

./snort -v

使用這個命令將使snort只輸出IP和TCP/UDP/ICMP的包頭信息。如果你要看到應用層的數據,可以使用:

./snort -vd

這條命令使snort在輸出包頭信息的同時顯示包的數據信息。如果你還要顯示數據鏈路層的信息,就使用下面的命令:

./snort -vde

注意這些選項開關還可以分開寫或者任意結合在一塊。例如:下面的命令就和上面最後的一條命令等價:

./snort -d -v -e

4.2.記錄數據包
如果要把所有的包記錄到硬碟上,你需要指定一個日誌目錄,snort就會自動對數據包進行日誌:

./snort -dev -l ./log

當然,./log目錄必須存在,否則snort就會報告錯誤信息並退出。當snort在這種模式下運行,它會日誌所有看到的包將其放到一個目錄中,這個目錄以數據包目的主機的IP地址命名,例如1192.168.10.1

如果你只指定了-l命令開關,而沒有設置目錄名,snort有時會使用遠程主機的IP地址作為目錄,有時會使用本地主機IP地址作為目錄名。為了只對本地網路進行日誌,你需要給出home net:

./snort -dev -l ./log -h 192.168.1.0/24

這個命令告訴snort把進入C類網路192.168.1的所有包的數據鏈路、TCP/IP以及應用層的數據記錄到目錄./log中。

如果你的網路速度很快,或者你想使日誌更加緊湊以便以後的分析,那麼應該使用二進位的日誌文件格式。所謂的二進位日誌文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包日誌到一個單一的二進位文件中:

./snort -l ./log -b

注意此處的命令行和上面的有很大的不同。我們勿需指定home network,因為所有的東西都被記錄到一個單一的文件。你也不必冗餘模式或者使用-d、-e功能選項,因為數據包中的所有內容都會被記錄到日誌文件中。

你可以使用任何支持tcpdump二進位格式的嗅探器程序從這個文件中讀出數據包,例如:tcpdump或者Ethereal。使用-r功能開關,也能使snort讀出包的數據。snort在所有運行模式下都能夠處理tcpdump格式的文件。例如:如果你想在嗅探器模式下把一個tcpdump格式的二進位文件中的包列印到屏幕上,可以輸入下面的命令:

./snort -dv -r packet.log

在日誌包和入侵檢測模式下,通過BPF(BSD Packet Filter)介面,你可以使用許多方式維護日誌文件中的數據。例如,你只想從日誌文件中提取ICMP包,只需要輸入下面的命令行:

./snort -dvr packet.log icmp

4.3.作為入侵檢測系統

snort最重要的用途還是作為網路入侵檢測系統(NIDS),使用下面命令行可以啟動這種模式:

./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf

snort.conf是規則集文件。snort會對每個包和規則集進行匹配,發現這樣的包就採取相應的行動。如果你不指定輸出目錄,snort就輸出到/var/log/snort目錄。

注意:如果你想長期使用snort作為自己的入侵檢測系統,最好不要使用-v選項。因為使用這個選項,使snort向屏幕上輸出一些信息,會大大降低snort的處理速度,從而在向顯示器輸出的過程中丟棄一些包。

此外,在絕大多數情況下,也沒有必要記錄數據鏈路層的包頭,所以-e選項也可以不用:

./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf

這是使用snort作為網路入侵檢測系統最基本的形式,日誌符合規則的包,以ASCII形式保存在有層次的目錄結構中。

網路入侵檢測模式下的輸出選項

在NIDS模式下,有很多的方式來配置snort的輸出。在默認情況下,snort以ASCII格式記錄日誌,使用full報警機制。如果使用full報警機制,snort會在包頭之後列印報警消息。如果你不需要日誌包,可以使用-N選項。

snort有6種報警機制:full、fast、socket、syslog、smb(winpopup)和none。其中有4個可以在命令行狀態下使用-A選項設置。這4個是:

-A fast:報警信息包括:一個時間戳(timestamp)、報警消息、源/目的IP地址和埠。

-A full:是默認的報警模式

-A unsock:把報警發送到一個UNIX套接字,需要有一個程序進行監聽,這樣可以實現適時的報警

-A none:關閉報警機制

使用-s選項可以使snort把報警消息發送到syslog,默認的設備是LOG_AUTHPRIV和LOG_ALERT。可以修改snort.conf文件修改其配置。

snort還可以使用SMB報警機制,通過SAMBA把報警消息發送到Windows主機。為了使用這個報警機制,在運行./configure腳本時,必須使用--enable-smbalerts選項。

下面是一些輸出配置的例子:

1).使用默認的日誌方式(以解碼的ASCII格式)並且把報警發給syslog:
./snort -c snort.conf -l ./log -s -h 192.168.1.0/24

2).使用二進位日誌格式和SMB報警機制:
./snort -c snort.conf -b -M WORKSTATIONS


snort規則簡介

snort最重要的用途是作為網路入侵檢測系統,它有自己的規則語言。從語法上看,這種規則語言非常簡單,但是對於入侵檢測來說它足夠強大。對於匹配特定規則的數據包,snort有三種處理動作:pass、log、alert。

1).pass:放行數據包
2).log:把數據包記錄到日誌文件
3).alert:產生報警消息並日誌數據包

snort的每條規則都可以分成邏輯上的兩個部分:規則頭和規則選項。規則頭包括:規則行動(rules action)、協議(protocol)、源/目的IP地址、子網掩碼以及源/目的埠。規則選項包含報警消息和異常包的信息(特徵碼),使用這些特徵碼來決定是否採取規則規定的行動。最基本的規則只是包含四個個域:處理動作、協議、方向、注意的埠。例如:



log tcp any any -> 10.1.1.0/24 79


這條規則表示:讓snort記錄從外部網路到C類網址10.l.1所有數據包。

snort規則中還可以有規則選項(rule option),使用規則選項可以定義更為複雜的行為,實現更加強大的功能。下面是一條含有規則選項的規則(注意整個規則應該在一行,是出於版面的原因才分成兩行):


alert tcp any any -> 10.1.1.0/24 80 (content:


"/cgi-bin/phf";msg "PHF probe!")


這條規則用來檢測對本地網路web伺服器的PHF服務的探測,一旦檢測到這種探測數據包,snort就發出報警消息,並把整個探測包記錄到日誌。

在規則中,IP地址的定義也有很大的靈活性。使用any關鍵詞表示任何IP地址或者埠。一般地,IP地址可以使用xx.xx.xx.xx/子網掩碼的形式定義,其中xx.xx.xx.xx是由.分割的四個位元組的數字。注意不能使用域名方式,snort不對域名進行解析,當然是出於效率的考慮^_^。還可以使用非操作符!對IP地址和埠進行操作,這個操作符就是邏輯非的意思。對於埠,還可以使用操作符:限制埠的範圍。例如:


alert tcp !10.1.1.0/24 any -> 10.1.1.0/24 6000:6010 (


msg: "X traffic";)


這條規則使snort對於從外部網路到內部網路X-window服務埠的數據包發出報警。

在snort當前版本(1.7)中有23個規則選項關鍵詞,隨著snort不斷地加入對更多協議的支持以及功能的擴展,會有更多的功能選項加入其中。這些功能選項可以以任意的方式進行組合,對數據包進行分類和檢測。現在,snort支持的選項包括:msg、logto、ttl、tos、id、ipoption、fragbits、dsize、flags、seq、ack、itype、icode、icmp_id、content、content-list、offset、depth、nocase、session、rpc、resp、react。每條規則中,各規則選項之間是邏輯與的關係。只有規則中的所有測試選項(例如:ttl、tos、id、ipoption等)都為真,snort才會採取規則動作。


如何編寫規則

由於snort的規則語言語法非常簡單,所以可以對新發現的攻擊作出快速的反應,迅速開發新的snort規則。編寫新的規則,最重要的是知道新攻擊的特徵碼。要得到一個新的攻擊的特徵碼,一般的方法就是進行實際的測試。對一個測試網路進行攻擊,使用snort記錄在攻擊主機和測試網路之間的數據流。然後,對記錄的數據進行分析得到其唯一的特徵碼,最後把得到的特徵碼加入到規則中。我們以IMAP緩衝區溢出為例進行說明,圖8是一個假想的IMAP緩衝區溢出攻擊被記錄下的數據包:

--------------------------------------------------------------------------
052499-22:27:58.403313 192.168.1.4:1034 -> 192.168.1.3:143
TCP TTL:64 TOS:0x0 DF
***PA* Seq: 0x5295B44E Ack: 0x1B4F8970 Win: 0x7D78
90 90 90 90 90 90 90 90 90 90 90 90 90 90 EB 3B ...............;
5E 89 76 08 31 ED 31 C9 31 C0 88 6E 07 89 6E 0C ^.v.1.1.1..n..n.
B0 0B 89 F3 8D 6E 08 89 E9 8D 6E 0C 89 EA CD 80 .....n....n.....
31 DB 89 D8 40 CD 80 90 90 90 90 90 90 90 90 90 1...@...........
90 90 90 90 90 90 90 90 90 90 90 E8 C0 FF FF FF ................
2F 62 69 6E 2F 73 68 90 90 90 90 90 90 90 90 90 /bin/sh.........
---------------------------------------------------------------------------

這個攻擊的特徵碼就是/bin/sh字元串及其前面的機器代碼。這實際上是一個shellcode。四用這些信息可以很快開發出一條新的規則:


alert tcp any any -> 192.168.1.0/24 143 (content:"|E8C0 FFF FF|/bin/sh";


msg:"New IMAP Buffer Overflow detected!";)


其中的特徵碼含有文本和16進位兩種形式,它們以|分割,snort運行時都被轉換為二進位形式。


總結

本文介紹了一個輕量級的入侵檢測系統snort。主要討論了其特點、如何安裝,最基本的用法,以及如何開發新的規則。snort是一個高性能的入侵檢測系統,適用於大中小型網路,尤其適合一些無力承受大型商業入侵檢測系統高昂費用中小型公司。


[火星人 ] 強大的輕量級網路入侵檢測系統SNORT已經有635次圍觀

http://coctec.com/docs/linux/show-post-68022.html