一、监控ICMP流量
1、ICMP流量特征
四大特征分别为:消息类型(Type)、代码(Code)、校验和(Checksum)、数据字段(Data Field)。这里我们使用 type消息类型。
ICMP 消息的类型字段标识了消息的类型。常见的类型包括回显请求(Echo Request,类型 8),回显应答(Echo Reply,类型 0),目的不可达(Destination Unreachable,类型 3),超时(Time Exceeded,类型 11)等。
而 ping
命令就是利用 ICMP 回显请求和回显应答来检查网络连接的连通性。
2、获取ICMP流量
通过ping的方式来获取该流量
ping ip
ping了四次
锁定特征
构造规则
在suricata中与Type* 8对应的是itype: 8,因此无需再写prce或content
alert icmp $EXTERNAL_NET any <> $HOME_NET any (msg:"icmp流量检测"; itype:8;threshold: type threshold,track by_src,count 10,seconds 20;sid:561011;)
threshold:用于设定和定义基于特定条件的阈值规则。
type threshold:设定规则为阈值类型,还可以是
type rate等,限制速率,防止DDOS攻击。
track by_src:根据源 IP 地址来跟踪请求。
count 10,seconds 20:20秒内发生10次.
意思是:在20秒内连续ping10次就触发警告。
添加测试
添加:
测试:
成功
二、监控TCP流量
1、预警TCP连接过高(全连接)
所谓的全连接简单来说就是建立TCP连接的过程,确保双方都准备好进行通信。攻击者通过构建大量的全连接使服务器崩溃。
规则构建:
flow:established,to_server这是关键字
flow:to_client, established:匹配从服务器到客户端的已建立连接的数据包。
flow:to_server, established, only_stream:匹配从客户端到服务器的已建立连接的数据包,并且这些数据包属于单一的数据流。
flow:to_server, not_established, no_frag:匹配从客户端到服务器的数据包,但这些数据包不属于已建立的连接,并且不允许是分片的。alert tcp $EXTERNAL_NET any <> $HOME_NET any (msg:"tcp连接过高,请及时检测!(全)"; flow:established,to_server;threshold: type threshold,track by_src,count 20,seconds 10;sid:561013;)
写入规则与测试:
写入:
测试:
在kali中使用如下命令安装wrk:
apt install wrk全连接攻击:
wrk -c 300 -t 4 -d 600 http://192.168.248.134/pikachu
-c, 跟主机保持连接数量
-d, 测试持续时间
-t, 开启线程数成功
三、监控SSH流量
1、抓取登录失败流量
分析:
ssh登录时客户端和服务端会交换密钥然后产生新的密钥New Keys,ssh在爆破时会产生很多次New Keys,这就是ssh爆破的一个特征。
其中每个New Keys的最后都是如下图这样:
框住的是16进制。
2、构建规则
根据上述的特征,先构建正则表达式,匹配New Keys中的最后的内容
prce:"|15 00 00 00 00 00 00 00 00 00 00|"
构建整个规则:
alert ssh any any <> $HOME_NET 22 (msg:"SSH爆破"; content: "|15 00 00 00 00 00 00 00 00 00 00|"; threshold: type threshold, track by_src, count 2, seconds 20; sid:5622002;)
四、MySql预警
1、登录失败预警
(1)保证系统的mysql可以远程连接
这里我使用的是xampp中的自带的mysql,初始时是没有密码的
修改成如下如这样就可以远程连接了:
测试远程连接
远程连接成功。
(2)抓取流量
查看wireshark抓取的流量信息
成功时:
既然成功了,也没必要提醒了。
失败时:
查看失败流量:
(3)编写规则
锁定关键点:
Error message: Access denied for user 'root'@'192.168.164.1' (using password: YES)
中的:
Access denied for user
编写规则:
首先要在/etc/suricata/suricata.yaml添加一个MySql端口(3306)的变量:
vi etc/suricata/suricata.yaml
我这里没有设置,直接填写为3306
Suricata默认并没有提供对MySQL的应用层协议的支持,所以只能使用TCP协议。
规则:
alert tcp any any <> any 3306 (msg:"MySQL登录失败"; content:"Access denied for user"; nocase; sid:5620001;)
(4)添加规则并测试:
添加:
测试:
成功
2、Mysql爆破预警
1、编写规则
在登录失败的基础上加上阈值来构建MySql爆破的监控规则:
alert tcp any any <> any 3306 (msg:"MySQL爆破攻击"; content:"Access denied for user"; nocase; threshold: type threshold, track by_src, count 5, seconds 10; sid:5620002;)
2、添加规则并测试
添加:
测试:
成功
3、MySql木马写入
1、锁定语句:
select "<?php eval($_POST['code']); ?>" into outfile "/opt/shell.php";
2、构建规则
alert tcp any any <> any 3306 (msg:"MySQL木马写入"; content:"into outfile"; nocase; pcre: "/eval|assert|system|_POST|_GET/i"; sid:5620004;)
3、添加规则与测试
测试: