浅谈端口扫描原理

一、端口扫描简介

端口扫描,顾名思义,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,然后就可以通过所提供的这些服务的己知漏洞就可进行攻击。其原理是当一个主机向远端一个服务器的某一个端口提出建立一个连接的请求,如果对方有此项服务,就会应答,如果对方未安装此项服务时,即使你向相应的端口发出请求,对方仍无应答,利用这个原理,如果对所有熟知端口或自己选定的某个范围内的熟知端口分别建立连接,并记录下远端服务器所给予的应答,通过查看一记录就可以知道目标服务器上都安装了哪些服务,这就是端口扫描,通过端口扫描,就可以搜集到很多关于目标主机的各种很有参考价值的信息。例如,对方是否提供FTP服务、WWW服务或其它服务。

二、端口状态

Nmap探测一个端口时可能得到以下六种端口状态:

open:端口是开放的。
closed:端口是关闭的。
filtered:端口被防火墙、IDS、IPS等屏蔽,无法确定其状态。
unfiltered:端口没有被屏蔽,但其是否开放需要进一步确定。
open|filtered:端口是开放的或被屏蔽。
closed|filtered :端口是关闭的或被屏蔽。

三、端口扫描方式

以下是三种常见的端口扫描方式:

1. 全连接扫描

全连接扫描是最传统且最直接的方法。它完全模拟客户端发起TCP连接的过程,通过执行完整的三次握手来确定端口是否开放。扫描器会调用操作系统级别的connect()函数来尝试与目标主机的某个端口建立连接。如果端口开放并监听连接,目标主机将回应一个ACK确认数据包,从而建立起连接。这种方式相对容易被防火墙和IDS(入侵检测系统)捕获。

2. 半连接扫描

半连接扫描,又称SYN扫描,是为了减少痕迹和避免引起警报而设计的更隐蔽的扫描方式。扫描器只发起TCP连接的第一次握手,即发送一个SYN数据包。如果目标端口开放,它会回应一个SYN+ACK数据包。这时,扫描器并不会完成第三次握手(即不发送ACK),而是发送一个RST(复位)数据包来终止连接。这样就不需要建立完整的连接,降低了被检测的风险。

3. 秘密扫描

“秘密扫描”通常指的是那些旨在最大程度地降低被目标系统察觉的扫描技术。除了SYN扫描之外,还有一些更隐蔽的扫描方式,例如FIN扫描、Xmas Tree扫描、Null扫描等,这些扫描方式通过发送非标准的TCP数据包(如只有FIN标志位的包或多个标志位同时置位的包)来探测端口状态,基于目标主机对这些异常数据包的不同响应来判断端口是否开放。这些扫描方式的目的在于尽量减少在目标主机上产生的日志信息,以及避免触发防火墙规则或入侵检测系统的警报。

四、常用端口扫描方法及原理

1、TCP CONNECT SCAN

原理很简单,与目标端口建立3次握手,如果成功建立则为open,收到RST则为close,此方法为全连接扫描。

 2、TCP SYN SCAN

也称为TCP半连接扫描,只发送三次握手的第一次SYN报文段,如果收到ACK+SYN则为open,收到RST则为close,这种好处是不必等待三次握手完全完成,速度快且不容易被防火墙记录进日志。

 探测结果及状态如下:

 3、TCP FIN/Xmas Tree/NULL SCAN

这几种探测方式原理相同,只是发送包的标志位不同。

FIN扫描:FIN标志位为1,其余标志位为0。

Xmas Tree扫描:也被称为Christmas Tree(圣诞树)扫描,它会设置FIN、URG和PSH标志位为1,其余标志为0。

NULL扫描:所有标志位都被设置为0。

根据规定,理论上不会将不设置SYN,RST,或者ACK位的报文发送到开放端口,如果您确实收到了,丢弃该报文。当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致一个RST返回。而当端口开放时,应该没有任何响应。

  探测结果及状态如下:

 4、TCP ACK SCAN

当发送给对方一个含有 ACK 标志的TCP报文的时候,接收方会认为发生了错误(因为tcp建立连接时第一次握手报文不含ACK标志),接收方会返回含有RST标志的报文,无论端口是开放或者关闭。所以,不能使用TCP ACK扫描来确定端口是否开放或者关闭。但是可以利用它来扫描防火墙的配置,用它来发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的。

向服务端发送一个带有 ACK 标识的数据包,如果收到带有 RST 标识的响应,则说明服务端存在状态防火墙。当没有收到任何响应或者收到ICMP错误响应时表明该端口处于filtered状态。

 

  5、TCP WINDOW SCAN

TCP 窗口扫描的流程类似于 ACK 扫描,都是向服务端发送带有 ACK 标识的数据包,不同的在于 TCP 窗口扫描会检查收到的 RST 数据包中的窗口大小。

如果返回RST数据包说明没有防火墙过滤,端口开放或关闭根据RST包中的窗口大小判断。

如果 RST 数据包中的窗口大小不为零,则说明目标端口是开放的。如果 RST 数据包中的窗口大小为零,则说明目标端口处于关闭状态。

 

   探测结果及状态如下:

 6、UDP SCAN

UDP扫描比较简单,一般如果返回ICMP port unreachable说明端口是关闭的,而如果没有回应或有回应(有些UDP服务是有回应的但不常见)则认为是open,但由于UDP的不可靠性,无法判断报文段是丢了还是没有回应,所以一般扫描器会发送多次,然后根据结果再判断。这也是为什么UDP扫描这么慢的原因。

 

虽然因特网上最流行的服务运行在TCP协议上,但UDP服务被广泛部署。 DNS,SNMP和DHCP(注册端口53,161 / 162和67/68)是最常见的三种。 由于UDP扫描通常比TCP更慢且更困难,因此某些安全审核员会忽略这些端口。 这是一个错误,因为可利用的UDP服务非常普遍,攻击者肯定不会忽略整个协议。

UDP扫描通过向每个目标端口发送UDP数据包来工作。 对于大多数端口,此数据包将为空(无有效负载),但对于一些更常见的端口,将发送特定于协议的有效负载。 根据响应或缺少响应,端口被分配给四种状态之一,如下表所示: