前言
端口扫描在红队渗透中是非常重要的一个环,日常使用的很多工具都具有端口扫描功能.
这篇文章会横向比较不同工具在端口扫描时的流量包特征和扫描器的扫描探活方法.从中提取出IDS和防火墙规则,达到拦截或检测网络中的扫描流量的目的.
*本文不讨论高频发包和异常连接等行为上的检测.
扫描流量分析
1. nmap
SYN扫描流量
nmap 默认使用TCP 半连接扫描方法
发送一个SYN包 如果端口开放则回返回ACK
如果收到RST则端口没有开放 (间接证明主机存活)
这种扫描方法没有阻塞,速度快. 只需要发syn包之后等待返回包即可 不需要建立会话
且因为没有建立完整连接,扫描不会被记录连接日志.
NMAP 使用了固定的窗口大小(1024)
同时也使用了固定的TCP OPTIONS (02 04 05 b4 TCP中最短的OPTIONS长度)
这种短OPTIONS 在日常使用的操作系统并不常见
猜测nmap可能是为了尽量减少包的大小才设置为最短options
https://github.com/nmap/nmap/blob/master/nmap.h#L165
注: nmap在收到SYN ACK后,会立即发送RST 重置连接.
存活检测
在大规模扫描中 存活检测也是一个非常重要的技术
在面对大量主机扫描时如果事先探测存活主机 之后仅对存活主机扫描 就防止在非存活主机上消耗不必要的探测时间
- ICMP ECHO 请求
这就是常见的ping 请求
特征: nmap为了减少包大小 icmp请求没有额外的数据负载
横向比较下 各个系统ICMP 负载
windows系统 icmp echo
linux icmp
nmap的icmp请求
- ICMP 时间戳 请求
注意: 上面这两个ICMP 包的类型不一样 配置防火墙时要同时丢弃两种请求
- ACK 诱导 RST
发送ACK数据包到服务器后,如果连接被重置或者连接会话不存在时会返回RST数据包
这个过程是由操作系统处理的 所以一般情况下返回RST就说明主机存活
- 常见端口 SYN ACK or RST
nmap默认会在80和443端口尝试SYN半连接
以是否有返回包判断主机存活
masscan
SYN 扫描流量
同nmap
SYN包模板位置
https://github.com/robertdavidgraham/masscan/blob/144c527ed55275ee9fbb80bb14fbb5e3fcff3b7e/src/templ-pkt.c#L51
存活检测
MASSCAN默认没有存活检测
GOBY
测试版本 goby 2.0.5 beta 企业版 默认配置
SYN 扫描流量
存活检测
UDP 探活
发送数据到不存在的端口 返回一个端口不可达的ICMP包
固定端口 数据 去特征
gorailgun
SYN 扫描流量
tcp 全连接扫描 无特征
会主动发起http探测
UA “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36”
Accept “text/html, image/gif, image/jpeg, *; q=.2, /; q=.2”
存活检测
只有ICMP ECHO
强特征
476f20476f204761646765742050696e67212121476f20476f204761646765742050696e67212121476f20476f204761646765742050696e67212121
yakit
SYN 扫描流量
存活检测
ICMP ECHO + TCP 扫描(80 22 443)
icmp 随机填充定长数据
fscan
SYN 扫描流量
操作系统 TCP 全连接 非半连接
存活检测
ICMP ECHO
无负载 同nmap
扫描流量检测
检测窗口 大小是否为1024
TCP OPTIONS 长度是否为4 (02 04 05 b4)
检测规则编写
iptables 规则(阻断需谨慎 可能有误报)
iptables -I INPUT -p tcp –syn -m length –length 44 -j REJECT –reject-with tcp-reset
阻断 TCP OPTIONS 长度为4 的syn 包 IP 固定 20 + TCP 固定 20+OPTIONS 4
suricata 检测规则
匹配结尾为02 04 05 b4 的TCP SYN包
alert tcp any any -> any any (msg:”SYN PORT SCAN (nmap masscan like)”;lags:S;tcp.hdr;content:”|02 04 05 b4|”; endswith; rev:1; sid:23330001; metadata:by burpheart;)
匹配长度为24 的TCP SYN包 (20+4)
alert tcp any any -> any any (msg:”SYN PORT SCAN nmap masscan like”;flags:S;tcp.hdr;bsize:24;rev:1; sid:23330002; metadata:by burpheart;)
有时间可能会写一篇 suricata 安装和检测规则编写的教程 x)
规则用途
公网扫描流量分析 收集攻击IP 统计公网扫描信息 作为威胁情报&防火墙黑名单使用
做了一个简易公网探针用来收集扫描信息
探针 suricata 检测流量生成日志->探针 Filebeat 收集日志->rabbit MQ 暂存->数据分析机 Filebeat 消费日志 ->ES ->KIBANA展示
下面这张图是几个公网流量探针最近收集到的告警数据
由于探针较少 所以数据量也非常少
参考 360 NATLAB 的监控数据
果然23端口扫的最多 )