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