suricata 检测规则编写

 目录

规则头

规则行为,根据优先级排列:

协议:

源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#

suricata 检测规则编写_第1张图片

规则头

alert tcp $HOME_NET any -> $EXTERNAL_NET 1024:

规则行为,根据优先级排列:

        pass 如果匹配到规则后,suricata会停止扫描数据包,并跳到所有规则的末尾

        drop ips模式使用,如果匹配到之后则立即阻断数据包不会发送任何信息

        reject 对数据包主动拒绝,接受者与发送中都会收到一个拒绝包

        alert 记录所有匹配的规则并记录与匹配规则相关的数据包

协议:

        在规则中指定匹配那些协议,suricata支持的协议要比snort多一些

        TCP、UDPICMPIP(同时用与TCPUDP)、httpftpsmbdns

ip,目标ip

        支持单个ipcidrip组,[96.30.87.36,96.32.45.57],所有主机any,以及规则文件中配置 的 ip变量$HOME_NET(受保护的ip段)与$EXTERNAL_NET(其他所有ip):

源端口/目标端口:

        支持设置单个端口80,端口组[80,8080],端口范围[1024:65535]以及any任意端口,还可以在配置文件中添加端口组,通过!号来进行排除

流量方向:

        -> 单向流量,从源ip到目标ip的单项流量

        <> 双向流量,2ip往返之间的流量

规则体

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

msg

        规则名称,规则中的第一个字段,ids告警上显示的信息

        ET MALWARE Win32/HunterStealer/AlfonsoStealer CnC Exfil  

flow流匹配: 

        flow是特定时间内具有相同数据的数据包(5元组信息)同属于一个流,suricata会将这些流量保存在内存中。

        to_client/from_server    服务器到客户端

        to_server/from_client     客户端到服务器

        established       匹配已经建立连接的(tcp则是经过3次握手之后,udp则是有双向流量)

        no_established     匹配不属于建立连接的

        only_stream    匹配由流引擎重新组装的数据包

        no_stream    不匹配流引擎重新组装的数据包

flowbits :

        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  此规则不会生成警报 

 suricata 检测规则编写_第2张图片

        当你看看第一条规则时,你会注意到,如果它匹配的话,会产生一个警告,如果它不是在规则末尾的'flowbits:noalert'。
        此规则的目的是检查“userlogin”上的匹配,并在流程中标记该匹配。 所以,没有必要产生一个警报。
        第二条规则没有第一条规则就没有效果。 如果第一条规则匹配,则流程将该特定条件设置为在流中存在。 现在用第二个规则可以检查前一个分组是否满足第一个条件。 如果第二条规则匹配,则会生成警报。

        有可能在规则中多次使用flowbits并组合不同的功能。

        

sameipip、目标ip检测

        会将流量中源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;)

content内容匹配:

        检测数据包中是否存在此内容,例如检测流量中是否存在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|";  

        匹配内容区分大小写,保留字符(; \ "|)须进行转义或十六进制转码

        内容修饰,能够更加精准匹配

不区分大小写 nocase

        content:"root";nocase;    #修饰符直接在;号后面添加

偏移位置 offset

        content:"xss";offset 100;    #代表了从数据包开始位置0往后偏移100位字节后进行匹配

结束位置 depth

        content:"xss";offset 100;depth 200; #代表了匹配数据包结束的位置,如果没有offset则是从开始位置计算,有offset则是从offset开始,此次则是从100字节开始匹配到200字节内的内容。

xx范围外 distance

        本次匹配必须在上一次匹配结束位置到distance设置的偏移位置区间之外,例如content:"msg1";content:"msg2";distance:25; 如果msg1在第100行找到,那么就会在100+25后匹配msg2  

xx范围内 within

        本次匹配必须在上一次匹配结束位置之内,如果上次结束是100within 15;那么第二次匹配必须在100115之内开始匹配

        如果withindistance同时出现 content:"evilliveshere";  content:"here";  distance:1;within:7; 则匹配here  evilliveshere位置结束1-7内匹配

有效载荷大小 dsize

        dsize: >64   用来匹配payload大小,可以用来检测异常包大小

pcre正则  pcre

        content:"xss"; pcre:"xss\w"   先匹配content内容后才进行匹配pcre正则,这样的话减少系统开销

http修饰符:

        更多详细内容查看: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方法(GETPOST等)

        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状态字段内容

fast_pattern快速匹配模式: 

        如果suricata规则中有多个匹配项目,快速匹配的目的是设置优先级最高的匹配项,如果设置了快速匹配模式没有命中则跳过这条规则

threshold阀值:

        threshold:  type , track , count , seconds

        threshold 最小阀值  也就是说只有匹配到至少多少次数才进行告警

        limit 限制告警次数,例如最少5分钟内告警一次

        调节阀值主要是通过2种方法,一种是通过规则内的threshold关键字来调节,下图中类型是limit也就是限制告警次数,track  by_src代表来源ipseconds 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引用:

        连接外部信息来源,补充描述,reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html

priority优先级:

        手动设置规则优先级别,范围1-2551最高,一般都是1-4suricata会首先检查优先级较高的规则

classtype类别:

        根据规则检测到的活动类型为规则分类,  classtype:attempted-user

sid特征标示符:

        用于唯一性规则标识,sid不能重复,0-10000000 VRT保留,20000000-29999999 Emerging保留,30000000+:公用

gid组:

        [1:2000000] 告警前面的1代表组id

rev修订:

        规则版本号,每次修改规则rev则递增1

metadata元数据:

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

suricata 检测规则编写_第3张图片


 凡是过往,即为序章

你可能感兴趣的:(suricata,网络安全,suricata)