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 ([email protected], 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 把規則測試順序修改為:PassAlertLog -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是一個高性能的入侵檢測系統,適用於大中小型網絡,尤其適合一些無力承受大型商業入侵檢測系統高昂費用中小型公司。