主頁 >  其他 > Suricata/Snort規則參考

Suricata/Snort規則參考

2021-08-23 06:44:27 其他

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規則檔案解釋了如何讀懂規則、按需調整規則以及創建一個新規則等所有特征相關的方面,

一條規則/特征包括如下部分:

  1. 動作(action),用來決定當特征匹配成功后如何處理,
  2. 頭資訊(header),定義應用規則的協議、IP地址、埠和方向,
  3. 規則選項(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關鍵字幾乎每次都伴隨著revrev代表簽名的版本,如果簽名被修改,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-attackclasstype的規則將被分配優先級1,并且告警將包含’Web Application Attack’:

classtypeAlertPriority
web-application-attackWeb Application Attack1
not-suspiciousNot Suspicious Traffic3

我們接下來的例子也有一個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 OptionDescription
rrRecord Route
eolEnd of List
nopNo Op
tsTime Stamp
secIP Security
esecIP Extended Security
lsrrLoose Source Routing
ssrrStrict Source Routing
satidStream Identifier
anyany 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;

因此,您可以使用以下內容來明確您想要匹配的方向:

OptionDescription
bothBoth directions have to match with the given geoip(s)
anyOne of the directions has to match with the given geoip(s).
destIf the destination matches with the given geoip.
srcThe 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 TypeName
0Echo Reply
3Destination Unreachable
4Source Quench
5Redirect
6Alternate Host Address
8Echo
9Router Advertisement
10Router Solicitation
11Time Exceeded
12Parameter Problem
13Timestamp
14Timestamp Reply
15Information Request
16Information Reply
17Address Mask Request
18Address Mask Reply
30Traceroute
31Datagram Conversion Error
32Mobile Host Redirect
33IPv6 Where-Are-You
34IPv6 I-Am-Here
35Mobile Registration Request
36Mobile Registration Reply
37Domain Name Request
38Domain Name Reply
39SKIP
40Photuris
41Experimental 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 CodeICMP TypeDescription
30Net Unreachable
31Host Unreachable
32Protocol Unreachable
33Port Unreachable
34Fragmentation Needed and Don’t Fragment was Set
35Source Route Failed
36Destination Network Unknown
37Destination Host Unknown
38Source Host Isolated
39Communication with Destination Network is Administratively Prohibited
310Communication with Destination Host is Administratively Prohibited
311Destination Network Unreachable for Type of Service
312Destination Host Unreachable for Type of Service
313Communication Administratively Prohibited
314Host Precedence Violation
315Precedence cutoff in effect
50Redirect Datagram for the Network (or subnet)
51Redirect Datagram for the Host
52Redirect Datagram for the Type of Service and Network
53Redirect Datagram for the Type of Service and Host
90Normal router advertisement
916Doesn’t route common traffic
110Time to Live exceeded in Transit
111Fragment Reassembly Time Exceeded
120Pointer indicates the error
121Missing a Required Option
122Bad Length
400Bad SPI
401Authentication Failed
402Decompression Failed
403Decryption Failed
404Need Authentication
405Need 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

標籤:其他

上一篇:一種linux平臺下演算法庫二進制檔案加密方法探討

下一篇:政策解讀 | 杜絕“大資料殺熟” 《個人資訊保護法》來了

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more