Suricata简介
Suricata是一个免费、开源、成熟、快速、健壮的网络威胁检测引擎。Suricata引擎能够进行实时入侵检测(IDS)、内联入侵预防(IPS)、网络安全监控(NSM)和离线pcap处理。Suricata使用强大而广泛的规则和签名语言来检查网络流量,并提供强大的Lua脚本支持来检测复杂的威胁。
实验环境
虚拟机版本信息
- 虚拟机平台:VMware 15.5
- 操作系统:Kali 2020.4
- 版本信息:Linux version 5.9.0-kali1-amd64 (devel@kali.org) (gcc-10 (Debian 10.2.0-15) 10.2.0, GNU ld (GNU Binutils for Debian) 2.35.1) #1 smb Debian 5.9.1-1kali2 (2020-10-29)
Suricata版本
- Suricata:version 6.0.1 RELEASE
Suricata安装
安装过程
根据实验所使用的环境,参考suricata官网进行安装。
命令如下:
sudo apt-get install suricata
echo "deb http://http.debian.net/debian buster-backports main" > /etc/apt/sources.list.d/backports.list
apt-get update
apt-get install suricata -t buster-backports
安装完成后可以查看一下版本信息,确认安装成功:
suricata -V
更新规则库
更新ET Open规则库命令如下:
sudo suricata-update
注意,suricata默认规则库的位置为:
/var/lib/suricata/rules/suricata.rules
常用规则关键字
类别 | 关键字 | 含义 |
Meta关键字 | msg(message) | 规则名称,规则中的第一个字段,ids告警上显示的信息 |
sid(signature ID) | 用于唯一规则标识,sid不能重复,0-10000000 VRT保留,20000000-29999999 Emerging保留,30000000+:公用 | |
rev(revision) | 表示规则的版本,每次修改规则rev递增1 | |
reference | 连接外部信息来源,补充描述。直接指向可以找到有关规则和规则试图解决的问题的信息的位置。 | |
classtype | 根据规则检测到的攻击行为类型为规则分类 | |
metadata | 允许在规则中添加其他非功能性信息,相当于备注,suricata会自动忽略其后内容 | |
Payload关键字 | content | 内容匹配,检测数据包中是否存在此内容 |
nocase | 内容修饰,表示不区分大小写 | |
offset | 内容修饰,表示从数据包开始位置0往后偏移多少字节后进行匹配 | |
depth | 内容修饰,表示匹配数据包结束的位置 | |
distance | 内容修饰,表示本次匹配必须在上一次匹配结束位置到distance设置的偏移区间之外 | |
within | 内容修饰,表示本次匹配必须在上一次匹配结束位置到within设置的偏移区间之内 | |
dsize | 内容修饰,表示有效载荷大小 | |
startswith | 内容修饰,表示匹配内容以content开头 | |
endswith | 内容修饰,表示匹配内容以content结尾 | |
isdataat | 内容修饰,表示查看负载的特定部分是否仍有数据 | |
pcre | 匹配特定正则表达式,优先级低于content | |
Prefiltering关键字 | fast_pattern | 快速匹配模式,即对这一项进行优先匹配,若没有命中则跳过本条规则。 |
flow关键字 | flow | 用于匹配流的方向,例如to/from客户端或to/from服务器。还可以匹配是否建立了流。 |
Suricata使用
在数据包所在目录下运行命令,假设数据包名为test.pcap:
suricata -r test.pcap -k none
生成四个结果文件:
其中,fast.log记录了包含的具体alert情况,包括时间、五元组信息、告警id和告警信息等,是我们本次重点分析的对象。eve.json则记录了告警信息、flow流信息、协议解析的信息(例如http,dns等),以及攻击的payload等。
规则BUG
关于Suricata规则中针对内容修饰关键字distance和within同时存在的情况的理解,经和同学老师交流,发现官网中给出的规则解释与实际的实现不符。
官网中解释如下:
实际上,within的起始位置应该是distance的结束位置。举个例子,当distance=8,within=3时,表示的含义应当如下图所示。