【suricata】Payload keywords

content
content关键字在suricata规则中非常重要,大部分规则都要使用这个关键字来匹配数据包中的内容,content中的内容是按字节匹配的,能匹配ASCII码从0-255的字节,可打印字符比如a-z可以直接写,而某些特殊符号或是不可打印的字符则需要使用十六进制来表示。
例如添加一条规则:
alert http any any -> any any (msg:"Http Get Found"; content:"GET";classtype:vinc; sid:1000001; rev:1;)
然后访问snorby页面,告警信息如下:
06/15-00:22:37.461697  [**] [1:1000001:1] Http Get [**] [Classification: vinc test!] [Priority: 1] {TCP} 63.147.242.144:80 -> 172.16.100.160:49876

例如:
alert http any any -> any any (msg:"Http Get Found"; content:"GET";nocase;content:"123";nocase; classtype:vinc; sid:1000001; rev:1;)
此时直接访问http://172.16.100.160:3000/dashboard不会产生告警。
而访问http://172.16.100.160:3000/dashboard?123会产生告警。
注:添加多个content,是与的关系。
以下符号不能在content中出现,需要使用对应的16进制。
"   |22|
;    |3B|
:    |3A|
|    |7C|
如果需要匹配http://,那么需要写成content: “http|3A|//”;
如果一条规则前面有一个“!”。那么那些不包含这些内容的数据包将触发报警。

Nocase
在content字段后加上nocase表示content中的内容不区分大小写。
depth
表示从payload开始多少个字节与content中的内容进行匹配
offset
offset是从payload开头先偏移指定字节再对content进行匹配
distance
distance表示从上一个content匹配的末尾偏移指定数量字符再进行本次的content匹配。
within
表示从上一个content匹配位置之后的指定字节内对当前的content进行匹配,within的值不能为0。
isdataat
isdataat关键字是用来判断指定偏移处的字符是否是数据。
dsize
dsize是用来检测数据包中的payload长度是否在符合要求的范围内,这样可以有效的组织一些缓冲区溢出的攻击。
replace
replace关键字是用来替换匹配到的content中的字符
pcre
允许用户使用与PERL语言相兼容的正则表达式。我们来加一条测试一下:
alert http any any -> any any (msg:"Http Get Found"; pcre:"/123/si"; classtype:vinc; sid:1000001; rev:1;)
其中/s表示圆点元字符(.)匹配所有的字符,包括换行符
/i表示忽略大小写
fast_pattern
suricata对只有一个content关键字的规则使用多模匹配,而对于多个content的规则就对最长对复杂的一个进行多模匹配,而fast_pattern则可以改变这个状况,如果在较短较简单的content字段后加上fast_pattern关键字则会优先匹配这个content,有时这种方法可以有效提升效率。
Flow
这个选项要和TCP流重建联合使用。它允许规则只应用到流量流的某个方向上。这将允许规则只应用到客户端或者服务器端。这将能把内网客户端流览web页面的数据包和内网服务器所发送的数据包区分开来。
选项:
to_client 触发服务器上从A到B的响应。
to_server 触发客户端上从A到B的请求。
from_client 触发客户端上从A到B的请求。
from_server触发服务器上从A到B的响应。
established 只触发已经建立的TCP连接。
stateless 不管流处理器的状态都触发(这对处理那些能引起机器崩溃的数据包很有用。
no_stream 不在重建的流数据包上触发(对dsize 和 stream4 有用。
only_stream 只在重建的流数据包上触发。
PS:这里需要注意客户端和服务端、请求与响应。
修改规则如下:
alert http any any -> any any (msg:"Http Get Found";flow:established,to_server; content:"123"; http_client_body; classtype:vinc; sid:1000001; rev:1;)