目录
一、什么是Suricata
二、安装
三、规则分析(常用)
1、动作(alert位置)
2、协议(http位置)
3、源/目的地($HOME_NET / $EXTERNAL_NET)
4、端口($HTTP_PORTS)
5、方向(dirction)
四、mata关键字
1、mgs(提示信息,message)
2、sid(签名ID,signature ID)
3、rev(版本,revision)
4、gid(签名组ID,group ID)
5、classtype
6、refererce
7、priority(优先级)
8、metadata(数据)
9、target(目标)
五、Http关键字
1、http_method:
2、http_uri/http_raw_uri
3、http.request_body
4、http.header
5、http.user_agent
7、http_referer
六、案例:
1、Suricata是来来源于经典的NIDS系统,是一套基于网络流量的危险检测引擎,整合了IDS(Instrusion detection)、IPS(Instrusion Prevention)、NSM(Network Security Monitoring)和PCAP等功能
2、IDS功能
通过监听网卡流量并匹配规则引擎进行入侵实时检测和预警,检测手段和wazuh比较类似
3、、IPS功能
与wazuh的主动响应功能不完全一样,IPS不需要对防火墙进行调用,而是直接将通过的流量引入到iptables的队列中,如果检测出危险则直接丢弃或拒绝,流量是无法到达目标服务器的
注释:IPS相对于IDS提供了流量阻断的功能。
这里使用二进制安装:
yum install epel-release yum-plugin-copr
yum install yum copr enable @oisf/suricata-6.0
yum install suricata
案例:
alert http $EXTERNAL_NET any <> $HOME_NET $HTTP_PORTS (msg:"sql注入检测!"; http.method; content:"POST"; nocase; threshold: type threshold, track by_src, count 3, seconds 10; priority: 7; http.request_body; pcre: "/union.+select/i"; sid:561004;)
alert 位置就是我们所需要填写的动作
常见用的有
drop —— 涉及到IPS模式,如果签名匹配到对应的内容,它将立即停止,数据包将不再发送,并且会生成警报。
reject —— 这是对数据包的主动拒绝。接收端和发送端都接收到拒绝数据包。有两种类型的拒绝数据包将被自动选择。
alert —— 如果签名匹配到对应的内容,Suricata将生成警报。只有系统管理员才能注意到此警报。
http 就是我们所需要配置的协议
传输层:
TCP
UPD
ICMP
IP(代表all或any)
应用层:
http
ftp
tls (this includes ssl)
smb
dns
ssh
smtp
imap(等)
$HOME_NET #来源地的IP,这里配置文件suricata.yaml文件中配置到,表示来访的IP
$EXTERNAL_NET #目的IP,被访问的IP
$HTTP_PORTS #在配置文件suricata.yaml中也可以进行配置,或者写成 80 或者 81 ·····
<> 这个符号可以这样理解
"->" :匹配请求的数据
”<-“ :匹配响应的数据
"<>" :双向都匹配
注意:在suricata中的 ;号 代表分割符号。 "号 用于包裹匹配项。有特殊含义
关键字可以理解为就是 (msg:····· )括号里的的这些数据。用来对流量进行匹配和筛选以及设置预警级别和sid等等参数。
一般放在开头,可以用于做预警提示。(sql注入;XSS注入····)
一般放在签名规则的末尾处,给每规则都命名一个ID,这个ID不能重复。(sid:561004;)
注意结尾处也需要使用 ;
这个也可以写在末尾,它是用来记录你对某一条签名规则修改的次数,手动修改方便运维人员记录修改的次数。(rev:1;)
举个例子:下面这条是我触发的预警信息
03/23/2023-00:24:05.191941 [**] [1:565001:0] 服 务 器 疑 似 正 在 与 蚁 剑 通 信 !!请 尽 快 查 查 处 !! [**] [Clasriority: 2] {TCP} 192.168.12.1:58957 -> 192.168.12.138:80
[1:565001:0] ——里面的1表示gid,565001表示sid,0表示rev
服务器疑似正````` ——表示msg的提示信息
[Clasriority: 2] ——Clasriority优先级,越低越危险。2代表级别(通过priority来设置下面会讲)
[TCP] —— 数据类型
192.168.12.1:58957 ——来访者,攻击者IP和端口
192.168.12.138:80 ——被攻击者,我们的服务器IP和端口
可以给出规则和警告信息的类型(因为攻击的类型较多,检测的规则也很多所以需要对其进行分组,分组的方法在配置文件classification.config中可以看到
例子:
#自定义类别
config classification: [攻击的类型] , [描述信息] , [级别Priotity(1,2,3)该级别在规则里没有被定义的时候会使用类别的级别]
不常用。这个关键字是为那些调查签名匹配原因的签名作者和分析人员准备的,相当于对签名所对应都漏洞写一个标注,这是一个什么样的类型。
reference: cve , CVE-2014-6666
priority通常回带一个强制的数字值,范围是1-255。一般就使用1-4级,数值越低优先级别越高,也就是威胁成都越高。写法
priority:1;
关键字允许在签名中添加其他非功能性信息。相当于做一个标签
metadata: ket value, key value;
允许规则编写指定警报的哪一侧是攻击目标。(源IP,还是目的IP)
target: src_ip;
这个字段中包含了
GET
,POST
,PUT
,HEAD
,DELETE
,TRACE
,OPTIONS
,CONNECT
andPATCH
一般会配合后面的 content字段来进行匹配筛选
http.method; content:"POST";
结合使用就可以过滤出数据包中的POST/GET请求!
这两个修饰符,可以专门匹配GET 请求 或 POST 请求之后的内容
检查整个请求或响应的内容,例如上如的例子中
http.request_body; pcre: "/union.+select/i"; #就用来检查请求或响应的内容中是否包含了“ union select ” 的字段。 pcre:"/【正则匹配】/i"
/ / #固定结构
i #表示不区分大小写
获取请求头匹配HTTP header 缓存区所有信息,除了那些有专门文本修饰符的(
http.cookie
,http.method
等)比如可以获取请求头的 Host:
http.header; content:"www.google.com";
是请求头的一部分,只不过它用来匹配 ”User-Agent:“ 之后的内容
只匹配cookid
也是包含于请求头的部分,不过这个可以单独用来匹配 请求头中的Referer
以上是较为常用的一些匹配签名。
#路径扫描
alert http $EXTERNAL_NET any <> $HOME_NET $HTTP_PORTS (msg:"访问错误404"; http.stat_code; content: "404";priority: 5; sid:561001;)#路径扫描检测
alert http $EXTERNAL_NET any <> $HOME_NET $HTTP_PORTS (msg:"相同IP连续出现404,疑似路径扫描!"; http.stat_code; content: "404"; threshold: type threshold, track by_src, count 5, seconds 10; priority: 3; sid:561002;)
#POST,SSRF检测
alert http $EXTERNAL_NET any <> $HOME_NET $HTTP_PORTS (msg:"疑似遭受SSRF攻击!"; http.method; content:"POST"; nocase;priority: 3; http.request_body; pcre: "/=file:|=dict:|=http:|=https:|=gopher:|=phar:/i"; sid:561008;)#GET请求url地址长度过长有可能是扫描工具进行扫描检测
alert http $EXTERNAL_NET any <> $HOME_NET $HTTP_PORTS (msg:"有漏扫工具正在扫描服务器!"; http.uri; pcre: "/\S{100,}/"; priority: 3; sid:562005;)