目录
-
- [1、识别 TCP SYN 半开扫描](#1、识别 TCP SYN 半开扫描)
- [2、过滤 ICMP 存活探测流量](#2、过滤 ICMP 存活探测流量)
- 3、分析扫描时间段规律
- 4、识别扫描工具指纹
-
- 原理
- [查看 TTL、TCP 窗口大小(判断 Nmap / Masscan)](#查看 TTL、TCP 窗口大小(判断 Nmap / Masscan))
- [查看 HTTP 请求里的 User-Agent(UA)工具指纹](#查看 HTTP 请求里的 User-Agent(UA)工具指纹)
端口扫描典型特征:大量 SYN 握手包无 ACK 应答、单 IP 短时间访问多个目的端口、大量 ICMP ping 包、高频短连接无上层应用数据。
1、识别 TCP SYN 半开扫描
原理说明
- SYN=1,ACK=0:代表客户端只发送握手请求,没有接收服务器确认报文,属于典型半开扫描(SYN 扫描),Nmap、Masscan 主流扫描工具默认使用该扫描方式。
- 正常 TCP 连接一定会有 SYN+ACK 握手回复,扫描行为只会大量发送 SYN 探测包,不会建立完整连接,所以没有上层业务数据,连接生命周期极短(高频短连接)。
- 统计 IPv4 端点可以快速定位扫描源 IP,单 IP 数据包几万级基本可以判定为恶意扫描 IP。
排查步骤
Step1:在 Wireshark 过滤栏输入过滤表达式
bash
tcp.flags.syn == 1 && tcp.flags.ack == 0

Step2:打开「统计」→「端点」→ IPv4

含义解释:
| Key | Value |
|---|---|
| 地址 | 通信双方的 IP 地址,用来区分攻击源 IP / 本机服务器 IP,定位恶意访问主机 |
| 分组 | 当前过滤条件下,该 IP 产生的数据包数量 |
| Total Packets | 该 IP 在整个流量文件全部数据包总量(不受当前过滤器限制),用来判断 IP 整体访问量级,快速筛选高频扫描 IP |
| Percent Filtered | 当前过滤出的数据包,占该 IP 总数据包的百分比,用来判断该 IP 流量是否集中在某一类行为中 |
| Tx Packets | Transmit 发送数据包:该 IP 向外发送的数据包个数;外网攻击 IP 一般只有 Tx 流量,服务器只有 Rx 流量 |
| Tx Bytes | 该 IP 向外发送的数据总字节大小,用来衡量攻击流量带宽消耗 |
| Rx Packets | Receive 接收数据包:该 IP 收到的数据包个数;本机 Web 服务器 Rx 数值会远大于 Tx |
| Rx Bytes | 该 IP 接收的数据总字节大小,代表本机收到的外部访问流量大小 |
判定技巧:
- 目标服务器 IP:Rx Packets数值极高,Tx Packets几乎为 0
- 外网扫描 IP:Tx Packets有大量数据,Rx Packets基本为 0
Step3 :按分组降序排列

核心受害 IP为203.161.44.208
- 接收数据包:108506 个,总流量 7MB,占过滤流量 34.56%,是本次所有流量的目标 Web 服务器内网 IP。
- 特征:Tx Packets=0、Rx Packets=108506,说明该 IP只收包、不主动向外发包,所有流量都是外网 IP 主动访问本机,完全符合公网服务器被外部扫描、探测的场景。
- 为什么能确定是目标服务器?所有其他 IP 的 Tx(发送)有数据、Rx(接收)为 0,代表都是外网攻击源主动向该 IP 发起连接请求。
TOP 高危可疑 IP:
| 外网源 IP | 发送数据包 |
|---|---|
| 172.234.207.202 | 2391 |
| 104.237.151.205 | 2389 |
| 193.32162.28 | 608 |
2、过滤 ICMP 存活探测流量
原理说明
攻击者在端口扫描前,会先用 ICMP ping 探测网段内主机是否存活,只有主机在线,才会继续端口遍历扫描。批量 ICMP 请求就是典型的存活探测行为,也是端口扫描的前置步骤。
排查步骤
Step1:过滤栏输入
bash
icmp.type == 8
表示ICMP Echo Request(Ping 请求包),只保留攻击者发出去用来探测主机是否存活的 Ping 探测包,自动过滤掉 Ping 响应、网络不可达等无关 ICMP 包,不用逐个数据包查看判断类型。
Step2:观察数据包列表

看每一行数据包的源 IP(Source 列),如果同一个源 IP 连续出现几十、上百条记录,说明该 IP 正在批量 Ping 扫描网段,属于典型的存活探测行为。
Step3 :打开「统计」→「端点」→ IPv4,并勾选右侧的显示过滤器的限制

Step4:选中某个恶意IP(此处选43.134.41.39),单独过滤
bash
# Wireshark 过滤栏
ip.src == 43.134.41.39

3、分析扫描时间段规律
原理说明
自动化扫描程序一般 7×24 小时不间断发包,凌晨、深夜流量峰值高;人工渗透一般集中在工作时段。通过时间分布可以判断威胁来源类型。
操作步骤
Step1:过滤得到所有扫描流量(SYN 扫描 + ICMP)
bash
(tcp.flags.syn == 1 && tcp.flags.ack == 0) || (icmp.type == 8)
Step2:自定义Wireshark 数据包列表自带「时间」列格式,并按时间排序,统计数据包集中出现的时间段。


Step3 :打开统计→I / O图表;可记录扫描集中在白天 / 凌晨,判断攻击者是自动化脚本扫描还是人工渗透扫描。


4、识别扫描工具指纹
原理
不同扫描工具操作系统默认 TTL、TCP 头部参数存在固定指纹,安全人员可以依靠 TCP 指纹匹配扫描工具,溯源攻击手段。
查看 TTL、TCP 窗口大小(判断 Nmap / Masscan)
Step1:查看 TTL(在 IPv4 层)
展开Internet Protocol Version 4 (IPv4),并找到字段 Time to live: 58
| 抓到的剩余 TTL 范围 | 原始默认 TTL | 攻击者操作系统 |
|---|---|---|
| 1~64 | 64 | Linux /macOS(Nmap 最常用运行环境) |
| 65~128 | 128 | Windows 系统 |
| 129~255 | 255 | 路由器、防火墙、嵌入式设备 |

Step2:查看 TCP 窗口大小(在 TCP 层)
展开Transmission Control Protocol (TCP),找到字段Window : 65535(Nmap 常用固定窗口值)
- Nmap 扫描发出的所有 SYN 包,窗口大小几乎固定不变;
- Masscan 高速扫描的数据包,窗口值不固定、数据包发送间隔极短、单位时间数据包量级极大。

不同扫描工具封装 TCP 数据包时,会沿用运行系统的默认网络参数,Nmap 大多部署在 Linux 虚拟机,默认 TTL 固定 64,TCP 握手窗口采用默认固定值;Masscan 为了高速发包,不会精细化控制 TCP 参数,数据包行为特征杂乱密集。
查看 HTTP 请求里的 User-Agent(UA)工具指纹
操作步骤:
Step1:清空上方过滤器,输入 Web 流量过滤语句
bash
ip.src == 恶意扫描IP && http
Step2 :选中任意一条 HTTP 请求数据包,在下方详情面板展开:Hypertext Transfer Protocol
Step3 :在 HTTP 层中找到字段:User-Agent: xxx

UA 特征:
| UA 内容 | 工具判定 |
|---|---|
| User-Agent: Nmap Script Engine | Nmap 自带脚本扫描 |
| python-requests/2.xx.x | Python 脚本、Dirsearch、自定义爬虫扫描 |
| curl/7.xx.x | curl 命令行批量探测 |
| Wget wget | 批量目录扫描 |
| 空 User-Agent | 高速扫描工具(Masscan、自定义扫描脚本) |
正规浏览器访问网站会携带 Chrome、Edge、Firefox 这类浏览器标识;而扫描工具、脚本程序会直接携带开发库、工具本身的默认 UA,属于非常典型的恶意流量指纹,可以直接作为 WAF 拦截规则。