目录
规则头
规则行为,根据优先级排列:
协议:
源ip,目标ip:
源端口/目标端口:
流量方向:
规则体
msg:
flow流匹配:
flowbits :
sameip源ip、目标ip检测:
content内容匹配:
不区分大小写 nocase:
偏移位置 offset:
结束位置 depth:
在xx范围外 distance :
在xx范围内 within:
有效载荷大小 dsize:
pcre正则 pcre:
http修饰符:
fast_pattern快速匹配模式:
threshold阀值:
reference引用:
priority优先级:
classtype类别:
sid特征标示符:
gid组:
rev修订:
metadata元数据:
自定义一个规则
参考: https://suricata.readthedocs.io/en/latest/rules/index.html#
alert tcp $HOME_NET any -> $EXTERNAL_NET 1024:
pass 如果匹配到规则后,suricata会停止扫描数据包,并跳到所有规则的末尾
drop ips模式使用,如果匹配到之后则立即阻断数据包不会发送任何信息
reject 对数据包主动拒绝,接受者与发送中都会收到一个拒绝包
alert 记录所有匹配的规则并记录与匹配规则相关的数据包
在规则中指定匹配那些协议,suricata支持的协议要比snort多一些
TCP、UDP、ICMP、IP(同时用与TCP与UDP)、http、ftp、smb、dns
支持单个ip,cidr,ip组,[96.30.87.36,96.32.45.57],所有主机any,以及规则文件中配置 的 ip变量$HOME_NET(受保护的ip段)与$EXTERNAL_NET(其他所有ip):
支持设置单个端口80,端口组[80,8080],端口范围[1024:65535]以及any任意端口,还可以在配置文件中添加端口组,通过!号来进行排除
-> 单向流量,从源ip到目标ip的单项流量
<> 双向流量,2个ip往返之间的流量
(msg:"ET MALWARE Win32/HunterStealer/AlfonsoStealer CnC Exfil"; flow:established,to_server; content:"|50 4b 03 04 14 00|"; depth:6; content:"Desktop.png"; distance:0; fast_pattern; reference:md5,20f025a45247cc0289e666057149c28e; reference:md5,7f053ba33d6e4bf07a15ee65dd2b0d92; classtype:command-and-control; sid:2031198; rev:1; metadata:affected_product Windows_XP_Vista_7_8_10_Server_32_64_Bit, attack_target Client_Endpoint, created_at 2020_11_11, deployment Perimeter, former_category MALWARE, malware_family HunterStealer, signature_severity Major, updated_at 2020_11_11;)
规则名称,规则中的第一个字段,ids告警上显示的信息
ET MALWARE Win32/HunterStealer/AlfonsoStealer CnC Exfil
flow是特定时间内具有相同数据的数据包(5元组信息)同属于一个流,suricata会将这些流量保存在内存中。
to_client/from_server 服务器到客户端
to_server/from_client 客户端到服务器
established 匹配已经建立连接的(tcp则是经过3次握手之后,udp则是有双向流量)
no_established 匹配不属于建立连接的
only_stream 匹配由流引擎重新组装的数据包
no_stream 不匹配流引擎重新组装的数据包
flowbits 参照 链接:https://www.jianshu.com/p/2d54c0461904
Flowbits由两部分组成。 第一部分描述要执行的操作,第二部分是flowbit的名称。
Flowbits可以确保例如两个不同的数据包匹配时会生成警报。 只有两个数据包匹配时才会生成警报。 所以,当第二个数据包匹配时,Suricata必须知道第一个数据包是否匹配。 如果一个数据包匹配,Flowbits将标记流,Suricata会“知道”它会在第二个数据包匹配时产生警报。
流程有不同的操作。 这些是:
flowbits:set,name 将在流程中设置条件/'name',如果存在的话。
flowbits:isset,name 可以在规则中使用,以确保它生成警报,当规则匹配并且条件在流中被设置时。
flowbits:toggle,name 颠倒当前设置。 所以例如,如果一个条件设置, 它将被解除,反之亦然。
flowbits:unset,name 可以用来取消流程中的条件。
flowbits:isnotset,name 可以在规则中使用,以确保它生成警报,当它匹配并且条件未在流程中设置时。
flowbits:noalert 此规则不会生成警报
当你看看第一条规则时,你会注意到,如果它匹配的话,会产生一个警告,如果它不是在规则末尾的'flowbits:noalert'。
此规则的目的是检查“userlogin”上的匹配,并在流程中标记该匹配。 所以,没有必要产生一个警报。
第二条规则没有第一条规则就没有效果。 如果第一条规则匹配,则流程将该特定条件设置为在流中存在。 现在用第二个规则可以检查前一个分组是否满足第一个条件。 如果第二条规则匹配,则会生成警报。
有可能在规则中多次使用flowbits并组合不同的功能。
会将流量中源ip和目标ip相同的显示出来。
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; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
检测数据包中是否存在此内容,例如检测流量中是否存在Desktop.png
如果有多个匹配项可以使用 content:"evilliveshere"; content:"here"; 这种写法,注意如果没有用内容修饰的话,ids不会按照先后顺序去匹配的,只会在内容中匹配是否包含这2个值,必须用内容修饰来调整先后顺序,用distance 0 来让第二个匹配项在第一个匹配项匹配位置之后匹配,并且如果有多个content他们的关系是and关系必须都匹配到才告警 。
使用感叹号!对匹配项的否定:content:!"evilliveshere";
将字符串的十六进制用管道符(|)进行包围:content:"|FF D8|"; 字符串与十六进制混合使用:content:"|FF |SMB|25 05 00 00 80|";
匹配内容区分大小写,保留字符(; \ "|)须进行转义或十六进制转码
内容修饰,能够更加精准匹配
content:"root";nocase; #修饰符直接在;号后面添加
content:"xss";offset 100; #代表了从数据包开始位置0往后偏移100位字节后进行匹配
content:"xss";offset 100;depth 200; #代表了匹配数据包结束的位置,如果没有offset则是从开始位置计算,有offset则是从offset开始,此次则是从100字节开始匹配到200字节内的内容。
本次匹配必须在上一次匹配结束位置到distance设置的偏移位置区间之外,例如content:"msg1";content:"msg2";distance:25; 如果msg1在第100行找到,那么就会在100+25后匹配msg2
本次匹配必须在上一次匹配结束位置之内,如果上次结束是100,within 15;那么第二次匹配必须在100到115之内开始匹配
如果within与distance同时出现 content:"evilliveshere"; content:"here"; distance:1;within:7; 则匹配here在 evilliveshere位置结束1-7内匹配
dsize: >64 用来匹配payload大小,可以用来检测异常包大小
content:"xss"; pcre:"xss\w" 先匹配content内容后才进行匹配pcre正则,这样的话减少系统开销
更多详细内容查看:http://suricata.readthedocs.io/en/suricata4.0.4/rules/http-keywords.html
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"ET EXPLOIT Mi Router 3 Remote Code Execution CVE-2018-13023"; flow:to_server,established; http.method; content:"GET"; http.uri; content:"/cgi-bin/luci/|3b|stok="; fast_pattern; content:"&sns=sns&grant=1&guest_user_id=guid&timeout="; distance:0; reference:url,blog.securityevaluators.com/show-mi-the-vulns-exploiting-command-injection-in-mi-router-3-55c6bcb48f09; reference:cve,2018-13023; classtype:attempted-admin; sid:2030311; rev:2; metadata:affected_product Linux, attack_target IoT, created_at 2020_06_11, deployment Perimeter, former_category EXPLOIT, signature_severity Minor, updated_at 2020_06_11;)
http.method 客户端使用的HTTP方法(GET,POST等)
http.uri HTTP客户端请求的URI内容
http.header HTTP请求或响应头的任何内容
http.request_body http 客户端请求的主体内容
http.request_line
http.header_names http 头字符串("Referer", "User-Agent"等)
http.user_agent
http.referer
http.content_type
http.host
http.protocol http版本("HTTP/1.0")
http.content_len
http.stat_code 服务器响应的HTTP状态字段内容
如果suricata规则中有多个匹配项目,快速匹配的目的是设置优先级最高的匹配项,如果设置了快速匹配模式没有命中则跳过这条规则
threshold: type
threshold 最小阀值 也就是说只有匹配到至少多少次数才进行告警
limit 限制告警次数,例如最少5分钟内告警一次
调节阀值主要是通过2种方法,一种是通过规则内的threshold关键字来调节,下图中类型是limit也就是限制告警次数,track by_src代表来源ip,seconds 60 每个60秒告警一次count 1
另外一种则是通过配置文件/etc/threshold.config来进行控制,更加推荐这种方法,写在规则内部每次更新后都会替换掉。
event_filter gen_id 1(组id), sig_id 1101111(规则id), type limit ,track by_src, count 1 , seconds 60
suppress 则是告警排除,排除指定ip产生的规则告警,下图则表示如果来自217.110.97.128/25如果命中图中的规则后则不会产生告警,主要用于排除一些扫描ip
连接外部信息来源,补充描述,reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html
手动设置规则优先级别,范围1-255,1最高,一般都是1-4,suricata会首先检查优先级较高的规则
根据规则检测到的活动类型为规则分类, classtype:attempted-user
用于唯一性规则标识,sid不能重复,0-10000000 VRT保留,20000000-29999999 Emerging保留,30000000+:公用
[1:2000000] 告警前面的1代表组id
规则版本号,每次修改规则rev则递增1
suricata会忽略元数据背后的语句,用于添加备注
alert tcp any any -> any any (msg: "Http rule test!"; flow:to_server,established; http.host; content:" y.gtimg.cn"; sid:3030303; rev:1;)
凡是过往,即为序章