Suricata
- Suricata
- 一、什么是suricata
- 二、安裝
- 三、規則分析
- 四、meta關鍵字
- 五、IP關鍵字
- 六、TCP關鍵字
- 七、UDP關鍵字
- 八、Payload關鍵字
- 九、Prefiltering關鍵字
- 十、flow關鍵字
- 十一、Bypass關鍵字
- 十二、http關鍵字
- uri與url
- 1、http_method
- 2、http_uri/http_raw_uri
- 3、uricontent
- 4、urilen
- 5、http.protocol
- 6、http.request_line
- 7、http.header / http.header.raw
- 8、http.cookie
- 9、http.user_agent
- 10、http.accept
- 11、http.accent_enc
- 12、http.accept_lang
- 13、http.connection
- 14、http.content_type
- 15、http.content_len
- 16、http_referer
- 17、http.start
- 18、http.header_names
- 19、http.request_body
- 20、http.stat_code
- 21、http.stat_msg
- 22、http.response_line
- 23、http.response_body
- 24、http.server
- 25、http.location
- 26、http.host and http.host.raw
- 27、file_data
一、什么是suricata
Suricata是一個高性能的檢測系統(IDS)、預防系統(IPS)和網絡安全監控(NSM)的引擎。它是開源的,由一個社區經營的非營利基金會開放信息安全基金會(OISF)擁有。Suricata由OISF開發。
IDS/IPS
IDS:檢測系統(Intrusion detection system,簡稱“IDS”)是一種對網絡傳輸進行即時監視,根據預設的策略,在發現可疑傳輸時發出警報
IPS:預防系統(Intrusion prevention system,簡稱“IPS”)是一部能夠監視網絡或網絡設備的網絡資料傳輸行為的計算機網絡安全設備,一般位於防火牆和網絡的設備之間,能夠即時的中斷、調整或隔離一些不正常或是具有傷害性的網絡資料傳輸行為。
IPS相對於IDS主能提供了中斷防御功能。
二、安裝
Ubuntu下:
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt-get update
sudo apt-get install suricata
三、規則分析
案例:
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、action(動作)
drop為action(動作)
- pass
Suricata將停止掃描數據包並跳到所有規則的末尾(僅針對當前數據包)
- drop
這只涉及IPS/inline模式。如果程序找到匹配的包含drop的簽名,它將立即停止。數據包將不再發送。缺點:接收器沒有接收到正在發生的事情的消息,從而導致超時(當然是TCP)。Suricata為此數據包生成警報。
- reject
這是對數據包的主動拒絕。接收端和發送端都接收到拒絕數據包。有兩種類型的拒絕數據包將被自動選擇。如果有問題的數據包與TCP有關,它將是一個重置數據包。對於所有其他協議,它將是一個ICMP錯誤包。Suricata也會生成警報。當處於inline/ips模式時,違規數據包也將像“drop”操作一樣被刪除
- alert
如果簽名匹配並包含alert,則該數據包將被視為任何其他非威脅性數據包,但此數據包除外,Suricata將生成警報。只有系統管理員才能注意到此警報。
2、Protocol(協議)
tcp為Protocol(協議)
TCP(用於TCP通信)
UDP協議
ICMP
ip(ip代表“all”或“any”)
應用層協議:
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 (depends on rust availability)
ikev2 (depends on rust availability)
krb5 (depends on rust availability)
ntp (depends on rust availability)
dhcp (depends on rust availability)
3、源/目的地
$HOME_NET 來源地
$EXTERNAL_NET 目的地
可選參數:
../.. IP ranges (CIDR notation)
! exception/negation
[.., ..] grouping
例子:
$HOME_NET yaml配置文件中的 HOME_NET
[$EXTERNAL_NET, !$HOME_NET] 配置文件中的EXTERNAL_NET 以及非HOME_NET
! 1.1.1.1 除了1.1.1.1外的任意IP
4、port(端口)
any 為port(端口),第一個為源地址的端口,第二個為目標地址的端口
可選參數:
: 端口系列
! 除...外
[.., ..] 組內所有端口
例子:
[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的其他端口
5、direction(方向)
-> 為direction(方向)
只有方向與簽名中相同的數據報才能匹配
可選參數:
source -> destination 源到目標,單向匹配
source <> destination 雙向都匹配
6、其它規則參數
其他規則參數
規則的其余部分由選項組成。它們用括號括起來,用分號分隔。有些選項具有設置(例如 msg ,由選項的關鍵字、冒號和設置指定。其他的沒有設置,只是關鍵字(例如 nocase )
<k>:<settings>; 有設置的規則
<k>; 無設置的規則
注意:
在suricata中,`;`和`"`都有特殊的含義,所以在規則setting中使用必須轉義,使用`\`對其進行轉義
例如: msg:"hhhhh\;"
四、meta關鍵字
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、msg(message)
一般,簽名的第一部分都大寫,並且顯示簽名的類型。
一般,msg都放在簽名的第一部分
msg:"ET TROJAN Likely Bot Nick in IRC (USA +..)";
2、sid(signature ID)
sid給每一個簽名一個id,一般放在簽名的末尾處
3、rev(revision)
rev表示簽名的版本。如果修改了簽名,則簽名編寫器將增加Rev的數量。sid通常與rev一起使用
一般而言,sid在rev之前,它們是簽名的最后兩個
4、 gid (group ID)
gid關鍵字可用於為不同的簽名組提供另一個ID值(如在sid中)。Suricata默認使用gid 1。可以修改這個。它將被改變是不常見的,改變它沒有技術上的影響。您只能在警報中注意到它。
下面例子中,[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
5、classtype
classtype給出規則和警告的類型信息。它由一個短名稱、一個長名稱和一個優先級組成。對於每個類類型,classification.config都有一個優先級,該優先級將在規則中使用。
通常classtype在sid和rev之前,在其他關鍵字之后
drop tcp $HOME_NET any -> $EXTERNAL_NET any (......; classtype:trojan-activity; sid:2008124; rev:2;)
6、reference
引用關鍵字直接指向可以找到有關簽名和簽名試圖解決的問題的信息的位置。引用關鍵字可以在簽名中多次出現。這個關鍵字是為那些調查簽名匹配原因的簽名作者和分析人員准備的。格式如下:
reference:type,reference
e.g.
reference: url, www.info.com
reference: cve, CVE-2014-1234
7、priority(優先級)
priority關鍵字帶有一個強制數字值,該值的范圍為1到255數字1到4最常用。優先權更高的簽名將首先被檢查。最高優先級是1。通常簽名已經通過ClassType具有優先級。這可以通過關鍵字優先級來克服。優先級格式為
priority:1;
8、metadata
metadata關鍵字允許在簽名中添加其他非功能性信息。盡管沒有格式要求,建議使用key value
方式
metadata:key value;
metadata:key value, key value;
9、target
target關鍵字允許規則編寫器指定警報的哪一側是攻擊的目標。如果指定,則會增強警報事件以包含有關源和目標的信息
target:src_ip;
五、IP關鍵字
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;)
1、ttl
TTL關鍵字用於檢查數據包頭中的特定IP生存時間值。生存時間值決定了包在Internet系統中的最大時間量。如果此字段設置為0,則必須銷毀數據包。格式為:
ttl:<number>
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: <IP Option>
e.g.
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;)
3、sameip
每個包都有一個源IP地址和一個目標IP地址,源IP和目標IP可以相同,sameip可以檢查源的IP地址是否與目標的IP地址相同
sameip
4、ipopts
https://www.osgeo.cn/suricata/rules/header-keywords.html#ip-proto
使用ip_proto關鍵字,您可以在包頭的ip協議上進行匹配。您可以使用協議的名稱或編號。
5、id
ID標識由主機發送的每個數據包,並且通常隨發送的每個數據包一起遞增。
IP ID用作片段標識號。每個數據包都有一個IP ID,當數據包碎片化時,該數據包的所有碎片都有相同的ID。這樣,數據包的接收者就知道哪些碎片屬於同一個數據包。
id:<number>;
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET DELETED F5 BIG-IP 3DNS TCP Probe 1”; id: 1; dsize: 24;......;)
6、geoip
https://suricata.readthedocs.io/en/suricata-5.0.2/rules/header-keywords.html#geoip
geoip關鍵字使(您)能夠匹配網絡流量的源、目標或源和目標IPv4地址,並查看它屬於哪個國家。
geoip: src, RU;
geoip: both, CN, RU;
geoip: dst, CN, RU, IR;
geoip: both, US, CA, UK;
geoip: any, CN, IR;
7、fragbits (IP fragmentation)
使用fragbits關鍵字,可以檢查IP頭中是否設置了碎片和保留位。fragbits關鍵字應放在規則的開頭。fragbits用於修改碎片機制。在將消息從一個Internet模塊路由到另一個模塊的過程中,可能會出現數據包大於網絡可以處理的最大數據包大小的情況。在這種情況下,包可以以片段形式發送。
M - More Fragments
D - Do not Fragment
R - Reserved Bit
e.g.
alert tcp$external_net any->$home_net any(msg:“et exploit invalid non-fragmented packet with fragment offset>0”; fragbits: M; ......;)
8、fragoffset
使用fragoffset關鍵字,可以匹配IP片段偏移字段的特定十進制值。如果要檢查會話的第一個片段,則必須將fragoffset 0與more fragment選項組合在一起。碎片偏移場便於重新組裝。
ID用於確定哪些片段屬於哪個包,碎片偏移字段澄清片段的順序。
9、tos
TOS關鍵字可以匹配IP頭TOS字段的特定十進制值。TOS關鍵字的值可以是0-255
tos:[!]<number>;
六、TCP關鍵字
1、seq
seq關鍵字可以在簽名中用於檢查特定的TCP序列號。序列號實際上是由TCP連接的兩個端點隨機生成的數字。客戶機和服務器都創建了一個序列號,序列號隨着發送的每個字節的增加而增加。所以兩邊的序列號是不同的。連接兩側必須確認此序列號。TCP通過序列號處理確認、排序和重傳。它的數目隨着發送方發送的每個數據字節的增加而增加。seq幫助跟蹤字節所屬的數據流中的位置。如果syn標志設置為1,那么數據第一個字節的序列號就是這個數字加1
2、ack
ACK是對接收到TCP連接另一端發送的所有以前(數據)字節的確認。在大多數情況下,TCP連接的每個包在第一個SYN之后都有一個ACK標志,ACK號隨着每個新數據字節的接收而增加。ACK關鍵字可用於簽名中,以檢查特定的TCP確認號。
3、window
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;)
4、tcp.mss
匹配tcp mss選項值。如果選項不存在,將不匹配
tcp.mss:<min>-<max>;
tcp.mss:[<|>]<number>;
tcp.mss:<value>;
e.g.
alert tcp $EXTERNAL_NET any -> $HOME_NET any (flow:stateless; flags:S,12; tcp.mss:<536; sid:1234; rev:5;)
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;)
七、UDP關鍵字
1、udp.hdr
在整個UDP頭上匹配的粘性緩沖區。
alert udp any any -> any any (udp.hdr; content:”|00 08|”; offset:4; depth:2; sid:1234; rev:5;)
八、Payload關鍵字
1、content
在引號之間,你可以寫上你希望簽名匹配的內容。
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;)
如果Firefox的版本不是3.6.13就會生成警告
2、nocase
不區分大小寫,nocase為content的修飾符,不需要跟參數
content: "abc"; nocase; 修飾前面最近的一個content,不區分大小寫
3、depth
絕對內容修飾符。它在content之后,深度內容修飾符帶有一個強制的數字值
depth:3
如圖,深度為3,content就無法匹配到def,只能匹配到abc
4、startswith
content的修飾符,不需要跟參數,匹配content 以...開頭
startswith
不能與 depth
, offset
, within
或 distance
混合使用
content:"GET|20|"; startswith; 匹配內容以`GET|20|`開頭
等價於
content:"GET|20|"; depth:4;offset:0;
5、endswith
content的修飾符,不需要跟參數,匹配content 以...結尾
endswith
不能和 offset
, within
或 distance
混合使用
content:".php"; endswith;
等價於
content:".php";isdatat:!1,relative
6、offset
offset關鍵字指定從哪個字節檢查有效負載以查找匹配。例如,偏移量:3;檢查第四個字節並進一步檢查。
content:"def";offset:3;depth:3;
7、distance
從上一次匹配之后的任意位置開始n個字節出匹配
1)第一次匹配abc,下一次匹配起始點為c后任意個數字符
2)distance起始匹配位置c后任意個數字符,然后匹配def
3)distance可以為負數,能夠用來匹配之前的內容是否匹配
8、within
檢查第二個content是否在第一個content的n距離范圍內
within和distance聯合使用,判斷第二個content是否在第一個content+within個字節范圍內
如下圖所示
9、isdataat
查看負載的特定部分是否仍有數據
isdataat:512; # 負載的512字節位置上,時候有數據
isdataat:8,relative; # 相對一上一次匹配位置開始的n個字節上是否有數據
10、bsize
使用bsize關鍵字,可以匹配緩沖區的長度。這增加了內容匹配的精度,以前這可以用isdataat完成
bsize:<number>;
11、dsize
使用dsize關鍵字,可以匹配數據包負載的大小。
dsize:<number>;
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;)
12、byte_test
https://suricata.readthedocs.io/en/suricata-5.0.2/rules/payload-keywords.html#byte-test
byte_test:<num of bytes>, [!]<operator>, <test value>, <offset> [,relative][,<endian>][, string, <num type>][, dce][, bitmask <bitmask value>];
13、byte_jump
https://www.osgeo.cn/suricata/rules/payload-keywords.html#byte-jump
14、byte_extract
https://www.osgeo.cn/suricata/rules/payload-keywords.html#byte-extract
15、rpc
rpc(遠程過程調用)是允許計算機程序在另一台計算機(或地址空間)上執行過程的應用程序。用於進程間通信。
rpc關鍵字可用於在sunrpc調用中匹配rpc過程號和rpc版本。用*定義的通配符可以匹配所有版本號和/或過程號。
rpc:<application number>, [<version number>|*], [<procedure number>|*]>;
16、replace
17、pcre (Perl Compatible Regular Expressions)
https://www.osgeo.cn/suricata/rules/payload-keywords.html#suricata-s-modifierss
關鍵字pcre匹配特定於正則表達式
pcre的復雜性帶來了很高的價格:它對性能有負面影響。因此,為了減少對pcre的經常檢查,pcre主要與“內容”結合使用。在這種情況下,必須先匹配內容,然后才能檢查pcre。
pcre:"/<regex>/opts";
pcre: "/<regex>/i";
i 不區分大小寫
s 檢查換行符
m 可以使一行(有效負載)計為兩行
A 模式必須在緩沖區的開頭匹配
E 忽略緩沖區/負載末尾的換行符
G 反貪婪
九、Prefiltering關鍵字
https://www.osgeo.cn/suricata/rules/prefilter-keywords.html
1、fast_pattern
content:"Badness"; distance:0; fast_pattern;
2、prefilter
alert ip any any -> any any (ttl:123; prefilter; content:"a"; sid:1;)
十、flow關鍵字
1、flowbits
存在屬於一個流的多個數據包,suricata會將這些信息保存在內存中。只有當兩個數據包匹配時才會生成警報。因此,當第二個包匹配時,Suricata必須知道第一個包是否也是匹配的。如果一個包匹配,那么FlowBits會標記該流,因此當第二個包匹配時,它會生成一個警報。
flowbits: set, name
如果flow中存在,就會設置 條件/名字
flowbits: isset, name
可以在規則中使用,以確保當規則匹配並且在流中設置了條件時,它會生成警報
flowbits: toggle, name
反轉當前設置。因此,例如,如果設置了某個條件,它將被取消設置,反之亦然。
flowbits: unset, name
可用於取消設置flow中的條件
flowbits: isnotset, name
可以在規則中使用,以確保它在匹配且flow中未設置條件時生成警報。
flowbits: noalert
此規則不會生成警報
2、flow
Flow關鍵字可用於匹配流的方向,例如to/from客戶端或to/from服務器。它還可以匹配是否建立了流。流關鍵字還可以用來表示簽名必須只在流上匹配(只在流上匹配)或只在包上匹配(不在流上匹配)。
to_client
在從服務器到客戶端的數據包上匹配
to_server
在從客戶端到服務器的數據包上匹配
from_client
在從客戶端到服務器的數據包上匹配(等同於to_server)
from_server
在從服務器到客戶端的數據包上匹配 (等同於to_client)
established
匹配已建立的連接
not_established
匹配不屬於已建立連接的數據包
stateless
匹配屬於或不屬於已建立連接的數據包
only_stream
匹配流引擎重新組裝的數據包
no_stream
匹配流引擎未重新組裝的數據包。與重新組裝的數據包不匹配
only_frag
匹配從片段中重新組裝的數據包
no_frag
匹配未從片段重新組合的數據包
e.g.
flow:to_client, established
flow:to_server, established, only_stream
flow:to_server, not_established, no_frag
3、flowint
4、stream_size
十一、Bypass關鍵字
1、bypass
在匹配的HTTP流量上繞過流
e.g.
alert http any any -> any any (content:"suricata-ids.org"; http_host; bypass; sid:10001; rev:1;)
十二、http關鍵字
uri與url
<img
1、http_method
修飾content,表示content只能在HTTP方法緩沖區上匹配
http_method:GET
, POST
, PUT
, HEAD
, DELETE
, TRACE
, OPTIONS
, CONNECT
and PATCH
content:"GET";http_method;
2、http_uri/http_raw_uri
http_uri <===> http.uri
與 http_uri
以及 http_raw_uri
內容修飾符,可以專門匹配,並且只能在請求URI緩沖區上匹配。
URI在Suricata中有兩種外觀:原始URI和規范化URI。空格用十六進制%20表示這是個規范化的uri
.png)
3、uricontent
效果與http_uri
相同,雖然仍然支持,但是不推薦使用。
content:"/frame.html?";http_uri
等價於
uricontent:"/frame.html?"
4、urilen
urilen用來匹配uri長度
urilen:number;
5、http.protocol
http_protocol <====> http.protocol
protocol從http請求或響應行檢查協議字段。如果請求行是“GET/HTTP/1.0rn”,則此緩沖區將包含“HTTP/1.0”。
alert http any any -> any any (flow:to_server; http.protocol; content:"HTTP/1.0"; sid:1;)
6、http.request_line
http_request_line強制檢查整個HTTP請求行
alert http any any -> any any (http_request_line; content:"GET / HTTP/1.0"; sid:1;)
7、http.header / http.header.raw
匹配HTTP header 緩存區所有信息,除了那些有專門文本修飾符的(http.cookie
,http.method
等)
8、http.cookie
只匹配cookie緩存區,可以和 depth
, distance
, offset
, nocase
, within
連用
9、http.user_agent
http.user_agent修飾符是http請求頭的一部分。這使得可以在用戶代理頭的值上進行特定的匹配。它是標准化的,因為它不包含“User-Agent: ”、“頭名稱和分隔符”,也不包含尾隨的回車和換行符(CRLF)。
匹配的是user-agent
中的value
中純文本內容,不包括key(User-Agent: )
、末尾的\n
注意:
http_user_agent
緩沖區將不包括頭名稱、冒號或前導空白。即不包括“User-Agent”。http_user_agent
緩沖區結尾不包含CRLF(0x0D 0x0A)。如果要匹配緩沖區的結尾,使用相對isdataat
或者pcre
(盡管pcre的性能會更差)- 如果一個請求包含多個“用戶代理”頭,這些值將在
http_user_agent
緩沖區,按從上到下的順序排列,每個緩沖區之間有逗號和空格(“,”)。
請求頭:
GET /test.html HTTP/1.1
User-Agent: SuriTester/0.8
User-Agent: GGGG
匹配規則:
content:"SuriTester/0.8","GGGG";http.user_agent
- 使用
http.user_agent
比使用http.header
效率高約10%
10、http.accept
與HTTP Accept header
匹配的粘性緩沖區。僅包含標題值。頭后面的\r\n不是緩沖區的一部分。
alert http any any -> any any (http.accept; content:"image/gif"; sid:1;)
11、http.accent_enc
與HTTP Accept-Encoding header
匹配的粘性緩沖區。僅包含標題值。頭后面的\r\n不是緩沖區的一部分。
alert http any any -> any any (http.accept_enc; content:"gzip"; sid:1;)
12、http.accept_lang
與HTTP Accept-Language header
匹配的粘性緩沖區。僅包含標題值。頭后面的\r\n不是緩沖區的一部分。
alert http any any -> any any (http.accept_lang; content:"en-us"; sid:1;)
13、http.connection
與HTTP Connection header
匹配的粘性緩沖區。僅包含標題值。頭后面的\r\n不是緩沖區的一部分。
alert http any any -> any any (http.connection; content:"keep-alive"; sid:1;)
14、http.content_type
與HTTP Content-Type header
匹配的粘性緩沖區。僅包含標題值。頭后面的\r\n不是緩沖區的一部分。
使用 flow:to_server
或者flow:to_client
區分是reuqest還是response
alert http any any -> any any (flow:to_server; \
http.content_type; content:"x-www-form-urlencoded"; sid:1;)
alert http any any -> any any (flow:to_client; \
http.content_type; content:"text/javascript"; sid:2;)
15、http.content_len
與HTTP Content-Length header
匹配的粘性緩沖區。僅包含標題值。頭后面的\r\n不是緩沖區的一部分。
使用 flow:to_server
或者flow:to_client
區分是reuqest還是response
alert http any any -> any any (flow:to_server; \
http.content_len; content:"666"; sid:1;)
alert http any any -> any any (flow:to_client; \
http.content_len; content:"555"; sid:2;)
16、http_referer
要在HTTP Referer header
上匹配的粘性緩沖區。僅包含標題值。頭之后的\r\n不是緩沖區的一部分。
alert http any any -> any any (http.referer; content:".php"; sid:1;)
17、http.start
檢查HTTP請求/響應的的起始。
alert http any any -> any any (http.start; content:"HTTP/1.1|0d 0a|User-Agent"; sid:1;)
18、http.header_names
檢查只包含HTTP頭名稱的緩沖區。用於確保頭不存在或測試頭的特定順序。
緩沖區以\r\n開頭,以額外的\r\n結尾
緩沖區:
\\r\\nHost\\r\\n\\r\\n
規范示例:
alert http any any -> any any (http_header_names; content:"|0d 0a|Host|0d 0a|"; sid:1;)
示例以確保 only 主機存在
alert http any any -> any any (http_header_names; \
content:"|0d 0a|Host|0d 0a 0d 0a|"; sid:1;)
示例以確保 User-Agent 緊跟在Host后面:
alert http any any -> any any (http_header_names; \
content:"|0d 0a|Host|0d 0a|User-Agent|0d 0a|"; sid:1;)
示例以確保 User-Agent 在Host之后 ,但緊跟其后:
alert http any any -> any any (http_header_names; \
content:"|0d 0a|Host|0d 0a|"; content:"|0a 0d|User-Agent|0d 0a|"; \
distance:-2; sid:1;)
19、http.request_body
與 http.client_body
內容修飾符,可以專門匹配,並且只能在HTTP request body
上匹配。
20、http.stat_code
與 http.stat_code
內容修飾符,可以專門匹配,並且只能在HTTP status code
緩沖區上匹配。關鍵字可以與前面提到的所有內容修飾符(如 distance
, offset
, nocase
, within
等。
21、http.stat_msg
與 http.stat_msg
內容修飾符,可以專門匹配,並且只能在HTTP status message
緩沖區上匹配。關鍵字可以與前面提到的所有內容修飾符(如 depth
, distance
, offset
, nocase
和 within
.
22、http.response_line
http.response_line
檢查整個HTTP響應行
alert http any any -> any any (http_response_line; content:"HTTP/1.0 200 OK"; sid:1;)
23、http.response_body
與 http.response_body
內容修飾符,可以在HTTP response body
進行特定匹配。關鍵字可以與前面提到的所有內容修飾符(如 distance
, offset
, nocase
, within
等。
24、http.server
與 http.server
內容修飾符,可以在HTTP Server body
進行特定匹配。
alert http any any -> any any (flow:to_client; \
http.server; content:"Microsoft-IIS/6.0"; sid:1;)
25、http.location
與 http.server_body
內容修飾符,可以在HTTP Location headers
進行特定匹配。
alert http any any -> any any (flow:to_client; \
http.location; content:"http://www.google.com"; sid:1;)
26、http.host and http.host.raw
使用http.host content修飾符,可以只與規范化的hostname進行特定匹配。http.host.raw檢查原始主機名。
可以與 distance
, offset
, within
,等一起使用,但是不能與nocase
一起使用
注意:
-
這個
http.host
和http.raw_host
緩沖區由URI(如果請求中存在完整的URI,如代理請求)或HTTP主機頭填充。如果兩者都存在,則使用URI。 -
這個
http.host
和http.raw_host
如果從主機頭填充,緩沖區將不包括頭名稱、冒號或前導空格。也就是說,它們不包括“主機:”。 -
這個
http.host
和http.raw_host
緩沖區結尾不包括CRLF(0x0D 0x0A)。如果要匹配緩沖區的結尾,請使用相對的“isdataat”或PCRE(盡管PCRE的性能會更差)。 -
這個
http.host
緩沖區被規范化為全部小寫。 -
內容與
http.host
應用於必須全部小寫或具有nocase
標志集。 -
http.raw_host
匹配未規范化的緩沖區,因此匹配將區分大小寫(除非nocase
設置)。 -
如果一個請求包含多個“主機”頭,這些值將在
http.host
和http.raw_host
緩沖區,按從上到下的順序排列,每個緩沖區之間有逗號和空格(“,”)。請求示例:
GET /test.html HTTP/1.1 Host: ABC.com Accept: */* Host: efg.net
http.host
緩沖區內容:abc.com, efg.net
http.raw_host
緩沖區內容:ABC.com, efg.net
-
相應的PCRE修改器 (
http.host
):W
-
相應的PCRE修改器 (
http.raw_host
):Z
27、file_data
用 file_data
,檢查HTTP響應主體,就像 http.server_body
。這個 file_data
關鍵字的工作方式與普通內容修飾符稍有不同;當在規則中使用時,規則中跟隨它的所有內容匹配都會受到它的影響(修改)。
注意:
- 如果HTTP主體正在使用gzip或deflate,
file_data
將匹配已解壓縮的數據。 - 否定匹配受分塊檢查的影響。例如,‘content:!”<html”;’無法在第一個塊上匹配,但可能在第二個塊上匹配。要避免這種情況,請使用深度設置。深度設置會考慮到車身尺寸。假設
response-body-minimal-inspect-size
大於1K,‘content:!”<html”; depth:1024;’只能在第一個檢查的塊中缺少模式‘<html’時匹配。 file_data
也可以與SMTP一起使用