Snail.W
snort有三種工作模式:嗅探器、數據包記錄器、網絡入侵檢測系統。嗅探器模式僅僅是從網絡上讀取數據包并作為連續不斷的流顯示在終端上。數據包記錄器模式把數據包記錄到硬盤上。網路入侵檢測模式是最復雜的,而且是可配置的。我們可以讓snort分析網絡數據流以匹配用戶定義的一些規則,并根據檢測結果采取一定的動作。
嗅探器
所謂的嗅探器模式就是snort從網絡上讀出數據包然后顯示在你的控制臺上。首先,我們從最基本的用法入手。如果你只要把TCP/IP包頭信息打印在屏幕上,只需要輸入下面的命令:
??./snort -v
使用這個命令將使snort只輸出IP和TCP/UDP/ICMP的包頭信息。如果你要看到應用層的數據,可以使用:
??./snort -vd
這條命令使snort在輸出包頭信息的同時顯示包的數據信息。如果你還要顯示數據鏈路層的信息,就使用下面的命令:
??./snort -vde
注意這些選項開關還可以分開寫或者任意結合在一塊。例如:下面的命令就和上面最后的一條命令等價:
??./snort -d -v –e
數據包記錄器
如果要把所有的包記錄到硬盤上,你需要指定一個日志目錄,snort就會自動記錄數據包:
??./snort -dev -l ./log
當然,./log目錄必須存在,否則snort就會報告錯誤信息并退出。當snort在這種模式下運行,它會記錄所有看到的包將其放到一個目錄中,這個目錄以數據包目的主機的IP地址命名,例如:192.168.10.1
??如果你只指定了-l命令開關,而沒有設置目錄名,snort有時會使用遠程主機的IP地址作為目錄,有時會使用本地主機IP地址作為目錄名。為了只對本地網絡進行日志,你需要給出本地網絡:
??./snort -dev -l ./log -h 192.168.1.0/24
這個命令告訴snort把進入C類網絡192.168.1的所有包的數據鏈路、TCP/IP以及應用層的數據記錄到目錄./log中。
如果你的網絡速度很快,或者你想使日志更加緊湊以便以后的分析,那么應該使用二進制的日志文件格式。所謂的二進制日志文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包記錄到一個單一的二進制文件中:
??./snort -l ./log -b
注意此處的命令行和上面的有很大的不同。我們勿需指定本地網絡,因為所有的東西都被記錄到一個單一的文件。你也不必冗余模式或者使用-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
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個是:
使用-s選項可以使snort把報警消息發送到syslog,默認的設備是LOG_AUTHPRIV和LOG_ALERT??梢孕薷膕nort.conf文件修改其配置。
snort還可以使用SMB報警機制,通過SAMBA把報警消息發送到Windows主機。為了使用這個報警機制,在運行./configure腳本時,必須使用--enable-smbalerts選項。
下面是一些輸出配置的例子:
使用默認的日志方式(以解碼的ASCII格式)并且把報警發給syslog:
./snort -c snort.conf -l ./log -s -h 192.168.1.0/24
使用二進制日志格式和SMB報警機制:??
./snort -c snort.conf -b -M WORKSTATIONS
snort使用一種簡單的,輕量級的規則描述語言,這種語言靈活而強大。在開發snort規則時要記住幾個簡單的原則。
第一, 大多數snort規則都寫在一個單行上,或者在多行之間的行尾用/分隔。Snort規則被分成兩個邏輯部分:規則頭和規則選項。規則頭包含規則的動作,協議,源和目標ip地址與網絡掩碼,以及源和目標端口信息;規則選項部分包含報警消息內容和要檢查的包的具體部分。
下面是一個規則范例:
alert tcp any any -> 192.168.1.0/24 111 (content:\"|00 01 86 a5|\"; msg: \"mountd aclearcase/" target="_blank" >ccess\";)
第一個括號前的部分是規則頭(rule header),包含的括號內的部分是規則選項(rule options)。規則選項部分中冒號前的單詞稱為選項關鍵字(option keywords)。注意,不是所有規則都必須包含規則選項部分,選項部分只是為了使對要收集或報警,或丟棄的包的定義更加嚴格。組成一個規則的所有元素對于指定的要采取的行動都必須是真的。當多個元素放在一起時,可以認為它們組成了一個邏輯與(AND)語句。同時,snort規則庫文件中的不同規則可以認為組成了一個大的邏輯或(OR)語句。
Includes:
include允許由命令行指定的規則文件包含其他的規則文件。
格式:
include:
注意在該行結尾處沒有分號。被包含的文件會把任何預先定義的變量值替換為自己的變量引用。參見變量(Variables)一節以獲取關于在SNORT規則文件中定義和使用變量的更多信息。
Variables :
變量可能在snort中定義。
格式:
var:
例子:
var MY_NET 192.168.1.0/24
alert tcp any any -> $MY_NET any (flags: S; msg: \"SYN packet\";)
規則變量名可以用多種方法修改??梢栽赲"$\"操作符之后定義變量。\"?\" 和 \"-\"可用于變量修改操作符。
$var - 定義變量。
$(var) - 用變量\"var\"的值替換。
$(var:-default) - 用變量\"var\"的值替換,如果\"var\"沒有定義用\"default\"替換。
$(var:?message) - 用變量\"var\"的值替換或打印出錯誤消息\"message\"然后退出。
例子:
var MY_NET $(MY_NET:-192.168.1.0/24)
log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
Config
Snort的很多配置和命令行選項都可以在配置文件中設置。
格式:
config
Directives
規則頭
規則動作:
規則的頭包含了定義一個包的who,where和what信息,以及當滿足規則定義的所有屬性的包出現時要采取的行動。規則的第一項是\"規則動作\"(rule action),\"規則動作\"告訴snort在發現匹配規則的包時要干什么。在snort中有五種動作:alert、log、pass、activate和dynamic.
1、Alert-使用選擇的報警方法生成一個警報,然后記錄(log)這個包。
2、Log-記錄這個包。
3、Pass-丟棄(忽略)這個包。
4、activate-報警并且激活另一條dynamic規則。
5、dynamic-保持空閑直到被一條activate規則激活,被激活后就作為一條log規則執行。
你可以定義你自己的規則類型并且附加一條或者更多的輸出模塊給它,然后你就可以使用這些規則類型作為snort規則的一個動作。
下面這個例子創建一條規則,記錄到tcpdump。
ruletype suspicious
{
type log output
log_tcpdump: suspicious.log
}
下面這個例子創建一條規則,記錄到系統日志和MySQL數據庫
ruletype redalert
{
type alert output
alert_syslog: LOG_AUTH LOG_ALERT
output database: log, mysql, user=snort dbname=snort host=localhost
}
協議
規則的下一部分是協議。Snort當前分析可疑包的ip協議有四種:tcp 、udp、icmp和ip。將來可能會更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。
Ip地址
規則頭的下一個部分處理一個給定規則的ip地址和端口號信息。關鍵字\"any\"可以被用來定義任何地址。Snort沒有提供根據ip地址查詢域名的機制。地址就是由直接的數字型ip地址和一個cidr塊組成的。Cidr塊指示作用在規則地址和需要檢查的進入的任何包的網絡掩碼。/24表示c類網絡,/16表示b類網絡,/32表示一個特定的機器的地址。例如,192.168.1.0/24代表從192.168.1.1到192.168.1.255的地址塊。在這個地址范圍的任何地址都匹配使用這個192.168.1.0/24標志的規則。這種記法給我們提供了一個很好的方法來表示一個很大的地址空間。
有一個操作符可以應用在ip地址上,它是否定運算符(negation operator)。這個操作符告訴snort匹配除了列出的ip地址以外的所有ip地址。否定操作符用\"!\"表示。下面這條規則對任何來自本地網絡以外的流都進行報警。
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: \"|00 01 86 a5|\"; msg: \"external mountd access\";)
這個規則的ip地址代表\"任何源ip地址不是來自內部網絡而目標地址是內部網絡的tcp包\"。
你也可以指定ip地址列表,一個ip地址列表由逗號分割的ip地址和CIDR塊組成,并且要放在方括號內“[”,“]”。此時,ip列表可以不包含空格在ip地址之間。下面是一個包含ip地址列表的規則的例子。
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\"端口、靜態端口定義、范圍、以及通過否定操作符。\"any\"端口是一個通配符,表示任何端口。靜態端口定義表示一個單個端口號,例如111表示portmapper,23表示telnet,80表示http等等。端口范圍用范圍操作符\":\"表示。范圍操作符可以有數種使用方法,如下所示:
log udp any any -> 192.168.1.0/24 1:1024
記錄來自任何端口的,目標端口范圍在1到1024的udp流
log tcp any any -> 192.168.1.0/24 :6000
記錄來自任何端口,目標端口小于等于6000的tcp流
log tcp any :1024 -> 192.168.1.0/24 500:
記錄來自任何小于等于1024的特權端口,目標端口大于等于500的tcp流
端口否定操作符用\"!\"表示。它可以用于任何規則類型(除了any,這表示沒有,呵呵)。例如,由于某個古怪的原因你需要記錄除x windows端口以外的所有一切,你可以使用類似下面的規則:
log tcp any any -> 192.168.1.0/24 !6000:6010
方向操作符
方向操作符\"->\"表示規則所施加的流的方向。方向操作符左邊的ip地址和端口號被認為是流來自的源主機,方向操作符右邊的ip地址和端口信息是目標主機,還有一個雙向操作符\"<>\"。它告訴snort把地址/端口號對既作為源,又作為目標來考慮。這對于記錄/分析雙向對話很方便,例如telnet或者pop3會話。用來記錄一個telnet會話的兩側的流的范例如下:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
Activate 和 dynamic 規則:
注:Activate 和 dynamic 規則將被tagging 所代替。在snort的將來版本,Activate 和 dynamic 規則將完全被功能增強的tagging所代替。
Activate 和 dynamic 規則對給了snort更強大的能力。你現在可以用一條規則來激活另一條規則,當這條規則適用于一些數據包時。在一些情況下這是非常有用的,例如你想設置一條規則:當一條規則結束后來完成記錄。Activate規則除了包含一個選擇域:activates外就和一條alert規則一樣。Dynamic規則除了包含一個不同的選擇域:activated_by 外就和log規則一樣,dynamic規則還包含一個count域。
Actevate規則除了類似一條alert規則外,當一個特定的網絡事件發生時還能告訴snort加載一條規則。Dynamic規則和log規則類似,但它是當一個activate規則發生后被動態加載的。把他們放在一起如下圖所示:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags: PA; content: \"|E8C0FFFFFF|/bin\"; activates: 1; msg: \"IMAP buffer overflow!\";)
dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by: 1; count: 50;)
規則選項
規則選項組成了snort入侵檢測引擎的核心,既易用又強大還靈活。所有的snort規則選項用分號\";\"隔開。規則選項關鍵字和它們的參數用冒號\":\"分開。按照這種寫法,snort中有42個規則選項關鍵字。
msg - 在報警和包日志中打印一個消息。
logto - 把包記錄到用戶指定的文件中而不是記錄到標準輸出。
ttl - 檢查ip頭的ttl的值。
tos 檢查IP頭中TOS字段的值。
id - 檢查ip頭的分片id值。
ipoption 查看IP選項字段的特定編碼。
fragbits 檢查IP頭的分段位。
dsize - 檢查包的凈荷尺寸的值 。
flags -檢查tcp flags的值。
seq - 檢查tcp順序號的值。
ack - 檢查tcp應答(acknowledgement)的值。
window 測試TCP窗口域的特殊值。
itype - 檢查icmp type的值。
icode - 檢查icmp code的值。
icmp_id - 檢查ICMP ECHO ID的值。
icmp_seq - 檢查ICMP ECHO 順序號的值。
content - 在包的凈荷中搜索指定的樣式。
content-list 在數據包載荷中搜索一個模式集合。
offset - content選項的修飾符,設定開始搜索的位置 。
depth - content選項的修飾符,設定搜索的最大深度。
nocase - 指定對content字符串大小寫不敏感。
session - 記錄指定會話的應用層信息的內容。
rpc - 監視特定應用/進程調用的RPC服務。
resp - 主動反應(切斷連接等)。
react - 響應動作(阻塞web站點)。
reference - 外部攻擊參考ids。
sid - snort規則id。
rev - 規則版本號。
classtype - 規則類別標識。
priority - 規則優先級標識號。
uricontent - 在數據包的URI部分搜索一個內容。
tag - 規則的高級記錄行為。
ip_proto - IP頭的協議字段值。
sameip - 判定源IP和目的IP是否相等。
stateless - 忽略劉狀態的有效性。
regex - 通配符模式匹配。
distance - 強迫關系模式匹配所跳過的距離。
within - 強迫關系模式匹配所在的范圍。
byte_test - 數字模式匹配。
byte_jump - 數字模式測試和偏移量調整。
msg
msg規則選項告訴記錄和報警引擎,記錄或報警一個包的內容的同時打印的消息。它是一個簡單的文本字符串,轉義符是\"\"。
格式:
msg: \"
logto
logto選項告訴snort把觸發該規則的所有的包記錄到一個指定的輸出日志文件中。這在把來自諸如nmap活動,http cgi掃描等等的數據組合到一起時很方便。需要指出的是當snort工作在二進制記錄模式下時這個選項不起作用。
格式:
logto:\"filename\";
ttl
這個規則選項用于設置一個要檢查的存活期的值。只有確切地匹配時它所進行的檢查才成功。這個選項關鍵字用于檢測traceroute。
格式:
ttl:
TOS
tos關鍵字允許你驗證IP頭中TOS字段為一個特殊的值。只有匹配時才執行成功。
格式:
tos:
id
這個選項關鍵字用于檢測ip頭的分片id的值。有些黑客工具(以及別的程序)為了各種目的設置這個域的值,例如一些黑客常使用31337。用一個簡單的規則檢查這個值就可以對付他們。
格式:
id:
Ipoption
如果數據包中使用了IP選項,Ipoption選項會查找使用中的某個特別IP選項,比如源路由。這個選項的合法參數如下:
rr - Record route(記錄路由)
eol - End of list (列表結尾)
nop - No op (無所作為)
ts - Time Stamp (時間戳)
sec - IP security option (IP安全選項)
lsrr - Loose source routing (松散源路由)
ssrr - Strict source routing (嚴格源路由)
satid - Stream identifier (流標示符)
松散和嚴格源路由是IP選項中最經常被檢查的內容,但是它們并沒有被用在任何廣泛使用的Internet應用中。每一個特定的規則只能用這個選項一次。
格式:
ipoption: option;
Fragbits
這條規則檢測IP頭中的分段和保留位字段的值,共有三個位能被檢測,保留位RB(Reserved Bit ), 更多分段位MF(More Fragments ), 和不分段位DF(Don’t Fragment)。這些位可以結合在一起來檢測。使用下面的值來代表這些位,R-RB,M-MF,D-DF。你也可以使用修飾語對特殊的位來指出合理的匹配標準:* + 所有標記匹配特殊位外加任何其他*;*-任何標記匹配如果任何位被設置為*;!如果指定位沒有設置就沒有標記匹配。
格式:
fragbits:
例子:
alert tcp !$HOME_NET any -> $HOME_NET any (fragbits: R+; msg: \"Rerserved bit set!\";)
dsize
dsize選項用于檢查包的凈荷的大小。它可以設置成任意值,可以使用大于/小于符號來指定范圍。例如,如果你知道某個特定的服務有一個特定大小的緩沖區,你可以設定這個選項來監視緩沖區溢出的企圖。它在檢查緩沖區溢出時比檢查凈荷內容的方法要快得多。
格式:
dsize: [<>]
說明:“> <”號是可選的。
content
content關鍵字是snort中比較重要的一個。它允許用戶設置規則在包的凈荷中搜索指定的內容并根據內容觸發響應。當進行content選項模式匹配時,Boyer-Moore模式匹配函數被調用,并且對包的內容進行檢查(很花費計算能力)。如果包的凈荷中包含的數據確切地匹配了參數的內容,這個檢查成功并且該規則選項的其他部分被執行。注意這個檢查是大小寫敏感的。
Content關鍵字的選項數據比較復雜;它可以包含混合的文本和二進制數據。二進制數據一般包含在管道符號中(\"|\"),表示為字節碼(bytecode)。字節碼把二進制數據表示為16進制數字,是描述復雜二進制數據的好方法。下面是包含了一個混合數據的snort規則范例。
格式:
content: [!] \"
例子:
alert tcp any any -> 192.168.1.0/24 143 (content: \"|90C8 C0FF FFFF|/bin/sh\"; msg: \"IMAP buffer overflow!\";)
注:多內容的規則可以放在一條規則中,還有(: ; / “)不能出現在content規則中。如果一條規則前面有一個“!”。那么那些不包含這些內容的數據包將觸發報警。這對于關注那些不包含一定內容的數據包是有用的。
offset
offset規則選項被用作使用content規則選項關鍵字的規則的修飾符。這個關鍵字修飾符指定模式匹配函數從包凈荷開始處開始搜索的偏移量。它對于cgi掃描檢測規則很有用,cgi掃描的內容搜索字符串不會在凈荷的前4個字節中出現。小心不要把這個偏移量設置的太嚴格了,會有可能漏掉攻擊!這個規則選項關鍵字必須和content規則選項一起使用。
格式:
offset:
depth
depth也是一個content規則選項修飾符。它設置了內容模式匹配函數從他搜索的區域的起始位置搜索的最大深度。它對于限制模式匹配函數超出搜索區域指定范圍而造成無效搜索很有用。(也就是說,如果你在一個web包中搜索\"cgi-bin/phf\",你可能不需要浪費時間搜索超過凈荷的頭20個字節)。
格式:
depth:
例子:
alert tcp any any -> 192.168.1.0/24 80 (content: \"cgi-bin/phf\"; offset: 3; depth: 22; msg: \"CGI-PHF access\";)
nocase
nocase選項用于取消content規則中的大小寫敏感性。它在規則中指定后,任何與包凈荷進行比較的ascii字符都被既作為大寫又作為小寫對待。
格式:
nocase;
例子:
alert tcp any any -> 192.168.1.0/24 21 (content: \"USER root\"; nocase; msg: \"FTP root user access attempt\";)
flags
這個規則檢查tcp標志。在snort中有9個標志變量:
F - FIN (LSB in TCP Flags byte)
S - SYN
R - RST
P - PSH
A - ACK
U - URG
2 - Reserved bit 2
1 - Reserved bit 1 (MSB in TCP Flags byte)
0 - No TCP Flags Set
在這些標志之間還可以使用邏輯操作符:
+ ALL flag, 匹配所有的指定的標志外加一個標志。
* ANY flag, 匹配指定的任何一個標志。
! NOT flag, 如果指定的標志不在這個數據包中就匹配成功。
保留位可以用來檢測不正常行為,例如IP棧指紋攻擊或者其他可疑的行為。
格式:
flags:
例子:
alert any any -> 192.168.1.0/24 any (flags: SF,12; msg: \"Possible SYN FIN scan\";)
seq
這個規則選項引用tcp順序號(sequence number)?;旧?,它探測一個包是否有一個靜態的順序號集,因此很少用。它是為了完整性而包含進來的。
格式:
seq:
ack
ack規則選項關鍵字引用tcp頭的確認(acknowledge)部分。這個規則的一個實用的目的是:檢查nmap tcp ping,nmap tcp ping把這個域設置為0,然后發送一個tcp ack flag置位的包來確定一個網絡主機是否活著。
格式:
ack:
例子:
alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: \"NMAP TCP ping\";)
Window
這條規則選項指向TCP窗口大小。這個選項檢查靜態窗口大小,此外別無他用。包括它只是為了完整性。
格式:
window:[!]
Itype
這條規則測試ICMP的type字段的值。它被設置為使用這個字段的數字值。要得到所有可能取值的列表,可以參見Snort包中自帶的decode.h文件,任何ICMP的參考資料中也可以得到。應該注意的是,type字段的取值可以超過正常范圍,這樣可以檢查用于拒絕服務或flooding攻擊的非法type值的ICMP包。
格式:
itype:
Icode
Icode規則選項關鍵字和itype規則非常接近,在這里指定一個數值,Snort會探測使用該值作為code值的ICMP包。超出正常范圍的數值可用于探測可疑的流量。
格式:
icode:
Session
Session關鍵字用于從TCP會話中抽取用戶數據。要檢查用戶在telnet,rlogin,ftp或web sessions中的用戶輸入,這個規則選項特別有用。Session規則選項有兩個可用的關鍵字作為參數:printable或all。Printable關鍵字僅僅打印用戶可以理解或者可以鍵入的數據。All關鍵字使用16進制值來表示不可打印的字符。該功能會顯著地降低Snort的性能,所以不能用于重負載環境。它適合于對二進制(tcpdump格式)log文件進行事后處理。
格式:
session: [printable|all];
例子
log tcp any any <> 192.168.1.0/24 23 (session: printable;)
Icmp_id
Icmp_id選項檢查ICMP ECHO數據包中ICMP ID數值是否是指定值。許多秘密通道(covert channel)程序使用靜態ICMP字段通訊,所以該選項在檢查這種流量時非常有用。這個特別的插件用于增強由Max Vision編寫的stacheldraht探測規則,但是在探測一些潛在攻擊時確實有效。
格式:
icmp_id:
Icmp_seq
Icmp_seq選項檢查ICMP ECHO數據包中ICMP sequence字段數值是否是指定值。許多秘密通道(covert channel)程序使用靜態ICMP字段通訊,所以該選項在檢查這種流量時非常有用。這個特別的插件用于增強由Max Vision編寫的stacheldraht探測規則,但是在探測一些潛在攻擊時確實有效。(我知道該字段的信息和icmp_id的描述幾乎完全相同,實際上它們就是同樣的東西?。?/P>
格式:
icmp_seq:
Rpc
這個選項查看RPC請求,并自動將應用(Application)、過程(procedure)和程序版本(program version)譯碼,如果所有三個值都匹配的話,該規則就顯示成功。這個選項的格式為\"應用、過程、版本\"。在過程和版本域中可以使用通配符\"*\"。
格式:
rpc:
例子
alert tcp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:\"RPC getport (TCP)\";)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:\"RPC getport (UDP)\";)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100083,*,*; msg:\"RPC ttdb\";)
Resp
Resp關鍵字可以對匹配一條Snort規則的流量進行靈活的反應(flexible reponse -FlexResp)。FlexResp代碼允許Snort主動地關閉惡意的連接。該插件合法的參數如下:
rst_snd - 向發送方發送TCP-RST數據包
rst_rcv - 向接受方發送TCP-RST數據包
rst_all - 向收發雙方發送TCP_RST數據包
icmp_net - 向發送方發送ICMP_NET_UNREACH
icmp_host - 向發送方發送ICMP_HOST_UNREACH
icmp_port - 向發送方發送ICMP_PORT_UNREACH
icmp_all - 向發送方發送上述所有的ICMP數據包
在向目標主機發送多種響應數據包時,這些選項組合使用。多個參數之間使用逗號分隔。
格式:
resp:
使用resp選項時要小心,因為很容易就會使snort陷入無限循環中,例如如下規則:
alert tcp any any -> 192.168.1.1/24 any (msg: \"aiee!\"; resp: rst_all;)
content_list
content_list 關鍵字允許多內容字符串被放在一個單獨的內容匹配選項中,被匹配的字符串被存放在指定的文件中,而且每個字符串要單獨占用一行。否則他們就等同于一個content字符串。這個選項是react關鍵字的基礎。
格式;
content-list:
下面是一個文件的內容:
# adult sites
\"porn\"
\"porn\"
\"adults\"
\"hard core\"
\"\"
React
注意,使用這個功能很容易使網絡流量陷入回路。React關鍵字以匹配一個規則時所作出的靈活的反應為基礎?;镜姆磻亲枞恍┮俗⒁獾恼军c的用戶的訪問。響應代碼允許snort積極的關掉有冒犯行為的訪問和/或發送一個通知給瀏覽者。這個通知可以包含你自己的注釋。這個選項包括如下的基本修飾詞:
block——關閉連接并且發送一個通知
warm——發送明顯的警告信息
基本修飾詞可以和如下的附加修飾詞組合使用:
msg——把msg選項的內容包含進阻塞通知信息中
proxy
大量的附加修飾詞由逗號隔開,react 關鍵字將被放在選項的最后一項。
格式:
react:
例子:
alert tcp any any <> 192.168.1.0/24 80 (content: \"bad.htm\"; msg: \"Not for children!\"; react: block, msg;)
reference
這個關鍵字允許規則包含一個外面的攻擊識別系統。這個插件目前支持幾種特定的系統,它和支持唯一的URL一樣好。這些插件被輸出插件用來提供一個關于產生報警的額外信息的連接。
確信先看一看如下地方:
格式:
reference:
例子:
alert tcp any any -> any 7070 (msg: \"IDS411/dos-realaudio\"; flags: AP; content: \"|fff4 fffd 06|\"; reference: arachNIDS,IDS411;)
alert tcp any any -> any 21 (msg: \"IDS287/ftp-wuftp260-venglin-linux\"; flags: AP; content: \"|31c031db 31c9b046 cd80 31c031db|\"; reference: arachNIDS,IDS287; reference: bugtraq,1387; reference: cve,CAN-2000-1574; )
Sid
這個關鍵字被用來識別snort規則的唯一性。這個信息允許輸出插件很容易的識別規則的ID號。
sid 的范圍是如下分配的:
<100 保留做將來使用
100-1000,000 包含在snort發布包中
>1000,000 作為本地規則使用
文件sid-msg.map 包含一個從msg標簽到snort規則ID的映射。這將被post-processing 輸出模塊用來映射一個ID到一個報警信息。
格式:
sid:
rev
這個關鍵字是被用來識別規則修改的。修改,隨同snort規則ID,允許簽名和描述被較新的信息替換。
格式:
rev:
Classtype
這個關鍵字把報警分成不同的攻擊類。通過使用這個關鍵字和使用優先級,用戶可以指定規則類中每個類型所具有的優先級。具有classification的規則有一個缺省的優先級。
格式:
classtype:
在文件classification.config中定義規則類。這個配置文件使用如下的語法:
config classification:
Priority
這個關鍵字給每條規則賦予一個優先級。一個classtype規則具有一個缺省的優先級,但這個優先級是可以被一條priority規則重載的。
格式:
priority:
Uricontent
這個關鍵字允許只在一個請求的URI(URL)部分進行搜索匹配。它允許一條規則只搜索請求部分的攻擊,這樣將避免服務數據流的錯誤報警。關于這個關鍵字的參數的描述可以參考content關鍵字部分。這個選項將和HTTP解析器一起工作。(只能搜索第一個“/”后面的內容)。
格式:
uricontent:[!]
Tag
這個關鍵字允許規則記錄不僅僅是觸發這條規則的那個數據包。一旦一條規則被觸發,來自這個主機的數據包將被貼上“標簽”。被貼上標簽的數據流將被記錄用于隨后的響應代碼和提交攻擊流量的分析。
格式:
tag:
type
session 記錄觸發這條規則的會話的數據包
host 記錄激活tag規則的主機的所有數據包(這里將使用[direction]修飾詞
count Count 指定一個單位的數量。這個單位由
metric
packets 標記主機/會話的
seconds 標記主機/會話的
例子:
alert tcp !$HOME_NET any -> $HOME_NET 143 (flags: A+; content: \"|e8 c0ff ffff|/bin/sh\"; tag: host, 300, packets, src; msg: \"IMAP Buffer overflow, tagging!\";)
alert tcp !$HOME_NET any -> $HOME_NET 23 (flags: S; tag: session, 10, seconds; msg: \"incoming telnet session\";)
Ip_proto
Ip_proto關鍵字允許檢測IP協議頭。這些協議可以是由名字標識的,參考/etc/protocols文件。在規則中要謹慎使用ip_protocol關鍵字。
格式:
ip_proto:[!]
例子:
alert ip !$HOME_NET any -> $HOME_NET any (msg: \"IGMP traffic detected\"; ip_proto: igmp;)
SameIP
Sameip關鍵字允許規則檢測源IP和目的IP是否相等。
格式:
sameip;
例子:
alert ip $HOME_NET any -> $HOME_NET any (msg: \"SRC IP == DST IP\"; sameip;)
Regex
這個模塊現在還正在開發,所以在當前的產品規則集中還不能使用。如果使用的話,它將觸發一個錯誤信息。
Flow
這個選項要和TCP流重建聯合使用。它允許規則只應用到流量流的某個方向上。這將允許規則只應用到客戶端或者服務器端。這將能把內網客戶端流覽web頁面的數據包和內網服務器所發送的數據包區分開來。這個確定的關鍵字能夠代替標志:A+ 這個標志在顯示已建立的TCP連接時都將被使用。
選項:
to_client 觸發服務器上從A到B的響應。
to_server 觸發客戶端上從A到B的請求。
from_client 觸發客戶端上從A到B的請求。
from_server觸發服務器上從A到B的響應。
established 只觸發已經建立的TCP連接。
stateless 不管流處理器的狀態都觸發(這對處理那些能引起機器崩潰的數據包很有用。
no_stream 不在重建的流數據包上觸發(對dsize 和 stream4 有用。
only_stream 只在重建的流數據包上觸發。
格式:
flow:[to_client|to_server|from_client|from_server|established|stateless|no_stream|only_stream]}
例子:
alert tcp !$HOME_NET any -> $HOME_NET 21 (flow: from_client; content: \"CWD incoming\"; nocase; msg: \"cd incoming detected\"; )
alert tcp !$HOME_NET 0 -> $HOME_NET 0 (msg: \"Port 0 TCP traffic\"; flow: stateless;)
Fragoffset
這個關鍵字允許把IP分段偏移值和一個十進制數相比較。為了抓到一個IP會話的第一個分段,你可以使用這個fragbits關鍵字并且和fragoffset:0 選項一起查看更多的分段選項。
格式:
fragoffset:[<|>]
例子:
alert ip any any -> any any (msg: \"First Fragment\"; fragbits: M; fragoffset: 0;)
Rawbytes
Rawbytes關鍵字允許規則查看telnet 解碼數據來處理不常見的數據。這將使得telnet 協議代碼獨立于預處理程序來檢測。這是對前面的content 的一個修飾。
格式:
rawbytes;
例子:
alert tcp any any -> any any (msg: \"Telnet NOP\"; content: \"|FF F1|\"; rawbytes;)
distance
distance關鍵字是content關鍵字的一個修飾詞,確信在使用content時模式匹配間至少有N個字節存在。它被設計成在規則選項中和其他選項聯合使用。
格式:
distance:
例子:
alert tcp any any -> any any (content: \"2 Patterns\"; content: \"ABCDE\"; content: \"EFGH\"; distance: 1;)
Within
Winthin關鍵字是content關鍵字的一個修飾詞,確保在使用content時模式匹配間至多有N個字節存在。它被設計成在規則選項中和distance選項聯合使用。
格式:
within:
例子:
alert tcp any any -> any any (content: \"2 Patterns\"; content: \"ABCDE\"; content: \"EFGH\"; within: 10;)
Byte_Test
測試一個字節的域為特定的值。能夠測試二進制值或者把字節字符串轉換成二進制后再測試。
格式:byte_test:
bytes_to_convert 從數據包取得的字節數。
operator 對檢測執行的操作 (<,>,=,!)。
value 和轉換后的值相測試的值。
offset 開始處理的字節在負載中的偏移量。
relative 使用一個相對于上次模式匹配的相對的偏移量。
big 以網絡字節順序處理數據(缺?。?。
little 以主機字節順序處理數據。
string 數據包中的數據以字符串形式存儲。
hex 把字符串數據轉換成十六進制數形式。
dec 把字符串數據轉換成十進制數形式。
oct 把字符串數據轉換成八進制數形式。
例子:
alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:\"AMD procedure 7 plog overflow \"; content: \"|00 04 93 F3|\"; content: \"|00 00 00 07|\"; distance: 4; within: 4; byte_test: 4,>, 1000, 20, relative;)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:\"AMD procedure 7 plog overflow \"; content: \"|00 04 93 F3|\"; content: \"|00 00 00 07|\"; distance: 4; within: 4; byte_test: 4, >,1000, 20, relative;)
Byte_Jump
Byte_jump 選項用來取得一定數量的字節,并把它們轉換成數字形式,跳過一些字節以進一步進行模式匹配。這就允許相對模式匹配在網絡數據中進行數字值匹配。
格式:
byte_jump:
bytes_to_convert 從數據包中選出的字節數。
offset 開始處理的字節在負載中的偏移量。
relative 使用一個相對于上次模式匹配的相對的偏移量。
big 以網絡字節順序處理數據(缺?。?。
little 以主機字節順序處理數據。
string 數據包中的數據以字符串形式存儲。
hex 把字符串數據轉換成十六進制數形式。
dec 把字符串數據轉換成十進制數形式。
oct 把字符串數據轉換成八進制數形式。
align 以32位為邊界對轉換的字節數對齊,即轉換的字節數為4的倍數。
例子:
alert udp any any -> any 32770:34000 (content: \"|00 01 86 B8|\"; content: \"|00 00 00 01|\"; distance: 4; within: 4; byte_jump: 4, 12, relative, align; byte_test: 4, >, 900, 20, relative; msg: \"statd format string buffer overflow\";)
預處理程序從Snort版本1.5開始引入,使得Snort的功能可以很容易地擴展,用戶和程序員能夠將模塊化的插件方便地融入Snort之中。預處理程序代碼在探測引擎被調用之前運行,但在數據包譯碼之后。通過這個機制,數據包可以通過額外的方法被修改或分析。使用preprocessor關鍵字加載和配置預處理程序。在Snort規則文件中的preprocessor指令格式如下:
preprocessor
例子:
preprocessor minfrag: 128
HTTP Decode
HTTP Decode用于處理HTTP URI字符串并且將串中的數據轉化為可讀的ASCII字串。HTTP對于一些特性定義了一個十六進制編碼方法,例如字符串%20被解釋成一個空格。Web服務器被設計成能夠處理無數的客戶端并且支持多種不同的標準。
格式:
http_decode:
例子:
preprocessor http_decode: 80 8080 unicode iis_flip_slash iis_alt_unicode
Portscan Detector
Snort Portscan預處理程序的用處:
向標準記錄設備中記錄從一個源IP地址來的端口掃描的開始和結束。如果指定了一個記錄文件,在記錄掃描類型的同時也記錄目的IP地址和端口。端口掃描定義為在時間T(秒)之內向超過P個端口進行TCP連接嘗試,或者在時間T(秒)之內向超過P個端口發送UDP數據包。端口掃描可以是對任一IP地址的多個端口,也可以是對多個IP地址的同一端口進行?,F在這個版本可以處理一對一和一對多方式的端口掃描,下一個完全版本將可以處理分布式的端口掃描(多對一或多對多)。端口掃描也包括單一的秘密掃描(stealth scan)數據包,比如NULL,FIN,SYNFIN,XMAS等。如果包括秘密掃描的話,端口掃描模塊會對每一個掃描數據包告警。為避免這種情況,可以在Snort標準發行版中的scan-lib文件里把有關秘密掃描數據包的小節注釋掉,這樣對每次掃描就只記錄一次。如果使用外部記錄特性,可以在記錄文件中看到(端口掃描的?)技術和類型。該模塊的參數如下:
格式:
portscan:
例子:
preprocessor portscan: 192.168.1.0/24 5 7 /var/log/portscan.log
Portscan Ignorehosts
如果用戶的服務器(比如NTP,NFS和DNS服務器)會妨礙端口掃描的探測,可以通知portscan模塊忽略源自這些主機的TCP SYN和UDP端口掃描。該模塊的參數為IPs/CIDR的列表。
格式:
portscan-ignorehosts:
例子:
preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24
Frag2
Frag2是一個新的IP碎片重組預處理器。Frag2的內存使用和碎片時間超時選項是可配置的。不給出參數,frag2將使用缺省的內存量(4MB)和時間超時值(60秒)。這個時間值用來決定一個沒有重組的分段將被丟棄的時間長度。
格式
preprocessor frag2: [memcap
timeout
memcap
min_ttl
detect_state_problems 發現重疊分段時報警。
ttl_limit
例子:
preprocessor frag2: memcap 16777216, timeout 30
Stream4
Stream4模塊使snort 具有 TCP流從新組裝和狀態分析能力。強壯的流重組能力使得snort能夠忽視無“狀態”攻擊,例如,stick粘滯位攻擊。Stream4也能夠給大量用戶提供超過256個TCP同步連接。Stream4缺省配置時能夠處理32768個TCP同步連接。Stream4有兩個可配置的模塊,stream4 preprocessor 和相關的 stream4_reassemble 插件。stream4_reassemble有如下選項
Stream4 格式:
preprocessor stream4: [noinspect], keepstats [machine|binary], [timeout
noinspect 關閉狀態監測能力。
keepstats [machine|binary] 保持會話統計,如果是“machine”選項就從機器以平坦的模式讀入,如果是“binary”選項就用統一的二進制模式輸出。
timeout
memcap
detect_scans 打開portscan 的報警能力。
detect_state_problems 打開流事件報警能力,例如,沒有RST的數據包、帶有數據的SYN包和超出窗口序列號的包。
disable_evasion_alerts 關閉事件報警能力,例如,TCP重疊。
ttl_limit 設置ttl的極限值。
Stream4_Reassemble 格式:
preprocessor stream4_reassemble: [clientonly], [serveronly],[noalerts], [ports
clientonly 對一個連接的客戶端提供重組
serveronly 對一個連接的服務器端提供重組
noalerts 對于插入和逃避攻擊事件不發出報警
ports
注: 在配置文件中僅僅設置stream4和stream4_reassemble 命令而沒有參數,它們將會使用缺省的參數配置。Stream4引入了一個新的命令行參數:-z 。在TCP流量中,如果指定了 –z 參數,snort將只對那些通過三次握手建立的流以及那些協作的雙向活動的流(即,一些流量走一個方向而其他一些除了一個RST或FIN外走相反方向)檢測報警。當設置了-z 選項后snort就完全忽略基于TCP的stick/snot攻擊。
Conversation
Conversation 預處理器使Snort 能夠得到關于協議的基本的會話狀態而不僅僅是由spp_stream4處理的TCP狀態。
目前它使用和stream4相同的內存保護機制,所以它能保護自己免受DOS攻擊。當它接收到一個你的網絡不允許的協議的數據包時,它也能產生一個報警信息。要做到這一點,請在IP協議列表中設置你允許的IP協議,并且當它收到一個不允許的數據包時,它將報警并記錄這個數據包。
格式:
preprocessor conversation: [allowed_ip_protocols
Portscan2
這個模塊將檢測端口掃描。它要求包含Conversation預處理器以便判定一個會話是什么時間開始的。它的目的是能夠檢測快速掃描,例如,快速的nmap掃描。
格式:
preprocessor portscan2: [scanners_max
Telnet Decode
telnet_decode 預處理器使snort能夠標準化telnet會話數據的控制協議字符。它把數據包規格和成單獨的數據緩存,這樣原始數據就能夠通過rawbytes content 修飾詞來記錄或者檢驗了。缺省情況下,它運行在21, 23, 25, 和119端口.
格式:
preprocessor telnet_decode:
RPC Decode
Rpc_decode 預處理器將RPC的多個碎片記錄組合成一個完整的記錄。它是通過將數據包放在標準緩存中來做到這一點的。如果打開stream4預處理器功能。它將只處理客戶端的流量。它缺省運行在 111和 32771端口。
格式:
preprocessor rpc_decode:
Perf Monitor
這個模塊是用來評估snort各方面性能的一個工具。它的輸出格式和參數格式都是變化的,在這里就不給出注釋了。
Http Flow
使用這個模塊可以忽略HTTP頭后面的HTTP服務響應。
輸出插件使得Snort在向用戶提供格式化輸出時更加靈活。輸出插件在Snort的告警和記錄子系統被調用時運行,在預處理程序和探測引擎之后。規則文件中指令的格式非常類似于預處理程序。
注意:如果在運行時指定了命令行的輸出開關,在Snort規則文件中指定的輸出插件會被替代。例如,如果在規則文件中指定了alert_syslog插件,但在命令行中使用了\"-A fast\"選項,則alert_syslog插件會被禁用而使用命令行開關。多個輸出插件是在snort的配置文件中指定的。當指定多個輸出插件時,它們被壓入棧并且在事件發生時按順序調用。關于標準的記錄和報警系統,輸出模塊缺省把數據發送到 /var/log/snort.或者通過使用-l命令行參數輸出到一個用戶指定的目錄。在規則文件中通過指定output關鍵字,使得在運行時加載輸出模塊。
格式:
output
例子:
output alert_syslog: LOG_AUTH LOG_ALERT
Alert_syslog
該插件向syslog設備發送告警(很像命令行中的-s開關)。該插件也允許用戶指定記錄設備,優先于Snort規則文件中的設定,從而在記錄告警方面給用戶更大的靈活性。
可用關鍵字:
選項(Options)
LOG_CONS
LOG_NDELAY
LOG_PERROR
LOG_PID
設備(Facilities)
LOG_AUTH
LOG_AUTHPRIV
LOG_DAEMON
LOG_LOCAL0
LOG_LOCAL1
LOG_LOCAL2
LOG_LOCAL3
LOG_LOCAL5
LOG_LOCAL6
LOG_LOCAL7
LOG_USER
優先級(Priorities)
LOG_EMERG
LOG_ALERT
LOG_CRIT
LOG_ERR
LOG_WARNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG
格式:
alert_syslog:
Alert_fast
將報警信息快速的打印在指定文件的一行里。它是一種快速的報警方法,因為不需要打印數據包頭的所有信息。
格式:
alert_fast:
例子:
output alert_fast: alert.fast
Alert_full
打印數據包頭所有信息的報警。這些報警信息寫到缺省的日志目錄(/var/log/snort)或者寫到命令行指定的目錄。在日志目錄內,每個IP都創建一個目錄。產生報警的數據包被解碼后寫到這個目錄下的文件里。這些文件的創建將大大降低snort的性能。所以這種輸出方法對大多數不適用,但那些輕量級的網絡環境還是可以使用的。
格式:
alert_full:
例子:
output alert_full: alert.full
Alert_smb
這個插件將把WinPopup報警信息發送給NETBIOS命名的機器上的一個文件。并不鼓勵使用這個插件,因為它以snort權限執行了一個外部可執行二進制程序,通常是root權限。那個工作站上接受報警信息的文件每行存放一條報警信息。
格式:
alert_smb: