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)容和要檢查的包的具體部分迄委。
1. 規(guī)則頭:
規(guī)則動(dòng)作:
在snort中有五種動(dòng)作:alert谋梭、log互广、pass踪栋、activate和dynamic.
1焙格、Alert-使用選擇的報(bào)警方法生成一個(gè)警報(bào),然后記錄(log)這個(gè)包夷都。
2眷唉、Log-記錄這個(gè)包。
3囤官、Pass-丟棄(忽略)這個(gè)包冬阳。
4、activate-報(bào)警并且激活另一條dynamic規(guī)則党饮。
5肝陪、dynamic-保持空閑直到被一條activate規(guī)則激活,被激活后就作為一條log規(guī)則執(zhí)行刑顺。
協(xié)議類型:
Snort當(dāng)前分析可疑包的ip協(xié)議有四種:tcp 氯窍、udp、icmp和ip蹲堂。將來可能會(huì)更多荞驴,例如ARP、IGRP贯城、GRE、OSPF霹娄、RIP能犯、IPX等鲫骗。
地址:
關(guān)鍵字"any"可以被用來定義任何地址。地址就是由直接的數(shù)字型ip地址和一個(gè)cidr塊組成的踩晶。cidr塊指示作用在規(guī)則地址和需要檢查的進(jìn)入的任何包的網(wǎng)絡(luò)掩碼执泰。/24表示c類網(wǎng)絡(luò), /16表示b類網(wǎng)絡(luò)渡蜻,/32表示一個(gè)特定的機(jī)器的地址术吝。
否定操作符用"!"表示茸苇。
你也可以指定ip地址列表排苍,一個(gè)ip地址列表由逗號(hào)分割的ip地址和CIDR塊組成,并且要放在方括號(hào)內(nèi)“[”学密,“]”淘衙。此時(shí),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";)
變量定義:
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"的值替換或打印出錯(cuò)誤消息"message"然后退出筝蚕。
例如:
var MY_NET $(MY_NET:-192.168.1.0/24)
log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
端口號(hào):
端口號(hào)可以用幾種方法表示,包括"any"端口抡草、靜態(tài)端口定義饰及、范圍、以及通過否定操作符康震。
靜態(tài)端口定義表示一個(gè)單個(gè)端口號(hào)燎含,例如111表示portmapper,23表示telnet腿短,80表示http等等屏箍。端口范圍用范圍操作符":"表示。范圍操作符可以有數(shù)種使用方法橘忱,如下所示:
log udp any any -> 192.168.1.0/24 1:1024
記錄來自任何端口的赴魁,目標(biāo)端口范圍在1到1024的udp流
log tcp any any -> 192.168.1.0/24 :6000
記錄來自任何端口,目標(biāo)端口小于等于6000的tcp流
log tcp any :1024 -> 192.168.1.0/24 500:
記錄來自任何小于等于1024的特權(quán)端口钝诚,目標(biāo)端口大于等于500的tcp流
方向操作符:
方向操作符"->"表示規(guī)則所施加的流的方向颖御。方向操作符左邊的ip地址和端口號(hào)被認(rèn)為是流來自的源主機(jī),方向操作符右邊的ip地址和端口信息是目標(biāo)主機(jī)凝颇,還有一個(gè)雙向操作符"<>"潘拱。
2. 規(guī)則選項(xiàng):
規(guī)則選項(xiàng)組成了snort入侵檢測(cè)引擎的核心疹鳄,既易用又強(qiáng)大還靈活。所有的snort規(guī)則選項(xiàng)用分號(hào)"芦岂;"隔開瘪弓。規(guī)則選項(xiàng)關(guān)鍵字和它們的參數(shù)用冒號(hào)":"分開。例如:
- msg - 在報(bào)警和包日志中打印一個(gè)消息禽最。
- flags -檢查tcp flags的值腺怯。
- content - 在包的凈荷中搜索指定的樣式。
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ù)的好方法。例如:content: "|90C8 C0FF FFFF|/bin/sh";
字符: ; \ "
在content選項(xiàng)內(nèi)容中出現(xiàn)時(shí)必須被轉(zhuǎn)義(有兩個(gè)方法:1.用前導(dǎo)“\”字符 2. 使用字節(jié)的二進(jìn)制表示方式愕够,比如用“|3A|”表示“:”):
內(nèi)容匹配項(xiàng)的默認(rèn)是區(qū)分大小寫的走贪; - offset - content選項(xiàng)的修飾符,設(shè)定開始搜索的位置 惑芭。
- depth - content選項(xiàng)的修飾符坠狡,設(shè)定搜索的最大深度。
- nocase - 指定對(duì)content字符串大小寫不敏感遂跟。
- distance - content選項(xiàng)的修飾符逃沿,設(shè)定模式匹配間的最小間距;
distance關(guān)鍵字是content關(guān)鍵字的一個(gè)修飾詞幻锁,確信在使用content時(shí)模式匹配間至少有N個(gè)字節(jié)存在凯亮。它被設(shè)計(jì)成在規(guī)則選項(xiàng)中和其他選項(xiàng)聯(lián)合使用。
格式:distance: ;
例子:
alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; distance: 1;)
- within - content選項(xiàng)的修飾符哄尔,設(shè)定模式匹配間的最大間距假消;
within關(guān)鍵字是content關(guān)鍵字的一個(gè)修飾詞,確保在使用content時(shí)模式匹配間至多有N個(gè)字節(jié)存在岭接。它被設(shè)計(jì)成在規(guī)則選項(xiàng)中和distance選項(xiàng)聯(lián)合使用富拗。
格式:within: ;
例子:
alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; within: 10;)
- byte_test - 數(shù)字模式匹配。
把數(shù)據(jù)包凈載中特定位置的字串轉(zhuǎn)換為數(shù)值類型與指定的值進(jìn)行比較鸣戴。
格式:byte_test: , , , [[relative],[big],[little],[string],[hex],[dec],[oct]] - bytes_to_convert 從數(shù)據(jù)包取得的字節(jié)數(shù)啃沪。
- operator 對(duì)檢測(cè)執(zhí)行的操作 (<,>,=,!)。
- value 和轉(zhuǎn)換后的值相測(cè)試的值窄锅。
- offset 開始處理的字節(jié)在負(fù)載中的偏移量创千。
- relative 使用一個(gè)相對(duì)于上次模式匹配的相對(duì)的偏移量。
- big 以網(wǎng)絡(luò)字節(jié)順序處理數(shù)據(jù)(缺省)签餐。
- little 以主機(jī)字節(jié)順序處理數(shù)據(jù)寓涨。
- string 數(shù)據(jù)包中的數(shù)據(jù)以字符串形式存儲(chǔ)。
- hex 把字符串?dāng)?shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù)形式氯檐。
- dec 把字符串?dāng)?shù)據(jù)轉(zhuǎn)換成十進(jìn)制數(shù)形式。
- oct 把字符串?dāng)?shù)據(jù)轉(zhuǎn)換成八進(jìn)制數(shù)形式体捏。
例子:
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;)
- uricontent - 用于匹配正規(guī)化處理后URI字段冠摄。
這個(gè)關(guān)鍵字允許只在一個(gè)請(qǐng)求的URI(URL)部分進(jìn)行搜索匹配。它允許一條規(guī)則只搜索請(qǐng)求部分的攻擊几缭,這樣將避免服務(wù)數(shù)據(jù)流的錯(cuò)誤報(bào)警河泳。關(guān)于這個(gè)關(guān)鍵字的參數(shù)的描述可以參考content關(guān)鍵字部分。這個(gè)選項(xiàng)將和HTTP解析器一起工作年栓。(只能搜索第一個(gè)“/”后面的內(nèi)容)拆挥。
例如:uricontent:".emf"; - 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ū)分開來。這個(gè)確定的關(guān)鍵字能夠代替標(biāo)志:A+ 這個(gè)標(biāo)志在顯示已建立的TCP連接時(shí)都將被使用否副。
選項(xiàng):
to_client 觸發(fā)上服務(wù)器從A到B的響應(yīng)汉矿。
to_server 觸發(fā)客戶端上從A到B的請(qǐng)求。
from_client 觸發(fā)客戶端上從A到B的請(qǐng)求备禀。
from_server 觸發(fā)服務(wù)器上從A到B的響應(yīng)洲拇。
established 只觸發(fā)已經(jīng)建立的TCP連接。
stateless 不管流處理器的狀態(tài)都觸發(fā)(這對(duì)處理那些能引起機(jī)器崩潰的數(shù)據(jù)包很有用曲尸。
no_stream 不在重建的流數(shù)據(jù)包上觸發(fā)赋续。
only_stream 只在重建的流數(shù)據(jù)包上觸發(fā)。
格式:flow:[to_client|to_server|from_client|from_server|established|stateless|no_stream|only_stream]
reference - 外部攻擊參考ids另患。
這個(gè)關(guān)鍵字允許規(guī)則包含一個(gè)外面的攻擊識(shí)別系統(tǒng)纽乱。這個(gè)插件目前支持幾種特定的系統(tǒng),它和支持唯一的URL一樣好柴淘。這些插件被輸出插件用來提供一個(gè)關(guān)于產(chǎn)生報(bào)警的額外信息的連接迫淹。 - sid - snort規(guī)則id。
這個(gè)關(guān)鍵字被用來識(shí)別snort規(guī)則的唯一性为严。這個(gè)信息允許輸出插件很容易的識(shí)別規(guī)則的ID號(hào)敛熬。
sid 的范圍是如下分配的:
<100 保留做將來使用
100-1000,000 包含在snort發(fā)布包中
1000,000 作為本地規(guī)則使用
- rev - 規(guī)則版本號(hào)。
這個(gè)關(guān)鍵字是被用來識(shí)別規(guī)則修改的第股。修改应民,隨同snort規(guī)則ID,允許簽名和描述被較新的信息替換。 - classtype - 規(guī)則類別標(biāo)識(shí)诲锹。
這個(gè)關(guān)鍵字把報(bào)警分成不同的攻擊類繁仁。通過使用這個(gè)關(guān)鍵字和使用優(yōu)先級(jí),用戶可以指定規(guī)則類中每個(gè)類型所具有的優(yōu)先級(jí)归园。 - pcre:
pcre選項(xiàng)允許用戶使用與PERL語(yǔ)言相兼容的正則表達(dá)式黄虱。相關(guān)正則表達(dá)式的具體細(xì)節(jié)參看PCRE的Web站點(diǎn):http://www.pcre.org
pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUB]";
在表達(dá)式后的修飾符設(shè)置編譯正則表達(dá)式的一些標(biāo)志。
Perl兼容的修飾符:
|i| 對(duì)大小不敏感
|s| 在點(diǎn)轉(zhuǎn)義符號(hào)中包含換行符庸诱, 一般情況下被匹配的緩沖區(qū)是作為一個(gè)大字符串
|m| 的捻浦,和$分別匹配串頭和串尾。當(dāng)設(shè)置了m修飾符桥爽,和$匹配跟緊跟換行符和緊先導(dǎo)于換行符的情況
|x| 要匹配的模式中的空格符被忽略朱灿,除非是被轉(zhuǎn)義過的或在一個(gè)字符集中。
PCRE兼容的修飾符:
|A| 模式必須在緩沖區(qū)的開頭匹配到(同^) 設(shè)置指定的$必須匹配到緩沖區(qū)末尾钠四。如果不用E |
|E| 修飾符盗扒,$則可能只匹配到串尾之前換行符。
|G| 在默認(rèn)情況下不使用“貪婪”模式缀去,只有在模式后面跟了“?”字符的情況下貪婪侣灶。
Snort特定的修飾符:
|R| 此匹配相對(duì)于前一個(gè)匹配成功串尾開始(類似于distance:0)
|U| 匹配解碼后的URI緩沖區(qū)(類似于uricontent
|B| 不使用解碼后的緩沖區(qū)(類似于rawbytes)
修飾符R和B不能同時(shí)使用。
例如:alert ip any any -> any any (pcre:"/BLAH/i";)
例子:
alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"WEB-CLIENT PNG large colour depth download attempt"; flow:from_server,established; content:"|89|PNG|0D 0A 1A 0A|"; content:"IHDR"; within:8; byte_test:1,>,16,8,relative;classtype:attempted-user; sid:3134; rev:3;reference:url,www.microsoft.com/technet/security/bulletin/MS05-009.mspx; )
alert tcp $EXTERNAL_NET any -> $HOME_NET 139 (msg:"NETBIOS SMB Trans Max Param/Count DOS attempt"; flow:established,to_server; content:"|00|"; depth:1; content:"|FF|SMB%"; within:5; distance:3; byte_test:1,!&,128,6,relative; pcre:"/^.{27}/sR"; content:"|00 00 00 00|"; within:4; distance:5;reference:url,www.corest.com/common/showdoc.php?idx=262;classtype:protocol-command-decode; sid:2101; rev:15;)
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"SPYWARE-PUT Hijacker shop at home select installation in progress"; flow:to_server,established; uricontent:"GRInstallCL.asp"; nocase; uricontent:"E="; nocase; uricontent:"MID="; nocase; uricontent:"Refer="; nocase; uricontent:"WGR="; nocase; uricontent:"Prev="; nocase; uricontent:"sGUID="; nocase; classtype:misc-activity; sid:5810; rev:1;)
正則表達(dá)式元字符的解釋:
\: 轉(zhuǎn)移字符朵耕,將后一個(gè)字符標(biāo)記為一個(gè)特殊字符
^:匹配輸入字串的開始位置
$:匹配輸入字串的結(jié)束位置
*:匹配前面的子表達(dá)式0次或多次
+:匹配前面的子表達(dá)式1次或多次
?:匹配前面的子表達(dá)式0次或1次
{n,m}:匹配至少n次炫隶,至多m次
.:匹配到除"\n"之外的所有單個(gè)字符
[]:表示一個(gè)字符集,可以單個(gè)列出阎曹,如[amk$]伪阶;也可以加一個(gè)"-"表示一個(gè)字符范圍,如[a-z]处嫌;匹配任意一個(gè)字符即可栅贴;也可以用補(bǔ)集來匹配不在區(qū)間范圍內(nèi)的字符。其做法是把""作為類別的首個(gè)字符熏迹;其它地方的""只會(huì)簡(jiǎn)單匹配 ""字符本身檐薯,例如[5] 將匹配除 "5" 之外的任意字符。
例如:
pcre:"/X-Mailer\x3A[\r\n]*mPOP\s+Web-Mail/smi";
pcre:"/Host\x3A[\r\n]*e2give.com/smi";
pcre:"/User-Agent\x3A[\r\n]*NSISDL/smi";
pcre:"/Host\x3A[\r\n]*push\x2Ecom/smi";
...
注:\x 后為十六進(jìn)制轉(zhuǎn)義值
\r 匹配一個(gè)回車符
\n 匹配一個(gè)換行符
\s 匹配任何空白字符
\d 匹配任何十進(jìn)制數(shù)注暗;它相當(dāng)于類 [0-9]坛缕。
\D 匹配任何非數(shù)字字符;它相當(dāng)于類 [^0-9]捆昏。
\s 匹配任何空白字符赚楚;它相當(dāng)于類 [ \t\n\r\f\v]。
\S 匹配任何非空白字符骗卜;它相當(dāng)于類 [^ \t\n\r\f\v]宠页。
\w 匹配任何字母數(shù)字字符左胞;它相當(dāng)于類 [a-zA-Z0-9_]。
\W 匹配任何非字母數(shù)字字符举户;它相當(dāng)于類 [^a-zA-Z0-9_]烤宙。
摘自百度文庫(kù)