摘要 Snort 用戶手冊(cè)
第一章 snort簡(jiǎn)介snort有三種工作模式:嗅探器、數(shù)據(jù)包記錄器、網(wǎng)絡(luò)入侵檢測(cè)系統(tǒng)。嗅探器模式僅僅是從網(wǎng)絡(luò)上讀取數(shù)據(jù)包并作為連續(xù)不斷的流顯示在終端上。數(shù)據(jù)包記錄器模式把數(shù)據(jù)包記錄到硬盤(pán)上。網(wǎng)路入侵檢測(cè)模式是最復(fù)雜的,而且是可配置的。我們可以讓snort分析網(wǎng)絡(luò)數(shù)據(jù)流以匹配用戶定義的一些規(guī)則,并根據(jù)檢測(cè)結(jié)果采取一定的動(dòng)作。 嗅探器 所謂的嗅探器模式就是snort從網(wǎng)絡(luò)上讀出數(shù)據(jù)包然后顯示在你的控制臺(tái)上。首先,我們從最基本的用法入手。如果你只要把TCP/IP包頭信息打印在屏幕上,只需要輸入下面的命令: ./snort -v 使用這個(gè)命令將使snort只輸出IP和TCP/UDP/ICMP的包頭信息。如果你要看到應(yīng)用層的數(shù)據(jù),可以使用: ./snort -vd 這條命令使snort在輸出包頭信息的同時(shí)顯示包的數(shù)據(jù)信息。如果你還要顯示數(shù)據(jù)鏈路層的信息,就使用下面的命令: ./snort -vde 注意這些選項(xiàng)開(kāi)關(guān)還可以分開(kāi)寫(xiě)或者任意結(jié)合在一塊。例如:下面的命令就和上面最后的一條命令等價(jià): ./snort -d -v –e 數(shù)據(jù)包記錄器 如果要把所有的包記錄到硬盤(pán)上,你需要指定一個(gè)日志目錄,snort就會(huì)自動(dòng)記錄數(shù)據(jù)包: ./snort -dev -l ./log 當(dāng)然,./log目錄必須存在,否則snort就會(huì)報(bào)告錯(cuò)誤信息并退出。當(dāng)snort在這種模式下運(yùn)行,它會(huì)記錄所有看到的包將其放到一個(gè)目錄中,這個(gè)目錄以數(shù)據(jù)包目的主機(jī)的IP地址命名,例如:192.168.10.1 如果你只指定了-l命令開(kāi)關(guān),而沒(méi)有設(shè)置目錄名,snort有時(shí)會(huì)使用遠(yuǎn)程主機(jī)的IP地址作為目錄,有時(shí)會(huì)使用本地主機(jī)IP地址作為目錄名。為了只對(duì)本地網(wǎng)絡(luò)進(jìn)行日志,你需要給出本地網(wǎng)絡(luò): ./snort -dev -l ./log -h 192.168.1.0/24 這個(gè)命令告訴snort把進(jìn)入C類(lèi)網(wǎng)絡(luò)192.168.1的所有包的數(shù)據(jù)鏈路、TCP/IP以及應(yīng)用層的數(shù)據(jù)記錄到目錄./log中。 如果你的網(wǎng)絡(luò)速度很快,或者你想使日志更加緊湊以便以后的分析,那么應(yīng)該使用二進(jìn)制的日志文件格式。所謂的二進(jìn)制日志文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包記錄到一個(gè)單一的二進(jìn)制文件中: ./snort -l ./log -b 注意此處的命令行和上面的有很大的不同。我們勿需指定本地網(wǎng)絡(luò),因?yàn)樗械臇|西都被記錄到一個(gè)單一的文件。你也不必冗余模式或者使用-d、-e功能選項(xiàng),因?yàn)閿?shù)據(jù)包中的所有內(nèi)容都會(huì)被記錄到日志文件中。 你可以使用任何支持tcpdump二進(jìn)制格式的嗅探器程序從這個(gè)文件中讀出數(shù)據(jù)包,例如: tcpdump或者Ethereal。使用-r功能開(kāi)關(guān),也能使snort讀出包的數(shù)據(jù)。snort在所有運(yùn)行模式下都能夠處理tcpdump格式的文件。例如:如果你想在嗅探器模式下把一個(gè)tcpdump格式的二進(jìn)制文件中的包打印到屏幕上,可以輸入下面的命令: ./snort -dv -r packet.log 在日志包和入侵檢測(cè)模式下,通過(guò)BPF(BSD Packet Filter)接口,你可以使用許多方式維護(hù)日志文件中的數(shù)據(jù)。例如,你只想從日志文件中提取ICMP包,只需要輸入下面的命令行: ./snort -dvr packet.log icmp 網(wǎng)絡(luò)入侵檢測(cè)系統(tǒng)snort最重要的用途還是作為網(wǎng)絡(luò)入侵檢測(cè)系統(tǒng)(NIDS),使用下面命令行可以啟動(dòng)這種模式: ./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf snort.conf是規(guī)則集文件。snort會(huì)對(duì)每個(gè)包和規(guī)則集進(jìn)行匹配,發(fā)現(xiàn)這樣的包就采取相應(yīng)的行動(dòng)。如果你不指定輸出目錄,snort就輸出到/var/log/snort目錄。 注意:如果你想長(zhǎng)期使用snort作為自己的入侵檢測(cè)系統(tǒng),最好不要使用-v選項(xiàng)。因?yàn)槭褂眠@個(gè)選項(xiàng),使snort向屏幕上輸出一些信息,會(huì)大大降低snort的處理速度,從而在向顯示器輸出的過(guò)程中丟棄一些包。 此外,在絕大多數(shù)情況下,也沒(méi)有必要記錄數(shù)據(jù)鏈路層的包頭,所以-e選項(xiàng)也可以不用: ./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf 這是使用snort作為網(wǎng)絡(luò)入侵檢測(cè)系統(tǒng)最基本的形式,日志符合規(guī)則的包,以ASCII形式保存在有層次的目錄結(jié)構(gòu)中。 網(wǎng)絡(luò)入侵檢測(cè)模式下的輸出選項(xiàng)在NIDS模式下,有很多的方式來(lái)配置snort的輸出。在默認(rèn)情況下,snort以ASCII格式記錄日志,使用full報(bào)警機(jī)制。如果使用full報(bào)警機(jī)制,snort會(huì)在包頭之后打印報(bào)警消息。如果你不需 要日志包,可以使用-N選項(xiàng)。 snort有6種報(bào)警機(jī)制:full、fast、socket、syslog、smb(winpopup)和none。其中有4個(gè)可以在命令行狀態(tài)下使用-A選項(xiàng)設(shè)置。這4個(gè)是:
使用-s選項(xiàng)可以使snort把報(bào)警消息發(fā)送到syslog,默認(rèn)的設(shè)備是LOG_AUTHPRIV和LOG_ALERT。可以修改snort.conf文件修改其配置。 snort還可以使用SMB報(bào)警機(jī)制,通過(guò)SAMBA把報(bào)警消息發(fā)送到Windows主機(jī)。為了使用這個(gè)報(bào)警機(jī)制,在運(yùn)行./configure腳本時(shí),必須使用--enable-smbalerts選項(xiàng)。 使用默認(rèn)的日志方式(以解碼的ASCII格式)并且把報(bào)警發(fā)給syslog: ./snort -c snort.conf -l ./log -s -h 192.168.1.0/24 使用二進(jìn)制日志格式和SMB報(bào)警機(jī)制: ./snort -c snort.conf -b -M WORKSTATIONS 第二章 編寫(xiě)snort 規(guī)則基礎(chǔ)snort使用一種簡(jiǎn)單的,輕量級(jí)的規(guī)則描述語(yǔ)言,這種語(yǔ)言靈活而強(qiáng)大。在開(kāi)發(fā)snort規(guī)則時(shí)要記住幾個(gè)簡(jiǎn)單的原則。 第一,大多數(shù)snort規(guī)則都寫(xiě)在一個(gè)單行上,或者在多行之間的行尾用/分隔。Snort規(guī)則被分成兩個(gè)邏輯部分:規(guī)則頭和規(guī)則選項(xiàng)。規(guī)則頭包含規(guī)則的動(dòng)作,協(xié)議,源和目標(biāo)ip地址與網(wǎng)絡(luò)掩碼,以及源和目標(biāo)端口信息;規(guī)則選項(xiàng)部分包含報(bào)警消息內(nèi)容和要檢查的包的具體部分。 alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";) 第一個(gè)括號(hào)前的部分是規(guī)則頭(rule header),包含的括號(hào)內(nèi)的部分是規(guī)則選項(xiàng)(rule options)。規(guī)則選項(xiàng)部分中冒號(hào)前的單詞稱(chēng)為選項(xiàng)關(guān)鍵字(option keywords)。注意,不是所有規(guī)則都必須包含規(guī)則選項(xiàng)部分,選項(xiàng)部分只是為了使對(duì)要收集或報(bào)警,或丟棄的包的定義更加嚴(yán)格。組成一個(gè)規(guī)則的所有元素對(duì)于指定的要采取的行動(dòng)都必須是真的。當(dāng)多個(gè)元素放在一起時(shí),可以認(rèn)為它們組成了一個(gè)邏輯與(AND)語(yǔ)句。同時(shí),snort規(guī)則庫(kù)文件中的不同規(guī)則可以認(rèn)為組成了一個(gè)大的邏輯或(OR)語(yǔ)句。 規(guī)則高級(jí)概念Includes:
格式: include: 注意在該行結(jié)尾處沒(méi)有分號(hào)。被包含的文件會(huì)把任何預(yù)先定義的變量值替換為自己的變量引用。參見(jiàn)變量(Variables)一節(jié)以獲取關(guān)于在SNORT規(guī)則文件中定義和使用變量的更多信息。 Variables : 變量可能在snort中定義。 格式: var: 例子: var MY_NET 192.168.1.0/24 規(guī)則變量名可以用多種方法修改??梢栽?$"操作符之后定義變量。"?" 和 "-"可用于變量修改操作符。 $var - 定義變量。 例子: var MY_NET $(MY_NET:-192.168.1.0/24) Config Snort的很多配置和命令行選項(xiàng)都可以在配置文件中設(shè)置。 格式: config Directives
規(guī)則頭 規(guī)則動(dòng)作: 規(guī)則的頭包含了定義一個(gè)包的who,where和what信息,以及當(dāng)滿足規(guī)則定義的所有屬性的包出現(xiàn)時(shí)要采取的行動(dòng)。規(guī)則的第一項(xiàng)是"規(guī)則動(dòng)作"(rule action),"規(guī)則動(dòng)作"告訴snort在發(fā)現(xiàn)匹配規(guī)則的包時(shí)要干什么。在snort中有五種動(dòng)作:alert、log、pass、activate和dynamic. 1、Alert-使用選擇的報(bào)警方法生成一個(gè)警報(bào),然后記錄(log)這個(gè)包。 下面這個(gè)例子創(chuàng)建一條規(guī)則,記錄到tcpdump。 ruletype suspicious 協(xié)議
Ip地址 規(guī)則頭的下一個(gè)部分處理一個(gè)給定規(guī)則的ip地址和端口號(hào)信息。關(guān)鍵字"any"可以被用來(lái)定義任何地址。Snort沒(méi)有提供根據(jù)ip地址查詢域名的機(jī)制。地址就是由直接的數(shù)字型ip地址和一個(gè)cidr塊組成的。Cidr塊指示作用在規(guī)則地址和需要檢查的進(jìn)入的任何包的網(wǎng)絡(luò)掩碼。/24表示c類(lèi)網(wǎng)絡(luò), /16表示b類(lèi)網(wǎng)絡(luò),/32表示一個(gè)特定的機(jī)器的地址。例如,192.168.1.0/24代表從192.168.1.1到192.168.1.255的地址塊。在這個(gè)地址范圍的任何地址都匹配使用這個(gè)192.168.1.0/24標(biāo)志的規(guī)則。這種記法給我們提供了一個(gè)很好的方法來(lái)表示一個(gè)很大的地址空間。 有一個(gè)操作符可以應(yīng)用在ip地址上,它是否定運(yùn)算符(negation operator)。這個(gè)操作符告訴snort匹配除了列出的ip地址以外的所有ip地址。否定操作符用"!"表示。下面這條規(guī)則對(duì)任何來(lái)自本地網(wǎng)絡(luò)以外的流都進(jìn)行報(bào)警。 alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: "|00 01 86 a5|"; msg: "external mountd access";) 這個(gè)規(guī)則的ip地址代表"任何源ip地址不是來(lái)自內(nèi)部網(wǎng)絡(luò)而目標(biāo)地址是內(nèi)部網(wǎng)絡(luò)的tcp包"。 alert tcp ![192.168.1.0/24,10.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";) 端口號(hào) 端口號(hào)可以用幾種方法表示,包括"any"端口、靜態(tài)端口定義、范圍、以及通過(guò)否定操作符。"any"端口是一個(gè)通配符,表示任何端口。靜態(tài)端口定義表示一個(gè)單個(gè)端口號(hào),例如111表示portmapper,23表示telnet,80表示http等等。端口范圍用范圍操作符":"表示。范圍操作符可以有數(shù)種使用方法,如下所示: log udp any any -> 192.168.1.0/24 1:1024 log tcp any any -> 192.168.1.0/24 :6000 log tcp any :1024 -> 192.168.1.0/24 500:
方向操作符 方向操作符"->"表示規(guī)則所施加的流的方向。方向操作符左邊的ip地址和端口號(hào)被認(rèn)為是流來(lái)自的源主機(jī),方向操作符右邊的ip地址和端口信息是目標(biāo)主機(jī),還有一個(gè)雙向操作符"<>"。它告訴snort把地址/端口號(hào)對(duì)既作為源,又作為目標(biāo)來(lái)考慮。這對(duì)于記錄/分析雙向?qū)υ捄芊奖?,例如telnet或者pop3會(huì)話。用來(lái)記錄一個(gè)telnet會(huì)話的兩側(cè)的流的范例如下: log !192.168.1.0/24 any <> 192.168.1.0/24 23 Activate 和 dynamic 規(guī)則: 注:Activate 和 dynamic 規(guī)則將被tagging 所代替。在snort的將來(lái)版本,Activate 和 dynamic 規(guī)則將完全被功能增強(qiáng)的tagging所代替。 Activate 和 dynamic 規(guī)則對(duì)給了snort更強(qiáng)大的能力。你現(xiàn)在可以用一條規(guī)則來(lái)激活另一條規(guī)則,當(dāng)這條規(guī)則適用于一些數(shù)據(jù)包時(shí)。在一些情況下這是非常有用的,例如你想設(shè)置一條規(guī)則:當(dāng)一條規(guī)則結(jié)束后來(lái)完成記錄。Activate規(guī)則除了包含一個(gè)選擇域:activates外就和一條alert規(guī)則一樣。Dynamic規(guī)則除了包含一個(gè)不同的選擇域:activated_by 外就和log規(guī)則一樣,dynamic規(guī)則還包含一個(gè)count域。 Actevate規(guī)則除了類(lèi)似一條alert規(guī)則外,當(dāng)一個(gè)特定的網(wǎng)絡(luò)事件發(fā)生時(shí)還能告訴snort加載一條規(guī)則。Dynamic規(guī)則和log規(guī)則類(lèi)似,但它是當(dāng)一個(gè)activate規(guī)則發(fā)生后被動(dòng)態(tài)加載的。把他們放在一起如下圖所示: activate tcp !$HOME_NET any -> $HOME_NET 143 (flags: PA; content: "|E8C0FFFFFF|/bin"; activates: 1; msg: "IMAP buffer overflow!";) 規(guī)則選項(xiàng) 規(guī)則選項(xiàng)組成了snort入侵檢測(cè)引擎的核心,既易用又強(qiáng)大還靈活。所有的snort規(guī)則選項(xiàng)用分號(hào)";"隔開(kāi)。規(guī)則選項(xiàng)關(guān)鍵字和它們的參數(shù)用冒號(hào)":"分開(kāi)。按照這種寫(xiě)法,snort中有42個(gè)規(guī)則選項(xiàng)關(guān)鍵字。 msg - 在報(bào)警和包日志中打印一個(gè)消息。 msg msg規(guī)則選項(xiàng)告訴記錄和報(bào)警引擎,記錄或報(bào)警一個(gè)包的內(nèi)容的同時(shí)打印的消息。它是一個(gè)簡(jiǎn)單的文本字符串,轉(zhuǎn)義符是""。 logto logto選項(xiàng)告訴snort把觸發(fā)該規(guī)則的所有的包記錄到一個(gè)指定的輸出日志文件中。這在把來(lái)自諸如nmap活動(dòng),http cgi掃描等等的數(shù)據(jù)組合到一起時(shí)很方便。需要指出的是當(dāng)snort工作在二進(jìn)制記錄模式下時(shí)這個(gè)選項(xiàng)不起作用。 ttl 這個(gè)規(guī)則選項(xiàng)用于設(shè)置一個(gè)要檢查的存活期的值。只有確切地匹配時(shí)它所進(jìn)行的檢查才成功。這個(gè)選項(xiàng)關(guān)鍵字用于檢測(cè)traceroute。 TOS tos關(guān)鍵字允許你驗(yàn)證IP頭中TOS字段為一個(gè)特殊的值。只有匹配時(shí)才執(zhí)行成功。 id 這個(gè)選項(xiàng)關(guān)鍵字用于檢測(cè)ip頭的分片id的值。有些黑客工具(以及別的程序)為了各種目的設(shè)置這個(gè)域的值,例如一些黑客常使用31337。用一個(gè)簡(jiǎn)單的規(guī)則檢查這個(gè)值就可以對(duì)付他們。 Ipoption 如果數(shù)據(jù)包中使用了IP選項(xiàng),Ipoption選項(xiàng)會(huì)查找使用中的某個(gè)特別IP選項(xiàng),比如源路由。這個(gè)選項(xiàng)的合法參數(shù)如下: rr - Record route(記錄路由) 松散和嚴(yán)格源路由是IP選項(xiàng)中最經(jīng)常被檢查的內(nèi)容,但是它們并沒(méi)有被用在任何廣泛使用的Internet應(yīng)用中。每一個(gè)特定的規(guī)則只能用這個(gè)選項(xiàng)一次。 格式: ipoption: option; 這條規(guī)則檢測(cè)IP頭中的分段和保留位字段的值,共有三個(gè)位能被檢測(cè),保留位RB(Reserved Bit ), 更多分段位MF(More Fragments ), 和不分段位DF(Don’t Fragment)。這些位可以結(jié)合在一起來(lái)檢測(cè)。使用下面的值來(lái)代表這些位,R-RB,M-MF,D-DF。你也可以使用修飾語(yǔ)對(duì)特殊的位來(lái)指出合理的匹配標(biāo)準(zhǔn):* + 所有標(biāo)記匹配特殊位外加任何其他*;*-任何標(biāo)記匹配如果任何位被設(shè)置為*;!如果指定位沒(méi)有設(shè)置就沒(méi)有標(biāo)記匹配。 格式: 例子: dsize dsize選項(xiàng)用于檢查包的凈荷的大小。它可以設(shè)置成任意值,可以使用大于/小于符號(hào)來(lái)指定范圍。例如,如果你知道某個(gè)特定的服務(wù)有一個(gè)特定大小的緩沖區(qū),你可以設(shè)定這個(gè)選項(xiàng)來(lái)監(jiān)視緩沖區(qū)溢出的企圖。它在檢查緩沖區(qū)溢出時(shí)比檢查凈荷內(nèi)容的方法要快得多。 格式: content content 關(guān)鍵字是snort中比較重要的一個(gè)。它允許用戶設(shè)置規(guī)則在包的凈荷中搜索指定的內(nèi)容并根據(jù)內(nèi)容觸發(fā)響應(yīng)。當(dāng)進(jìn)行content選項(xiàng)模式匹配時(shí), Boyer-Moore模式匹配函數(shù)被調(diào)用,并且對(duì)包的內(nèi)容進(jìn)行檢查(很花費(fèi)計(jì)算能力)。如果包的凈荷中包含的數(shù)據(jù)確切地匹配了參數(shù)的內(nèi)容,這個(gè)檢查成功并且該規(guī)則選項(xiàng)的其他部分被執(zhí)行。注意這個(gè)檢查是大小寫(xiě)敏感的。 Content關(guān)鍵字的選項(xiàng)數(shù)據(jù)比較復(fù)雜;它可以包含混合的文本和二進(jìn)制數(shù)據(jù)。二進(jìn)制數(shù)據(jù)一般包含在管道符號(hào)中("|"),表示為字節(jié)碼(bytecode)。字節(jié)碼把二進(jìn)制數(shù)據(jù)表示為16進(jìn)制數(shù)字,是描述復(fù)雜二進(jìn)制數(shù)據(jù)的好方法。下面是包含了一個(gè)混合數(shù)據(jù)的snort規(guī)則范例。 格式: 例子: 注:多內(nèi)容的規(guī)則可以放在一條規(guī)則中,還有(: ; / “)不能出現(xiàn)在content規(guī)則中。如果一條規(guī)則前面有一個(gè)“!”。那么那些不包含這些內(nèi)容的數(shù)據(jù)包將觸發(fā)報(bào)警。這對(duì)于關(guān)注那些不包含一定內(nèi)容的數(shù)據(jù)包是有用的。 offset offset規(guī)則選項(xiàng)被用作使用content規(guī)則選項(xiàng)關(guān)鍵字的規(guī)則的修飾符。這個(gè)關(guān)鍵字修飾符指定模式匹配函數(shù)從包凈荷開(kāi)始處開(kāi)始搜索的偏移量。它對(duì)于cgi掃描檢測(cè)規(guī)則很有用,cgi掃描的內(nèi)容搜索字符串不會(huì)在凈荷的前4個(gè)字節(jié)中出現(xiàn)。小心不要把這個(gè)偏移量設(shè)置的太嚴(yán)格了,會(huì)有可能漏掉攻擊!這個(gè)規(guī)則選項(xiàng)關(guān)鍵字必須和content規(guī)則選項(xiàng)一起使用。 格式: depth depth也是一個(gè)content規(guī)則選項(xiàng)修飾符。它設(shè)置了內(nèi)容模式匹配函數(shù)從他搜索的區(qū)域的起始位置搜索的最大深度。它對(duì)于限制模式匹配函數(shù)超出搜索區(qū)域指定范圍而造成無(wú)效搜索很有用。(也就是說(shuō),如果你在一個(gè)web包中搜索"cgi-bin/phf",你可能不需要浪費(fèi)時(shí)間搜索超過(guò)凈荷的頭20 個(gè)字節(jié))。 格式: 例子: nocase nocase選項(xiàng)用于取消content規(guī)則中的大小寫(xiě)敏感性。它在規(guī)則中指定后,任何與包凈荷進(jìn)行比較的ascii字符都被既作為大寫(xiě)又作為小寫(xiě)對(duì)待。 格式: 例子: flags 這個(gè)規(guī)則檢查tcp標(biāo)志。在snort中有9個(gè)標(biāo)志變量: F - FIN (LSB in TCP Flags byte) 格式: 例子: seq 這個(gè)規(guī)則選項(xiàng)引用tcp順序號(hào)(sequence number)?;旧?,它探測(cè)一個(gè)包是否有一個(gè)靜態(tài)的順序號(hào)集,因此很少用。它是為了完整性而包含進(jìn)來(lái)的。 格式: ack ack規(guī)則選項(xiàng)關(guān)鍵字引用tcp頭的確認(rèn)(acknowledge)部分。這個(gè)規(guī)則的一個(gè)實(shí)用的目的是:檢查nmap tcp ping,nmap tcp ping把這個(gè)域設(shè)置為0,然后發(fā)送一個(gè)tcp ack flag置位的包來(lái)確定一個(gè)網(wǎng)絡(luò)主機(jī)是否活著。 格式: 例子: Window 這條規(guī)則選項(xiàng)指向TCP窗口大小。這個(gè)選項(xiàng)檢查靜態(tài)窗口大小,此外別無(wú)他用。包括它只是為了完整性。
格式: Itype 格式: Icode Icode規(guī)則選項(xiàng)關(guān)鍵字和itype規(guī)則非常接近,在這里指定一個(gè)數(shù)值,Snort會(huì)探測(cè)使用該值作為code值的ICMP包。超出正常范圍的數(shù)值可用于探測(cè)可疑的流量。 格式: Session Session關(guān)鍵字用于從TCP會(huì)話中抽取用戶數(shù)據(jù)。要檢查用戶在telnet,rlogin,ftp或web sessions中的用戶輸入,這個(gè)規(guī)則選項(xiàng)特別有用。Session規(guī)則選項(xiàng)有兩個(gè)可用的關(guān)鍵字作為參數(shù):printable或all。 Printable關(guān)鍵字僅僅打印用戶可以理解或者可以鍵入的數(shù)據(jù)。All關(guān)鍵字使用16進(jìn)制值來(lái)表示不可打印的字符。該功能會(huì)顯著地降低Snort的性能,所以不能用于重負(fù)載環(huán)境。它適合于對(duì)二進(jìn)制(tcpdump格式)log文件進(jìn)行事后處理。 格式: 例子 Icmp_id Icmp_id選項(xiàng)檢查ICMP ECHO數(shù)據(jù)包中ICMP ID數(shù)值是否是指定值。許多秘密通道(covert channel)程序使用靜態(tài)ICMP字段通訊,所以該選項(xiàng)在檢查這種流量時(shí)非常有用。這個(gè)特別的插件用于增強(qiáng)由Max Vision編寫(xiě)的stacheldraht探測(cè)規(guī)則,但是在探測(cè)一些潛在攻擊時(shí)確實(shí)有效。 格式: Icmp_seq Icmp_seq選項(xiàng)檢查ICMP ECHO數(shù)據(jù)包中ICMP sequence字段數(shù)值是否是指定值。許多秘密通道(covert channel)程序使用靜態(tài)ICMP字段通訊,所以該選項(xiàng)在檢查這種流量時(shí)非常有用。這個(gè)特別的插件用于增強(qiáng)由Max Vision編寫(xiě)的stacheldraht探測(cè)規(guī)則,但是在探測(cè)一些潛在攻擊時(shí)確實(shí)有效。(我知道該字段的信息和icmp_id的描述幾乎完全相同,實(shí)際上它們就是同樣的東西!) 格式: Rpc 這個(gè)選項(xiàng)查看RPC請(qǐng)求,并自動(dòng)將應(yīng)用(Application)、過(guò)程(procedure)和程序版本(program version)譯碼,如果所有三個(gè)值都匹配的話,該規(guī)則就顯示成功。這個(gè)選項(xiàng)的格式為"應(yīng)用、過(guò)程、版本"。在過(guò)程和版本域中可以使用通配符"*"。 格式: 例子 搠?敧?捯浵???o??<
Resp Resp關(guān)鍵字可以對(duì)匹配一條Snort規(guī)則的流量進(jìn)行靈活的反應(yīng)(flexible reponse -FlexResp)。FlexResp代碼允許Snort主動(dòng)地關(guān)閉惡意的連接。該插件合法的參數(shù)如下: 格式: 使用resp選項(xiàng)時(shí)要小心,因?yàn)楹苋菀拙蜁?huì)使snort陷入無(wú)限循環(huán)中,例如如下規(guī)則: content_list content_list 關(guān)鍵字允許多內(nèi)容字符串被放在一個(gè)單獨(dú)的內(nèi)容匹配選項(xiàng)中,被匹配的字符串被存放在指定的文件中,而且每個(gè)字符串要單獨(dú)占用一行。否則他們就等同于一個(gè)content字符串。這個(gè)選項(xiàng)是react關(guān)鍵字的基礎(chǔ)。 格式; 下面是一個(gè)文件的內(nèi)容: React 注意,使用這個(gè)功能很容易使網(wǎng)絡(luò)流量陷入回路。React關(guān)鍵字以匹配一個(gè)規(guī)則時(shí)所作出的靈活的反應(yīng)為基礎(chǔ)?;镜姆磻?yīng)是阻塞一些引人注意的站點(diǎn)的用戶的訪問(wèn)。響應(yīng)代碼允許snort積極的關(guān)掉有冒犯行為的訪問(wèn)和/或發(fā)送一個(gè)通知給瀏覽者。這個(gè)通知可以包含你自己的注釋。這個(gè)選項(xiàng)包括如下的基本修飾詞: block——關(guān)閉連接并且發(fā)送一個(gè)通知 格式: 例子: reference 這個(gè)關(guān)鍵字允許規(guī)則包含一個(gè)外面的攻擊識(shí)別系統(tǒng)。這個(gè)插件目前支持幾種特定的系統(tǒng),它和支持唯一的URL一樣好。這些插件被輸出插件用來(lái)提供一個(gè)關(guān)于產(chǎn)生報(bào)警的額外信息的連接。 格式: 例子: Sid 這個(gè)關(guān)鍵字被用來(lái)識(shí)別snort規(guī)則的唯一性。這個(gè)信息允許輸出插件很容易的識(shí)別規(guī)則的ID號(hào)。 <100 保留做將來(lái)使用 格式: rev 這個(gè)關(guān)鍵字是被用來(lái)識(shí)別規(guī)則修改的。修改,隨同snort規(guī)則ID,允許簽名和描述被較新的信息替換。 格式: Classtype 這個(gè)關(guān)鍵字把報(bào)警分成不同的攻擊類(lèi)。通過(guò)使用這個(gè)關(guān)鍵字和使用優(yōu)先級(jí),用戶可以指定規(guī)則類(lèi)中每個(gè)類(lèi)型所具有的優(yōu)先級(jí)。具有classification的規(guī)則有一個(gè)缺省的優(yōu)先級(jí)。 格式: 在文件classification.config中定義規(guī)則類(lèi)。這個(gè)配置文件使用如下的語(yǔ)法: Priority 這個(gè)關(guān)鍵字給每條規(guī)則賦予一個(gè)優(yōu)先級(jí)。一個(gè)classtype規(guī)則具有一個(gè)缺省的優(yōu)先級(jí),但這個(gè)優(yōu)先級(jí)是可以被一條priority規(guī)則重載的。 格式: 格式: Tag 這個(gè)關(guān)鍵字允許規(guī)則記錄不僅僅是觸發(fā)這條規(guī)則的那個(gè)數(shù)據(jù)包。一旦一條規(guī)則被觸發(fā),來(lái)自這個(gè)主機(jī)的數(shù)據(jù)包將被貼上“標(biāo)簽”。被貼上標(biāo)簽的數(shù)據(jù)流將被記錄用于隨后的響應(yīng)代碼和提交攻擊流量的分析。 格式: type session 記錄觸發(fā)這條規(guī)則的會(huì)話的數(shù)據(jù)包 例子: Ip_proto 格式: 例子: br> alert ip !$HOME_NET any -> $HOME_NET any (msg: "IGMP traffic detected"; ip_proto: igmp;) SameIP Sameip關(guān)鍵字允許規(guī)則檢測(cè)源IP和目的IP是否相等。 格式: 例子: Regex Flow 這個(gè)選項(xiàng)要和TCP流重建聯(lián)合使用。它允許規(guī)則只應(yīng)用到流量流的某個(gè)方向上。這將允許規(guī)則只應(yīng)用到客戶端或者服務(wù)器端。這將能把內(nèi)網(wǎng)客戶端流覽web頁(yè)面的數(shù)據(jù)包和內(nèi)網(wǎng)服務(wù)器所發(fā)送的數(shù)據(jù)包區(qū)分開(kāi)來(lái)。這個(gè)確定的關(guān)鍵字能夠代替標(biāo)志:A+ 這個(gè)標(biāo)志在顯示已建立的TCP連接時(shí)都將被使用。 選項(xiàng): 格式: 例子: 這個(gè)關(guān)鍵字允許把IP分段偏移值和一個(gè)十進(jìn)制數(shù)相比較。為了抓到一個(gè)IP會(huì)話的第一個(gè)分段,你可以使用這個(gè)fragbits關(guān)鍵字并且和fragoffset:0 選項(xiàng)一起查看更多的分段選項(xiàng)。 格式: 例子: Rawbytes Rawbytes關(guān)鍵字允許規(guī)則查看telnet 解碼數(shù)據(jù)來(lái)處理不常見(jiàn)的數(shù)據(jù)。這將使得telnet 協(xié)議代碼獨(dú)立于預(yù)處理程序來(lái)檢測(cè)。這是對(duì)前面的content 的一個(gè)修飾。 格式: 例子: distance distance關(guān)鍵字是content關(guān)鍵字的一個(gè)修飾詞,確信在使用content時(shí)模式匹配間至少有N個(gè)字節(jié)存在。它被設(shè)計(jì)成在規(guī)則選項(xiàng)中和其他選項(xiàng)聯(lián)合使用。 格式: 例子: Within Winthin關(guān)鍵字是content關(guān)鍵字的一個(gè)修飾詞,確保在使用content時(shí)模式匹配間至多有N個(gè)字節(jié)存在。它被設(shè)計(jì)成在規(guī)則選項(xiàng)中和distance選項(xiàng)聯(lián)合使用。 格式: 例子: 測(cè)試一個(gè)字節(jié)的域?yàn)樘囟ǖ闹?。能夠測(cè)試二進(jìn)制值或者把字節(jié)字符串轉(zhuǎn)換成二進(jìn)制后再測(cè)試。 格式:byte_test: 例子: Byte_Jump Byte_jump 選項(xiàng)用來(lái)取得一定數(shù)量的字節(jié),并把它們轉(zhuǎn)換成數(shù)字形式,跳過(guò)一些字節(jié)以進(jìn)一步進(jìn)行模式匹配。這就允許相對(duì)模式匹配在網(wǎng)絡(luò)數(shù)據(jù)中進(jìn)行數(shù)字值匹配。 格式: 例子: 第三章 預(yù)處理程序預(yù)處理程序從Snort版本1.5開(kāi)始引入,使得Snort的功能可以很容易地?cái)U(kuò)展,用戶和程序員能夠?qū)⒛K化的插件方便地融入Snort之中。預(yù)處理程序代碼在探測(cè)引擎被調(diào)用之前運(yùn)行,但在數(shù)據(jù)包譯碼之后。通過(guò)這個(gè)機(jī)制,數(shù)據(jù)包可以通過(guò)額外的方法被修改或分析。使用preprocessor關(guān)鍵字加載和配置預(yù)處理程序。在Snort規(guī)則文件中的preprocessor指令格式如下: preprocessor 例子: HTTP Decode HTTP Decode用于處理HTTP URI字符串并且將串中的數(shù)據(jù)轉(zhuǎn)化為可讀的ASCII字串。HTTP對(duì)于一些特性定義了一個(gè)十六進(jìn)制編碼方法,例如字符串%20被解釋成一個(gè)空格。Web服務(wù)器被設(shè)計(jì)成能夠處理無(wú)數(shù)的客戶端并且支持多種不同的標(biāo)準(zhǔn)。 格式: 例子: Portscan Detector Snort Portscan預(yù)處理程序的用處:
格式: 例子: Portscan Ignorehosts 如果用戶的服務(wù)器(比如NTP,NFS和DNS服務(wù)器)會(huì)妨礙端口掃描的探測(cè),可以通知portscan模塊忽略源自這些主機(jī)的TCP SYN和UDP端口掃描。該模塊的參數(shù)為IPs/CIDR的列表。 格式: 例子: Frag2 Frag2是一個(gè)新的IP碎片重組預(yù)處理器。Frag2的內(nèi)存使用和碎片時(shí)間超時(shí)選項(xiàng)是可配置的。不給出參數(shù),frag2將使用缺省的內(nèi)存量(4MB)和時(shí)間超時(shí)值(60秒)。這個(gè)時(shí)間值用來(lái)決定一個(gè)沒(méi)有重組的分段將被丟棄的時(shí)間長(zhǎng)度。 格式 timeout memcap detect_state_problems 發(fā)現(xiàn)重疊分段時(shí)報(bào)警。 ttl_limit 例子: Stream4 Stream4模塊使snort 具有 TCP流從新組裝和狀態(tài)分析能力。強(qiáng)壯的流重組能力使得snort能夠忽視無(wú)“狀態(tài)”攻擊,例如,stick粘滯位攻擊。Stream4也能夠給大量用戶提供超過(guò)256個(gè)TCP同步連接。Stream4缺省配置時(shí)能夠處理32768個(gè)TCP同步連接。Stream4有兩個(gè)可配置的模塊,stream4 preprocessor 和相關(guān)的 stream4_reassemble 插件。stream4_reassemble有如下選項(xiàng) Stream4 格式: preprocessor stream4: [noinspect], keepstats [machine|binary], [timeout noinspect 關(guān)閉狀態(tài)監(jiān)測(cè)能力。 keepstats [machine|binary] 保持會(huì)話統(tǒng)計(jì),如果是“machine”選項(xiàng)就從機(jī)器以平坦的模式讀入,如果是“binary”選項(xiàng)就用統(tǒng)一的二進(jìn)制模式輸出。 timeout memcap detect_scans 打開(kāi)portscan 的報(bào)警能力。 detect_state_problems 打開(kāi)流事件報(bào)警能力,例如,沒(méi)有RST的數(shù)據(jù)包、帶有數(shù)據(jù)的SYN包和超出窗口序列號(hào)的包。 disable_evasion_alerts 關(guān)閉事件報(bào)警能力,例如,TCP重疊。 ttl_limit 設(shè)置ttl的極限值。 Stream4_Reassemble 格式: 注: 在配置文件中僅僅設(shè)置stream4和stream4_reassemble 命令而沒(méi)有參數(shù),它們將會(huì)使用缺省的參數(shù)配置。Stream4引入了一個(gè)新的命令行參數(shù):-z 。在TCP流量中,如果指定了 –z 參數(shù),snort將只對(duì)那些通過(guò)三次握手建立的流以及那些協(xié)作的雙向活動(dòng)的流(即,一些流量走一個(gè)方向而其他一些除了一個(gè)RST或FIN外走相反方向)檢測(cè)報(bào)警。當(dāng)設(shè)置了-z 選項(xiàng)后snort就完全忽略基于TCP的stick/snot攻擊。 Conversation Conversation 預(yù)處理器使Snort 能夠得到關(guān)于協(xié)議的基本的會(huì)話狀態(tài)而不僅僅是由spp_stream4處理的TCP狀態(tài)。 目前它使用和stream4相同的內(nèi)存保護(hù)機(jī)制,所以它能保護(hù)自己免受DOS攻擊。當(dāng)它接收到一個(gè)你的網(wǎng)絡(luò)不允許的協(xié)議的數(shù)據(jù)包時(shí),它也能產(chǎn)生一個(gè)報(bào)警信息。要做到這一點(diǎn),請(qǐng)?jiān)贗P協(xié)議列表中設(shè)置你允許的IP協(xié)議,并且當(dāng)它收到一個(gè)不允許的數(shù)據(jù)包時(shí),它將報(bào)警并記錄這個(gè)數(shù)據(jù)包。 格式: Portscan2 這個(gè)模塊將檢測(cè)端口掃描。它要求包含Conversation預(yù)處理器以便判定一個(gè)會(huì)話是什么時(shí)間開(kāi)始的。它的目的是能夠檢測(cè)快速掃描,例如,快速的nmap掃描。 格式:
Telnet Decode 格式: RPC Decode Rpc_decode 預(yù)處理器將RPC的多個(gè)碎片記錄組合成一個(gè)完整的記錄。它是通過(guò)將數(shù)據(jù)包放在標(biāo)準(zhǔn)緩存中來(lái)做到這一點(diǎn)的。如果打開(kāi)stream4預(yù)處理器功能。它將只處理客戶端的流量。它缺省運(yùn)行在 111和 32771端口。 格式: Perf Monitor 這個(gè)模塊是用來(lái)評(píng)估snort各方面性能的一個(gè)工具。它的輸出格式和參數(shù)格式都是變化的,在這里就不給出注釋了。 Http Flow 使用這個(gè)模塊可以忽略HTTP頭后面的HTTP服務(wù)響應(yīng)。 第四章 輸出插件輸出插件使得Snort在向用戶提供格式化輸出時(shí)更加靈活。輸出插件在Snort的告警和記錄子系統(tǒng)被調(diào)用時(shí)運(yùn)行,在預(yù)處理程序和探測(cè)引擎之后。規(guī)則文件中指令的格式非常類(lèi)似于預(yù)處理程序。 注意:如果在運(yùn)行時(shí)指定了命令行的輸出開(kāi)關(guān),在Snort規(guī)則文件中指定的輸出插件會(huì)被替代。例如,如果在規(guī)則文件中指定了alert_syslog插件,但在命令行中使用了"-A fast"選項(xiàng),則alert_syslog插件會(huì)被禁用而使用命令行開(kāi)關(guān)。多個(gè)輸出插件是在snort的配置文件中指定的。當(dāng)指定多個(gè)輸出插件時(shí),它們被壓入棧并且在事件發(fā)生時(shí)按順序調(diào)用。關(guān)于標(biāo)準(zhǔn)的記錄和報(bào)警系統(tǒng),輸出模塊缺省把數(shù)據(jù)發(fā)送到 /var/log/snort.或者通過(guò)使用-l命令行參數(shù)輸出到一個(gè)用戶指定的目錄。在規(guī)則文件中通過(guò)指定output關(guān)鍵字,使得在運(yùn)行時(shí)加載輸出模塊。 格式: 例子: Alert_syslog 該插件向syslog設(shè)備發(fā)送告警(很像命令行中的-s開(kāi)關(guān))。該插件也允許用戶指定記錄設(shè)備,優(yōu)先于Snort規(guī)則文件中的設(shè)定,從而在記錄告警方面給用戶更大的靈活性。 選項(xiàng)(Options) 格式: 例子: Alert_full 打印數(shù)據(jù)包頭所有信息的報(bào)警。這些報(bào)警信息寫(xiě)到缺省的日志目錄(/var/log/snort)或者寫(xiě)到命令行指定的目錄。在日志目錄內(nèi),每個(gè)IP 都創(chuàng)建一個(gè)目錄。產(chǎn)生報(bào)警的數(shù)據(jù)包被解碼后寫(xiě)到這個(gè)目錄下的文件里。這些文件的創(chuàng)建將大大降低snort的性能。所以這種輸出方法對(duì)大多數(shù)不適用,但那些輕量級(jí)的網(wǎng)絡(luò)環(huán)境還是可以使用的。 格式: 例子: Alert_smb 這個(gè)插件將把WinPopup報(bào)警信息發(fā)送給NETBIOS命名的機(jī)器上的一個(gè)文件。并不鼓勵(lì)使用這個(gè)插件,因?yàn)樗詓nort權(quán)限執(zhí)行了一個(gè)外部可執(zhí)行二進(jìn)制程序,通常是root權(quán)限。那個(gè)工作站上接受報(bào)警信息的文件每行存放一條報(bào)警信息。 格式: 例子; Alert_unixsock 打開(kāi)一個(gè)UNIX套接字,并且把報(bào)警信息發(fā)送到那里。外部的程序/進(jìn)程會(huì)在這個(gè)套接字上偵聽(tīng)并實(shí)時(shí)接收這些報(bào)警數(shù)據(jù)。 格式: Log_tcpdump log_tcpdump插件將數(shù)據(jù)包記錄到tcpdump格式的文件中。這便于使用已有的多種檢查tcpdump格式文件的工具,來(lái)對(duì)收集到的流量數(shù)據(jù)進(jìn)行后處理工作。該插件只接受一個(gè)參數(shù),即輸出文件名 格式: 例子: database 該插件由Jed Pickel提供將Snort數(shù)據(jù)記錄到Postgres SQL數(shù)據(jù)庫(kù)中。更多的有關(guān)安裝和配置該插件的信息可以在Incident.org (http://www./snortdb)找到。這個(gè)插件的參數(shù)是數(shù)據(jù)庫(kù)名稱(chēng)和一個(gè)參數(shù)列表。參數(shù)由格式parameter = argument來(lái)指定??捎脜?shù)如下: host - 連接主機(jī)。如果指定了一個(gè)非零字串,就使用TCP/IP通訊。如果不指定主機(jī)名,就會(huì)使用Unix domain socket連接。 格式: CSV CSV輸出插件可以將報(bào)警數(shù)據(jù)以一種方便的形式輸出到一個(gè)數(shù)據(jù)庫(kù)。這個(gè)插件要求兩個(gè)參數(shù),一個(gè)全路徑文件名和輸出模式選項(xiàng)。下面是模式選項(xiàng)列表。如果模式選項(xiàng)缺省,就按模式選項(xiàng)列表中的順序輸出。 timestamp 格式: 例子: Unified Unified輸出插件被設(shè)計(jì)成盡可能快的事件記錄方法。它記錄一個(gè)事件到一個(gè)報(bào)警文件和一個(gè)數(shù)據(jù)包到一個(gè)日志文件。報(bào)警文件包含一個(gè)事件的主要信息(ips, protocol, port, message id)。日志文件包含數(shù)據(jù)包信息的細(xì)節(jié)(一個(gè)數(shù)據(jù)包考貝及相關(guān)的事件ID)。 這兩個(gè)文件都是以spo_unified.h文件中描述的二進(jìn)制形式寫(xiě)的。以u(píng)nix秒為單位的時(shí)間將附加到每個(gè)文件的后面寫(xiě)出。 格式 例子: Log Null 有時(shí)創(chuàng)建這樣的規(guī)則是必要的,即在某些情況下能夠發(fā)出報(bào)警而不記錄數(shù)據(jù)包。當(dāng)使用log_null插件時(shí)就相當(dāng)于命令行的-N選項(xiàng),但這個(gè)插件可以工作在一個(gè)規(guī)則類(lèi)型上。 格式: 自己動(dòng)手編寫(xiě)好的規(guī)則 當(dāng)編寫(xiě)snort規(guī)則時(shí),首先考慮的是效率和速度。 好的規(guī)則要包含content選項(xiàng)。2.0版本以后,snort改變了檢測(cè)引擎的工作方式,在第一階段就作一個(gè)集合模式匹配。一個(gè)content選項(xiàng)越長(zhǎng),這個(gè)匹配就越精確。如果一條規(guī)則不包含content選項(xiàng),它們將使整個(gè)系統(tǒng)慢下來(lái)。 當(dāng)編寫(xiě)規(guī)則時(shí),盡量要把目標(biāo)定位在攻擊的地方(例如,將目標(biāo)定位在1025的偏移量等等)而不僅僅是泛泛的指定(如,在這匹配腳本代碼)。 Content規(guī)則是大小寫(xiě)敏感的(除非你使用了nocase選項(xiàng))。不要忘記content是大小寫(xiě)敏感的和大多數(shù)程序的命令都是大寫(xiě)字母。FTP就是一個(gè)很好的例子。考慮如下的規(guī)則: alert tcp any any -> 192.168.1.0/24 21 (content: "user root"; msg: "FTP root login";) 上面的第二條規(guī)則能檢測(cè)出大多數(shù)的自動(dòng)以root登陸的嘗試,而第一條規(guī)則就不行。Internet 守護(hù)進(jìn)程在接受輸入時(shí)是很隨便的。在編寫(xiě)規(guī)則時(shí),很好的理解協(xié)議規(guī)范將降低錯(cuò)過(guò)攻擊的機(jī)會(huì)。 加速含有內(nèi)容選項(xiàng)的規(guī)則 探測(cè)引擎運(yùn)用規(guī)則的順序和它們?cè)谝?guī)則中的書(shū)寫(xiě)順序無(wú)關(guān)。內(nèi)容規(guī)則選項(xiàng)總是最后一個(gè)被檢驗(yàn)。利用這個(gè)事實(shí),應(yīng)該先運(yùn)用別的快速規(guī)則選項(xiàng),由這些選項(xiàng)決定是否需要檢查數(shù)據(jù)包的內(nèi)容。例如:在TCP會(huì)話建立起來(lái)后,從客戶端發(fā)來(lái)的數(shù)據(jù)包,PSH和ACK這兩個(gè)TCP標(biāo)志總是被置位的。如果想檢驗(yàn)從客戶端到服務(wù)器的有效載荷,利用這個(gè)事實(shí),就可以先進(jìn)行一次TCP標(biāo)志檢驗(yàn),這比模式匹配算法(pattern match algorithm)在計(jì)算上節(jié)約許多。使用內(nèi)容選項(xiàng)的規(guī)則要加速的一個(gè)簡(jiǎn)便方法就是也進(jìn)行一次標(biāo)志檢驗(yàn)。基本思想是,如果PSH和ACK標(biāo)志沒(méi)有置位,就不需要對(duì)數(shù)據(jù)包的有效載荷進(jìn)行檢驗(yàn)。如果這些標(biāo)志置位,檢驗(yàn)標(biāo)志而帶來(lái)的計(jì)算能力消耗是可以忽略不計(jì)的。 alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; flags: PA; msg: "CGI-PHF probe";)
from site : http://man./network/snort/Snortman.htm |
|
來(lái)自: 農(nóng)夫子oice > 《Snort》