如何編寫snort的檢測規則
2013年09月08日 ⁄ 綜合 ⁄ 共 16976字
前言
snort是一個強大的輕量級的網絡入侵檢測系統。它具有實時數據流量分析和日志IP網絡數據包的能力,能夠進行協議分析,
對內容進行搜索/匹配。它能夠檢測各種不同的攻擊方式,對攻擊進行實時報警。此外,snort具有很好的擴展性和可移植性。本文將講述如何開發snort
規則。
1.基礎
snort使用一種簡單的規則描述語言,這種描述語言易於擴展,功能也比較強大。下面是一些最基本的東西:
snort的每條規則必須在一行中,它的規則解釋器無法對跨行的規則進行解析。注意:由於排版的原因本文的例子有的分為兩行。
snort
的每條規則都可以分成邏輯上的兩個部分:規則頭和規則選項。規則頭包括:規則行為(rule's
action)、協議(protocol)、源/目的IP地址、子網掩碼以及源/目的端口。規則選項包含報警信息和異常包的信息(特征
碼,signature),使用這些特征碼來決定是否采取規則規定的行動。
這是一個例子:
alert tcp any any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"mountd access";)
表1.一條簡單的snort規則
從開頭到最左邊的括號屬於規則頭部分,括號內的部分屬於規則選項。規則選項中冒號前面的詞叫做選項關鍵詞(option
keywords)。注意對於每條規則來說規則選項不是必需的,它們是為了更加詳細地定義應該收集或者報警的數據包。只有匹配所有選項的數據
包,snort才會執行其規則行為。如果許多選項組合在一起,它們之間是邏輯與的關系。讓我們從規則頭開始。
1.1 include
snort使用的規則文件在命令行中指定,include關鍵詞使這個規則文件可以包含其它規則文件中的規則,非常類似與C語言中的#include。snort會從被包含的文件讀出其內容,取代include關鍵詞。
格式:
include <文件路徑/文件名>
注意:行尾沒有分號。
1.2 varriables
在snort規則文件中可以定義變量。
格式:
var
例子:
var MY_NET 192.168.1.0/24,10.1.1.0/24] $MY_NET any (flags:S;msg:'SYNMETA packet";)
表2.變量的定義和使用
規則變量名可以使用多種方式來修改,你可以使用$操作符來定義元變量(meta-variables)。這些修改方式可以結合變量修改操作符:?和-來使用。
$var:定義元變量
$(var):以變量var的內容作為變量名
$(var:-default):以變量var的內容作為變量名,如果var沒有定義就使用default作為變量名
$(var:?message):使用變量var的內容作為變量名,如果不成功就打印錯誤信息message並退出。
例如:
var MY_NET $(MYU_NET:-192.168.1.0/24) tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
表3.高級變量應用
2.規則頭(Rule Headers)
2.1 Rule Action
規則頭包含一些信息,這些信息包括:哪些數據包、數據包的來源、什么類型的數據包,以及對匹配的數據包如何處理。每條規則的第一項就是規則行為
(rule
action)。規則行為告訴snort當發現匹配的數據包時,應該如何處理。在snort中,有五種默認的處理方式:alert、log、pass、
activate和dynamic。
alert:使用選定的報警方法產生報警信息,並且記錄數據包
log:記錄數據包
pass:忽略數據包
activate:報警,接着打開其它的dynamic規則
dynamic:保持空閑狀態,直到被activete規則激活,作為一條log規則
你也可以定義自己的規則類型,把它們和一個或者幾個輸出插件聯系在一起。然后你就可以在snort規則中使用這些規則類型了。
這個例子將建立一個類型,它將只以tcpdump格式輸出日志:
ruletype suspicious
{
type log
output log_tcpdump: suspocious.log
}
下面這個例子將建立一個類型,把日志發送到syslog和MySql數據庫:
ruletype redalert
{
type alert
output alert_syslog:LOG_AUTH LOG_ALERT
output database:log,user=snort dbname=snort host=localhost
}
2.2 協議
每條規則的第二項就是協議項。當前,snort能夠分析的協議是:TCP、UDP和ICMP。將來,可能提供對ARP、ICRP、GRE、OSPF、RIP、IPX等協議的支持。
2.3 IP地址
規則頭下面的部分就是IP地址和端口信息。關鍵詞any可以用來定義任意的IP地址。snort不支持對主機名的解析。所以地址只能使用數字/CIDR
的形式。/24表示一個C類網絡;/16表示一個B類網絡;而/32表示一台特定的主機地址。例如:192.168.1.0/24表示從
192.168.1.1到192.168.1.255的地址。
在規則中,可以使用使用否定操作符(negation
operator)對IP地址進行操作。它告訴snort除了列出的IP地址外,匹配所有的IP地址。否定操作符使用!表示。例如,使用否定操作符可以很
輕松地對表1的規則進行改寫,使其對從外部網絡向內的數據報警。
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"external mountd access";)
表4.使用IP地址否定操作符的規則
上面這條規則中的IP地址表示:所有IP源地址不是內部網絡的地址,而目的地址是內部網絡地址。
你也可以定義一個IP地址列表(IP list)。IP地址列表的格式如下:
[IP地址1/CIDR,IP地址/CIDR,....]
注意每個IP地址之間不能有空格。例如:
alert tcp ![192.168.1.0/24,10.1.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";)
2.4 端口號
在規則中,可以有幾種方式來指
定端口號,包括:any、靜態端口號(static
port)定義、端口范圍,以及使用非操作定義。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 :600
記錄來自任何端口,其目的端口號小於或者等於6000的TCP數據包
log tcp any :1024 -> 192.168.1.0/24 500:
記錄源端口號小於等於1024,目的端口號大於等於500的TCP數據包
表5.端口范圍示例
你還可以使用邏輯非操作符!對端口進行非邏輯操作(port negation)。邏輯非操作符可以用於其它的規則類型(除了any類型,道理很簡單)。例如,你如果要日志除了X-window系統端口之外的所有端口,可以使用下面的規則:
log tcp any any -> 192.168.1.0/24 !6000:60 10
表6.對端口進行邏輯非操作
2.5 方向操作符(direction operator)
方向操作符->表示數據包的流向。它左邊是數據包的源地址和源端口,右邊是目的地址和端口。此外,還有一個雙向操作符<>,它使
snort對這條規則中,兩個IP地址/端口之間雙向的數據傳輸進行記錄/分析,例如telnet或者POP3對話。下面的規則表示對一個telnet對
話的雙向數據傳輸進行記錄:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
表7.使用雙向操作符的snort規則
activate/dynamic規則
activate/dynamic規則對擴展了snort功能。使用activate/dynamic規則對,你能夠使用一條規則激活另一條規則。當一
條特定的規則啟動,如果你想要snort接着對符合條件的數據包進行記錄時,使用activate/dynamic規則對非常方便。除了一個必需的選項
activates外,激活規則(activate rule)非常類似於報警規則(alert rule)。動態規則(dynamic
rule)和日志規則(log
rule)也很相似,不過它需要一個選項:activated_by。動態規則還需要另一個選項:count。當一個激活規則啟動,它就打開由
activate/activated_by選項之后的數字指示的動態規則,記錄count個數據包。
下面是一條activate/dynamic規則對的規則:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags:PA;content:"|E8C0FFFFFF|in|;activates:1;
表8.activate/dynamic規則對
這個規則使snort在檢測到IMAP緩沖區溢出時發出報警,並且記錄后續的50個從$HOME_NET之外,發往$HOME_NET的143號端口的
數據包。如果緩沖區溢出成功,那么接下來50個發送到這個網絡同一個服務端口(這個例子中是143號端口)的數據包中,會有很重要的數據,這些數據對以后
的分析很有用處。
3.規則選項
規則選項構成了snort入侵檢測引擎的核心,它們非常容易使用,同時又很強大和容易擴展。在每條snort規則中,選項之間使用分號進行分割。規則選項關鍵詞和其參數之間使用冒號分割。截止到寫本文為止(snort 1.7版),snort有23個規則選項關鍵詞:
msg:在報警和日志中打印的消息
logto:把日志記錄到一個用戶指定的文件,而不是輸出到標准的輸出文件
ttl:測試IP包頭的TTL域的值
tos:測試IP包頭的TOS域的值
id:測試IP分組標志符(fragment ID)域是否是一個特定的值
ipoption:查看IP選項(IP option)域
fragbits:測試IP包頭的分片位(fragmentation bit)
dsize:測試數據包包數據段的大小
flags:測試TCP標志(flag)是否是某個值
seq:測試TCP包的序列號是否是某個值
ack:測試TCP包的確認(acknowledgement)域是否為某個值
itype:測試ICMP數據包的類型(type)域
icode:測試ICMP數據包的編碼(code)域
icmp_id:測試ICMP回送包的標志符(ICMP ECHO ID)是否為某個值
content:在數據包的數據段中搜索模式(pattern)
content-list:在數據包的數據段中搜索模式清單
offset:設置開始搜索的偏移量
depth:設置搜索最大深度
nocase:大小寫不敏感匹配內容字符串
session:剝離一個對話的應用層信息
rpc:觀察RPC服務對特定應用程序的調用
resp:激活反應措施(斷開連接等)
react:激活反應措施(阻塞WEB站點)
3.1 msg
msg規則選項告訴日志引擎在復制包時同時打印的信息,以及讓報警引擎輸出的警告消息。它只是一個簡單的文本字符串,使用作為轉義符。
格式:
msg:"";
3.2 logto
logto選項告訴snort把觸發某條規則所有的數據包都記錄到指定的文件。使用這個選項,對處理來自nmap掃描、HTTP CGI掃描的數據非常方便。注意如果使用二進制日志模式,這個選項會失效。
格式:
logto:"<文件名>";
3.3 ttl
這個選項設置要測試的生命周期(time-to-live)值。只有數據包的TTL和這個選項設置的值精確匹配,測試才會成功。這個選項主要用來檢測路由企圖。
格式:
ttl:"";
3.4 tos
你可以使用tos關鍵詞檢查IP包頭的TOS(type of service)域是否是一個特定的值。也是只有在被檢測包TOS域的值和給定的值精確匹配時,這個測試才會成功。
格式:
tos:"";
3.5 ID
這個選項關鍵詞用來測試IP分片包頭的ID域。一些黑客工具為了不同的目的把這個域設置為特殊的值,例如:31337是在一些黑客中比較流行的值。使用這個選項就可以阻止這種攻擊。
格式:
id: "";
3.6 lpoption
如果IP包中有選項域,可以使用這個規則選項搜索IP包頭的特定選項,例如源路由。這個規則選項可以使用的參數如下:
rr:路由記錄
eof:End of list
nop:無操作
ts:時間戳
sec:IP安全選項
lsrr:寬松源路由(loose source routing)
ssrr:嚴格源路由(strict source roution)
satid:流標識符
最常被注意的IP選項是loose&strict source routing,不過在Internet上廣泛使用的任何應用程序中都沒使用這兩個選項。每條規則中只能設定一個IP規則。
格式:
ipopts: ;
3.7 fragbits
使用這個規則選項可以觀察IP包頭的分片位和保留位。它們在IP包頭的標識域,共有3位,分別是:保留為(reserved
bit,RB)、還有分組片位(more fragments,MF)、不可分片(dont
fragment,DF)。這些位可以以各種方式組合檢查,使用下面的值指定:
R:保留位
D:DF位
M:MF位
你也可以使用修飾符號對特定的位進行邏輯組合:
+--ALL標志,指定的位加上任何其它的位為真
*--ANY標志,指定的任何位為真
!--NOT標志,指定的位不為真
格式:
fragbits: ;
例子:
alert tcp !$HOME_NET any -> $HOME_NET any (fragbits:R+;msg:"Reserverd IP bit set!";)
表9.fragbits示例
3.8 dsize
這個規則選項用來測試數據包負載的大小。它可以被設置為任意值,還可以使用大於/小於號。例如,如果你知道某個服務有一個特定大小的緩沖區,你就能夠設置這個選項來捕獲制造緩沖區溢出的企圖。它比檢查數據包的內容速度快的多。
格式:
dsize: [>|<]
<、>是可選的
3.9 content
關鍵詞content是snort一個非常重要的特征。用戶可以在規則中使用這個關鍵詞,snort就會搜索數據包中content指定的內容,並且觸
發對於這些數據的反應。每當對一個content規則選項進行模式匹配時,snort都會調用Boyer-Moore模式匹配函數,測試數據包的內容。無
論在數據包的那個位置發現要搜索的數據,就算測試成功。接下來,snort就會對這條規則中其余的選項進行測試。注意:測試是大小寫敏感的。
content選項包含的數據可以混合有文本和二進制數據。二進制數據一般被包在管道符(|)中,由字節碼(bytecode)表示。字節碼使用16進制數字表示二進制數據。表10是一條混有文本和二進制數據的snort規則。
alert tcp any any -> 192.168.1.0/24 143(content:"|90c8 c0ff ffff|/bin/sh";msg:"IMAP buffer overflow");
表10.content規則選項中混有文本和二進制數據
格式:
content:"";
3.10 offset
在使用content規則選項時,offset規則選項作為其修飾符。這個關鍵詞設置對content的內容進行模式匹配時的起始位置。這個規則選項在
某些情況下很有用,例如CGI掃描,要搜索的字符串從來不會在數據包的前4個字節出現。注意:設置偏移值一定要小心,它可能會造成漏檢!這個規則選項只能
和content規則選項搭配使用。
格式:
offset: ;
3.11 depth
depth是content規則選項的另一個修飾符。它用來設置最大的搜索深度,以減少無謂的搜索,使snort只在特征碼可能出現的區域內搜索,例如
如果在一個web綁定(web-bound)包中搜索“cgi-bin/phf",你就不必浪費時間在數據包負載數據的前20個字節之外搜索。表11的規
則結合了content、offset、depth。
alert tcp any any -> 192.168.1.0/24 80 (content:"cgi-bin/phf";offset:3;depth:22;msg:"CGI-PHF access";)
表11.含有content、offset和depth規則選項的規則
格式:
depth: ;
3.12 nocase
nocase使對content進行模式匹配時大小寫不敏感。snort將不再區別每個ASCII字符的大小寫。
格式:
nocase;
例如:
alert tcp any any -> 192.168.1.0/24 21 (content:"USER root";nocase;msg:"FTP root login attempt";)
表12.使用nocase修飾符的規則
3.13 flags
這個規則選項用來測試TCP包頭的標志。實際上,在snort中有8個有效的標志:
F:FIN(TCP標志字節最左邊一位)
S:SYN
R:RST
P:PSH
A:ACK
S:ACK
U:URG
2:保留位2
1:保留位1(標志字節最右邊一位)
還可以使用邏輯操作符對指定的標志位進行操作:
+:ALL,指定的標志位和其它任意的標志位為真
*:ANY,指定的標志位中任意的標志位為真
!:NOT,除了指定標志位外,任意的標志位為真
保留位能夠用來檢測非正常的行為,例如對IP協議棧指紋特征的探測企圖或者其它可疑行為。表13是一條針對SYN-FIN掃描的檢測規則。
alert any any -> 192.168.1.0/24 any (flags:SF;msg:"Possible SYN FIN scan";)
表13.TCP標志
格式:
flags: ;
3.14 seq
這個規則選項涉及TCP包的序列號。實質上,它檢測包是否有一個靜態的序列號集合,因此這個規則選項非常沒有用處。指示出於完整性的考慮才包含了這個選項。
格式:
seq:
3.15 ack
這個規則選項涉及TCP包頭的確認域(acknowledge)。迄今為止,它只有一個實際的用途:檢測NMAP TCP
ping掃描。掃描程序nmap進行TCP ping掃描時,把TCP包頭的確認號(4個字節)設置為0,然后向目標主機發出TCP
ACK包,確定目標主機是否正在運行。表14是一個檢測這種探測的規則:
alert any any -> 192.168.1.0/24 any (flags:A;ack:0;msg:"nmap TCP ping";)
表14.TCP ACK域的使用
格式:
ack:;
3.16 itype
itype規則選項用來測試ICMP包頭的類型域,使用數字進行設置。每種ICMP包對應的數值如下:
0:回送應答
3:無法到達目的地
4:抑制包源
5:重定向(改變路徑)
8:回送請求
11:IP分組超時
12:IP分組參數有問題
13:時間戳請求
14:時間戳應答
15:信息請求
16:信息應答
17:地址掩碼請求
18:地址掩碼應答
注意:拒絕服務和淹沒攻擊的數據包有時使用無效的ICMP類型,可以使用這個規則選項對無效的ICMP類型進行檢測,也就是說,這個規則選項中的值可以不是上面所列的數值。
格式:
itype:;
3.17 icode
icode規則選項和itype非常相似,也是使用數字進行設置,具體數值見snort源代碼的decode.h文件。同樣,也可以使用其它的數值來檢測可疑的數據包。
格式:
icode:;
3.18 session
sesion關鍵詞是從snort-1.3.1.1版加入的,用來從TCP會話中剝離用戶的數據。如果想觀察用戶在telnet、rlogin、
ftp,甚至WEB會話過程中輸入了什么,就可以使用這個規則選項。session規則選項有兩個參數關鍵詞:printable、all。使用
printable,snort就會只輸出可打印數據;使用all,snort就會輸出所有的數據,不可打印的數據以16進制表示。不過,這個功能會大大
降低snort的速度,所以不太適合大負載的情況,而且最好使用二進制日志文件格式。表15是一條記錄telnet會話的規則:
log tcp any any <> 192.168.1.0/24 23 (session: printable;)
表15.記錄可打印的telnet會話數據
格式:
session:[printable|all];
3.19 icmp_id
icmp_id規則選項用來檢測ICMP回送(echo)數據包的ICMP
ID號是否為一個特定的值。之所以會用到這個規則選項,是因為一些隱秘通道(covert
channel)程序在通訊時使用靜態的ICMP域。為了執行stacheldreht檢測規則,開發了這個特別的插件,這些規則是由Max
Vision(一位著名的白帽黑客,譯者注)編寫的。不過,它有助於檢測其它一些潛在的攻擊。
格式:
icmp_id:;
3.20 icmp_seq
icmp_seq規則選項用來檢測一個ICMP回送包的ICMP序列號是否是一個特定的值。之所以會用到這個規則選項,是因為一些隱秘通道
(covert
channel)程序在通訊時使用靜態的ICMP域。為了執行stacheldreht檢測規則,開發了這個特別的插件,這些規則是由Max
Vision編寫的。不過,它有助於檢測其它一些潛在的攻擊。
格式:
icmp_seq:
3.21 rpc
規則選項rpc可以使snort觀察RPC請求,並且自動對應用程序、過程(procedure)和程序版本進行解碼。只有這三個變量都匹配時,才算成功。統配符*可以用來代替過程(procedure)和版本號。
格式:
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";)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100232,10,*;msg:"RPCsadmin";)
表16.幾條RPC報警規則
3.22 resp
對於匹配某個規則的數據包,可以通過resp關鍵詞使snort的靈活反應(flexible reponse,FlexResp)機制生效。使用FlexResp插件,snort能夠主動斷開惡意連接。下面是這個模塊的參數:
rst_snd:向發送方套接字發送TCP-RST數據包
rst_rcv:向接受方套接字發送TCP-RST數據包
rst_all:在兩個方向上發送TCP-TST數據包
icmp_net:向發送方發送ICMP_NET_UNREACH數據包
icmp_host:向發送方發送ICMP_HOST_UNREACH數據包
icmp_port:向發送方發送ICMP_PORT_UNREACH數據包
icmp_all:向發送方發送以上各種類型的ICMP數據包
多個參數可以結合使用,各個參數之間使用逗號隔開。
格式:
resp:;
例子:
alert tcp any any -> 192.168.1.0/24 1524 (flags:S;resp:rst_all;msg:"Root shell backdoor attempt";)
alert udp any any -> 192.1.168.1.0/ 31 (resp:icmp_port,icmp_host;msg:"Hacker's Paradise access attempt";)
表17.FlexResp規則
3.23 content-list
使用content-list關鍵詞可以指定更多的正文字符串,突破了content規則選項只能指定單一字符串的限制。表18是一個conternt-list文件。每個要搜索的字符串占一行。這個規則選項是使用react關鍵詞的基礎。
#adult sites
porn
adults
hard core
www.pornsite.com
# ...
表18.content-list文件
格式:
content-list:"";
3.24 react
react關鍵詞是基於FlexResp(flexible
response)的,它使snort對匹配某個規則的數據包作出反應。基本的反應就是阻塞用戶要訪問的站點,例如色情站點。snort的
FlexResp插件能夠主動關閉惡意連接,如果連接使用的是http或者代理服務器端口,FlexResp插件就會向瀏覽器發出一條
HTML/javascript警告信息。這個規則選項可以使用下面幾個參數:
block:關閉連接並發出注意信息
warn:發出警告信息
這兩個參數是基本參數,它們可以和下面的可選參數組合使用:
msg:定義要包含在警告信息中的文本
proxy::使用代理服務器端口發送警告信息
可選參數使用逗號分開,react關鍵詞應該放在選項的最后。例如:
alert tcp any any <> 192.168.1.0/24 80 (content-list:"adults";msg:"Not for children!";react:block,msg;)
alert tcp any any <> 192.168.1.0/24 any (content-list:"adults";msg:"Adults list access attempt";react:block;)
表19.react規則
格式:
react:;
4.預處理器(preprocessors)
4.1 預處理器綜述
從snort-1.5開始加入了對預處理器的支持。有了這種支持,用戶和程序員能夠比較容易地編寫模塊化的插件,擴展snort的功能。預處理器在調用
檢測引擎之前,在數據包被解碼之后運行。通過這種機制,snort可以以一種out of band的方式對數據包進行修改或者分析。
預處理器可以使用preprocessor關鍵詞來加載和配置,格式如下:
preprocessor :
例如:
preprocessor minfrag: 128
表20.預處理器指令格式
4.2 可用的預處理器模塊
4.2.1 minfrag
這個預處理器測試分片包的大小是否為一個特定的值。數據包分片,通常是源/目的地址之間的路由器完成的。一般來說,商業網絡設備產生的分片不會小於
512個字節,基於這種情況,我們可以對很小的分片進行監視,很小的分片包一般是人為產生的,主要為了使用很小的碎片隱藏數據。
格式:
minfreg:<大小閥值>
4.2.2 HTTP decode預處理插件
HTTP解碼預處理模塊用來處理HTTP URI字符串,把它們轉換為清晰的ASCII字符串。這樣就可以對抗evasice web URL掃描程序和能夠避開字符串內容分析的惡意攻擊者。這個預處理模塊使用WEB端口號作為其參數,每個端口號使用空格分開。
格式:
http_decode:<端口號列表>
例如:
preprocessor http_decode: 80 8080
表21.使用HTTP decode預處理模塊的規則
4.2.3 端口掃描檢測模塊
snort端口掃描檢測預處理模塊是Patrick Mullen開發的,從他的個人主頁可以得到更多信息。
snort端口掃描檢測預處理模塊主要做如下工作:
把由單個源IP地址發起的端口掃描從開始到結束的全過程記錄到標准日志設備。
如果指定了一個日志文件,就把被掃描的IP地址和端口號和掃描類型都記錄到這個日志文件。
這個模塊使用的參數包括:
監視的網絡: 以IP地址/子網掩碼的格式指定要進行端口掃描監視的網絡。
端口數: 在檢測周期(detection period)內訪問的端口數目。
檢測周期(detection period): 達到某個設定的端口訪問量需要的時間,以秒計。
日志目錄/文件: 保存警告信息的目錄/文件。警告信息也可以寫到默認警告文件中。
格式:
portscan:<要監視的網絡> <端口數> <檢測周期> <日志目錄/文件>
例子:
preprocessor portscan:192.168.1.0/24 5 7 /var/log/portscan.log
表22.端口掃描檢測模塊的配置
4.2.4 portscan ignorehosts
Patrick Mullen對端口掃描檢測系統進行了改進,形成了另一個模塊--portscan
ignorehosts。有些服務器程序容易和端口掃描檢測模塊造成沖突,例如NTP、NFS和DNS,如果你運行這些服務器程序,可以告訴端口掃描檢
測模塊忽略對由特定主機發起的TCP SYN和UDP端口掃描的檢測。這個模塊使用的參數是一個要忽略的IP地址/CIDR的列表。
格式:
portscan-ignorehosts:<主機列表>
例子:
preprocessor portscan-ignorehosts:192.168.1.5/32 192.168.3.0/24
表23.portscan ignorehosts模塊的配置
4.2.5 defrag模塊
defrag插件是由Dragos
Rulu開發的,它使snort能夠消除IP碎片包,給黑客使用IP碎片包繞過系統的檢測增加了難度。這個模塊非常容易配置,不需要參數,直接放在
preprocessor關鍵詞之后即可。它的功能超過了migfrag模塊的功能,所以你如果使用defrag,就不用在用minfrag模塊了。
格式:
defrag
例子:
preprocessor defrag
defrag模塊的配置
4.2.6 stream模塊
stream插件為snort提供了TCP數據包重組的功能。在配置的端口上,stream插件能夠對TCP數據包的細小片段進行重組成為完整的TCP數據包,然后snort可以對其可疑行為進行檢查。這個插件有好多參數:
超時(timeout): 在一個TCP數據包送達之前,保存一個
TCP數據流緩沖的最長時間。
端口(port): 要監視的服務器端口。我們不想監視所有的
TCP端口,這也不太現實。
最大字節數(maxbytes): 重組包的最大長度。
格式:
stream:timeout ,ports ,maxbytes
例如:
preprocessor stream:timeout 5,ports 21 23 80 8080,maxbytes 16384
TCP數據包重組插件配置
4.2.7 spade:the Statisical Packet Anomaly Dection Engine
如果需要了解更多關於spade的信息,請參考snort源代碼中的README.Spake文件,或者http://www.silicondefense.com/spice/。
使用這個模塊使snort能夠在你的網絡上進行統計異常檢測(statistical anomaly dection),這是一個全新的檢測引擎。如果你對此感興趣,請參考源代碼中的有關文檔和SiliconDefense站點的有關文檔。
5.輸出模塊
5.1 輸出模塊綜述
snort輸出模塊是從1.6版加入的新特征,使snort的輸出更為靈活。snort調用其報警或者日志子系統時,就會調用指定的輸出模塊。設置輸出模塊的規則和設置預處理模塊的非常相似。
在snort配置文件中可以指定多個輸出插件。如果對同一種類型(報警、日志)指定了幾個輸出插件,那么當事件發生時,snort就會順序調用這些插
件。使用標准日志和報警系統,默認情況下,輸出模塊就會將數據發送到/var/log/snor目錄,或者用戶使用-l命令行開關指定的目錄。
在規則文件中,輸出模塊使用output關鍵詞指定:
格式:
output name:<選項>
例子:
output alert_syslog: LOG_AUTH LOG_ALERT
表26.輸出模塊的配置
5.2 可用的輸出模塊
5.2.1 alert_syslog
使用這個輸出模塊,snort把報警信息發送到syslog,與-s命令行開關非常類似。這個輸出模塊允許用戶在規則文件中指定logging facility和優先級,給用戶以更大的靈活性。
有效的關鍵詞:
選項:
LOG_CONS
LOG_NDELAY
LOG_PERROR
LOG_PID
facility
LOG_AUTH
LOG_AUTHPRIV
LOG_DAEMON
LOG_LOCAL0
LOG_LOCAL1
LOG_LOCAL3
LOG_LOCAL4
LOG_LOCAL5
LOG_LOCAL6
LOG_LOCAL7
優先級
LOG_EMERG
LOG_ALERT
LOG_ERR
LOG_WARNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG
格式:
alert_syslog: <優先級> <選項>
5.2.2 alert_fast
使用快速單行格式(quick on line format)把snort報警信息輸出到指定的輸出文件。這種報警方式比完全(full)報警模式速度快,因為使用這種報警模式不需要把全部的數據包頭都輸出到指定的文件。
格式:
alert_fast: <輸出文件>
例子:
output alert_fast: alert.fast
表27.快速報警配置
5.2.3 alert_full
把全部的數據包頭都輸出到snort報警信息。這種報警機制一般較滿,因為程序需要對整個數據包進行分析。報警信息可以輸出到默認的日志目錄/var/log/snort,也可以使用命令行指定日志目錄。
格式:
alert_full:<輸出文件>
例子:
output alert_full:alert_full
表28.full報警配置
5.2.4 alert_smb
snort使用這個插件把WinPopup報警信息輸出到由NETBIOS命名的主機,主機名由參數指定的文件給出。注意我們不鼓勵使用這種報警方式,
因為samba客戶程序smbclient以root權限運行。接收報警信息工作站的名字列表由保存在一個文件中,每行是一台主機的NETBIOS名字。
格式:
alert_smb:<文件>
例子:
output alert_smb:workstation.list
表29.SMB報警配置
5.2.5 alert_unixsock
設置一個UNIX域套接字(UNIX domain socket),把報警信息發送到這個套接字。外部程序/進程可以在這個套接字上監聽,實時接收snort報警信息和數據包數據。這個接口目前尚處於實驗狀態。
格式:
alert_unixsock
示例:
output alert_unixsock
表30.UnixSock報警配置
5.2.6 log_tcpdump
log_tcpdump輸出模塊使用tcpdump格式的文件記錄數據包日志。這種日志文件格式便於使用很多外部的工具對數據進行分析,只要這些工具軟件支持tcpdump格式的文件。這個模塊只有一個參數,就是輸出文件的名字。
格式:
log_tcpdump:<輸出文件名>
示例:
output log_tcpdump:snort.log
表31.tcpdump輸出模塊的配置
5.2.7 數據庫輸出模塊
snort的數據庫輸出模塊是JedPickel開發的,用來將snort產生的數據送到各種SQL數據庫系統。如果要獲得安裝和配置這個模塊更為詳盡
的信息,可以參考ncident.org web
page。這個插件使用的參數是記錄snort日志的數據庫名和參數表。參數表使用這種格式:parameter=argument。有如下參數可以使
用:
host: 數據庫所在的主機。如果指定了一個非零字符串,snort就使用TCP/IP協議連接以此命名的主機。如果沒有主機名,snort就使用一個本地UNIX-domain套接字連接本地主機。
port: 數據庫所在服務器的端口號,或者一個UNIX-domain套接字文件。
dbname: 數據庫名字。
user: 數據庫用戶名。
passwd: 密碼。
sensor_name: 指定這個snort觸發器的名字,如果沒有指定就自動產生。
encoding: 因為數據包的負載和選項都是二進制數據,所以沒有一種簡單和可移植的方式將snort的數據保存在數據庫。所以在snort數據庫輸出插件中提供了一些選項,讓你自己決定使用那種編碼。下面是這幾種編碼的優點和缺點:
hex: 默認編碼選項,使用16進制字符串代表二進制數據。
存儲空間: 兩倍於二進制數據
搜索性: 極好
可讀性: 極差
base64: 使用base64字符串代表二進制數據。
存儲空間: 大約是直接存儲二進制數據的1.3倍
搜索性: 可能無須后續處理。
可讀性: 不可讀需要后續處理。
ascii:: 使用ASCII字符串代替二進制數據。非ASCII字符使用.代替。如果你選擇這個選項,那么IP和TCP包頭的選項會仍然使用hex表示。
存儲空間: 比直接存儲二進制數據稍大。
搜索性: 非常便於二進制數據中搜索文本字符串。
可讀性: 很好。
detail: 設置你要保存多少細節數據,有如下選項:
full: 保存引起報警的數據包的所有細節,包括IP/TCP包頭和負載數據。
fast: 只記錄少量的數據。如果選擇這種記錄方式,不利於以后對數據的分析,但在某些情況下還有其用處。使用這種方式,將記錄數據包的以下域:時間戳(timestamp)、簽名(signature)、源地址、目的地址、源端口、目的端口、TCP標志和協議。
還需要定義日志方法和數據庫類型。有兩種日志方法:log和alert。如果使用log,snort就會調用log輸出,將日志數據記錄到數據庫;如果設置為alert,snort就會調用alert輸出,在數據庫中記錄報警信息。
當前版本中,snort可以使用四種數據庫:MySQL、PostgreSQL、Oracle以及和unixODBC兼容的數據庫。可以使用你喜歡的數據庫。
格式:
database:,<數據庫類型>,<參數表>
例子:
output database:log,mysql,dbname=snort user=snort host=localhost password=xyz
表33.數據庫輸出插件配置
6.如何建立好的snort規則
在開發高效、高速的snort規則時,有幾個概念要銘記於心。
關鍵詞content指定的內容是大小寫敏感的,除非你使用nocase選項
不要忘記content規則選項指定的內容是大小寫敏感的,許多程序一般使用大寫表示命令。FTP就是一個很好的例子。請比較下面兩條規則:
alert tcp any any -> 192.168.1.0/24 21 (content:"user root";msg:"FTP root login";)
alert tcp any any -> 192.168.1.0/24 21 (content:"USER root";msg:"FTP root login";)
第二條規則可以使snort捕獲大多數使用root用戶名的自動登錄企圖,而在數據包中從來就沒有小寫的user。
提高snort對含有content規則選項的規則的檢測速度
snort檢測引擎對各個規則選項的測試順序與其在各條規則中所處的位置無關。在各個規則選項中,檢測引擎最后測試的總是content規則選項。因
此,在開發規則時,要盡量使用快速的選項篩選掉根本不必對其內容進行檢查的包。例如,如果實現了一個TCP會話過程,那么在會話過程的大部分時間內,雙方
傳輸的數據包的TCP標志ACK、PSH都被置位。而測試包頭的TCP標志比對數據包的內容進行模式匹配需要的計算量要小的多。所以,在開發相關的檢測規
則時,需要設置flags規則選項對PSH和ACK沒有置位的數據包進行過濾。而這樣做,增加的額外計算量微乎其微。例如:
alert tcp any any -> 192.168.1.0/24 80 (content:"cgi-bin/phf";flags:PA;msg:"CGI-PHF probe";)
--------------------------------------------
Snort 規則編寫
I 總體結構分析:
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)
分析:
多行之間用 / 分開
規則包括:規則頭rule header: alert tcp any any -> 192.168.1.0/24 111 和規則選項 rule options:(content:"|00 01 86 a5|"; msg: "mountd access";)
II 規則頭:3個要素: who , where, what,how(行動)
2.1 規則動作 rule action。告訴snort一旦匹配干什么事,原來的snort共5種:alert, log,pass,activate,dynamic
(alert:警報並且記錄; log:記錄; pass::丟棄(忽略); activate:報警並且激活另外一條dynamic規則;dynamic:被激活后log,也可自己自定義,參考manual)
******************************************
以下是2.9版本的mannal中新添加的action:
1. alert - generate an alert using the selected alert method, and then log the packet
2. log - log the packet
3. pass - ignore the packet
4. activate - alert and then turn on another dynamic rule
5. dynamic - remain idle until activated by an activate rule , then act as a log rule
6. drop - block and log the packet
7. reject - block the packet, log it, and then send a TCP reset if the protocol is TCP or an ICMP port unreachable
message if the protocol is UDP.
8. sdrop - block the packet but do not log it.
******************************************
2.2 協議。snort當前可分析的協議包有:tcp,udp,ip,icmp。
2.3 ip地址。ip地址可以用any定義任何地址,並且需要添加掩碼(16-B類,24-C類,32-特定的機器),並且可以使用!操作符。如果ip地址是個列表,需要[192.168.1.0/24,10.1.1.0/24]類似,使用[],中間用逗號隔開,如果要加!,要加到[]外部。
2.4 端口號。any表示全部,如果表示范圍,eg:1:1024,中間用冒號隔開。但是:200也可,表示小於等於200的,反之:1024:表示大於等於1024的。當然也可以類似ip地址使用!否定操作符。
2.5 方向操作符。規則所施加的流的方向. 單向,從源到目的 ->; 雙向,既是源又是目標<>.
III 規則選項:nids的核心,所有選項用“;”隔開,規則選項關鍵字和他們的參數用“:”分開,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 - 數字模式測試和偏移量調整
*****************************************
在2.9的mannal中把它們分為了4類:
*******************************************
general :These options provide information about the rule but do not have any affect during detection
對檢測無影響
payload :These options all look for data inside the packet payload and can be inter-related
需要深入到包中的數據。
non-payload: These options look for non-payload data
不需要包數據。
post-detection :These options are rule specific triggers that happen after a rule has “fired.”
觸發器,只有當一個規則觸發后才發生。
*******************************************
在對各種分類介紹之前,我觀察了rules下面的系統原有的rules,發現在規則選項中如下幾項用的十分多:(尤其是前8項)
1 msg:
2 content
3 nocase
4 flow
5 reference
6 classtype
7 sid
8 rev
9 icmp_id
10 icmp_seq
11 itype
12 offset
13 depth
給出幾個常見的eg:(從snort發布的rule中摘錄)
***********************************
1 alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP PING NMAP"; dsize:0; itype:8; reference:arachnids,162; classtype:attempted-recon; sid:469; rev:3;
2 # These rules look for specific Agobot/PhatBot commands on an IRC session
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"COMMUNITY BOT Agobot/PhatBot bot.about command"; flow: established; flowbits:isset,community_is_proto_irc; content:"bot.about"; classtype: trojan-activity; sid:100000242; rev:2;
***********************************
下面把以上常用的進行分類着重介紹(這個分類是2.9版manual中分類,這樣能更清晰地給出規則選型的使用環境)
A : general有那些:
1 msg: alert和log的同時,同時print的東西
2 reference: 允許規則包含外面的攻擊系統: arachnids(一個攻擊特征數據庫),cve(這個不用說了吧),bugtraq(一個完整的對計算機安全漏洞(它們是什么,如何利用它們,以及如何修補它們)的公告及詳細論述進行適度披露的郵件列表)等.
3 sid:規則的唯一序列 (<100保留,100~999999為snrot發布用,>=1000,000本地用),允許輸出插件容易識別規則的ID好,常和rev一起使用。rev:用來標記規則修改,按照我的理解,就是當前規則改了一次,rev就記錄這個次數。
4 classtype:這個選項把alert分為不同的攻擊類。通過使用這個關鍵字和優先級,用戶可以指定每個類型需要的優先級。比如上文的classtype為trojan-activity就屬於high類別。
總體描述:
**********************************
msg
The msg keyword tells the logging and alerting engine the message to print with
the packet dump or alert.
reference
The reference keyword allows rules to include references to external attack identification
systems.
gid
The gid keyword (generator id) is used to identify what part of Snort generates the
event when a particular rule fires.
sid
The sid keyword is used to uniquely identify Snort rules.
rev
The rev keyword is used to uniquely identify revisions of Snort rules.
classtype
The classtype keyword is used to categorize a rule as detecting an attack that is
part of a more general type of attack class.
priority
The priority keyword assigns a severity level to rules.
metadata
The metadata keyword allows a rule writer to embed additional information about
the rule, typically in a key-value format.
**********************************
B:payload類型
1 content:最重要的rule option之一。它允許用戶設置規則在包的凈荷中搜索指定的內容並根據內容觸發響應。當進行content選項模式匹配時, Boyer-Moore模式匹配函數被調用,並且對包的內容進行檢查(很花費計算能力)。如果包的凈荷中包含的數據確切地匹配了參數的內容,這個檢查成功並且該規則選項的其他部分被執行。注意這個檢查是大小寫敏感的。
Content關鍵字的選項數據比較復雜;它可以包含混合的文本和二進制數據。二進制數據一般包含在管道符號中("|"),表示為字節碼 (bytecode)。字節碼把二進制數據表示為16進制數字,是描述復雜二進制數據的好方法。下面是包含了一個混合數據的snort規則范例
eg: 1) content:"/bin/sh";
2)content:"|90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90|";
3) content:"name=|22 CC CC CC CC CC|"; 來自web-php.rules.
2 nocase: 用於取消content中的大小寫敏感
3 depth:depth也是一個content規則選項修飾符。它設置了內容模式匹配函數從他搜索的區域的起始位置搜索的最大深度。它對於限制模式匹配函數超出 搜索區域指定范圍而造成無效搜索很有用。(也就是說,如果你在一個web包中搜索"cgi-bin/phf",你可能不需要浪費時間搜索超過凈荷的頭20 個字節)。eg: content:"NICK "; nocase; offset: 0; depth: 5; (來自community-bot.rules)
4 offset: offset規則選項被用作使用content規則選項關鍵字的規則的修飾符。這個關鍵字修飾符指定模式匹配函數從包凈荷開始處開始搜索的偏移量。 它對於cgi掃描檢測規則很有用,cgi掃描的內容搜索字符串不會在凈荷的前4個字節中出現。小心不要把這個偏移量設置的太嚴格了,會有可能漏掉攻擊!這 個規則選項關鍵字必須和content規則選項一起使用。
其它的payload類型的規則選項:
**********************************
part1: content及其修飾符
Modifier Section
nocase 3.5.2
rawbytes 3.5.3
depth 3.5.4
offset 3.5.5
http_client_body 3.5.8
http_cookie 3.5.9
http_raw cookie 3.5.10
http_header 3.5.11
http_raw_header 3.5.12
http_method 3.5.13
http_uri 3.5.14
http_raw uri 3.5.15
http_stat code 3.5.16
http_stat msg 3.5.17
fast_pattern 3.5.19
distance
The distance keyword allows the rule writer to specify how far into a packet Snort should ignore before
starting to search for the specified pattern relative to the end of the previous pattern match.
within
The within keyword is a content modifier that makes sure that at most N bytes are between pattern
matches using the content keyword.
part2: 其它的:
uricontent
The uricontent keyword in the Snort rule language searches the normalized request URI field.
isdataat
The isdataat keyword verifies that the payload has data at a specified location.
pcre
The pcre keyword allows rules to be written using perl compatible regular expressions.
byte_test
The byte test keyword tests a byte field against a specific value (with operator).
byte_jump
The byte jump keyword allows rules to read the length of a portion of data, then skip that far forward
in the packet.
ftpbounce
The ftpbounce keyword detects FTP bounce attacks.
asn1
The asn1 detection plugin decodes a packet or a portion of a packet, and looks for various malicious
encodings.
cvs
The cvs keyword detects invalid entry strings.
dce_iface
See the DCE/RPC 2 Preprocessor section 2.2.13.
dce_opnum
See the DCE/RPC 2 Preprocessor section 2.2.13.
dce_stub_data
See the DCE/RPC 2 Preprocessor section 2.2.13.
**********************************
C: non-payload類型:
1 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;)
2 Icmp_id
Icmp_id選項檢查ICMP ECHO數據包中ICMP ID數值是否是指定值。許多秘密通道(covert channel)程序使用靜態ICMP字段通訊,所以該選項在檢查這種流量時非常有用。這個特別的插件用於增強由Max Vision編寫的stacheldraht探測規則,但是在探測一些潛在攻擊時確實有效。
3 Icmp_seq
Icmp_seq選項檢查ICMP ECHO數據包中ICMP sequence字段數值是否是指定值。許多秘密通道(covert channel)程序使用靜態ICMP字段通訊,所以該選項在檢查這種流量時非常有用。這個特別的插件用於增強由Max Vision編寫的stacheldraht探測規則,但是在探測一些潛在攻擊時確實有效。(我知道該字段的信息和icmp_id的描述幾乎完全相同,實際上它們就是同樣的東西!)
其它:
*************************************
fragoffset
The fragoffset keyword allows one to compare the IP fragment offset field against a decimal value.
ttl
The ttl keyword is used to check the IP time-to-live value.
tos
The tos keyword is used to check the IP TOS field for a specific value.
id
The id keyword is used to check the IP ID field for a specific value.
ipopts
The ipopts keyword is used to check if a specific IP option is present.
fragbits
The fragbits keyword is used to check if fragmentation and reserved bits are set in the IP header.
dsize The dsize keyword is used to test the packet payload size.
flags
The flags keyword is used to check if specific TCP flag bits are present.
flow
The flow keyword allows rules to only apply to certain directions of the traffic flow.
flowbits
The flowbits keyword allows rules to track states during a transport protocol session.
seq
The seq keyword is used to check for a specific TCP sequence number.
ack
The ack keyword is used to check for a specific TCP acknowledge number.
window
The window keyword is used to check for a specific TCP window size.
itype
The itype keyword is used to check for a specific ICMP type value.
icode
The icode keyword is used to check for a specific ICMP code value.
icmp_id
The icmp id keyword is used to check for a specific ICMP ID value.
icmp_seq
The icmp seq keyword is used to check for a specific ICMP sequence value.
rpc
The rpc keyword is used to check for a RPC application, version, and procedure numbers in SUNRPC
CALL requests.
ip_proto
The ip_proto keyword allows checks against the IP protocol header.
sameip
The sameip keyword allows rules to check if the source ip is the same as the destination IP.
*****************************************
D: post-Detection 規則選項:
logto
The logto keyword tells Snort to log all packets that trigger this rule to a special output log file.
session
The session keyword is built to extract user data from TCP Sessions.
resp
The resp keyword is used attempt to close sessions when an alert is triggered.
react
This keyword implements an ability for users to react to traffic that matches a Snort rule by closing
connection and sending a notice.
tag
The tag keyword allow rules to log more than just the single packet that triggered the rule.
activates
This keyword allows the rule writer to specify a rule to add when a specific network event occurs.
activated_by
This keyword allows the rule writer to dynamically enable a rule when a specific activate rule is
triggered.
count
This keyword must be used in combination with the activated by keyword. It allows the rule writer
to specify how many packets to leave the rule enabled for after it is activated.
replace Replace the prior matching content with the given string of the same length. Available in inline mode
only.
detection filter Track by source or destination IP address and if the rule otherwise matches more than the configured rete it will fire.
IV 規則臨界值:不被推薦,在以后的版本中被替代。
Rule thresholds are deprecated and will not be supported in a future release. Use detection filters (3.7.10) within rules, or
event filters (2.4.2) as standalone configurations instead.
eg:
alert tcp $external_net any -> $http_servers $http_ports /
(msg:"web-misc robots.txt access"; flow:to_server, established; /
uricontent:"/robots.txt"; nocase; reference:nessus,10302; /
classtype:web-application-activity; threshold:type limit, track /
by_src, count 1 , seconds 60; sid:1000852; rev:1;)
******************
type limit|threshold|both
type limit alerts on the 1st m events during the time interval, then ignores events
for the rest of the time interval. Type threshold alerts every m times we see
this event during the time interval. Type both alerts once per time interval after
seeing m occurrences of the event, then ignores any additional events during the
time interval.
track by src|by dst
rate is tracked either by source IP address, or destination IP address. This means
count is maintained for each unique source IP addresses, or for each unique destination
IP addresses. Ports or anything else are not tracked.
count c
number of rule matching in s seconds that will cause event filter limit to be
exceeded. c must be nonzero value.
seconds s
time period over which count is accrued. s must be nonzero value.
************************
V: 如何寫出好的規則(來自manual2.9)
1 Content_matching :
如果可能,至少在你的規則中包含一次Content
If at all possible, try and have at least one content (or uricontent)
rule option in your rule.
2 Catch the Vulnerability, Not the Exploit
針對漏洞本身寫rule,而不是利用代碼
Try to write rules that target the vulnerability, instead of a specific exploit.
For example, look for a the vulnerable command with an argument that is too large, instead of shellcode that binds a shell.
By writing rules for the vulnerability, the rule is less vulnerable to evasion when an attacker changes the exploit slightly.
3 Catch the Oddities of the Protocol in the Rule
抓住協議中奇特的部分
以FTP協議為例:
Many services typically send the commands in upper case letters. FTP is a good example. In FTP, to send the username, the client sends:
user username_here
A simple rule to look for FTP root login attempts could be:
alert tcp any any -> any any 21 (content:"user root";)
4 Optimizing Rules 優化規則(摘自2.9 manual)
The content matching portion of the detection engine has recursion to handle a few evasion cases. Rules that are not properly written can cause Snort to waste time duplicating checks.
The way the recursion works now is if a pattern matches, and if any of the detection options after that pattern fail, then look for the pattern again after where it was found the previous time. Repeat until the pattern is not found again or the opt functions all succeed.
On first read, that may not sound like a smart idea, but it is needed. For example, take the following rule:
alert ip any any -> any any (content:"a"; content:"b"; within:1;) (邏輯關系不對,影響判斷)
This rule would look for “a”, immediately followed by “b”. Without recursion, the payload “aab” would fail, even though it is obvious that the
payload “aab” has “a” immediately followed by “b”, because the first ”a” is not immediately followed by “b”.
While recursion is important for detection, the recursion implementation is not very smart.
For example, the following rule options are not optimized:
content:"|13|"; dsize:1; (位置先后很重要)
By looking at this rule snippit, it is obvious the rule looks for a packet with a single byte of 0x13. However, because of recursion, a packet with
1024 bytes of 0x13 could cause 1023 too many pattern match attempts and 1023 too many dsize checks. Why? The content 0x13 would be found
in the first byte, then the dsize option would fail, and because of recursion, the content 0x13 would be found again starting after where the previous
0x13 was found, once it is found, then check the dsize again, repeating until 0x13 is not found in the payload again.
Reordering the rule options so that discrete checks (such as dsize) are moved to the beginning of the rule speed up Snort.
The optimized rule snipping would be:
dsize:1; content:"|13|";
A packet of 1024 bytes of 0x13 would fail immediately, as the dsize check is the first option checked and dsize is a discrete check without recursion.
The following rule options are discrete and should generally be placed at the beginning of any rule:(下列rule option是離散的,應該放在任何rule的前面)
• dsize
• flags
• flow
• fragbits
• icmp id
• icmp seq
• icode
• id
• ipopts
• ip proto
• itype
• seq
• session
• tos
• ttl
• ack
• window
• resp
• sameip
5 Testing Numerical Values
snort manual 2.9 180-182頁,很好的一個解決方案。
======================= End