規(guī)則格式
特征/簽名在suricata中起著非常重要的作用。在大多數(shù)情況下,人們使用現(xiàn)有的規(guī)則集。
Suricata-Update規(guī)則管理中描述了安裝規(guī)則集的正式方法已卷。
Suricata規(guī)則文檔解釋了所有關(guān)于特征/簽名的內(nèi)容。
規(guī)則/簽名由以下內(nèi)容組成:
action:確定特征/簽名匹配時會發(fā)生什么(圖1紅色字體)
header:定義協(xié)議淳蔼、IP地址侧蘸、端口和規(guī)則的方向(圖1綠色字體)
rule options:定義規(guī)則的細(xì)節(jié)(圖1藍(lán)色字體)
(備注:紅色字體是Action,綠色字體是header鹉梨,藍(lán)色字體是rule options.)
在這篇文章中讳癌,我們將使用上面的簽名/規(guī)則作為示例,突出顯示簽名的不同部分存皂。它是從新興威脅數(shù)據(jù)庫(EmergingThreats)中提取的簽名析桥,這是一個開放的數(shù)據(jù)庫,具有許多規(guī)則艰垂,您可以免費下載并在Suricata實例中使用。
1.Action
動作順序埋虹,默認(rèn)順序為:pass猜憎,drop,reject搔课,alert
所有簽名/規(guī)則都有不同的屬性胰柑。其中之一是Action屬性。它決定了簽名/規(guī)則匹配時會發(fā)生什么。有四種類型的動作柬讨,當(dāng)簽名匹配并包含其中一個操作時將發(fā)生什么動作崩瓤。
(1.1)pass
如果簽名匹配并包含pass, Suricata將停止掃描數(shù)據(jù)包并跳到所有規(guī)則的末尾(僅針對當(dāng)前數(shù)據(jù)包)。
(1.2)Drop
這只涉及IPS/內(nèi)聯(lián)模式踩官。如果程序發(fā)現(xiàn)匹配的簽名(包含drop)却桶,它將立即停止。這個數(shù)據(jù)包不會再發(fā)送出去了蔗牡。缺點:接收方?jīng)]有接收到有關(guān)正在進(jìn)行的操作的消息颖系,從而導(dǎo)致時間延遲(使用TCP)。Suricata會為此數(shù)據(jù)包生成警報辩越。
(1.3)Reject
這是對數(shù)據(jù)包的主動拒絕嘁扼。接收方和發(fā)送方都接收到一個拒絕包。當(dāng)匹配該規(guī)則時黔攒,自動選擇兩種類型的拒絕包:
(1.3.1)如果匹配規(guī)則并包含reject的數(shù)據(jù)包與TCP有關(guān)趁啸,它將是一個重置包(Reset-packet)。
(1.3.2)對于所有其他協(xié)議督惰,它將是ICMP錯誤數(shù)據(jù)包不傅。
Suricata還會生成警報。在Inline / IPS模式下姑丑,違規(guī)數(shù)據(jù)包也會像“drop”操作一樣被丟棄蛤签。
(1.5)Alert
如果簽名匹配并包含警報,則包將被視為與任何其他非威脅包一樣栅哀,除此之外震肮,Suricata將生成一個警報。只有系統(tǒng)管理員才能注意到此警告alert留拾。
Inline / IPS可以通過兩種方式阻止網(wǎng)絡(luò)流量戳晌。一種方法是drop?,另一種方式是reject痴柔。
規(guī)則將按照它們在文件中出現(xiàn)的順序加載沦偎。但它們將以不同的順序處理。簽名有不同的優(yōu)先級扔字,最重要的簽名首先被掃描。優(yōu)先次序可以改變。默認(rèn)順序是: pass儡率、drop勒葱、reject、alert荒椭。這意味著在丟棄(drop)規(guī)則之前考慮傳遞(pass?)規(guī)則隔缀,在拒絕(reject)規(guī)則之前考慮丟棄(drop)規(guī)則等等咐低。
2.header
(2.1)協(xié)議
簽名/規(guī)則中的這個關(guān)鍵字告訴Suricata它所關(guān)注的協(xié)議是什么×缮纾可以在四種基本協(xié)議中進(jìn)行選擇
tcp (for tcp-traffic)
udp
icmp
ip (ip stands for ‘a(chǎn)ll’ or ‘a(chǎn)ny’)
同時也支持應(yīng)用層協(xié)議,可以從中選擇的第7層協(xié)議守伸。如下:
http绎秒、ftp、tls (包括ssl)尼摹、smb见芹、dns剂娄、dcerpc、ssh玄呛、smtp阅懦、imap、msn徘铝、modbus (默認(rèn)禁用)耳胎、dnp3 (默認(rèn)禁用)、enip (默認(rèn)禁用)惕它、nfs (depends on rust availability)怕午、ikev2 depends on rust availability)、krb5 (depends on rust availability)淹魄、ntp (depends on rust availability)郁惜、dhcp (depends on rust availability)。
這些協(xié)議的可用性取決于是否在配置文件suricata.yaml中啟用了該協(xié)議揭北。如果您有一個簽名扳炬,例如一個http協(xié)議,Suricata確保簽名只有在涉及http通信時才能匹配搔体。
(2.2)源和目標(biāo)地址(IP)
使用源和目標(biāo)恨樟,分別指定流量的來源和流量的目標(biāo)。您可以分配IP地址(支持IPv4和IPv6)和IP范圍疚俱。這些可以與運營商結(jié)合劝术。如圖1所示:第一個強調(diào)部分是源,第二個是目的地(注意方向箭頭的方向)呆奕。
drop tcp?$HOME_NET?any ->?$EXTERNAL_NET?any (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”; flow:established,to_server; flowbits:isset,is_proto_irc; content:”NICK “; pcre:”/NICK .*USA.*[0-9]{3,}/i”; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)
通常养晋,可以使用變量,例如$HOME_NET和?$EXTERNAL_NET梁钾。配置文件指定了這些關(guān)注的IP地址绳泉,這些設(shè)置將用于代替規(guī)則中的變量。
示例:
(2.3)源和目標(biāo)端口
流量通過端口流入和流出姆泻。不同的端口具有不同的端口號零酪。例如,HTTP的默認(rèn)端口是80拇勃,而443通常是HTTPS的端口四苇。但請注意,端口不指示通信中使用的協(xié)議方咆。相反月腋,它確定哪個應(yīng)用程序正在接收數(shù)據(jù)。
上面提到的端口通常是目標(biāo)端口。源端口榆骚,即發(fā)送數(shù)據(jù)包的應(yīng)用程序片拍,通常由操作系統(tǒng)分配一個隨機(jī)端口。在為自己的HTTP服務(wù)編寫規(guī)則時妓肢,通常會編寫any?->?80穆碎,這意味著從任何源端口到HTTP應(yīng)用程序(在端口80上運行)的任何數(shù)據(jù)包都是匹配的。在設(shè)置端口時职恳,您也可以使用特殊操作符,如下:
示例:
(2.4)方向
方向告訴簽名/規(guī)則必須匹配的方式方面。幾乎每個簽名都有一個向右箭頭(->)放钦,意味著只有具有相同方向的數(shù)據(jù)包才能匹配。但是恭金,也可以使規(guī)則匹配兩個方式(<>):
source->destination
source<>destination(both? directions)
但是沒有<-這種風(fēng)格操禀。
以下示例說明了這一點。比如横腿,有一個IP地址為1.2.3.4和端口1024的客戶端颓屑,以及一個IP地址為5.6.7.8的服務(wù)器,監(jiān)聽端口80(通常是HTTP)耿焊【镜耄客戶端向服務(wù)器發(fā)送消息,服務(wù)器回復(fù)其答案罗侯。
使用規(guī)則:alert tcp 1.2.3.4 1024 -> 5.6.7.8? 80器腋。此規(guī)則僅僅匹配第一個數(shù)據(jù)包,因為方向指定在響應(yīng)包上不匹配钩杰。
3.規(guī)則選項
規(guī)則的其余部分包括規(guī)則選項纫塌。它們用括號括起來并用分號分隔。某些選項具有設(shè)置功能(例如msg)讲弄,這些設(shè)置功能的選項由關(guān)鍵字指定措左,關(guān)鍵字后面跟冒號,冒號后跟設(shè)置的內(nèi)容避除。其他選項沒有設(shè)置功能怎披,只有簡單的關(guān)鍵字(例如nocase):
<keyword> : <settings>;
<keyword>;
規(guī)則選項具有特定的順序,更改其順序?qū)⒏淖円?guī)則的含義驹饺。
注意:字符 ; 和 " 在Suricata規(guī)則語言具有特殊含義钳枕,在規(guī)則選項值使用時必須轉(zhuǎn)義。使用轉(zhuǎn)義反斜杠赏壹,因為它充當(dāng)轉(zhuǎn)義字符例如:msg:" Message with semicolon\鱼炒; " ;
接下來在文檔中介紹各種關(guān)鍵字的使用,一些關(guān)鍵字詳情如下:
(3.1)修飾符關(guān)鍵字
一些關(guān)鍵字函數(shù)充當(dāng)修飾符蝌借。有兩種類型的修飾符昔瞧。
(3.1.1)舊式“content modifiers”風(fēng)格:
alert http any any->any any(content:"index.php";http_uri;sid:1;)
在上面的示例中指蚁,修改了模式'index.php'以檢查HTTP uri緩沖區(qū)。
(3.1.2)最近的類型稱為“sticky buffe”自晰。它首先放置緩沖區(qū)名稱凝化,然后將其后面的所有關(guān)鍵字應(yīng)用于該緩沖區(qū),例如:
alert http any any->any any(http_response_line;content:"403 Forbidden";sid:1;)
在上面的示例中酬荞,針對HTTP響應(yīng)行檢查模式“403 Forbidden”搓劫,因為它遵循h(huán)ttp_response_line關(guān)鍵字
(3.2)標(biāo)準(zhǔn)化緩沖區(qū)
一個數(shù)據(jù)包由原始數(shù)據(jù)組成。HTTP和重組會復(fù)制這些類型的數(shù)據(jù)包混巧。它們擦除異常內(nèi)容枪向,組合數(shù)據(jù)包等。剩下的是一個叫做“標(biāo)準(zhǔn)化緩沖區(qū)”:
因為數(shù)據(jù)正在規(guī)范化咧党,所以它不像過去那樣;?這是一種解釋.標(biāo)準(zhǔn)化緩沖區(qū)包括:所有HTTP關(guān)鍵字秘蛔,重組流,TLS-傍衡,SSL-深员,SSH-,F(xiàn)TP-和dcerpc-緩沖區(qū)蛙埂。
4.Meta 關(guān)鍵字
Meta?設(shè)置對Suricata的規(guī)則檢查沒有影響; 他們是Suricata上報的事件信息倦畅,對上報內(nèi)容有影響。
(4.1)msg (message)
關(guān)鍵字msg提供對觸發(fā)警報的有關(guān)簽名/規(guī)則相關(guān)文本提示信息绣的。格式如下:
msg:"some description";
實例:
msg: "ET EXPLOIT SMB-DS DCERPC PnP bind attempt ";
約定:(1)通常將簽名第一部分設(shè)為大寫顯示簽名的類滔迈。(2)通常在簽名中的第一個關(guān)鍵字為msg。
(4.2)SID(規(guī)則ID)
關(guān)鍵字sid為每個簽名提供自己的ID被辑。這個id用數(shù)字表示燎悍。sid的格式是:
sid:123;
通常,簽名sid是作為簽名的最后一個關(guān)鍵字(或者如果有rev的話盼理,則倒數(shù)第二個)提供的谈山。
(4.3)rev(修訂版)
sid關(guān)鍵字幾乎每次都伴隨著rev。Rev代表簽名的版本宏怔。如果修改了簽名奏路,則簽名編寫者將增加rev的數(shù)量。rev的格式是:
rev:123;:
sid寫在rev之前臊诊,這是一個慣例鸽粉,兩者都是最后一個關(guān)鍵字。
(4.4)gid(組ID)
gid關(guān)鍵字可用于為不同的簽名組提供另一個id值(如sid中)抓艳。Suricata默認(rèn)使用gid 1.可以修改它触机。它通常不會被改變,改變它沒有技術(shù)含義。您只能在警報中注意到它儡首。
示例: 在一個?fast.log文件中:
10/15/09-03:30:10.219671 [**] [1:2008124:2] ET TROJAN Likely Bot Nick in IRC (USA +..) [**] [Classification: A Network Trojan was Detected] [Priority: 3] {TCP} 192.168.1.42:1028 -> 72.184.196.31:6667
在[1:2008124:2]部分片任,1代表gid,2008124代表sid蔬胯;2代表rev
(4.5)分類
classtype關(guān)鍵字提供有關(guān)規(guī)則和警報分類的信息对供。它由短名稱,長名稱和優(yōu)先級組成氛濒。例如产场,它可以告訴規(guī)則是僅僅是信息性的還是關(guān)于黑客等。對于每個classtype舞竿,這個classification.config具有將在規(guī)則中使用的優(yōu)先級涝动。classtype定義如下:
config classification: web-application-attack,Web Application Attack,1
config classification: not-suspicious,NotSuspiciousTraffic,3
現(xiàn)在霸旗,當(dāng)我們在配置中定義了這個時,我們可以在規(guī)則中使用classtypes跟啤。具有classtype web-application-attack的規(guī)則將被賦予優(yōu)先級1个盆,并且警報將包含“Web Application Attack”:
(4.6)reference (參考)
可以找到參考關(guān)鍵字指向有關(guān)簽名的信息以及簽名試圖解決的問題的位置。參考關(guān)鍵字可以在簽名中多次出現(xiàn)拔创。此關(guān)鍵字適用于簽名編寫者和分析師,他們會調(diào)查簽名匹配的原因。它具有以下格式:
reference:type,reference
示例:reference: url,www.info.com? ? ?鼻吮、reference: cve,CVE-2014-1234
(4.7)priority(優(yōu)先級)
priority關(guān)鍵字帶有一個強制數(shù)字值,范圍從1到255.最常使用數(shù)字1到4较鼓。將首先檢查具有更高優(yōu)先級的簽名椎木。最高優(yōu)先級是1.通常,簽名已經(jīng)通過classtype具有優(yōu)先級博烂。這可以用關(guān)鍵字優(yōu)先級否決香椎。優(yōu)先格式為:
priority:1;
(4.8)metadata(元數(shù)據(jù))
metadata關(guān)鍵字允許將額外的非功能信息添加到簽名中。雖然格式是自由格式禽篱,但建議堅持使用鍵值對畜伐,因為Suricata可以在前夕警報中包含這些值。格式為:
metadata:keyvalue;
metadata:keyvalue,keyvalue;
(4.9)target(目標(biāo))
target關(guān)鍵字允許規(guī)則編寫者指定警報的哪一側(cè)是攻擊的目標(biāo)躺率。如果指定玛界,則會增強警報事件以包含有關(guān)源和目標(biāo)的信息。
格式為:
target:[src_ip|dest_ip]
如果值為src_ip悼吱,則生成的事件中的源IP(JSON中的src_ip字段)是攻擊的目標(biāo)慎框。如果target設(shè)置為dest_ip,則目標(biāo)是生成的事件中的目標(biāo)IP后添。
5.IP 關(guān)鍵字
5.1 ttl
ttl關(guān)鍵字用于檢查數(shù)據(jù)包標(biāo)頭中的特定IP生存時間值笨枯。
格式為:ttl:<number>.
在ttl關(guān)鍵字的末尾,您可以輸入要匹配的值。生存時間值確定數(shù)據(jù)包在Internet系統(tǒng)中的最長時間猎醇。如果此字段設(shè)置為0窥突,則必須銷毀數(shù)據(jù)包。生存時間基于跳數(shù)硫嘶。數(shù)據(jù)包通過的每個跳/路由器減去一個數(shù)據(jù)包TTL計數(shù)器阻问。此機(jī)制的目的是限制數(shù)據(jù)包的存在,以便數(shù)據(jù)包不會在無限路由循環(huán)中結(jié)束沦疾。
5.2?ipopts?
使用ipopts關(guān)鍵字称近,您可以檢查是否設(shè)置了特定的IP選項。Ipopts必須在規(guī)則的開頭使用哮塞。每條規(guī)則只能匹配一個選項刨秆。有幾個選項可以匹配。這些是:
5.3??sameip?
每個數(shù)據(jù)包都有一個源IP地址和一個目標(biāo)IP地址忆畅。源IP可以與目標(biāo)IP相同衡未。使用sameip關(guān)鍵字,您可以檢查源的IP地址是否與目標(biāo)的IP地址相同家凯。sameip關(guān)鍵字的格式為:sameip;
5.4?ip_proto?
使用ip_proto關(guān)鍵字缓醋,您可以匹配數(shù)據(jù)包標(biāo)頭中的IP協(xié)議。您可以使用協(xié)議的名稱或編號绊诲。例如送粱,您可以匹配以下協(xié)議:
5.5 ID?
使用id關(guān)鍵字,您可以匹配特定的IP ID值掂之。ID標(biāo)識主機(jī)發(fā)送的每個數(shù)據(jù)包抗俄,并且通常與正在發(fā)送的每個數(shù)據(jù)包一起遞增。IP ID用作片段標(biāo)識號世舰。每個數(shù)據(jù)包都有一個IP ID动雹,當(dāng)數(shù)據(jù)包被分段時,該數(shù)據(jù)包的所有片段都具有相同的ID跟压。以這種方式洽胶,分組的接收器知道哪些片段屬于同一分組。(IP ID不處理順序裆馒,在這種情況下使用偏移姊氓。它闡明了片段的順序。)
id:<number>;
5.6 geoip
geoip關(guān)鍵字使您(您)能夠匹配網(wǎng)絡(luò)流量的源喷好,目標(biāo)或源和目標(biāo)IP地址翔横,并查看它所屬的國家/地區(qū)。為了能夠做到這一點梗搅,Suricata使用Maxmind的GeoIP API禾唁。
geoip的語法:
因此效览,您可以看到您可以使用以下內(nèi)容來明確您希望匹配的方向:
該關(guān)鍵字僅支持IPv4。因為它使用Maxmind的GeoIP API荡短,所以必須編譯libgeoip丐枉。
5.7?fragbits (IP碎片)
使用fragbits關(guān)鍵字,可以檢查IP頭中是否設(shè)置了分段和保留位掘托。fragbits關(guān)鍵字應(yīng)放在規(guī)則的開頭瘦锹。Fragbits用于修改碎片機(jī)制。在將消息從一個Internet模塊路由到另一個Internet模塊期間闪盔,可能發(fā)生分組大于網(wǎng)絡(luò)可以處理的最大分組大小弯院。在這種情況下,可以分段發(fā)送數(shù)據(jù)包泪掀。數(shù)據(jù)包大小的最大值稱為最大傳輸單位(MTU)听绳。您可以匹配以下位:
可以使用以下修飾符更多地指定匹配此位:
格式:fragbits:[*+!]<[MDR]>;
5.8?fragoffset?
使用fragoffset關(guān)鍵字,您可以匹配IP片段偏移字段的特定十進(jìn)制值异赫。如果要檢查會話的第一個片段椅挣,則必須將fragoffset 0與More Fragment選項組合在一起。碎片偏移字段便于重組塔拳。id用于確定哪些片段屬于哪個分組鼠证,并且片段偏移字段闡明片段的順序。您可以使用以下修飾符:
fragoffset的格式:
????????????????fragoffset:[!|<|>]<number>;
5.9?TOS?
tos關(guān)鍵字可以匹配IP頭TOS字段的特定十進(jìn)制值蝙斜。tos關(guān)鍵字的值可以是0到255,IP頭的這個字段已由rfc2474更新澎胡,?以包含差異化服務(wù)的功能?孕荠。格式:
tos:[!]<number>;
6.TCP 關(guān)鍵字
6.1 SEQ?
可以在簽名中使用seq關(guān)鍵字來檢查特定的TCP序列號。序列號是TCP連接的兩個端點實際上隨機(jī)生成的數(shù)字攻谁≈晌椋客戶端和服務(wù)器都創(chuàng)建一個序列號,它隨著它們發(fā)送的每個字節(jié)的增加而增加戚宦。所以這個序列號對于雙方都是不同的个曙。該序列號必須由連接的雙方確認(rèn)。通過序列號受楼,TCP處理確認(rèn)垦搬,命令和重傳。它的數(shù)量隨著發(fā)送方發(fā)送的每個數(shù)據(jù)字節(jié)而增加艳汽。seq有助于跟蹤字節(jié)所屬的數(shù)據(jù)流中的位置猴贰。如果SYN標(biāo)志設(shè)置為1,則數(shù)據(jù)的第一個字節(jié)的序列號是該數(shù)字加1(因此河狐,2)米绕。
6.2 ACK
ack是對TCP連接另一端發(fā)送的所有先前(數(shù)據(jù))字節(jié)的接收的確認(rèn)瑟捣。在大多數(shù)情況下,TCP連接的每個數(shù)據(jù)包在第一個SYN之后都有一個ACK標(biāo)志栅干,而ack-number隨著每個新數(shù)據(jù)字節(jié)的接收而增加迈套。可以在簽名中使用ack關(guān)鍵字來檢查特定的TCP確認(rèn)號碱鳞。
6.3?window(窗口)
window關(guān)鍵字用于檢查特定的TCP窗口大小桑李。TCP窗口大小是一種控制數(shù)據(jù)流的機(jī)制。窗口由接收器設(shè)置(接收器通告的窗口大薪袤稀)芙扎,并指示可以接收的字節(jié)數(shù)。在發(fā)送方可以發(fā)送相同數(shù)量的新數(shù)據(jù)之前填大,接收方必須首先確認(rèn)此數(shù)據(jù)量戒洼。該機(jī)制用于防止接收器被數(shù)據(jù)溢出。窗口大小的值是有限的允华,可以是2到65.535字節(jié)圈浇。要更多地利用帶寬,您可以使用更大的TCP窗口靴寂。window關(guān)鍵字的格式:
window:[!]<number>;
7.ICMP 關(guān)鍵字
ICMP(Internet控制消息協(xié)議)是IP的一部分磷蜀。在提供數(shù)據(jù)(數(shù)據(jù)報)方面,IP本身并不可靠百炬。ICMP在出現(xiàn)問題時提供反饋褐隆。它不會阻止問題的發(fā)生,但有助于理解出錯的地方和地點剖踊。如果需要可靠性庶弃,使用IP的協(xié)議必須自己處理可靠性。在不同的情況下德澈,將發(fā)送ICMP消息歇攻。例如,當(dāng)目的地不可達(dá)時梆造,如果沒有足夠的緩沖容量來轉(zhuǎn)發(fā)數(shù)據(jù)缴守,或者當(dāng)數(shù)據(jù)報不應(yīng)該被分段時,等等镇辉÷潘耄可以在包含消息類型的列表中找到更多內(nèi)容。ICMP消息有四個重要內(nèi)容忽肛,可以與相應(yīng)的ICMP關(guān)鍵字匹配鸡捐。它們是:消息的類型,代碼麻裁,id和序列箍镜。
7.1? ITYPE?
itype關(guān)鍵字用于匹配特定的ICMP類型(數(shù)字)源祈。ICMP有幾種消息,并使用代碼來澄清這些消息色迂。不同的消息由不同的名稱區(qū)分香缺,但更重要的是數(shù)值。有關(guān)更多信息歇僧,請參閱包含消息類型和代碼的表图张。
itype關(guān)鍵字的格式:
????????itype:min<>max;
????????itype:[<|>]<number>;
如查找大于10的ICMP類型:
itype:>10
以下列出了ICMP類型
7.2?ICODE
使用icode關(guān)鍵字,您可以匹配特定的ICMP代碼诈悍。ICMP消息的代碼闡明了該消息祸轮。與ICMP類型一起,它表明您正在處理什么樣的問題侥钳。代碼與每種ICMP類型具有不同的用途适袜。icode關(guān)鍵字的格式:
icode:min<>max;
icode:[<|>]<number>;
示例:此示例查找大于5的ICMP代碼:icode:>5;
以下列出了所有ICMP類型的含義。如果未列出代碼舷夺,則僅在上表中定義類型0并具有ICMP代碼的含義苦酱。最新的表格可以在IANA的網(wǎng)站上找到
7.3 icmp_id
使用icmp_id關(guān)鍵字,您可以匹配特定的ICMP id值给猾。每個ICMP數(shù)據(jù)包在發(fā)送時都會獲得一個id疫萤。在接收方收到數(shù)據(jù)包時,它將使用相同的ID發(fā)送回復(fù)敢伸,以便發(fā)送方識別它并將其與正確的ICMP請求連接扯饶。icmp_id關(guān)鍵字的格式:
????????icmp_id:<number>;?
7.4?icmp_seq?
您可以使用icmp_seq關(guān)鍵字檢查ICMP序列號。ICMP消息都有序列號池颈。這可以用于(與id一起)用于檢查哪個回復(fù)消息屬于哪個請求消息.icmp_seq關(guān)鍵字的格式:
icmp_seq:<number>;
8.Payload關(guān)鍵字
Payload關(guān)鍵字檢查數(shù)據(jù)包或流的有效負(fù)載的內(nèi)容尾序。
8.1 content(內(nèi)容)
content關(guān)鍵字在簽名中非常重要。在引號之間饶辙,您可以寫下您希望簽名匹配的內(nèi)容蹲诀。最簡單的內(nèi)容格式是:
content: ”............”;
可以在簽名中使用多個內(nèi)容斑粱。內(nèi)容匹配字節(jié)弃揽。一個字節(jié)有256個不同的值(0-255)。你可以匹配所有角色;?從a到z则北,大寫和小寫以及所有特殊標(biāo)志矿微。但并非所有字節(jié)都是可打印字符。對于這些字節(jié)尚揣,使用十六進(jìn)制表示法涌矢。許多編程語言使用0x00作為表示法,其中0x表示它涉及二進(jìn)制值快骗,但規(guī)則語言?|00|用作表示法娜庇。這種表示法也可用于可打印字符塔次。如:
您無法在內(nèi)容中使用的字符因為它們在簽名中已經(jīng)很重要。要匹配這些字符名秀,您應(yīng)該使用十六進(jìn)制表示法励负。這些是:
將大寫符號寫成大寫字符是一種慣例
要http://在簽名的內(nèi)容中編寫,您應(yīng)該這樣寫:如果在簽名中使用十六進(jìn)制表示法匕得,請確保始終將其放在管道之間继榆。否則,表示法將作為內(nèi)容的一部分汁掠。content:?“http|3A|//”;幾個例子:
可以讓簽名檢查整個有效載荷以與內(nèi)容匹配略吨,或者讓它檢查有效載荷的特定部分。如果您沒有為簽名添加任何特殊內(nèi)容考阱,它將嘗試在有效內(nèi)容的所有字節(jié)中找到匹配項翠忠。默認(rèn)情況下,模式匹配區(qū)分大小寫羔砾。內(nèi)容必須準(zhǔn)確负间,否則不會匹配。
舉例:
content:!”Firefox/3.6.13”;姜凄。這意味著如果使用的Firefox版本不是3.6.13政溃,則會生成警報。
8.2?nocase(不關(guān)心大小寫)
如果您不想?yún)^(qū)分大寫和小寫字符态秧,可以使用nocase董虱。關(guān)鍵字nocase是內(nèi)容修飾符.此關(guān)鍵字的格式為:nocase;您必須將其放在要修改的內(nèi)容之后,例如:
content: “abc”; nocase;它對簽名中的其他內(nèi)容沒有影響申鱼。
8.3?depth(深度)
depth關(guān)鍵字是絕對內(nèi)容修飾符愤诱。它來自內(nèi)容。深度內(nèi)容修飾符帶有必需的數(shù)值捐友,如:depth:12;深度后的數(shù)字表示將檢查有效負(fù)載開頭的字節(jié)數(shù)淫半。
8.4?startswith
該startswith關(guān)鍵字類似depth。它不需要參數(shù)匣砖,必須遵循content關(guān)鍵字科吭。它修改了content在緩沖區(qū)的開頭準(zhǔn)確匹配。如:content:"GET|20|";startswith;
startswith?是一個簡寫符號:
content:"GET|20|";depth:4;offset:0;
startswith不能與被混合depth猴鲫,offset对人,within或?distance為相同的圖案。
8.5 offset?(偏移)
offset關(guān)鍵字指定將檢查有效負(fù)載中的哪個字節(jié)以查找匹配拂共。例如offset:3;?檢查第四個字節(jié)并進(jìn)一步牺弄。關(guān)鍵字偏移和深度可以組合并且通常一起使用。
如: content:“def”; offset:3; depth:3;
它將檢查從第三個字節(jié)到第六個字節(jié)的有效載荷宜狐。
8.6 (distance )距離
關(guān)鍵字distance是相對內(nèi)容修飾符势告。這意味著它表示此content?關(guān)鍵字與其前面的內(nèi)容之間的關(guān)系蛇捌。距離在前一次匹配后有影響。關(guān)鍵字distance帶有必填數(shù)值咱台。給出距離的值確定有效載荷中的字節(jié)豁陆,從中檢查相對于前一個匹配的匹配項。距離僅確定Suricata將開始尋找模式的位置吵护。所以盒音,distance:5;?表示模式可以是前一個匹配后的任何位置+5個字節(jié)。要限制Suricata最后一次匹配后的距離馅而,請使用“within”祥诽。
如:
距離也可以是負(fù)數(shù)。它可用于檢查部分相同內(nèi)容(參見示例)的匹配項瓮恭,或者甚至完全位于其之前的內(nèi)容雄坪。但這并不經(jīng)常使用。與其他關(guān)鍵字可以獲得相同的結(jié)果屯蹦。
8.7?within
關(guān)鍵字within?是相對于前一個匹配维哈。其中的關(guān)鍵字帶有必填數(shù)值。使用within確保只有當(dāng)內(nèi)容與設(shè)置的字節(jié)數(shù)內(nèi)的有效負(fù)載匹配時才會有匹配登澜。within?不能為0(零).
如前所述阔挠,距離和內(nèi)部可以很好地組合在一個簽名中。如果您希望Suricata檢查有效負(fù)載的特定部分以進(jìn)行匹配脑蠕,請在內(nèi)部使用购撼。
8.8?isdataat
isdataat關(guān)鍵字的目的是查看有效負(fù)載的特定部分是否仍有數(shù)據(jù)。關(guān)鍵字以數(shù)字(位置)開頭谴仙,然后是可選的迂求,后跟“relative”,用逗號和選項rawbytes分隔晃跺。您可以使用“relative”一詞來了解有效負(fù)載的特定部分是否仍有相對于上一次匹配的數(shù)據(jù)揩局。
如:
isdataat:512;
isdataat:50,relative;
第一個例子說明了一個簽名,它搜索有效載荷的字節(jié)512掀虎。第二個例子說明了在最后一次匹配之后搜索字節(jié)50的簽名凌盯。
您也可以在isdataat之前使用否定(!)
8.9 dsize
使用dsize關(guān)鍵字涩盾,您可以匹配數(shù)據(jù)包有效負(fù)載的大小十气。例如励背,您可以使用關(guān)鍵字來查找有效負(fù)載的異常大小春霍。這在檢測緩沖區(qū)溢出時可能很方便。格式:
dsize:<number>;
8.10?rpc
rpc關(guān)鍵字可用于在RPC過程編號和RPC版本的SUNRPC CALL中進(jìn)行匹配叶眉。您可以使用通過*定義的通配符修改關(guān)鍵字址儒。使用此通配符芹枷,您可以匹配所有版本和/或程序編號。RPC(遠(yuǎn)程過程調(diào)用)是一種允許計算機(jī)程序在另一臺計算機(jī)(或地址空間)上執(zhí)行過程的應(yīng)用程序莲趣。它用于進(jìn)程間通信鸳慈。請參見?http://en.wikipedia.org/wiki/Inter-process_communication
格式:
????rpc:<applicationnumber>,[<versionnumber>|*],[<procedurenumber>|*]>;
8.11?replace(IPS模式)
替換內(nèi)容修飾符只能在ips中使用。它調(diào)整網(wǎng)絡(luò)流量喧伞。它將其后面的內(nèi)容('abc')更改為另一個('def')走芋,參見示例:
替換修飾符必須包含與其替換的內(nèi)容一樣多的字符。它只能用于單個數(shù)據(jù)包潘鲫。它不適用于HTTP uri等規(guī)范化緩沖區(qū)或重組流中的內(nèi)容匹配翁逞。
校驗和將由Suricata重新計算,并在使用replace關(guān)鍵字后更改溉仑。
8.12pcre(Perl兼容正則表達(dá)式)
關(guān)鍵字pcre與正則表達(dá)式上的特定匹配挖函。有關(guān)正則表達(dá)式的更多信息,請訪問http://en.wikipedia.org/wiki/Regular_expression浊竟。
pcre的復(fù)雜性雖然價格很高怨喘,但它對性能有負(fù)面影響。因此振定,為了減輕Suricata不得不經(jīng)常檢查pcre必怜,pcre主要與'content'相結(jié)合。在這種情況下后频,在檢查pcre之前棚赔,內(nèi)容必須先匹配。pcre的格式:pcre:"/<regex>/opts";
有一些pcre的特性可以修改:
默認(rèn)情況下徘郭,pcre區(qū)分大小寫靠益。
.(點)是正則表達(dá)式的一部分。它匹配除換行符之外的每個字節(jié)残揉。
默認(rèn)情況下胧后,有效負(fù)載將被檢查為一行。
可以使用以下字符修改這些質(zhì)量:
這些選項是perl兼容修飾符抱环。要使用這些修飾符壳快,您應(yīng)該將它們添加到正則表達(dá)式后面的pcre。像這樣:
????pcre: “/<regex>/i”;
有一些pcre兼容的改性劑也可以改變pcre的質(zhì)量镇草。這些是:
A:模式必須在緩沖區(qū)的開頭匹配眶痰。(在pcre ^中類似于A.)
E:忽略緩沖區(qū)/有效負(fù)載末尾的換行符。
G:顛倒貪婪梯啤。
8.12.1?Suricata的修飾符
Suricata有自己特定的pcre修飾符竖伯。這些是:
R:匹配相對于最后一個模式匹配。它類似于距離:0;
U:使標(biāo)準(zhǔn)化的uri上的pcre匹配。它與uri_buffer匹配就像uricontent一樣七婴,內(nèi)容與http_uri.U結(jié)合可以與/ R結(jié)合使用祟偷。請注意,R是相對于前一個匹配的打厘,因此兩個匹配必須位于HTTP-uri緩沖區(qū)中修肠。閱讀有關(guān)HTTP URI規(guī)范化的更多信息。
I:在HTTP-raw-uri上進(jìn)行pcre匹配户盯。它與http_raw_uri匹配在同一個緩沖區(qū)中嵌施。我可以和/ R結(jié)合使用。請注意莽鸭,R是相對于前一個匹配的艰管,因此兩個匹配必須位于HTTP-raw-uri緩沖區(qū)中。閱讀有關(guān)HTTP URI規(guī)范化的更多信息蒋川。
P:在HTTP-request-body上進(jìn)行pcre匹配牲芋。因此,它在與http_client_body相同的緩沖區(qū)上匹配捺球。P可以與/ R組合缸浦。請注意,R是相對于前一個匹配的氮兵,因此兩個匹配必須位于HTTP請求主體中裂逐。
Q:在HTTP響應(yīng)主體上進(jìn)行pcre匹配。因此泣栈,它在與http_server_body相同的緩沖區(qū)上匹配卜高。Q可與/ R組合使用。請注意南片,R是相對于前一個匹配的掺涛,因此兩個匹配必須位于HTTP響應(yīng)主體中。
H:在HTTP標(biāo)頭上進(jìn)行pcre匹配疼进。H可以與/ R組合薪缆。請注意,R是相對于前一個匹配的伞广,因此兩個匹配必須位于HTTP標(biāo)頭正文中拣帽。
D:使非標(biāo)準(zhǔn)化標(biāo)題上的pcre匹配。因此嚼锄,它在與http_raw_header相同的緩沖區(qū)上匹配减拭。D可以與/ R組合。請注意区丑,R是相對于前一個匹配的拧粪,因此兩個匹配必須位于HTTP-raw-header中修陡。
M:使請求方法上的pcre匹配。因此既们,它在與http_method相同的緩沖區(qū)上匹配。M可以與/ R組合正什。請注意啥纸,R與前一個匹配項相關(guān),因此兩個匹配項必須位于HTTP方法緩沖區(qū)中斯棒。
C:在HTTP-cookie上進(jìn)行pcre匹配。因此,它與http_cookie在同一個緩沖區(qū)上匹配惠遏。C可以與/ R組合狸臣。請注意栗涂,R與前一個匹配項相關(guān)棍弄,因此兩個匹配項必須位于HTTP-cookie緩沖區(qū)中津辩。
S:使HTTP-stat-code上的pcre匹配。因此容劳,它在與http_stat_code相同的緩沖區(qū)上匹配喘沿。S可與/ R組合使用。請注意竭贩,R是相對于前一個匹配的蚜印,因此兩個匹配必須位于HTTP-stat-code緩沖區(qū)中。
Y:使HTTP-stat-msg上的pcre匹配留量。因此窄赋,它在與http_stat_msg相同的緩沖區(qū)上匹配拷淘。Y可以與/ R組合撒妈。請注意础钠,R是相對于前一個匹配的毙替,因此兩個匹配必須位于HTTP-stat-msg緩沖區(qū)中。
B:您可以在簽名中遇到B错敢,但這只是為了兼容性翰灾。因此,Suricata不使用B但支持它伐债,因此它不會導(dǎo)致錯誤预侯。
O:覆蓋配置pcre匹配限制致开。
V:在HTTP-User-Agent上進(jìn)行pcre匹配峰锁。因此,它在與http_user_agent相同的緩沖區(qū)上匹配双戳。V可以與/ R組合虹蒋。請注意,R與前一個匹配項相關(guān)飒货,因此兩個匹配項必須位于HTTP-User-Agent緩沖區(qū)中魄衅。
W:在HTTP主機(jī)上進(jìn)行pcre匹配。因此塘辅,它在與http_host相同的緩沖區(qū)上匹配晃虫。W可與/ R組合使用。請注意扣墩,R與前一個匹配項相關(guān)哲银,因此兩個匹配項必須位于HTTP-Host緩沖區(qū)中。
9.轉(zhuǎn)換
轉(zhuǎn)換關(guān)鍵字將粘性緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)換為其他內(nèi)容呻惕。例:
alert http any any->any any (file_data;strip_whitespace;\content:"window.navigate(";sid:1;)
即使在navigate和(之間有一個或多個空格荆责,此示例也會匹配流量。變換可以鏈接亚脆。它們按照它們在規(guī)則中出現(xiàn)的順序進(jìn)行處理做院。每個轉(zhuǎn)換輸出都充當(dāng)下一個輸出的輸入。
9.1??strip_whitespace
剝離isspace()C中調(diào)用所考慮的所有空格濒持,如:
alert http any any->any any (file_data;strip_whitespace;\content:"window.navigate(";sid:1;)
9.2?compress_whitespace
將所有連續(xù)的空格壓縮到單個空間中.
9.3?to_sha256
獲取緩沖區(qū)键耕,計算SHA-256哈希并傳遞原始哈希值。如:
alert http any any->any any(http_request_line;to_sha256;\content:"|54A9 7A8A B09C 1B81 3725 2214 51D3 F997 F015 9DD7 049E E5AD CED3 945A FC79 7401|";sid:1;)
注意:取決于libnss被編譯到Suricata中柑营。
10.預(yù)過濾關(guān)鍵字
10.1?fast_pattern?
10.1.1?Suricata快速模式確定解釋
如果在規(guī)則中明確設(shè)置了'fast_pattern'關(guān)鍵字郁竟,Suricata將使用它作為快速模式匹配。'fast_pattern'關(guān)鍵字只能按規(guī)則設(shè)置一次由境。如果未設(shè)置“fast_pattern”棚亩,Suricata會自動確定要用作快速模式匹配的內(nèi)容蓖议。以下說明Suricata用于自動確定要使用的快速模式匹配的邏輯。(請注意讥蟆,如果存在正(即非否定)內(nèi)容匹配勒虾,則忽略否定內(nèi)容匹配以進(jìn)行快速模式確定。否則瘸彤,考慮否定的內(nèi)容匹配)
fast_pattern選擇標(biāo)準(zhǔn)如下:
1.Suricata首先識別簽名中使用的具有最高“優(yōu)先級”的所有內(nèi)容匹配修然。優(yōu)先級基于匹配的緩沖區(qū),通持士觯“http_ *”緩沖區(qū)具有更高的優(yōu)先級(較低的數(shù)字是較高的優(yōu)先級)愕宋。有關(guān)哪些緩沖區(qū)具有優(yōu)先級的詳細(xì)信息,請參見?附錄B.
2.在步驟1中識別的內(nèi)容匹配(最高優(yōu)先級內(nèi)容匹配)內(nèi)结榄,最長(就字符/字節(jié)長度而言)內(nèi)容匹配被用作快速模式匹配中贝。
3.如果多個內(nèi)容匹配具有相同的最高優(yōu)先級并且有資格獲得最長長度,則具有最高字符/字節(jié)多樣性分?jǐn)?shù)(“模式強度”)的那個匹配用作快速模式匹配臼朗。有關(guān)用于確定圖案強度的算法的詳細(xì)信息邻寿,請參閱附錄C.
4.如果多個內(nèi)容匹配具有相同的最高優(yōu)先級,符合最長長度和相同的最高模式強度视哑,則最后注冊的緩沖區(qū)(“l(fā)ist_id”)用作快速模式匹配绣否。有關(guān)不同緩沖區(qū)/列表的注冊順序,請參閱附錄B.
5.如果多個內(nèi)容匹配具有相同的最高優(yōu)先級挡毅,則有資格獲得最長的長度蒜撮,相同的最高模式強度,并且具有相同的list_id(即查看相同的緩沖區(qū))跪呈,然后是首先出現(xiàn)的(從左到右) )在規(guī)則中用作快速模式匹配段磨。
值得注意的是,對于具有相同優(yōu)先級庆械,長度和模式強度的內(nèi)容匹配薇溃,'http_stat_msg','http_stat_code'和'http_method'優(yōu)先于常規(guī)'內(nèi)容'匹配缭乘。
10.1.2?附錄
附錄A - Suricata 1.3.4的緩沖區(qū)沐序,list_id值和注冊順序.對于Suricata 1.1.x - 1.4.x,這應(yīng)該基本相同.
附錄B - Suricata 2.0.7的緩沖區(qū)堕绩,list_id值策幼,優(yōu)先級和注冊順序
對于Suricata 2.0.x,這應(yīng)該基本相同奴紧。
附錄C - 模式強度算法
來自detect-engine-mpm.c特姐。基本上黍氮,模式強度“得分”從零開始唐含,從左到右查看傳入的字節(jié)數(shù)組中的每個字符/字節(jié)浅浮。如果之前在數(shù)組中沒有看到字符/字節(jié),如果它是一個字母字符捷枯,它會為分?jǐn)?shù)增加3;?否則滚秩,如果它是可打印字符0x00,0x01或0xFF,它會為分?jǐn)?shù)增加4;?否則它會增加6分淮捆。如果在分?jǐn)?shù)加1之前已經(jīng)看到字符/字節(jié)郁油。最終得分返回。
在多模式匹配器(MPM)中僅使用一個簽名內(nèi)容攀痊。如果有多個內(nèi)容桐腌,則Suricata使用“最強”的內(nèi)容。這意味著長度的組合苟径,內(nèi)容的變化程度以及它所處的緩沖區(qū)案站。通常,越長越好涩笤,越多越好嚼吞。有時盒件,簽名作者得出結(jié)論蹬碧,他希望Suricata使用其他內(nèi)容,而不是默認(rèn)使用炒刁。例如:
User-agent: Mozilla/5.0 Badness;
content:”User-Agent|3A|”;
content:”Badness”; distance:0;
在此示例中恩沽,您會看到第一個內(nèi)容比第二個內(nèi)容更長且更多,因此您知道Suricata將使用此內(nèi)容作為MPM翔始。由于“User-Agent:”會經(jīng)常匹配罗心,并且“Badness”在網(wǎng)絡(luò)流量中顯得較少,因此您可以使用“fast_pattern”使Suricata使用第二個內(nèi)容城瞎。
content:”User-Agent|3A|”;
content:”Badness”; distance:0; fast_pattern;
10.1.1? fast_pattern:only
有時簽名只包含一個內(nèi)容渤闷。在這種情況下,沒有必要Suricata將在MPM中找到匹配后進(jìn)一步檢查脖镀。如果只有一個內(nèi)容飒箭,則整個簽名匹配。Suricata會自動注意到這一點蜒灰。在某些簽名中弦蹂,仍然用'fast_pattern:only;'表示。雖然Suricata不需要fast_pattern:但它確實支持它强窖。
10.1.2??fast_pattern:’chop’
如果您不希望MPM使用整個內(nèi)容凸椿,可以使用fast_pattern'chop'。例如:
content: “aaaaaaaaabc”; fast_pattern:8,4;
這樣翅溺,MPM僅使用最后四個字符
10.2 prefilter
可以使用'prefilter'關(guān)鍵字在特定規(guī)則中啟用其他非MPM關(guān)鍵字的預(yù)過濾器引擎脑漫。在以下規(guī)則中髓抑,TTL測試將用于預(yù)過濾而不是單字節(jié)模式:
alert ip any any->any any(ttl:123;prefilter;content:"a";sid:1;)
有關(guān)如何配置預(yù)濾器引擎的更多信息,請參閱預(yù)濾器引擎优幸。
11 .流關(guān)鍵字
11.1?flowbits
Flowbits由兩部分組成启昧。第一部分描述了它將要執(zhí)行的操作,第二部分是flowbit的名稱劈伴。有多個數(shù)據(jù)包屬于一個流密末。Suricata將這些流量保留在內(nèi)存中。欲了解更多信息跛璧,請參閱 流和流處理严里。Flowbits可以確保在例如兩個不同的數(shù)據(jù)包匹配時生成警報。只有兩個數(shù)據(jù)包匹配時才會生成警報追城。因此刹碾,當(dāng)?shù)诙€數(shù)據(jù)包匹配時,Suricata必須知道第一個數(shù)據(jù)包是否也匹配座柱。如果數(shù)據(jù)包匹配迷帜,F(xiàn)lowbits標(biāo)記流程,因此Suricata'知道'它應(yīng)該在第二個數(shù)據(jù)包匹配時生成警報色洞。
Flowbits有不同的動作戏锹。這些是:
flowbits:set,name
????????????將在流程中設(shè)置條件/'名稱'(如果存在)火诸。
flowbits:isset锦针,name
????????????可以在規(guī)則中使用,以確保在規(guī)則匹配并在流中設(shè)置條件時生成警報置蜀。
flowbits:toggle奈搜,name
????????????反轉(zhuǎn)當(dāng)前設(shè)置。因此盯荤,例如馋吗,如果設(shè)置了條件,則將取消設(shè)置秋秤,反之亦然宏粤。
flowbits:unset,name
????????????可用于取消流程中的條件航缀。
flowbits:isnotset商架,name
????????????可以在規(guī)則中使用,以確保它在匹配時生成警報芥玉,并且未在流中設(shè)置條件蛇摸。
flowbits:noalert
????????????此規(guī)則不會生成警報。
如:
當(dāng)您查看第一個規(guī)則時灿巧,您將注意到它會生成一個警報赶袄,如果它匹配揽涮,如果它不是該規(guī)則末尾的'flowbits:noalert'。此規(guī)則的目的是檢查“userlogin”上的匹配項并在流中標(biāo)記該匹配項饿肺。因此蒋困,無需生成警報。沒有第一條規(guī)則敬辣,第二條規(guī)則無效雪标。如果第一個規(guī)則匹配,則flowbits將該特定條件設(shè)置為存在于流中「仍荆現(xiàn)在使用第二個規(guī)則可以檢查先前的數(shù)據(jù)包是否滿足第一個條件村刨。如果此時第二個規(guī)則匹配,則會生成警報撰茎。
11.2?flow
flow關(guān)鍵字可用于匹配流的方向嵌牺,因此可以to/from客戶端或to/from服務(wù)器進(jìn)行匹配。如果流程建立與否龄糊,它也可以匹配逆粹。flow關(guān)鍵字也可用于表示簽名必須僅在流上(only_stream)或僅在數(shù)據(jù)包上匹配(no_stream)。
因此炫惩,使用flow關(guān)鍵字僻弹,您可以匹配:
to_client
????????????匹配從服務(wù)器到客戶端的數(shù)據(jù)包。
to_server
????????????匹配從客戶端到服務(wù)器的數(shù)據(jù)包诡必。
from_client
????????????匹配從客戶端到服務(wù)器的數(shù)據(jù)包(與to_server相同)奢方。
from_server
????????????匹配從服務(wù)器到客戶端的數(shù)據(jù)包(與to_client相同)搔扁。
established
????????????匹配已建立的連接爸舒。
not_established
????????????匹配不屬于已建立連接的數(shù)據(jù)包。
stateless
????????????匹配已建立連接且不屬于已建立連接的數(shù)據(jù)包稿蹲。
only_stream
????????????匹配由流引擎重新組裝的數(shù)據(jù)包扭勉。
no_stream
????????????匹配尚未由流引擎重組的數(shù)據(jù)包。將不匹配已重新組裝的數(shù)據(jù)包苛聘。
only_frag
????????????匹配已從片段重組的數(shù)據(jù)包涂炎。
no_frag
????????????匹配尚未從片段重組的數(shù)據(jù)包。
可以組合多個流選項设哗,例如:
確定的標(biāo)準(zhǔn)取決于協(xié)議:
對于TCP唱捣,將在三次握手之后建立連接:
對于其他協(xié)議(例如UDP),在看到來自連接兩邊的流量后网梢,將認(rèn)為建立了連接震缭。
11.3?flowint
Flowint允許使用變量進(jìn)行存儲和數(shù)學(xué)運算。它的運行方式與flowbits非常相似战虏,但增加了數(shù)學(xué)功能拣宰,并且可以存儲和操作整數(shù)党涕,而不僅僅是標(biāo)志集。我們可以將它用于許多非常有用的事情巡社,例如計算出現(xiàn)次數(shù)膛堤,添加或減去出現(xiàn)次數(shù),或者在流中對多個因子進(jìn)行閾值處理晌该。這將很快擴(kuò)展到全局上下文肥荔,因此用戶可以在流之間執(zhí)行這些操作。
語法如下:
flowint:name,modifier[,value];
定義var(不是必需的)朝群,或檢查是否設(shè)置了一個:
flowint:name,<+,-,=,>,<,>=,<=,==,!=>,value;
flowint:name,(isset|isnotset);
比較或改變變量次企。加,減潜圃,比較大于或小于缸棵,大于或等于,小于或等于可用谭期。要比較的項目可以是整數(shù)或其他變量堵第。
例如,如果您想要計算在特定流中看到用戶名的次數(shù)隧出,并警告它是否超過5踏志。
alert tcp any any->any any(msg:"Counting Usernames";content:"jonkman";\flowint:usernamecount,+,1;noalert;)這將計算每次出現(xiàn)并增加var usernamecount,而不為每個出現(xiàn)警報≌偷桑現(xiàn)在說如果流中有超過五個匹配针余,我們想要生成警報:alert tcp any any->any any(msg:"More than Five Usernames!";content:"jonkman";\flowint:usernamecount,+,1;flowint:usernamecount,>,5;)因此,只有當(dāng)usernamecount超過五個時凄诞,我們才會收到提醒.所以現(xiàn)在讓我們說我們想要獲得如上所述的警報圆雁,但不是如果有更多的用戶名注銷。假設(shè)此特定協(xié)議表示使用“jonkman logout”注銷帆谍,請嘗試:alert? tcp? any? any->any? any(msg:"Username Logged out";content:"logout jonkman";\flowint:usernamecount,-,1;flowint:usernamecount,>,5;)所以現(xiàn)在伪朽,如果此特定用戶名的活動登錄數(shù)超過五個,我們將僅收到警報.這是一個相當(dāng)簡單的例子汛蝙,但我相信它顯示了這樣一個簡單的函數(shù)可以為規(guī)則編寫做些什么的力量烈涮。我在登錄跟蹤,IRC狀態(tài)機(jī)窖剑,惡意軟件跟蹤和暴力登錄檢測等方面看到了很多應(yīng)用程序坚洽。
假設(shè)我們正在跟蹤一個通常允許每個連接有五次登錄失敗的協(xié)議,但是我們有一個漏洞西土,攻擊者可以在五次嘗試之后繼續(xù)登錄讶舰,我們需要了解它。alert tcp an yany->any any(msg:"Start a login count";content:"login failed";\flowint:loginfail,notset;flowint:loginfail,=,1;noalert;)因此,如果變量尚未設(shè)置绘雁,我們會檢測到初始失敗橡疼,如果是,則將其設(shè)置為1庐舟。我們的第一擊欣除。
alert tcp any any->any any(msg:"Counting Logins";content:"login failed";\flowint:loginfail,isset;flowint:loginfail,+,1;noalert;)
如果已設(shè)置,我們現(xiàn)在正在遞增計數(shù)器挪略。
alert tcp any any->any any(msg:"More than Five login fails in a Stream";\content:"login failed";flowint:loginfail,isset;flowint:loginfail,>,5;)
現(xiàn)在历帚,如果我們在同一個流中交叉五次登錄失敗,我們將生成警報杠娱。
但是挽牢,我們還要說,如果有兩次成功登錄并且之后登錄失敗摊求,我們也需要提醒禽拔。
alert tcp any any->any any(msg:"Counting Good Logins";\content:"login successful";flowint:loginsuccess,+,1;noalert;)
在這里,我們計算好登錄室叉,所以現(xiàn)在我們將計算與失敗相關(guān)的良好登錄:
alert tcp any any->any any(msg:"Login fail after two successes";\content:"login failed";flowint:loginsuccess,isset;\flowint:loginsuccess,=,2;)
11.4?stream_size?
流大小選項根據(jù)注冊的字節(jié)數(shù)按序列號匹配流量睹栖。此關(guān)鍵字有幾個修飾符:
格式:
stream_size:<server|client|both|either>,<modifier>,<number>;
規(guī)則中stream-size關(guān)鍵字的示例:
alert tcp any any->any any(stream_size:both,>,5000;sid:1;)
12 . bypass關(guān)鍵字
Suricata有一個bypass關(guān)鍵字,可用于簽名茧痕,以排除進(jìn)一步評估的流量野来。該bypass關(guān)鍵字在預(yù)期流量較大的情況下非常有用(例如Netflix,Spotify踪旷,Youtube).該bypass關(guān)鍵字被視為匹配后關(guān)鍵字.如:在匹配的http流量上繞過流量:
alert http any any->any any(content:"suricata-ids.org";\http_host;bypass;sid:10001;rev:1;)