3.2 端口扫描
端口扫描是获取主机信息的一种重要办法。通过对目标系统的端口扫描,可以获取主机的服务、软件版本、系统配置、端口分配等相关信息。端口作为潜在通信信道的同时,也是黑客入侵的通道。通过对端口的扫描与端口数据的分析,安全管理员、评估人员、黑客均可以得到众多关键信息,从而发现系统的安全漏洞、不必要开放的端口、脆弱软件等。端口扫描主要通过连接目标系统的TCP和UDP端口,来确定哪些服务正在运行。下面介绍主流的扫描技术。
3.2.1 开放扫描
开放扫描又称TCP connect扫描,它是最直接的端口扫描方法。扫描主机通过TCP/IP的3次握手与目标主机的指定端口建立一次完整的连接。连接由系统调用connect()开始,如果端口开放,则连接建立成功;否则返回-1,表示端口关闭。图3-5和图3-6分别给出连接成功及连接失败的开放扫描原理。
图3-5 连接成功的开放扫描
图3-6 连接失败的开放扫描
开放扫描实现起来非常容易,对操作者权限没有限制,但是开放扫描会被主机记录。
3.2.2 半开放扫描
半开放扫描又称TCP SYN扫描,半开放端口扫描方法不需要3次握手,扫描主机与目标主机之间不用建立完整的连接。图3-7和图3-8分别给出连接成功及未连接成功的半开放扫描原理。
图3-7 连接成功的半开放扫描
图3-8 未连接成功的半开放扫描
半开放扫描可能不会被记入系统日志,所以不会在目标计算机上留下记录。但是,通常情况下,构造自己的SYN数据包必须要有root权限。
3.2.3 秘密扫描
秘密扫描是一种不被审计工具所检测的扫描技术,它能躲避IDS、防火墙、包过滤器和日志审计,从而获取目标端口的开放或关闭信息。由于没有包含TCP的3次握手协议的任何部分,所以无法被记录下来,因此比半开放扫描更为隐蔽。秘密扫描的缺点是扫描结果的不可靠性会增加,而且扫描主机也需要自己构造IP包。现有的秘密扫描有TCP FIN扫描、TCP ACK扫描、TCP NULL扫描、Xmas Tree扫描等,具体介绍如下。
(1)TCP FIN扫描
使用FIN数据包来探听端口。由于这种技术不包含标准的TCP三次握手协议的任何部分,所以无法被记录下来。当一个FIN数据包到达一个关闭的端口时,数据包会被丢掉并会返回一个RST数据包;否则,当一个FIN数据包到达一个打开的端口时,数据包只是被简单地丢掉而不返回RST。这种方法在区分UNIX和NT操作系统时十分有用。
(2)TCP ACK扫描
扫描主机向目标主机发送ACK数据包。根据返回的RST数据包,推断端口信息。若返回的RST数据包的TTL值小于或等于64,则端口开放,反之,则端口关闭。
(3)TCP NULL扫描
根据RFC 793[1]的要求,将一个没有设置任何标志位的数据包发送给TCP端口,在正常的通信中至少要设置一个标志位;根据RFC 793的要求,在端口关闭的情况下,若收到一个没有设置标志位的数据字段,那么主机应该舍弃这个分段,并发送一个RST数据包,否则不会响应发起扫描的客户端计算机。也就是说,如果TCP端口处于关闭,则响应一个RST数据包,若处于开放则无响应。NULL扫描要求所有的主机都符合RFC 793规定。
(4)Xmas Tree扫描
根据RFC 793的要求,程序往目标端口发送一个FIN(结束)、URG(紧急)和PSH(弹出)标志的分组,若其关闭,应该返回一个RST分组。