Suricata IDS 入门 — 规则详解

2018-05-14 61,927

suricata是一款开源高性能的入侵检测系统,并支持ips(入侵防御)与nsm(网络安全监控)模式,用来替代原有的snort入侵检测系统,完全兼容snort规则语法和支持lua脚本。

安全脉搏SecPulse.Com独家发文,如需转载,请先联系授权。

1.规则配置

配置文件位置:/etc/suricata/suricata.yaml

规则目录位置:/etc/suricata/rules

先设置HOME_NET与EXTERNAL_NET,推荐HOME_NET填写内网网段,EXTERNAL_NET设置为any

注意如果HOME_NET设置了any,EXTERNAL_NET设置!HOME_NET的话会报错,如果HOME_NET设置了内网地址,EXTERNAL_NET设置为!$HOME_NET的话,有些内网之间的告警就无法匹配到


image.png


通过配置文件的default-rule-path设置规则目录,rule-files来选择启用那些规则。


image.png


classification-file:/etc/suricata/classification.config

reference-config-file:/etc/suricata/reference.config

threshold-file:/etc/suricata/threshold.config

修改配置文件改成下面


outputs:
  fast:
       enabled:  yes
  eve-log:
       enabled:  yes
       types:
        -   alert:
              payload-buffer-size: 6kb    #paylaod大小限制
              payload-printable: yes     #记录原始payload
              http-body-printable: yes    #记录http 原始响应系想你
              启用下面的xff、http、dns、tls、ssh、flow等字段

注意 配置文件中必须禁用校验和checksum,不然的话会有非常多的误报,并且占空间。

类似下面这种告警

{"timestamp":"2018-04-01T15:11:35.318851+0000","flow_id":2220356201340002,"pcap_cnt":12,"event_type":"alert","src_ip":"192.168.2.140","src_port":58598,"dest_ip":"192.168.2.2","dest_port":4444,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2200073,"rev":2,"signature":"SURICATA  IPv4 invalid checksum","category":"Generic Protocol Command  Decode","severity":3},"flow":{"pkts_toserver":2,"pkts_toclient":1,"bytes_toserver":120,"bytes_toclient":66,"start":"2018-04-01T15:11:35.318562+0000"},"payload_printable":"","stream":0}


2.Suricata规则详解


更多参考官网文档:http://suricata.readthedocs.io/en/suricata-4.0.4

完整规则:

alert  tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any (msg:"INDICATOR-SHELLCODE  heapspray characters detected - ASCII     "; flow:to_client,established; file_data; content:"0d0d0d0d";  fast_pattern:only; metadata:service ftp-data, service http,service imap, service  pop3;  reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html;  classty    pe:attempted-user; sid:33339;  rev:1;)


默认规则的说明:https://www.jianshu.com/p/d81db4c352af

 

alert  tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any

规则行为 协议 ip 源端口 流量方向 目标ip 目标端口   红色代表规则头

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

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

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

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

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

协议:

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

TCP、UDP、ICMP、IP(同时用与TCP与UDP)、http、ftp、smb、dns

源ip,目标ip:

支持单个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任意端口,还可以在配置文件中添加端口组,通过!号来进行排除


image.png


流量方向:

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

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

 

规则体

(msg:"INDICATOR-SHELLCODE  heapspray characters detected - ASCII     "; flow:to_client,established; file_data; content:"0d0d0d0d";  fast_pattern:only; metadata:service ftp-data, service http,service imap, service  pop3;  reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html;  classtype:attempted-user; sid:33339; rev:1;)


MSG:规则名称,规则中的第一个字段,ids告警上显示的信息,INDICATOR-SHELLCODE heapspray  characters detected - ASCII  

特征标示符sid:

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

组gid:

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

修订rev:

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

引用reference:

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

优先级 priority:

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

类别 classtype:

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

元数据 Metadata:

suricata会忽略元数据背后的语句,用于添加备注

源ip、目标ip检测:

sameip会将流量中源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:检测数据包中是否存在此内容,例如检测流量中是否存在0d0d0d0d

如果有多个匹配项可以使用 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:

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

如果within与distance同时出现 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/suricata-4.0.4/rules/http-keywords.html

alert  tcp any any -> any 80(msg:"Evil Doamin www.appliednsm.com";  "content:"GET";httpmethod;   content:"www.appliednsm.com";http_uri; sid:5445555; rev:1;)

http_client_body       HTTP客户端请求的主体内容

        http_cookie         HTTP头字段的“Cookie”内容

        http_header         HTTP请求或响应头的任何内容

        http_method         客户端使用的HTTP方法(GET,POST等)

        http_uri               HTTP客户端请求的URI内容

        http_stat_code       服务器响应的HTTP状态字段内容

        http_stat_message     服务器响应的HTTP状态消息内容

        http_encode         在HTTP传输过程中所使用的编码类型

url_len  url长度

快速匹配模式:

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

flow流匹配:

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

flowbits set , name     设置条件

flowbits isset, name    选择条件

一旦设置flowbits之后,第一条规则没有命中那么第二条规则即使命中了也不会显示出来,例如一些攻击行为的响应信息,现在请求中设置条件,然后在响应中选择条件


image.png


to_client/from_server    服务器到客户端

to_server/from_client     客户端到服务器

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

no_established     匹配不属于建立连接的

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

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

阀值 threshold:

threshold:  type <threshold|limit|both>, track <by_src|by_dst>, count <N>,  seconds <T>

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

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

调节阀值主要是通过2种方法,一种是通过规则内的threshold关键字来调节,下图中类型是limit也就是限制告警次数,track  by_src代表来源ip,seconds 60 每个60秒告警一次count 1

image.png

另外一种则是通过配置文件/etc/suricata/threshold.config来进行控制,更加推荐这种方法,写在规则内部每次更新后都会替换掉。

event_filter gen_id 1(组id), sig_id  1101111(规则id), type limit ,track by_src, count 1 ,  seconds 60

image.png

suppress 则是告警排除,排除指定ip产生的规则告警,下图则表示如果来自217.110.97.128/25如果命中图中的规则后则不会产生告警,主要用于排除一些扫描ip

image.png

 

3.规则更新管理:

suricata规则更新可以使用suricata-update来进行更新

apt install python-pip python-yaml    

pip install --pre --upgrade suricata-update   安装命令

输入suricata-update 会自动进行规则更新,显示当前已经更新与启用了多少规则


image.png


通过suricata-udpate可以很好的控制规则,例如要禁用某一个规则,直接新建/etc/suricata/disable.conf 文件,然后在里面填入sid,每次更新的话会自动禁止该规则


image.png


规则更新后,所有的规则都会保存在/var/lib/suricata/rules/suricata.rules这一个文件中,这个时候就必须修改suricata配置文件的default-rule-path与rule-files来指定规则文件到这个规则上

suricata-update list-sources 列出当前的规则源

image.png


suricata主要是et/open  规则,这是系统自带的规则,目前开源免费的就是et/open、pt规则、sslbl规则,其余的需要授权码才能更新

ptresearch/attackdetection规则是来自github  https://github.com/ptresearch/AttackDetection 的开源规则,里面包含了近几年常见cve漏洞的检测,更新十分及时。


image.png


sslbl/ssl-fp-blacklist  列表里面提供了有关恶意软件与僵尸网络的ssl证书列表,根据证书特征来匹配流量中的威胁


image.png


通过enable-source  ptresearch/attackdetection  来启用规则


4.手工编写规则


4.1.检测windows  回传信息


wireshark通过打开网上提供的shell.cap文件,通过追踪流量发现回传cmd shell信息


image.png


这里以windows的版权信息 “2009 Microsoft Corporation”来作为特征将他们转换成16进制,由于是发送请求所以添加to_server与established

image.png


alert  tcp any any -> any any (msg: "Hacker backdoor or shell  Microsoft Corporation";  flow:to_server,established; content:"|20 4d 69 63 72 6f 73 6f 66 74 20 43 6f 72  70 6f 72 61 74 69 6f 6e|"; depth:200; sid:3030303; rev:1;)

suricata测试pcap流量包,成功发现告警     注意-l ./的意思是在当前位置生成日志,如果没有加-l参数则是才配置文件中指定的默认位置追加日志


image.png


4.2. 加载更强大的lua脚本来检测ssl自签名


脚本来源:https://github.com/OISF/suricata/pull/1585

suricata可以使用lua脚本来生成告警与事件(在suricata.yaml里面配置),也可以直接写在规则里面用luajit解析lua来进行匹配

将以下文件保存self-signed-cert.lua,如果遇到ssl自签名就会进行告警。


function  init (args)
    local needs = {}
    needs["tls"] = tostring(true)
    return needs
end
 
function  match(args)
    version, subject, issuer, fingerprint =  TlsGetCertInfo();
    if subject == issuer then
        --[[selfSigned =  string.format("\nIssuer: %s\nSubject: %s\n are the same.\nSelf Signed  Certificate!\n",
                        issuer, subject)
        print(string.format("\nIssuer:  %s\nSubject: %s\nare the same.\nSelf Signed Certificate!\n",
                        issuer, subject))]]
        return 1
    else
        return 0
    end
    --[[str = string.format("\nVersion  %s\nIssuer %s\nSubject %s\nFingerprint %s",
                        version, issuer,  subject, fingerprint)
    SCLogInfo(str);]]
end#

                                            

配置文件中加入以下规则

alert  tls any any -> any any (msg:"SURICATA TLS Self Signed Certificate";  flow:established; luajit:self-signed-cert.lua;   classtype:protocol-command-decode; sid:999666111; rev:1;)

 

4.3.使用pcre正则来进行匹配


这条规则主要是用来检测一些挖矿程序与自动化利用脚本,如果系统被利用或者爆破成功后调用curl与wget下载.sh脚本时进行告警

alert  http any any -> any any (msg:"***Linux wget/curl download .sh script***";  flow:established,to_server; pcre:"/curl|Wget|linux-gnu/i"; content:".sh";  http_uri; content:"200"; http_stat_code; sid:3000004; rev:1;)

image.png

4.4  从流量中提取文件


在suricata.yaml文件里面开启文件存储功能


image.png


如果没有相应的规则文件,即使设置了文件存储功能也不会提取,需要添加规则文件,规则里面如果没有添加fileexe参数的话,filestore会保存所有文件

alert  http any any -> any any (msg:"File store all"; flow:established,to_server;  content:"POST";http_method; fileext:"php"; filestore; sid:1; rev:1;)

运行后会生成files-json.log、file目录,file-json.log记录了http与文件信息


image.png


files目录下则是保存的文件,与meta文件信息

image.png


5.规则提取与测试

首先搭建漏洞环境,用poc攻击时通过wireshark抓包来分析攻击特征,然后导出pcap包。

suricata -c   /etc/suricata/suricata.yaml -T  #  -T参数测试规则是否存在问题

编写规则后,通过suricata -c  /etc/suricata/suricata.yaml -r test.pcap -l ./   该命令会读取test.pcap包并将结果保存到当前目录,如果这个时候规则出现错误时会提示响应的告警


image.png


如果有签名命中则出现在eve.json与fast.log中


image.png


fast.log记录了流量中匹配到签名的告警信息,包括时间,五元组信息,告警id,告警信息。此次检测的是meterpreter 控制流量


image.png


eve.json则是记录了告警信息,flow流信息,协议解析的信息(例如http,dns等),以及攻击的payload等


image.png


suricata不需要重新启动来载入新的规则

修改rule文件添加新的规则后执行下面命令

ps -ef|grep suricata    查找suricata程序的pid

kill -USR2 1111  通过kill命令发送usr2信号来重新加载suricata规则

find * -name 'eve.json*' |xargs -i{} cat {} | jq -c  '[.src_ip,.dest_ip,.proto,.alert.signature]' |grep -v null | sed  's/"//g;s/\[//;s/\]//' | awk -F="," '{a[$1$3]++;}END{for (i in a)print i, " |  Alertas: "a[i];}' |grep -E '([0-9]*\.){3}[0-9]*'     # 使用linux命令分析统计eve.json告警信息,需要安装jq(linux终端下json格式化输出的工具)


image.png


如果要web展现的话可以使用elk或者Squert,snorby安装后感觉不是很好用,十分推荐securityonion(安全洋葱)系统,集成了snort/suricata、bro、elk、ossec以及各种分析工具 https://securityonion.net/

安全脉搏SecPulse.Com独家发文,如需转载,请先联系授权。


本文作者:al0ne

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/71603.html

Tags:
评论  (3)
快来写下你的想法吧!
  • leilanyu 2018-07-09 16:31:00

    请问,我使用tcpreplay,对pcap流量包进行很多次重放,然后使用suricata进行监控,但是问题是:suricata检测中fast.log只打印一次信息, 重复的信息不再打印,这是为什么? 检测百度网址的话,访问两遍都是可以检测得到的。[em_33]

  • chenc454545 2018-07-26 16:31:36

    hello,请问suricata-update时候用的source都能在哪里找到啊?你的截图里面的部分source的授权码是如何获取的?

  • 洛洛 2019-07-11 15:55:27

    正在学习,很有用,谢谢!

al0ne

文章数:4 积分: 53

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号