Suricata/Snort規則參考
文章目錄
- Suricata/Snort規則參考
- 限制
- 優勢
- 6. Suricata 規則
- 6.1. 規則格式
- 6.1.1. 動作(Action)
- 6.1.2. 協議(Protocol)
- 6.1.3. 源和目的(Source and destination)
- 6.1.4. 埠(Source and destination)
- 6.1.5. 方向(Direction)
- 6.1.6. 規則選項(Rule options)
- 6.1.6.1. 修飾器關鍵詞(Modifier Keywords)
- 6.1.6.2. 規范化的緩沖區(Normalized Buffers)
- 6.2. Meta Keywords
- 6.2.1. msg (message)
- 6.2.2. sid (簽名ID)
- 6.2.3. rev (版本)
- 6.2.4. gid (組ID)
- 6.2.5. classtype (類別)
- 6.2.6. reference (參考/參考)
- 6.2.7. priority (優先級)
- 6.2.8. metadata (元資料)
- 6.2.9. target (目標)
- 6.3. IP Keywords
- 6.3.1. ttl
- 6.3.2. ipopts
- 6.3.3. sameip
- 6.3.4. ip_proto
- 6.3.5. ipv4.hdr
- 6.3.6. ipv6.hdr
- 6.3.7. id
- 6.3.8. geoip
- 6.3.9. fragbits (IP fragmentation)
- 6.3.10. fragoffset
- 6.3.11. tos
- 6.4. TCP Keywords
- 6.4.1. seq
- 6.4.2. ack
- 6.4.3. window
- 6.4.4 tcp.mss
- 6.4.5 tcp.hdr
- 6.5. UDP Keywords
- 6.5.1. udp.hdr
- 6.6. ICMP Keywords
- 6.6.1. itype
- 6.6.2. icode
- 6.6.3. icmp_id
- 6.6.4. icmp_seq
- 6.6.5. icmpv6.hdr
- 6.6.6. icmpv6.mtu
- 6.7. Payload Keywords
- 6.7.1. content
- 6.7.2. nocase
- 6.7.3. depth
- 6.7.4. startsWith
- 6.7.5. endswith
- 6.7.6. offset
- 6.7.7. distance
- 6.7.8. within
- 6.7.9. isdataat
- 6.7.10. bsize
- 6.7.11. dsize
- 6.7.12. byte_test
- 6.7.13. byte_math
- 6.7.14. byte_jump
- 6.7.15. byte_extract
- 6.7.16. rpc
- 6.7.17. replace
- 6.7.18. pcre (Perl Compatible Regular Expressions)
- 6.7.18.1. Suricata’s modifiers
- 6.8. Transformations(轉換)
- 6.9. Prefiltering Keywords(前置篩選關鍵詞)
- 6.10. Flow Keywords
- 6.10.1. flowbits
- 6.10.2. flow
- 6.10.3. flowint
- 6.10.4. stream_size
- 6.11. Bypass 關鍵詞
- 6.11.1. bypass
- 6.12. HTTP 關鍵詞
- 6.13. 檔案關鍵詞
- 6.13.1. filename
- 6.13.2. fileext
- 6.13.3. filemagic
- 6.13.4. filestore
- 6.13.5. filemd5
- 6.13.6. filesha1
- 6.13.7. filesha256
- 6.13.8. filesize
- 6.14. DNS 關鍵詞
Suricata是一款開源IDS/IPS/NSM引擎,兼容Snort規則
限制
截至Suricata 6.0.0
- 不支持請求-回應雙向匹配,單條規則只支持請求或者回應
- 不支持復雜的邏輯運算,只支持并且
優勢
- 規則支持眾多協議型別
- 規則支持多種解碼、編碼匹配方式
- 規則支持多種預定義函式轉換方式
6. Suricata 規則
6.1. 規則格式
攻擊特征在Suricata中扮演了一個非常重要的角色,在大多數場景下,使用現有的規則庫即可滿足大多數場景需求,
官方安裝規則庫的方式參照:Rule Management with Suricata-Update
Suricata規則檔案解釋了如何讀懂規則、按需調整規則以及創建一個新規則等所有特征相關的方面,
一條規則/特征包括如下部分:
- 動作(action),用來決定當特征匹配成功后如何處理,
- 頭資訊(header),定義應用規則的協議、IP地址、埠和方向,
- 規則選項(rule options),定義規則的特征,
如下是一條規則示例:
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;)
將上面的示例拆解:
1. 動作 -> drop
2. 頭資訊 -> tcp $HOME_NET any -> $EXTERNAL_NET any
3. 規則選項 -> (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;)
在本節中,我們將使用上述規則簽名作為示例,突出解釋簽名的不同部分,它是從Emerging Threats資料庫中提取的簽名,這是一個開放資料庫,具有許多規則,您可以免費下載并在您的Suricata實體中使用,
6.1.1. 動作(Action)
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;)
示例中為:drop
有效的動作取值為:
- alert - 生成一條告警
- pass - 停止對資料包的進一步檢查
- drop - 棄資料包并生成告警
- reject - 發送RST/ICMP unreach 錯誤到匹配資料包的發送方,
- rejectsrc - 與 reject 含義相同
- rejectdst - 發送RST/ICMP錯誤資料包到匹配資料包的接收方,
- rejectboth - 向對話雙方發送RST/ICMP錯誤資料包,
!注意 在IPS模式中, 使用任何的
reject
動作,同時也會觸發drop
動作,
更多關于動作(Action)的詳細資訊請參閱:Action-order
6.1.2. 協議(Protocol)
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;)
示例中為:tcp
規則中的協議關鍵詞告訴Suricata該規則應該應用哪種協議,你可以在四個基礎協議中選擇:
- tcp (for tcp-traffic)
- udp
- icmp
- ip (ip stands for ‘all’ or ‘any’)
還有一些叫做應用層協議,或者7層協議的選擇項:
- http
- ftp
- tls (this includes ssl)
- smb
- dns
- dcerpc
- ssh
- smtp
- imap
- modbus (disabled by default)
- dnp3 (disabled by default)
- enip (disabled by default)
- nfs
- ikev2
- krb5
- ntp
- dhcp
- rfb
- rdp
- snmp
- tftp
- sip
- http2
這些協議的可用性取決于組態檔suricata.yaml中是否啟用了該協議,
如果您有一個協議標記為http的規則,Suricata確保規則只有在涉及http流量時才能匹配,
6.1.3. 源和目的(Source and destination)
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
第一個強調的部分$HOME_NET
是源,第二個是目的$EXTERNAL_NET
(注意方向箭頭的方向),
通過設定源和目的,可以分別指定網路通信的源和目的,你可以為源和目的分配IP地址(IPv4和IPv6都支持)和IP地址段,并且可以通過運算子進行組合:
運算子 | 描述 | 示例 |
---|---|---|
…/… | IP段 (CIDR記號法) | 192.168.1.1/24 |
! | 除去/取反 | !192.168.1.125 |
[…, …] | 組合 | [192.168.1.2, 192.168.1.3] |
你也可以使用變數來設定,例如:$HOME_NET
、$EXTERNAL_NET
,這些變數表示預定義的IP地址,預定義的內容可以在suricata-yaml
組態檔中修改,詳情參考:Rule-vars
示例:
示例 | 含義 |
---|---|
!1.1.1.1 | 除1.1.1.1之外的所有IP |
![1.1.1.1, 1.1.1.2] | 除1.1.1.1 和 1.1.1.2之外的所有IP |
$HOME_NET | 在yaml組態檔中配置的 HOME_NET 變數 |
[ E X T E R N A L N E T , ! EXTERNAL_NET, ! EXTERNALN?ET,!HOME_NET] | EXTERNAL_NET 和 非 HOME_NET |
[10.0.0.0/24, !10.0.0.5] | 除去10.0.0.5之外的10.0.0.0/24 IP段 |
[…, [….]] | |
[…, ![……]] |
!警告
如何你的配置像這樣:
HOME_NET: any
EXTERNAL_NET: ! $HOME_NET
您不能使用$EXTERNAL_NET
撰寫簽名,因為它代表“not any”,這是一個無效的設定,
6.1.4. 埠(Source and destination)
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;)
第一個強調的部分是源埠,第二個是目的埠(注意方向箭頭的方向),
通信通過埠進出,不同的埠有不同的埠號,例如,HTTP的默認埠是80,而443通常是HTTPS的埠,但是請注意,埠并不規定在通信中使用哪個協議,相反,它確定哪個應用程式正在接收資料,
上述提到的埠通常是目的埠,源埠是應用程式用來發送資料的埠,一般由作業系統隨機分配,當你需要為你的HTTP服務寫一個規則時,你通常可以寫any -> 80
,它表示當任何源埠發送到80埠的資料才會進行規則匹配,
在設定埠時,你也可以運算子,如下所示:
運算子 | 描述 |
---|---|
: | 埠范圍 |
! | 除去/取非 |
[…, …] | 組合 |
示例:
示例 | 含義 |
---|---|
[80, 81, 82] | 埠 80, 81 和 82 |
[80: 82] | 埠范圍 80 到 82 |
[1024: ] | 從1024 到 最大的埠 |
!80 | 除去80之外的所有埠 |
[80:100,!99] | 埠范圍 80 到 100,除去 99 |
[1:80,![2,4]] | 埠范圍 1-80, 除去 2 和 4 |
[…, […,…]] |
6.1.5. 方向(Direction)
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;)
方向說明以何種方式匹配簽名,幾乎每個簽名都有一個向右的箭頭(->
),這意味著只有方向相同的資料包才能匹配,當然,也有一個規則匹配的兩個方向(<>
):
source -> destination
source <> destination (both directions)
!警告
沒有反方向的方向表示,也就是說,沒有<-
,
下面的示例說明了這一點,假設,有一個客戶端,IP地址為1.2.3.4,埠為1024,還有一個服務器,IP地址為5.6.7.8,監聽埠為80(通常是HTTP),客戶機向服務器發送一條訊息,服務器回傳了回應資訊,
現在,假設我們有一個規則,它的頭資訊如下:
alert tcp 1.2.3.4 1024 -> 5.6.7.8 80
只有第一個資料包會被這個規則匹配,因為方向指定了,所有我們不匹配回應包,
6.1.6. 規則選項(Rule options)
規則的其余部分由選項組成,它們用圓括號括著,用分號分隔著,有些選項具有設定(如msg
),由選項的關鍵字、冒號和設定指定,其他的沒有設定,只是關鍵字(如nocase):
<keyword>: <settings>;
<keyword>;
規則選項具有特定的順序,更改它們的順序將改變規則的含義,
!注意
字符;
和"
在Suricata規則語言中具有特殊意義,在規則選項值中使用時必須轉義,例如:
msg:"Message with semicolon\;";
因此,還必須轉義反斜杠,因為它是轉義字符,
本章的其余部分在檔案中記錄了各種關鍵字的使用,
下面是一些關于關鍵詞的通用細節,
6.1.6.1. 修飾器關鍵詞(Modifier Keywords)
一些關鍵字的功能作為修飾語,修飾語有兩種型別,
- 舊樣式的“內容修飾符”在
content:"";
后面,例如:
alert http any any -> any any (content:"index.php"; http_uri; sid:1;)
在上面的例子中,模式'index.php'
被修飾用來檢測HTTP uri快取區,
也就是說,當http資料包的uri部分包括
index.php
關鍵詞時,才會觸發告警,
- 最近的一種被稱為“粘性緩沖”,它將緩沖區名稱放在首位,然后所有緊隨它后面的關鍵字應用到該緩沖區,例如:
alert http any any -> any any (http_response_line; content:"403 Forbidden"; sid:1;)
在上面的例子中,當模式'403 Forbidden'
在HTTP response line中出現時觸發告警,因為它緊隨http_response_line
關鍵詞,
6.1.6.2. 規范化的緩沖區(Normalized Buffers)
資料包由原始資料組成,HTTP和reassembly復制了這些型別的資料包資料,它們清除例外內容,組合資料包等等,剩下的就是所謂的“標準化緩沖區”:
因為資料被標準化了,它不再是以前的樣子了;這是一種解釋,規范化的緩沖區是:所有http關鍵字、重新組裝的流、TLS-、SSL-、SSH-、FTP-和dcerpc-緩沖區,
注意有一些例外,例如http_raw_uri關鍵字,參見:http.uri and http.uri.raw獲取更多資訊,
6.2. Meta Keywords
Meta Keywords不會影響任何Suricata規則檢測行為;它們只影響Suricata的告警事件輸出格式,
6.2.1. msg (message)
關鍵字msg給出關于規則和告警的合理的文本資訊,
msg的格式為:
msg: "some description";
例子:
msg:"ATTACK-RESPONSES 403 Forbidden";
msg:"ET EXPLOIT SMB-DS DCERPC PnP bind attempt";
繼續上一章的例子,這是關鍵字在實際規則的行動:
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;)
msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”;
慣例是將msg
作為規則選項的第一個關鍵字,并且這部分以大寫表示,突出顯示簽名的類別,
這些字符如出現在msg
中必須進行轉義:;
\
"
6.2.2. sid (簽名ID)
關鍵字sid
為每個簽名提供自己的id,這個id規定使用數字進行宣告,sid的格式如下:
sid:123;
sid在一個規則中的例子:
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;)
按照慣例,簽名sid作為簽名的最后一個關鍵字(如果有rev,則倒數第二)提供,
6.2.3. rev (版本)
sid
關鍵字幾乎每次都伴隨著rev
,rev
代表簽名的版本,如果簽名被修改,rev
的數量將由簽名作者增加,rev
格式為:
rev:123;
一個規則中包含rev的例子:
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;)
按照慣例,sid出現在rev之前,并且兩者都是所有關鍵字中的最后一個,
6.2.4. gid (組ID)
gid
關鍵字可用于提供另一個id值來表示不同的簽名組(就像sid),Suricata默認使用gid 1,這是可以修改的,通常情況下,它不會被改變,而且改變它沒有技術含義,您只能在告警中觀察到它的變化,
如下是一個有gid的告警示例,此告警列印在fast.log檔案中,在[1:2008124:2]
部分,1
是 gid,2008124
是 sid,2
是 rev,
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
6.2.5. classtype (類別)
classtype關鍵字提供了關于規則和告警的分類資訊,它包括一個短名稱,一個長名稱和一個優先級,它可以分辨出一個規則是僅僅提供資訊還是匹配攻擊行為等等,對于每個classtype,classification.config中有一個優先級可以在規則中被使用,
classtype定義示例:
config classification: web-application-attack,Web Application Attack,1
config classification: not-suspicious,Not Suspicious Traffic,3
現在當我們在配置中定義了如上配置之后,我們就可以在規則中使用這些classtype,一個使用web-application-attack
classtype的規則將被分配優先級1,并且告警將包含’Web Application Attack’:
classtype | Alert | Priority |
---|---|---|
web-application-attack | Web Application Attack | 1 |
not-suspicious | Not Suspicious Traffic | 3 |
我們接下來的例子也有一個classtype,這個是trojan-activity:
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;)
按照慣例,classtype出現在sid和rev之前,并出現在其他關鍵字之后,
6.2.6. reference (參考/參考)
reference關鍵字指向可以找到關于簽名和簽名試圖解決的問題的資訊的位置,reference關鍵字可以在簽名中出現多次,這個關鍵字是為研究簽名匹配原因的簽名作者和分析人員設計的,它的格式如下:
reference: type, reference
一個典型的指向www.info.com的reference可以這么寫:
reference: url, www.info.com
但是,還有一些系統可以作為參考,一個常見的例子是CVE-database,它為漏洞分配了唯一的ID,為了防止你一遍又一遍地輸入相同的URL,你可以使用這樣的寫法:
reference: cve, CVE-2014-1234
這種寫法可以自動生成一個指向http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1234的參考,所有的參考型別在reference.config組態檔中定義,
我們接下來的例子也有一個參考:
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;)
6.2.7. priority (優先級)
priority
關鍵字的值必須使用數字,范圍從1到255,數字1到4是最常用的,優先級較高的簽名將首先被檢查,最高優先級是1,通常,配置了classtype的簽名已經有了優先級,但是我們可以用關鍵字priority
來重新設定,優先級的形式是:
priority:1;
6.2.8. metadata (元資料)
元資料關鍵字允許將附加的、非功能的資訊添加到簽名中,盡管它的格式沒有限制,但建議堅持使用鍵、值對,因為Suricata可以將它們包含在eve告警中,格式是:
metadata: key value;
metadata: key value, key value;
6.2.9. target (目標)
target關鍵字允許規則撰寫人員指定警報的哪一邊是攻擊的目標,如果指定,告警事件將增強為包含有關源和目標的資訊,
格式是:
target:[src_ip|dest_ip]
如果值是src_ip,那么生成事件中的源IP (JSON格式的src_ip欄位)就是攻擊的目標,如果target被設定為dest_ip,那么目的IP就是生成事件中的目標IP,
6.3. IP Keywords
6.3.1. ttl
ttl關鍵字用于檢查包頭中的特定IP生存時間(time-to-live)值,格式是:
ttl:<number>
例如:
ttl:10;
在ttl關鍵字的末尾,您可以輸入想要匹配的值,生存時間值決定了資料包在網路傳輸中可以存在的最大時間,如果該欄位被設定為0,則必須銷毀該資料包,生存時間基于跳數,資料包通過的每一跳/路由器減去一個資料包TTL計數器,這個機制的目的是限制資料包的存在,防止資料包不能在無限的路由回圈中結束,
ttl關鍵字在規則中的例子:
alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL MISC 0 ttl”; ttl:0; reference:url,support.microsoft.com/default.aspx?scid=kb#-#-EN-US#-#-q138268; reference:url,www.isi.edu/in-notes/rfc1122.txt; classtype:misc-activity; sid:2101321; rev:9;)
6.3.2. ipopts
使用ipopts關鍵字,您可以檢查是否設定了特定的IP選項,Ipopts必須在規則的開頭使用,每個規則只能匹配一個選項,有幾個選項可以匹配,它們是:
IP Option | Description |
---|---|
rr | Record Route |
eol | End of List |
nop | No Op |
ts | Time Stamp |
sec | IP Security |
esec | IP Extended Security |
lsrr | Loose Source Routing |
ssrr | Strict Source Routing |
satid | Stream Identifier |
any | any IP options are set |
ipopts關鍵詞格式:
ipopts: <name>
例子:
ipopts: lsrr;
規則中的ipopts示例:
alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL MISC source route ssrr”; ipopts:ssrr; reference:arachnids,422; classtype:bad-unknown; sid:2100502; rev:3;)
6.3.3. sameip
每個包有一個源ip地址和一個目的ip地址,源IP可能與目標IP相同,使用sameip關鍵字,您可以檢查源的IP地址是否與目標的IP地址相同,sameip關鍵字的格式為:
sameip;
規則中的sameip示例:
alert ip any any -> any any (msg:”GPL SCAN same SRC/DST”; sameip; reference:bugtraq,2666; reference:cve,1999-0016; reference:url,www.cert.org/advisories/CA-1997-28.html; classtype:bad-unknown; sid:2100527; rev:9;)
6.3.4. ip_proto
您可以使用關鍵字ip_proto匹配包頭中的IP協議,您可以使用協議的名稱或編號,例如,您可以匹配以下協議:
1 ICMP Internet Control Message
6 TCP Transmission Control Protocol
17 UDP User Datagram
47 GRE General Routing Encapsulation
50 ESP Encap Security Payload for IPv6
51 AH Authentication Header for Ipv6
58 IPv6-ICMP ICMP for Ipv6
有關協議及其編號的完整串列,請參閱:http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
規則中的ip_proto示例:
alert ip any any -> any any (msg:”GPL MISC IP Proto 103 PIM”; ip_proto:103; reference:bugtraq,8211; reference:cve,2003-0567; classtype:non-standard-protocol; sid:2102189; rev:4;)
該示例的ip_proto也可以使用名稱表示為:
ip_proto:PIM
6.3.5. ipv4.hdr
匹配整個IPv4 header的Sticky buffer,
示例規則:
alert ip any any -> any any (ipv4.hdr; content:”|3A|”; offset:9; depth:1; sid:1234; rev:5;)
這個例子檢查IPv4 header的第9個位元組的值是否為3A,它表示IPv4 protocol是ICMPv6,
6.3.6. ipv6.hdr
匹配整個IPv6 header的Sticky buffer,
6.3.7. id
通過id關鍵詞,你可以匹配一個特定的IP ID值,這個ID標識主機發送出去的每個packet,并且每次發送ID都遞增1,IP ID可以用來作為碎片標識數字,每個packet都有一個IP ID,并且當一個packet在網路中傳輸變成一些碎片時,所有這個packet的碎片都有相同的ID,通過這種方式,packet的接收者可以知道哪些碎片屬于相同的packet,(IP ID不關心順序,這種情況需要使用offset,它可以幫助分清碎片的順序,)
id的格式:
id:<number>;
規則中的id示例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET DELETED F5 BIG-IP 3DNS TCP Probe 1”; id: 1; dsize: 24; flags: S,12; content:”|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|”; window: 2048; reference:url,www.f5.com/f5products/v9intro/index.html; reference:url,doc.emergingthreats.net/2001609; classtype:misc-activity; sid:2001609; rev:13;)
6.3.8. geoip
geoip關鍵字允許(您)匹配網路流量的源、目的地或源和目的地IPv4地址,并查看它屬于哪個國家,為了能夠做到這一點,Suricata使用MaxMind的GeoIP2 API,
geoip語法:
geoip: src,RU;
geoip: both,CN,RU;
geoip: dst,CN,RU,IR;
geoip: both,US,CA,UK;
geoip: any,CN,IR;
因此,您可以使用以下內容來明確您想要匹配的方向:
Option | Description |
---|---|
both | Both directions have to match with the given geoip(s) |
any | One of the directions has to match with the given geoip(s). |
dest | If the destination matches with the given geoip. |
src | The source matches with the given geoip. |
關鍵字只支持IPv4,由于使用MaxMind的GeoIP2 API,libmaxminddb必須編譯進來,您必須下載并安裝所需的GeoIP2或GeoLite2資料庫版本,訪問MaxMind網站https://dev.maxmind.com/geoip/geoip2/geolite2/獲取詳細資訊,
您還必須在本地yaml組態檔中提供GeoIP2或GeoLite2資料庫檔案的位置(例如):
geoip-database: /usr/local/share/GeoIP/GeoLite2-Country.mmdb
6.3.9. fragbits (IP fragmentation)
使用fragbits關鍵字,可以檢查碎片和保留位是否在IP header中設定,fragbits關鍵字應該放在規則的開頭,fragbits用于修飾碎片機制,在將訊息從一個Internet模塊路由到另一個Internet模塊時,可能會出現包大于網路所能處理的最大包大小的情況,在這種情況下,資料包可以以片段的形式發送,這個資料包大小的最大值稱為最大傳輸單元(MTU),
你可以匹配以下位:
M - More Fragments
D - Do not Fragment
R - Reserved Bit
匹配在這個位可以更指定以下修飾器:
+ match on the specified bits, plus any others
* match if any of the specified bits are set
! match if the specified bits are not set
格式:
fragbits:[*+!]<[MDR]>;
規則中的fragbits示例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET EXPLOIT Invalid non-fragmented packet with fragment offset>0”; fragbits: M; fragoffset: >0; reference:url,doc.emergingthreats.net/bin/view/Main/2001022; classtype:bad-unknown; sid:2001022; rev:5; metadata:created_at 2010_07_30, updated_at 2010_07_30;)
6.3.10. fragoffset
使用fragoffset關鍵字,您可以匹配IP片段偏移欄位的特定十進制值,如果您想要檢查會話的第一個片段,您必須結合fragoffset 0和More Fragment(fragbits: M)選項,碎片偏移量欄位便于重新組裝,id用于確定哪個片段屬于哪個包,而碎片偏移欄位澄清了片段的順序,
你可以使用以下修飾詞:
< match if the value is smaller than the specified value
> match if the value is greater than the specified value
! match if the specified value is not present
fragoffset格式:
fragoffset:[!|<|>]<number>;
規則中的fragoffset示例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET EXPLOIT Invalid non-fragmented packet with fragment offset>0”; fragbits: M; fragoffset: >0; reference:url,doc.emergingthreats.net/bin/view/Main/2001022; classtype:bad-unknown; sid:2001022; rev:5; metadata:created_at 2010_07_30, updated_at 2010_07_30;)
6.3.11. tos
tos關鍵字可以匹配IP頭tos欄位的特定十進制值,tos關鍵字的值可以是0 - 255,IP報頭的這個欄位已經被rfc2474更新,以包含用于差異化服務功能,注意,欄位的值被定義為最右邊的2位的值為0,當為tos指定一個值時,確保該值符合這個規則,
例如,不是指定十進制值34(十六進制22),而是右移兩次并使用十六進制88),
可以用前導x指定十六進制值,例如x88,
tos的格式:
tos:[!]<number>;
規則中的tos示例:
alert ip any any -> any any (msg:”Differentiated Services Codepoint: Class Selector 1 (8)”; flow:established; tos:8; classtype:not-suspicious; sid:2600115; rev:1;)
帶有否定值的tos示例:
alert ip any any -> any any (msg:”TGI HUNT non-DiffServ aware TOS setting”; flow:established,to_server; tos:!0; tos:!8; tos:!16; tos:!24; tos:!32; tos:!40; tos:!48; tos:!56; threshold:type limit, track by_src, seconds 60, count 1; classtype:bad-unknown; sid:2600124; rev:1;)
6.4. TCP Keywords
6.4.1. seq
seq關鍵字可以在簽名中用于檢查特定的TCP序列號,序列號是tcp連接的兩個端點實際上隨機生成的數字,客戶端和服務器都創建一個序列號,序列號每發送一個位元組就增加一個,所以兩邊的序號都不一樣,這個序列號必須由連接的雙方確認,通過序列號,TCP處理acknowledgement(確認), order(順序)和 retransmission(重傳)它的數字隨著發送方發送的每一個資料位元組而增加,seq幫助跟蹤一個位元組在資料流中的位置,如果SYN標志被設定為1,那么資料的第一個位元組的序列號就是這個數字加上1(所以是2),
例子:
seq:0;
簽名中的seq示例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN NULL”; flow:stateless; ack:0; flags:0; seq:0; reference:arachnids,4; classtype:attempted-recon; sid:2100623; rev:7;)
資料包中的seq示例(Wireshark):
6.4.2. ack
ack是tcp連接的另一端收到之前發送的所有(資料)位元組的確認,在大多數情況下,TCP連接的每個包在第一個SYN之后都有一個ACK標志,并且ack-number隨著每個新資料位元組的接收而增加,ack關鍵字可以在簽名中用于檢查特定的TCP確認號,
ack的格式:
ack:1;
簽名中的ack示例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN NULL”; flow:stateless; ack:0; flags:0; seq:0; reference:arachnids,4; classtype:attempted-recon; sid:2100623; rev:7;)
包中的ack的例子(Wireshark):
6.4.3. window
window
關鍵詞用來指定TCP視窗大小,TCP視窗大小是一個用來控制資料流的機制,這個視窗大小由接收者設定(receiver advertised window size),并且表明了它可以接收的位元組數量,在發送方可以發送相同數量的新資料之前,接收方必須首先確認此資料量,這種機制是用來防止接收器被資料溢位,視窗大小的值被限制在2到65.535位元組,為了更好地利用帶寬,可以使用更大的TCP視窗,
視窗關鍵字的格式:
window:[!]<number>;
一個規則中的視窗的例子:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL DELETED typot trojan traffic”; flow:stateless; flags:S,12; window:55808; reference:mcafee,100406; classtype:trojan-activity; sid:2182; rev:8;)
以上規則用于病毒檢測:參考https://blog.csdn.net/richerg85/article/details/25079865
病毒名稱:Trojan.Linux.Typot.a
類別: 木馬病毒
破壞方法:
該病毒是在Linux作業系統下的木馬,木馬運行后每隔幾秒就發送一個TCP包,其目的IP和源IP地址是隨機的,這個包中存在固定的特征,包括 TCP window size等<在這里為55808>,同時,病毒會嗅探網路,如果發現TCP包的window size等于55808,就會在當前目錄下生成一個檔案<檔案名為:r>,每隔24小時,病毒檢測是否存在檔案 “r”,如果存在,就會試圖連接固定的IP地址<可能為木馬的客戶端>,如果連接成功,病毒就會洗掉檔案:/tmp/……/a并退出
6.4.4 tcp.mss
匹配TCP MSS選項值,如果選項不存在,將不匹配,
關鍵字格式:
tcp.mss:<min>-<max>;
tcp.mss:[<|>]<number>;
tcp.mss:<value>;
示例規則:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (flow:stateless; flags:S,12; tcp.mss:<536; sid:1234; rev:5;)
6.4.5 tcp.hdr
粘貼緩沖區來匹配整個TCP報頭,
示例規則:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (flags:S,12; tcp.hdr; content:”|02 04|”; offset:20; byte_test:2,<,536,0,big,relative; sid:1234; rev:5;)
This example starts looking after the fixed portion of the header, so into the variable sized options. There it will look for the MSS option (type 2, option len 4) and using a byte_test determine if the value of the option is lower than 536. The tcp.mss option will be more efficient, so this keyword is meant to be used in cases where no specific keyword is available.
6.5. UDP Keywords
6.5.1. udp.hdr
粘貼緩沖區匹配整個UDP頭,
示例規則:
alert udp any any -> any any (udp.hdr; content:”|00 08|”; offset:4; depth:2; sid:1234; rev:5;)
這個例子匹配UDP頭部的length
欄位,在這里length
欄位的值是8,意思是沒有payload,也可以使用dsize:0;
來達到同樣的效果,
6.6. ICMP Keywords
ICMP (Internet Control Message Protocol) 是IP的一部分,在傳輸資料時,IP本身并不可靠(datagram資料報),ICMP在出現問題時給予反饋,它不能阻止問題的發生,但是可以幫助搞清楚何時發生了什么問題,如果可靠性是必須的,那么建立在IP之上的協議就得自己考慮可靠性,ICMP訊息被發送的情況有多種,例如,當目的不可達時,當沒有足夠的快取去轉發資料時,或者當一個資料報被分片發送但是不應該被分片發送時,等等,更多請參見message-types串列,
ICMP訊息中有4個重要內容可以與對應的ICMP關鍵字進行匹配,它們是:type,code,id和sequence,
6.6.1. itype
itype關鍵字用于匹配特定的ICMP型別(數字),ICMP有幾種型別的訊息,并且使用編號來表示每種訊息,不同的訊息因不同的名稱而不同,但更重要的是數字值,有關更多資訊,請參見帶有訊息型別和代碼的表,
itype關鍵詞的格式:
itype:min<>max;
itype:[<|>]<number>;
例子:(這個例子尋找一個大于10的ICMP型別)
itype:>10;
規則實體(Smurf攻擊):
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN Broadscan Smurf Scanner”; dsize:4; icmp_id:0; icmp_seq:0; itype:8; classtype:attempted-recon; sid:2100478; rev:4;)
以上規則用于病毒檢測,參考:https://baike.baidu.com/item/Smurf%E6%94%BB%E5%87%BB/9112141?fr=aladdin
下面列出了撰寫本文時已知的所有ICMP型別,最新的表格可以在IANA的網站上找到,
ICMP Type | Name |
---|---|
0 | Echo Reply |
3 | Destination Unreachable |
4 | Source Quench |
5 | Redirect |
6 | Alternate Host Address |
8 | Echo |
9 | Router Advertisement |
10 | Router Solicitation |
11 | Time Exceeded |
12 | Parameter Problem |
13 | Timestamp |
14 | Timestamp Reply |
15 | Information Request |
16 | Information Reply |
17 | Address Mask Request |
18 | Address Mask Reply |
30 | Traceroute |
31 | Datagram Conversion Error |
32 | Mobile Host Redirect |
33 | IPv6 Where-Are-You |
34 | IPv6 I-Am-Here |
35 | Mobile Registration Request |
36 | Mobile Registration Reply |
37 | Domain Name Request |
38 | Domain Name Reply |
39 | SKIP |
40 | Photuris |
41 | Experimental mobility protocols such as Seamoby |
6.6.2. icode
你可以使用icode關鍵字匹配特定的ICMP code,ICMP訊息的code闡明了該訊息,它與icmp型別一起指示您正在處理的問題型別,每個icmp型別的代碼都有不同的用途,
icode關鍵字格式:
icode:min<>max;
icode:[<|>]<number>;
示例:本示例查找大于5的ICMP code:
icode:>5;
規則中的icode關鍵字示例:
alert icmp $HOME_NET any -> $EXTERNAL_NET any (msg:”GPL MISC Time-To-Live Exceeded in Transit”; icode:0; itype:11; classtype:misc-activity; sid:2100449; rev:7;)
下面列出了所有ICMP型別的含義,表格中沒有列舉的ICMP code,表示只有一種ICMP type是0,它的含義如上表定義,意思是Echo Reply,最新的表格可以在IANA的網站上找到,
ICMP Code | ICMP Type | Description |
---|---|---|
3 | 0 | Net Unreachable |
3 | 1 | Host Unreachable |
3 | 2 | Protocol Unreachable |
3 | 3 | Port Unreachable |
3 | 4 | Fragmentation Needed and Don’t Fragment was Set |
3 | 5 | Source Route Failed |
3 | 6 | Destination Network Unknown |
3 | 7 | Destination Host Unknown |
3 | 8 | Source Host Isolated |
3 | 9 | Communication with Destination Network is Administratively Prohibited |
3 | 10 | Communication with Destination Host is Administratively Prohibited |
3 | 11 | Destination Network Unreachable for Type of Service |
3 | 12 | Destination Host Unreachable for Type of Service |
3 | 13 | Communication Administratively Prohibited |
3 | 14 | Host Precedence Violation |
3 | 15 | Precedence cutoff in effect |
5 | 0 | Redirect Datagram for the Network (or subnet) |
5 | 1 | Redirect Datagram for the Host |
5 | 2 | Redirect Datagram for the Type of Service and Network |
5 | 3 | Redirect Datagram for the Type of Service and Host |
9 | 0 | Normal router advertisement |
9 | 16 | Doesn’t route common traffic |
11 | 0 | Time to Live exceeded in Transit |
11 | 1 | Fragment Reassembly Time Exceeded |
12 | 0 | Pointer indicates the error |
12 | 1 | Missing a Required Option |
12 | 2 | Bad Length |
40 | 0 | Bad SPI |
40 | 1 | Authentication Failed |
40 | 2 | Decompression Failed |
40 | 3 | Decryption Failed |
40 | 4 | Need Authentication |
40 | 5 | Need Authorization |
6.6.3. icmp_id
你可以使用icmp_id關鍵字匹配特定的ICMP id值,每個icmp包在發送時都得到一個id,在接收方收到資料包的那一刻,它將使用相同的id發送回復,以便發送方能夠識別它并將其與正確的icmp請求連接起來,
icmp_id關鍵字的格式:
icmp_id:<number>;
示例:這個示例查找ICMP ID為0:
icmp_id:0;
規則中的icmp_id關鍵字示例:
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN Broadscan Smurf Scanner”; dsize:4; icmp_id:0; icmp_seq:0; itype:8; classtype:attempted-recon; sid:2100478; rev:4;)
6.6.4. icmp_seq
你可以使用icmp_seq關鍵字檢查ICMP序列號,ICMP訊息都有序列號,這對于檢查哪潭訓復訊息屬于哪條請求訊息非常有用(與id一起),
icmp_seq關鍵字的格式:
icmp_seq:<number>;
示例:這個示例查找ICMP序列為0:
icmp_seq:0;
規則中的icmp_seq示例:
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN Broadscan Smurf Scanner”; dsize:4; icmp_id:0; icmp_seq:0; itype:8; classtype:attempted-recon; sid:2100478; rev:4;)
6.6.5. icmpv6.hdr
粘貼緩沖區,以匹配整個ICMPv6報頭,
6.6.6. icmpv6.mtu
匹配ICMPv6 MTU可選值,如果MTU不存在,將不匹配,
關鍵字格式:
icmpv6.mtu:<min>-<max>;
icmpv6.mtu:[<|>]<number>;
icmpv6.mtu:<value>;
示例規則:
alert ip $EXTERNAL_NET any -> $HOME_NET any (icmpv6.mtu:<1280; sid:1234; rev:5;)
6.7. Payload Keywords
Payload關鍵詞檢查一個包或流的payload內容,
6.7.1. content
content關鍵字在簽名中非常重要,在引號之間,你可以寫上你希望簽名匹配的內容,最簡單的內容格式是:
content: "............";
可以在簽名中使用多個content,
內容在位元組上匹配,一個位元組有256個不同的值(0-255),你可以匹配所有字符; 從a到z,大寫和小寫以及所有特殊符號,但并不是所有的位元組都是可列印字符,對于這些位元組,可以使用十六進制表示法,許多編程語言使用0x00作為符號,其中0x表示它與二進制值有關,但是我們的規則語言使用|00|作為符號,這種表示法也可用于可列印字符,
例子:
|61| is a
|61 61| is aa
|41| is A
|21| is !
|0D| is carriage return
|0A| is line feed
有些字符不能在內容中使用,因為它們在簽名中已經作為重要的識別符號了,為了匹配這些字符,應該使用十六進制表示法,這些是:
" |22|
; |3B|
: |3A|
| |7C|
用大寫字母書寫十六進制表示法是一種慣例,
例如,要在簽名的內容中寫http://,你應該這樣寫:content:“http|3A|//”; 如果在簽名中使用十六進制表示法,請確保始終將其放在管道符(|)之間,否則,符號將被視為內容的一部分,
舉例:
content:"a|0D|bc";
content:"|61 0D 62 63|";
content:"a|0D|b|63|";
可以讓簽名檢查整個有效負載是否與內容匹配,或者讓簽名檢查有效負載的特定部分,這種情況我們稍后再談,如果沒有向簽名添加任何特殊內容,它將嘗試在有效負載的所有位元組中查找匹配項,
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;)
默認情況下,模式匹配是區分大小寫的,內容必須準確,否則將沒有匹配,
圖例:
可以使用!
除去content的例外情況:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"Outdated Firefox on
Windows"; content:"User-Agent|3A| Mozilla/5.0 |28|Windows|3B| ";
content:"Firefox/3."; distance:0; content:!"Firefox/3.6.13";
distance:-10; sid:9000000; rev:1;)
可以看到以上例子中的content:!"Firefox/3.6.13";
,它表示匹配到Firefox/3.
但不包括Firefox/3.6.13
時告警,
!注意:必須在內容中對下列字符進行轉義:
;
\
"
6.7.2. nocase
如果不想區分大寫和小寫字符,可以使用nocase,關鍵字nocase是一個content修飾符,
這個關鍵字的格式是:
nocase;
你必須把它放在你想修改的內容之后,比如:
content: "abc"; nocase;
nocase示例:
對簽名中的其他content不產生影響,
6.7.3. depth
depth
關鍵詞是一個絕對位置content修飾符,它在content之后出現,depth修飾符的值強制使用數字型別,例如:
depth:12;
depth之后的數字指定了從有效負載開始檢查的位元組數,
例子:
6.7.4. startsWith
關鍵字startswith類似于depth,它不接受引數,并且必須緊隨content關鍵字,它修飾content,以精確匹配緩沖區的開始位置,
例子:
content:"GET|20|"; startswith;
startswith是一個簡寫符號,等同于:
content:"GET|20|"; depth:4; offset:0;
startswith
不能與depth
,offset
,within
或者distance
在同一pattern中混用,
6.7.5. endswith
endswith
關鍵字類似于isdataat:!1,relative;
,它不接受引數,并且必須跟在content關鍵字之后,它修飾content
以精確匹配緩沖區的末尾,
例子:
content:".php"; endswith;
endswith是一個簡寫符號,等同于:
content:".php"; isdatat:!1,relative;
endswith
不能和offset
, within
或者 distance
在同一pattern中混用,
6.7.6. offset
offset關鍵字指定將從哪個位元組檢查有效負載以查找匹配,例如:offset:3; 檢查第四個以及之后的位元組,
關鍵字偏移和深度可以結合使用,經常一起使用,
例如:
content:"def"; offset:3; depth:3;
如果在簽名中使用了它,它將檢查從第3位元組到第6位元組的有效負載,
6.7.7. distance
TODO
6.7.8. within
TODO
6.7.9. isdataat
TODO
6.7.10. bsize
TODO
6.7.11. dsize
使用dsize關鍵字,你可以匹配資料包有效負載的大小,例如,你可以使用關鍵字來查找有效載荷的例外大小,這可以方便地檢測緩沖區溢位,
格式:
dsize:<number>;
規則中dsize的例子:
alert udp $EXTERNAL_NET any -> $HOME_NET 65535 (msg:”GPL DELETED EXPLOIT LANDesk Management Suite Alerting Service buffer overflow”; dsize:>268; reference: bugtraq,23483; reference: cve,2007-1674; classtype: attempted-admin; sid:100000928; rev:1;)
6.7.12. byte_test
TODO
6.7.13. byte_math
TODO
6.7.14. byte_jump
TODO
6.7.15. byte_extract
TODO
6.7.16. rpc
rpc關鍵字可用于在SUNRPC呼叫中匹配rpc程序號和rpc版本,
你可以通過使用通配符修改關鍵字,用*定義,使用這個通配符你可以匹配所有版本號和/或程序號,
遠程程序呼叫(Remote Procedure Call)是允許計算機程式在另一臺計算機(或地址空間)上執行程序的應用程式,它用于行程間通信,參見:http://en.wikipedia.org/wiki/Inter-process_communication
格式:
rpc:<application number>, [<version number>|*], [<procedure number>|*]>;
規則中rpc關鍵字的例子:
alert udp $EXTERNAL_NET any -> $HOME_NET 111 (msg:”RPC portmap request yppasswdd”; rpc:100009,*,*; reference:bugtraq,2763; classtype:rpc-portmap-decode; sid:1296; rev:4;)
6.7.17. replace
TODO
6.7.18. pcre (Perl Compatible Regular Expressions)
TODO
6.7.18.1. Suricata’s modifiers
TODO
6.8. Transformations(轉換)
TODO
6.9. Prefiltering Keywords(前置篩選關鍵詞)
TODO
6.10. Flow Keywords
6.10.1. flowbits
Flowbits由兩部分組成,第一部分描述了它將要執行的動作,第二部分是flowbit的名稱,
有多個包屬于一個流,Suricata將這些流保存在記憶體中,有關更多資訊,請參見Flow Settings,例如,當兩個不同的包匹配時,Flowbits可以確保生成警報,只有當兩個資料包匹配時,才會生成警報,因此,當第二個資料包匹配時,Suricata必須知道第一個資料包是否也匹配,Flowbits在包匹配時標記流,因此Suricata“知道”在第二個包匹配時也應該生成警報,
flowbits有不同的action,它們是:
- flowbits: set, name
將設定流中的條件/“name”(如果存在), - flowbits: isset, name
可以在規則中使用,以確保在規則匹配并在流中設定條件時生成警報, - flowbits: toggle, name
反轉當前設定,例如,如果一個條件被設定,它將被取消設定,反之亦然, - flowbits: unset, name
可用于在流中取消設定條件, - flowbits: isnotset, name
可以在規則中使用,以確保在匹配時生成警報,并且在流中沒有設定條件, - flowbits: noalert
此規則不會生成任何警報,
例子:
當你看第一個規則時,你會注意到當它匹配時,如果它不是以“flowbits: noalert”結尾的話,就會生成一個警告,這個規則的目的是檢查’ userlogin '上的匹配,并在流中標記它,因此不需要生成警報,如果沒有第一條規則,第二條規則就不起作用,如果第一個規則匹配,則流位將該特定條件設定為出現在流中,現在有了第二個規則,可以檢查前一個資料包是否滿足第一個條件,如果此時第二個規則匹配,將生成一個警告,
可以在規則中多次使用flowbits,并組合不同的函式,
6.10.2. flow
flow關鍵詞可以用來匹配flow的方向,例如:to/from client or to/from server,它還可以匹配是否建立了流,flow關鍵字還可以用來表示簽名只能在流(only_stream)或資料包(no_stream)上匹配,
所以,通過flow關鍵字你可以匹配:
- to_client
匹配從服務器到客戶端的資料包, - to_server
匹配從客戶端到服務器的資料包, - from_client
匹配從客戶機到服務器的資料包(與to_server相同), - from_server
匹配從服務器到客戶機的資料包(與to_client相同), - established
匹配已建立的連接, - not_established
匹配不屬于已建立連接的包, - stateless
匹配屬于或不屬于已建立連接的資料包, - only_stream
匹配已由流引擎重新組裝的資料包, - no_stream
匹配未被流引擎重新組裝的資料包,將不匹配已重新組裝的包, - only_frag
匹配從片段中重新組裝的包, - no_frag
匹配沒有從片段中重新組裝的包,
可以組合多個流選項,例如:
flow:to_client, established
flow:to_server, established, only_stream
flow:to_server, not_established, no_frag
連接是否建立的評定依賴于具體協議:
- 對于TCP,在三次握手之后將建立連接,
- 對于其他協議(例如UDP),在看到來自連接兩端的流量后,將認為連接已經建立,
6.10.3. flowint
Flowint允許使用變數進行存盤和數學操作,它的操作方式很像flowbits,但是增加了數學能力,而且可以存盤和操作整數,而不僅僅是標記集,我們可以將其用于許多非常有用的事情,比如計數出現次數、添加或減去出現次數,或者在一個流中針對多個因素進行閾值設定,這將很快擴展到全域背景關系,因此用戶可以在流之間執行這些操作,
語法如下:
flowint: name, modifier[, value];
定義一個變數(不是必需的),或者檢查是否設定了它,
flowint: name, < +,-,=,>,<,>=,<=,==, != >, value;
flowint: name, (isset|isnotset);
比較或更改一個變數,可用操作包括:添加,減去,比較大于或小于,大于或等于,和小于或等于,要比較的項可以是整數或另一個變數,
例如,如果您想計算用戶名在特定流中出現的次數,并在超過5時發出警報,
alert tcp any any -> any any (msg:"Counting Usernames"; content:"jonkman"; \
flowint: usernamecount, +, 1; noalert;)
這將計算每次出現的次數,并增加變數 usernamecount,而不會為每次出現生成警告,
現在,假設我們想在流中出現超過5次點擊時生成一個警報,
alert tcp any any -> any any (msg:"More than Five Usernames!"; content:"jonkman"; \
flowint: usernamecount, +, 1; flowint:usernamecount, >, 5;)
只有當usernamecount超過5時,我們才會得到警告,
現在,我們想要得到如上警告,但考慮到在統計的期間如果用戶名退出的情況更多,就不會出現,假設這個特定的協議使用“jonkman logout”字樣指示登出,讓我們試試:
alert tcp any any -> any any (msg:"Username Logged out"; content:"logout jonkman"; \
flowint: usernamecount, -, 1; flowint:usernamecount, >, 5;)
此時,只有當用戶名的活動登錄超過5時,我們才會收到警告,
這是一個相當簡單的示例,但我相信它展示了這樣一個簡單函式對于撰寫規則的強大功能,我看到過很多類似于登錄跟蹤、IRC狀態機、惡意軟體跟蹤和暴力登錄檢測的應用程式,
假設我們正在跟蹤一個通常允許每個連接5次登錄失敗的協議,但是我們有一個漏洞,攻擊者可以在嘗試5次之后繼續登錄,我們需要知道這一點,
alert tcp any any -> any any (msg:"Start a login count"; content:"login failed"; \
flowint:loginfail, notset; flowint:loginfail, =, 1; noalert;)
以上,我們檢測如果變數尚未設定,就將其設定為1,這是我們的第一次命中,
alert tcp any any -> any any (msg:"Counting Logins"; content:"login failed"; \
flowint:loginfail, isset; flowint:loginfail, +, 1; noalert;)
如果已經設定好了,我們現在就對計數器進行遞增,
alert tcp any any -> any any (msg:"More than Five login fails in a Stream"; \
content:"login failed"; flowint:loginfail, isset; flowint:loginfail, >, 5;)
現在,如果在同一流中出現5次登錄失敗,我們將生成一個警報,
但是,如果有兩次成功的登錄和一次失敗的登錄,我們還需要警告,
alert tcp any any -> any any (msg:"Counting Good Logins"; \
content:"login successful"; flowint:loginsuccess, +, 1; noalert;)
這里我們計算了良好的登錄次數,現在我們將計算與失敗相關的良好登錄次數:
alert tcp any any -> any any (msg:"Login fail after two successes"; \
content:"login failed"; flowint:loginsuccess, isset; \
flowint:loginsuccess, =, 2;)
以下是一些常見的例子:
alert tcp any any -> any any (msg:"Setting a flowint counter"; content:"GET"; \
flowint:myvar, notset; flowint:maxvar,notset; \
flowint:myvar,=,1; flowint: maxvar,=,6;)
alert tcp any any -> any any (msg:"Adding to flowint counter"; \
content:"Unauthorized"; flowint:myvar,isset; flowint: myvar,+,2;)
alert tcp any any -> any any (msg:"when flowint counter is 3 create new counter"; \
content:"Unauthorized"; flowint:myvar, isset; flowint:myvar,==,3; \
flowint:cntpackets,notset; flowint:cntpackets, =, 0;)
alert tcp any any -> any any (msg:"count the rest without generating alerts"; \
flowint:cntpackets,isset; flowint:cntpackets, +, 1; noalert;)
alert tcp any any -> any any (msg:"fire this when it reach 6"; \
flowint: cntpackets, isset; \
flowint: maxvar,isset; flowint: cntpackets, ==, maxvar;)
6.10.4. stream_size
流大小選項根據按序列號注冊的位元組量匹配流量,這個關鍵字有幾個修飾詞:
> greater than
< less than
= equal
!= not equal
>= greater than or equal
<= less than or equal
格式:
stream_size:<server|client|both|either>, <modifier>, <number>;
規則中的流大小關鍵字示例:
alert tcp any any -> any any (stream_size:both, >, 5000; sid:1;)
6.11. Bypass 關鍵詞
Suricata有一個bypass
關鍵字,可以在簽名中使用,以從進一步的計算中排除流量,
bypass
關鍵字在大流量的環境下(如Netflix, Spotify, Youtube)很有用,
bypass
關鍵字被認為是一個賽后關鍵字,
6.11.1. bypass
繞過匹配http流量的流,
例子:
alert http any any -> any any (content:"suricata-ids.org"; \
http_host; bypass; sid:10001; rev:1;)
6.12. HTTP 關鍵詞
TODO
6.13. 檔案關鍵詞
Suricata提供了幾個規則關鍵字來匹配不同的檔案屬性,它們依賴于正確配置的File Extraction,
6.13.1. filename
匹配檔案名,
語法:
filename:<string>;
例子:
filename:"secret";
6.13.2. fileext
匹配檔案名的擴展名,
語法:
fileext:<string>;
例子:
fileext:"jpg";
6.13.3. filemagic
匹配libmagic回傳的關于檔案的資訊,
語法:
filemagic:<string>;
例子:
filemagic:"executable for MS Windows";
注意:由于不同安裝的libmagic版本不同,回傳的資訊也可能略有變化,參見#437,
6.13.4. filestore
如果簽名匹配,則將檔案存盤到磁盤,
語法:
filestore:<direction>,<scope>;
direction(方向)可以是:
- request/to_server: store a file in the request / to_server direction
- response/to_client: store a file in the response / to_client direction
- both: store both directions
scope(范圍)可以是:
- file: only store the matching file (for filename,fileext,filemagic matches)
- tx: store all files from the matching HTTP transaction
- ssn/flow: store all files from the TCP session/flow.
如果省略方向和范圍,方向將與規則相同,范圍將是每個檔案,
6.13.5. filemd5
使用MD5校驗和串列里匹配檔案MD5,
語法:
filemd5:[!]filename;
這個filename被擴展用以包含特定的規則檔案夾,它的默認值是:/etc/suricata/rules/filename,在filename前加感嘆號表示取反匹配,這可以用做白名單,
例子:
filemd5:md5-blacklist;
filemd5:!md5-whitelist;
規則檔案格式:
這個MD5規則檔案的格式簡單,它是文本型別,在每行的頂頭使用md5哈希表示一條規則,如果這一行中還有其他的附加資訊,會被忽略,
規則檔案內容使用md5sum工具的輸出結果是可以的:
2f8d0355f0032c3e6311c6408d7c2dc2 util-path.c
b9cf5cf347a70e02fde975fc4e117760 util-pidfile.c
02aaa6c3f4dbae65f5889eeb8f2bbb8d util-pool.c
dd5fc1ee7f2f96b5f12d1a854007a818 util-print.c
只有MD5也是可以的:
2f8d0355f0032c3e6311c6408d7c2dc2
b9cf5cf347a70e02fde975fc4e117760
02aaa6c3f4dbae65f5889eeb8f2bbb8d
dd5fc1ee7f2f96b5f12d1a854007a818
記憶體要求:
每個MD5使用16位元組記憶體,2000萬個MD5大約需要使用310MIB記憶體,
參見:https://blog.inliniac.net/2012/06/09/suricata-md5-blacklisting/
6.13.6. filesha1
使用SHA1校驗和串列里匹配檔案SHA1,
語法:
filesha1:[!]filename;
這個filename被擴展用以包含特定的規則檔案夾,它的默認值是:/etc/suricata/rules/filename,在filename前加感嘆號表示取反匹配,這可以用做白名單,
例子:
filesha1:sha1-blacklist;
filesha1:!sha1-whitelist;
檔案格式:
跟上述md5檔案格式相同
6.13.7. filesha256
使用SHA256校驗和串列里匹配檔案SHA256 ,
語法:
filesha256:[!]filename;
這個filename被擴展用以包含特定的規則檔案夾,它的默認值是:/etc/suricata/rules/filename,在filename前加感嘆號表示取反匹配,這可以用做白名單,
例子:
filesha256:sha256-blacklist;
filesha256:!sha256-whitelist;
檔案格式:
跟上述md5檔案格式相同
6.13.8. filesize
匹配正在傳輸的檔案的大小,
語法:
filesize:<value>;
可能的單位是KB, MB和GB,如果沒有任何單位,默認是位元組,
例子:
filesize:100; # exactly 100 bytes
filesize:100<>200; # greater than 100 and smaller than 200
filesize:>100MB; # greater than 100 megabytes
filesize:<100MB; # smaller than 100 megabytes
對于那些由于 丟包或者達到了stream.reassembly.depth
規定的上限 而沒有被完全跟蹤的檔案,此時只會使用大于
進行檢查,這是因為Suricata可以知道一個檔案大于一個值(它已經看到了其中的一些),但它不能知道最終大小是否在一個范圍內,一個確切的值或小于一個值,
6.14. DNS 關鍵詞
未完待續,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295565.html
標籤:其他