概述
端口扫描是信息收集阶段的重要环节,是获取目标主机服务信息的主要方式之一。其核心基于 TCP/IP 协议栈的传输层特性。常见的主动端口扫描大体可分为 TCP 扫描 和 UDP 扫描 两类。
UDP 端口扫描原理
与 TCP 不同,UDP 是一种无连接、无状态的协议,因此在扫描时能够得到的信息相对有限。
- 当客户端向服务端某个 关闭的 UDP 端口发送数据时,服务端通常会返回一个 ICMP Port Unreachable 报文。
- 由此可知:如果收到了该 ICMP 报文,可以确定端口已关闭。
- 如果没有收到响应,则可能是端口开放,也可能是被防火墙丢弃。
👉 因此,UDP 扫描的特点是:
- 端口关闭的结论可靠;
- 端口开放的结论不确定(可能开放,也可能被屏蔽)。
这也是为什么 UDP 扫描常常比较缓慢、准确率不高。
TCP 端口扫描原理
由于TCP 是一种面向连接、有状态的协议,并且拥有多种标志位(Flags),因此针对 TCP 的扫描方式更加多样化。以下列出几种常见方式(以 Nmap 为例):
| 扫描方法 | 原理 | 典型应用 | Nmap 参数 |
|---|---|---|---|
| 全连接扫描 | 完整执行 TCP 三次握手 | 结果最稳定,但容易被记录 | -sT |
| 半开扫描(SYN Scan) | 仅发送 SYN,收到 SYN/ACK 后立即发送 RST,避免完整握手 | 快速,隐蔽性较好,常用 | -sS |
| FIN 扫描 | 仅发送 FIN 标志包,若端口关闭则返回 RST | 适用于类 Unix 系统 | -sF |
| 圣诞树扫描(Xmas Scan) | 同时设置 FIN、URG、PUSH 标志,关闭端口返回 RST | 绕过部分防火墙 | -sX |
| TCP Null 扫描 | 不设置任何标志位,关闭端口返回 RST | 类似 FIN 扫描 | -sN |
| ACK 扫描 | 发送 ACK 包,关闭端口返回 RST | 探测防火墙过滤规则,而非端口状态 | -sA |
| UDP 扫描 | 发送 UDP 包,关闭端口通常返回 ICMP Port Unreachable | UDP 服务发现 | -sU |
TCP 报文格式(关键标志位)
下面给出 TCP 首部(Header)的结构示意,重点在 6 个控制位(Flags):
0 1 2 3 4 5 6 7 8 9 A B C D E F
+-------------------------------+
| Source Port |
+-------------------------------+
| Destination Port |
+-------------------------------+
| Sequence Number |
+-------------------------------+
| Acknowledgment Number |
+-------+-----------+-+-+-+-+-+-+
| Data | Reserved |U|A|P|R|S|F|
| Offset| |R|C|S|S|Y|I|
+-------+-----------+-+-+-+-+-+-+
| Window Size |
+-------------------------------+
| Checksum |
+-------------------------------+
| Urgent Pointer |
+-------------------------------+
| Options | Padding |
+-------------------------------+
| Data |
+-------------------------------+
标志位解释:
- URG:紧急指针有效
- ACK:确认号有效
- PSH:提示立即将数据交给应用层
- RST:重置连接
- SYN:发起新连接
- FIN:释放连接
空闲扫描
攻击者并不直接与目标主机通信,而是“借用”第三方僵尸机(Zombie Host)的 IPID 递增特性进行扫描。因此,目标主机的日志里不会出现攻击者的 IP,而只会记录下“僵尸机”的 IP。但是这种扫描依赖老旧的僵尸主机。
sequenceDiagram
participant A as 攻击者
participant Z as 僵尸主机
participant T as 目标主机
Note over A, T: 阶段一:探测僵尸主机的初始IPID
A->>Z: 发送SYN/ACK包
Z->>A: 回复RST包 (IPID = x)
Note right of A: 记录初始IPID: x
Note over A, T: 阶段二:伪造僵尸主机的IP向目标发送探测包
A->>T: 伪造SYN包 (源IP = Z)
alt 目标端口开放
T->>Z: 发送SYN/ACK包
Z->>T: 回复RST包 (IPID 递增为 x+1)
else 目标端口关闭
T->>Z: 发送RST包
Note right of Z: 收到RST,不回复,IPID不变
end
Note over A, T: 阶段三:再次探测僵尸主机的IPID
A->>Z: 发送SYN/ACK包
Z->>A: 回复RST包 (IPID = y)
Note right of A: 分析IPID变化
alt 如果 y == x + 1
Note right of A: 目标端口可能为【过滤】状态
(或僵尸机IPID增长不规律) else 如果 y == x + 2 Note right of A: 目标端口【开放】 else 如果 y == x Note right of A: 目标端口【关闭】 end
(或僵尸机IPID增长不规律) else 如果 y == x + 2 Note right of A: 目标端口【开放】 else 如果 y == x Note right of A: 目标端口【关闭】 end
nmap 用法
nmap -sI <zombie_host> <target_host>
示例:
nmap -sI 192.168.1.100 192.168.1.200
192.168.1.100→ 僵尸机(Zombie),必须具备 IPID 可预测性。192.168.1.200→ 目标主机。
防御与检测
- 最小化服务暴露:仅开放业务需要的端口,最简单也最有效的方式。
- 使用防火墙/ACL:限制来自不可信源的访问。
- IDS/IPS 检测:通过流量特征识别扫描行为。
- 蜜罐技术:诱导扫描者暴露意图。
总结
端口扫描既是进攻方的侦察利器,也是防御方必须重点防护的对象。
理解不同扫描方式的原理,能够帮助安全研究人员更好地掌握攻防思维,也有助于在实际工作中快速定位风险点。