端口扫描技术全解析:从“光明正大”到“偷偷摸摸”的十种姿势

什么是端口扫描?

简单来说,端口扫描就是往目标主机的各个端口“敲门”,看看哪些门是开着的、门后面提供了什么服务。网络里的每台电脑都有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),这是一种极其巧妙的扫描技术。

它的核心思想是:扫描者自己不出面,借一台“僵尸主机”当替身去试探目标

原理稍微复杂一点,但拆开看也不难理解

  1. 找僵尸:先找一台网络空闲的“僵尸主机”(通常是Windows系统),它的IP数据包ID头是递增的。
  2. 测基线:扫描器向僵尸主机发一个探测包,查看它当前的IP ID值
  3. 借刀:扫描器伪造数据包,把源IP改成僵尸主机的IP,向目标端口发SYN包
  4. 看反应:如果目标端口开放,目标会给僵尸主机回SYN+ACK,僵尸收到后发RST——僵尸的IP ID值会+1。如果端口关闭,目标回RST,僵尸直接忽略——IP ID值不变
  5. 再测:扫描器再测一次僵尸的IP ID值,对比两次的差值,就知道端口开没开。

特点:隐蔽性极高,目标系统看到的扫描来源是僵尸主机的IP,不是扫描者自己的。缺点是速度慢,而且依赖僵尸主机的IP ID必须递增——现在很多操作系统已经改了这种 predictable 的行为,让这种扫描越来越难搞。

四、隐蔽扫描——绕过防火墙和IDS

隐蔽扫描是一个大类,指那些能绕过IDS、防火墙等安全机制的扫描技术。FIN扫描、NULL扫描、XMAS扫描、ACK扫描都属于这一类。

它们的共同点是:不按TCP三次握手的正常套路出牌,用各种奇怪的标志位组合去试探

4.1 FIN扫描

向目标端口发送只带FIN标志位的数据包

根据RFC 793的规定:如果端口关闭,系统应该返回RST包;如果端口开放,不返回任何信息

特点:比SYN扫描更隐蔽。但对Windows系统基本无效——Windows不管端口开不开都会回RST。主要针对Unix/Linux系统有效

4.2 NULL扫描

把所有标志位(ACK、FIN、RST、SYN、URG、PSH)全部置空(也就是设为0)

原理和FIN扫描一样:关闭的端口回RST,开放的端口没反应

同样的问题:对Windows无效

4.3 XMAS扫描

把所有标志位全部置为1(FIN、URG、PSH全开)

之所以叫XMAS(圣诞节)扫描,是因为数据包像圣诞树一样“灯全亮着”

原理和NULL、FIN完全一样。

注意:这三种扫描(FIN、NULL、XMAS)行为完全一样,只是数据包里的标志位组合不同

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协议设计中的一些巧妙(或者说脆弱)之处