《网络攻防技术(第2版)》 —1.2.2 网络攻击的步骤与方法
858
2022-05-30
2.3.2 端口扫描
Internet上的大部分服务都使用一种基于TCP/IP协议的客户机/服务器的模式。在这种模式下,服务器端在某个TCP或UDP(User Datagram Protocol,用户数据报协议)的端口处于侦听状态,等待客户端程序发来的连接请求或数据,并做出相应的应答。因此,一个Internet的服务或程序必然会打开一个或多个TCP或UDP端口,反之,一个开放的TCP或UDP端口意味着可能存在一个Internet服务或程序。比如,访问Web通过服务器的TCP 80端口通信,访问FTP服务通过服务器的TCP 21端口通信,QQ使用UDP 8000端口进行通信。
IP地址可以在Internet上定位一台主机,在攻击者试图入侵一台主机时,必须发现可能访问该主机的通道,也就是端口。
端口扫描就是一种检查目标系统开放的TCP或UDP端口的信息收集技术。它的基本方法是向目标机器的各个端口发送连接的请求,根据返回的响应,判断在目标机器上是否开放了某个端口。端口扫描的直接结果就是得到目标主机开放和关闭的端口列表,这些开放的端口往往与一定的服务相对应,通过这些开放的端口,攻击者就能了解主机运行的服务,然后进一步整理和分析这些服务可能存在的漏洞,随后采取针对性的攻击。
1. Connect扫描
对于所有基于TCP协议的应用层服务来说,其运作模式基本上是相同的。图2-4描述了使用Socket编程接口实现基于TCP连接的过程。客户端利用Socket向服务器端口发送一个Connect请求,如果服务器正常运行,Connect将返回一个已建立的TCP连接。通过这个连接,客户端和服务器之间完成正常的数据交互。如果仅仅判断目标主机上的某个端口是否运行着一个服务,那么只需要用Socket向目标端口发送一个Connect请求,在连接建立后关闭这条连接即可。
图2-4 使用Socket编写基于TCP的应用
早期的扫描器(比如UNIX下的扫描工具SATAN)采用的就是这种简单的端口扫描实现方法,这种方法也称为TCP Connect。用户只需要创建一个套接字(Socket),调用Connect函数,目标主机就会对这个Connect请求做出响应。如果某个端口开放了一个服务,这个Connect请求就会成功地建立一个TCP连接;如果没有开放服务,连接就不会建立,并返回错误的原因。
使用TCP Connect进行扫描的优点是实现简单,几乎所有支持TCP/IP的操作系统都提供了TCP Connect调用的API(Application Programming Interface,应用程序编程接口)函数,并允许以普通用户权限进行调用。这种方法的缺点是很容易被防火墙检测,也会被目标的操作系统或服务记录。
2. SYN扫描和FIN扫描
为了使端口扫描的动作更加隐蔽、更加不易被目标觉察,在过去的几年中,攻击者对端口扫描技术进行了更为深入的研究,形成了一系列新颖的端口扫描技术。这些扫描技术的形式很多,但基本思想接近。它们的共同点是:扫描必须向目标发送某种数据包,而对于这种数据包,开放端口和关闭端口的响应是有差异的。另一个共同点是,这种数据包的发送和接收过程往往不同于正常的TCP数据的发送和接收过程。事实上,正常的TCP数据发送和接收总是存在着被目标主机记入日志的危险。
TCP Connect的建立要经过三次握手过程,对这个过程进行研究就可以引申出一种新的扫描方式—TCP SYN扫描。
TCP三次握手实际上包含三次数据包的发送:客户端发送SYN包,服务器回送SYN|ACK包,客户端回送ACK包。这是正常的TCP连接过程,如果想和服务器进行正常数据通信也必须这样做。但对于端口扫描来说则不是这样。在对一个目标进行扫描时,我们并不需要等待一个连接的完全建立。如果我们向目标的某个端口发送一个标志SYN置位的数据包,而目标返回了一个标志SYN、ACK同时置位的数据包,那么就能够判断出目标的这个端口是打开的。最后一个ACK数据包对于端口扫描来说并不必要。另一方面,正是这个ACK数据包的发送使服务程序确认一个连接的建立并将之记录到日志中。如果不回送最后的ACK包,就可以使这次扫描变得隐蔽起来,这就是TCP SYN扫描。
TCP SYN扫描技术通常被称为“半打开”扫描,因为扫描程序并不需要建立一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好像准备建立一个实际的连接并等待反应一样。若返回信息为SYN|ACK,表示端口处于侦听状态;若返回信息为RST,表示端口没有处于侦听状态。
SYN扫描的实现比Connect扫描复杂一些。要实现TCP SYN扫描,就需要更有效地控制IP数据包。因此,必须使用RAW Socket编程实现这样的扫描功能。
在某些情况下,SYN扫描也不够隐蔽。一些防火墙和包过滤器会对某些指定的端口进行监视,有些程序,比如Synlogger和TCPWrapper,能检测到这些扫描。相反,FIN数据包可能会顺利通过。在TCP协议标准中规定,发送一个FIN报文到一个关闭的端口时,该报文会被丢掉,并返回一个RST报文;但是当FIN报文到达一个活动的端口时,该报文只是被丢掉,而不回应任何信息。大多数操作系统(Unix BSD等)在实现时遵从了协议规范,但也有部分系统(如微软的系列产品)没有遵守TCP标准所要求的行为,这些系统不管端口是否打开都会回复RST。对于这样的系统,FIN扫描就不适用了。
与FIN扫描具有相似思路的实现是发送一个带有FIN和ACK标记的包,如果从某个端口返回的包的TTL值小于其他RST包,端口就可能是打开的。因为IP是一个基于路由的协议,每经过一次包的中转都会将TTL值减1,所以当一个打开的端口收到一个包时,它会首先将TTL值减1,若发来的包不是一个TCP的SYN包,就会返回一个TTL值比关闭端口小1的RST包。
FIN扫描的优点是一般不会被目标操作系统或服务记录到日志,并且可以绕过某些简单的防火墙设置。Netstate命令不会显示主机受到了扫描,因为Netstate命令只能显示TCP连接或连接的尝试。
它的缺点是需要使用RAW Socket来编程实现,实现起来相对比较复杂。而且,FIN扫描并不对所有操作系统有效。对于不同的操作系统会有不同的结果,因而FIN扫描并不是一个可以完全信任的方法。
3. 其他端口扫描技术
为了避开防火墙的过滤,并且使扫描更加隐蔽,出现了其他端口扫描技术。下面将列举一些端口扫描技术,更多的内容可以参考扫描工具Nmap自带的文档。
(1)SYN+ACK扫描
向目标主机发送SYN和ACK同时置位的TCP包,关闭的端口会返回RST包,而开放的端口会忽略该包。
(2)TCP XMAS扫描
扫描器发送的TCP包头设置所有标志位,关闭的端口会响应一个同样设置所有标志位的包,开放的端口则会忽略该包而不做出任何响应。
(3)NULL扫描
与XMAS扫描相反,NULL扫描将TCP包中的所有标志位都置0。当这个数据包被发送到基于BSD操作系统的主机时,如果目标端口是开放的,则不会返回任何数据包;如果目标端口是关闭的,被扫描主机将发回一个RST包。不同的操作系统有不同的响应方式。
(4)IP分段扫描
IP分段扫描本身并不是一种新的扫描方法,而是其他扫描技术的变种,特别是SYN扫描和FIN扫描。其原理是把TCP包分成很小的分片,从而让它们能够通过包过滤防火墙。不过,有些防火墙会丢弃太小的包,而有些服务程序在处理这样的包的时候会出现异常、性能下降或者错误。
(5)TCP FTP Proxy扫描
在FTP协议中,数据连接可以与控制连接位于不同的机器上。例如,扫描内部网络主机可以利用FTP服务器连接目标主机指定的端口,从而判断目标主机是否打开了某个端口。利用PORT命令让FTP服务器与目标主机的指定端口建立连接。如果端口打开,则可以传输,否则返回“425 Can't build data connection: Connection refused.”。FTP协议的这个缺陷还可以被用来向目标(邮件、新闻)传送匿名信息。这种方法的优点是可以穿透防火墙,缺点是速度比较慢,且有些FTP服务器禁止这种特性。
在所有的扫描工具中,Nmap是最著名也是最强大的扫描工具,它提供了可运行在Linux、Windows、MacOS等多个操作系统上的版本。Nmap不仅可用于探测主机的存活状态,还可以扫描目标主机开放的端口、操作系统类型等,更为重要的是,它提供了隐蔽、半隐蔽等多种扫描策略。可以说,Nmap使用手册就是一本端口扫描的教科书。图2-5展示了Nmap的扫描结果。
图2-5 Nmap扫描结果
4. UDP端口扫描
上面讨论的各种扫描技术实际上都是针对TCP端口的扫描技术。UDP端口的扫描比TCP端口的扫描要简单得多,因为TCP是一种面向连接的流协议,而UDP则是一种无连接的数据报协议。
攻击者只需向目标主机的UDP端口任意发送一些数据,如果这个UDP端口是没有开放的,则会发回一个 “目标不可达” ICMP报文。对于UDP端口扫描来说,这可能是目前唯一的方法。
通用安全
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。