端口扫描技术全解析:从“光明正大”到“偷偷摸摸”的十种姿势
什么是端口扫描?
简单来说,端口扫描就是往目标主机的各个端口“敲门”,看看哪些门是开着的、门后面提供了什么服务。网络里的每台电脑都有65535个TCP端口和65535个UDP端口,端口扫描就是逐个试探这些端口,判断它们是开着的还是关着的。
端口扫描是网络安全领域最基础也最重要的技术之一。网络管理员用它来检查自家系统有没有不该开的口子,渗透测试人员用它来发现目标系统的攻击面。当然,黑客也会用它——工具本身没有善恶,关键看谁在用、用来干什么。
下面梳理了十种常见的端口扫描技术,按“从最容易被发现到最隐蔽”的顺序排列。
一、完全连接扫描——最“诚实”的敲门方式
完全连接扫描,也叫TCP Connect扫描,是最基础、最原始的扫描方法。
它的原理特别简单:完整地走完TCP三次握手。扫描器向目标端口发SYN包,目标回复SYN+ACK,扫描器再回复ACK——三次握手完成,连接建立成功,说明端口是开放的。如果连接建立失败,说明端口是关闭的。
特点:实现最简单,普通用户权限就能跑,结果最可靠。但缺点也很明显——隐蔽性最差,所有连接记录都会老老实实写在目标系统的日志里。
二、SYN扫描(半连接扫描)——“敲到一半就跑”
SYN扫描也叫半连接扫描或半开放扫描,是目前应用最广泛的端口扫描技术之一。
它的原理是:只完成TCP三次握手的前两步,不建立完整连接。扫描器发SYN包,如果收到SYN+ACK,就说明端口开放——但这时候扫描器不发ACK完成握手,而是直接发RST包中断连接。如果收到RST包,说明端口关闭。
注意:“半连接扫描”和“SYN扫描”其实是同一种技术的两个名字。你叫它什么都行,指的都是同一回事。
特点:比完全连接扫描隐蔽,因为连接根本没建立完,很多系统日志不会记录这种半连接。速度也更快,少了一次握手交互。缺点是需要构造原始数据包,在Unix/Linux上通常需要root权限。
三、ID头信息扫描(僵尸扫描)——“借刀杀人”
ID头信息扫描也叫空闲扫描(Idle Scan),这是一种极其巧妙的扫描技术。
它的核心思想是:扫描者自己不出面,借一台“僵尸主机”当替身去试探目标。
- 找僵尸:先找一台网络空闲的“僵尸主机”(通常是Windows系统),它的IP数据包ID头是递增的。
- 测基线:扫描器向僵尸主机发一个探测包,查看它当前的IP ID值。
- 借刀:扫描器伪造数据包,把源IP改成僵尸主机的IP,向目标端口发SYN包。
- 看反应:如果目标端口开放,目标会给僵尸主机回SYN+ACK,僵尸收到后发RST——僵尸的IP ID值会+1。如果端口关闭,目标回RST,僵尸直接忽略——IP ID值不变。
- 再测:扫描器再测一次僵尸的IP ID值,对比两次的差值,就知道端口开没开。
特点:隐蔽性极高,目标系统看到的扫描来源是僵尸主机的IP,不是扫描者自己的。缺点是速度慢,而且依赖僵尸主机的IP ID必须递增——现在很多操作系统已经改了这种 predictable 的行为,让这种扫描越来越难搞。
四、隐蔽扫描——绕过防火墙和IDS
隐蔽扫描是一个大类,指那些能绕过IDS、防火墙等安全机制的扫描技术。FIN扫描、NULL扫描、XMAS扫描、ACK扫描都属于这一类。
它们的共同点是:不按TCP三次握手的正常套路出牌,用各种奇怪的标志位组合去试探。
4.1 FIN扫描
根据RFC 793的规定:如果端口关闭,系统应该返回RST包;如果端口开放,不返回任何信息。
特点:比SYN扫描更隐蔽。但对Windows系统基本无效——Windows不管端口开不开都会回RST。主要针对Unix/Linux系统有效。
4.2 NULL扫描
把所有标志位(ACK、FIN、RST、SYN、URG、PSH)全部置空(也就是设为0)。
原理和FIN扫描一样:关闭的端口回RST,开放的端口没反应。
4.3 XMAS扫描
之所以叫XMAS(圣诞节)扫描,是因为数据包像圣诞树一样“灯全亮着”。
原理和NULL、FIN完全一样。
4.4 ACK扫描
向目标发ACK数据包。
不管端口开还是关,目标都会返回RST包。所以ACK扫描不能直接判断端口开没开,它的用途是探测防火墙规则——如果收不到RST,说明有防火墙把包滤掉了。
判断端口状态要看返回RST包的TTL值和WIN值:
- TTL < 64 或 WIN > 0 → 端口可能开放
- TTL > 64 或 WIN = 0 → 端口可能关闭
说白了:ACK扫描不是用来直接“找开放端口”的,而是用来“摸清防火墙脾气”的。
4.5 SYNACK扫描
不先发SYN,直接发SYN+ACK数据包。
正常TCP连接都是先SYN再SYN+ACK。如果你直接发SYN+ACK,目标会觉得“这什么鬼”——开放端口会直接丢弃这个包,不返回任何信息;关闭端口会返回RST。
这种扫描方式比较冷门,实际应用中不太常见。
总结一下
| 扫描方式 | 核心原理 | 隐蔽性 | 主要限制 |
|---|---|---|---|
| 完全连接扫描 | 完整三次握手 | 最低 | 日志全记录 |
| SYN/半连接扫描 | 只做前两次握手 | 较高 | 需root权限 |
| ID头/僵尸扫描 | 借僵尸主机当替身 | 极高 | 依赖特定条件 |
| FIN扫描 | 只发FIN标志 | 较高 | Windows无效 |
| NULL扫描 | 所有标志位为0 | 较高 | Windows无效 |
| XMAS扫描 | 所有标志位为1 | 较高 | Windows无效 |
| ACK扫描 | 发ACK看TTL/WIN | 较高 | 不直接判断开/关 |
| SYNACK扫描 | 直接发SYN+ACK | 较高 | 不太常用 |
一个重要的知识点:FIN、NULL、XMAS这三种扫描,原理完全相同——都是利用RFC 793的规范(关闭端口回RST,开放端口无响应)。区别仅仅在于数据包里标志位的组合不同。记住这一点,考试遇到相关题目就不容易混淆了。
在实际渗透测试和网络安全工作中,SYN扫描(-sS)是用得最多的,因为它速度快、隐蔽性不错、结果可靠。完全连接扫描(-sT)适合没有root权限的场景。FIN/NULL/XMAS这些“花样”扫描,实战中反而用得少——主要是兼容性问题太多。至于ID头扫描,更多是作为一种“炫技”般的存在,展示了TCP/IP协议设计中的一些巧妙(或者说脆弱)之处