安全扫描技术分析

1、 前言

在渗透测试中,信息收集环节作为项目正式实施的第一阶段,用于直接或间接获取相关目标资产信息,从而使得测试人员更专注测试及利用扫描获取到的信息。无论是WEB渗透、网络渗透还是内网渗透,安全扫描成为测试人员获取资产信息及拓扑的首要手段。常规的安全扫描一般分为主动扫描和被动扫描,本文主要讲解其中的主动扫描。

2、 说明

主动扫描(Active Scanning):通过向目标间隔性发送扫描信息,接收此过程的回应类型,从而由此探寻弱点,其方式为大规模的爬虫、遍历及爆破等行为。

被动扫描(Passive Scanning):通过流量、代理、日志等方式去采集测试数据源,然后进行安全验证的过程。在此过程中,攻击机处于一种监听的状态,时时等待扫描结果的到来。

由于被动扫描需要时间较长,不如主动扫描获得信息更及时,而且处于授权的情况下,测试人员为快速获取全面的资产信息,会优先使用主动扫描的方式进行信息获取。(注:主动扫描会在目标主机上留下大量的访问痕迹且占用资源较多,两种扫描方式有利有弊,请根据工作状况酌情考虑。

3、 技术

我们都知道,计算机之间的通信是网络通过端口传递信息实现的,而计算机上65535个端口遵循TCP或UDP协议,因此又分为TCP扫描和UDP扫描。TCP是一个有连接的可靠协议,所以要使用三次握手来建立连接,三次握手的报文分别是(SYN)、(ACK SYN)和(ACK)。进行端口扫描时,首先向对方主机的某一端口发送(SYN)报文,如果对方这一端口上有程序在监听,则回复(SYN ACK)报文,否则回复(RST)报文。因此根据握手过程状况,又分为TCP SYN扫描(半开放)和TCP FIN扫描。而UDP是不存在监听的概念,因为它是无连接不可靠的协议,发送数据包过去,通常也不会有任何的对等回应。UDP扫描主要是检测是否存在ICMP不可达数据包。在主动扫描中,我们通常利用TCP或UDP协议对主机、端口等进行相关扫描,从而获取主机存活、端口状态等信息内容。下面对扫描实现进行一定的技术分析。

1、主机扫描一般用来检测当前主机是否存活,且通过系统指纹来判断当前主机是什么类型的系统。常见的扫描工具Nmap提供了相应的参数指令,对当前主机进行探测。

图1:使用Nmap-GUI工具扫描获取局域网C段存活主机

图2:使用Nmap-GUI工具扫描获取主机系统类型版本

从图1和图2可以看出,我们通过Nmap-GUI工具使用指定参数查询获得主机存活情况和IP当前为192.168.1.155的主机所安装的系统版本。那么Nmap工具是如何判断主机是使用什么类型的系统版本呢?

Nmap工具安装在本地的文件目录,里面有一份nmap-os-db文件,里面包含了目前市场上绝大多数主流的系统版本指纹信息,测试主机通过对目标主机发送特定的数据包,通过响应及系统版本指纹进行对比,从而确定当前主机使用的系统版本类型。

图3:nmap-os-db文件中局部系统版本指纹信息

接下来我们来看如何通过Java实现来看C段IP主机存活的情况。

图4:当前192.168.1.0/24段主机存活状况

Java使用java.net.*包下内置类中的函数,且对C段IP进行遍历探测,如超过规定的时间,则证明主机未存活或ICMP不可达。其底层实现也均用TCP/IP协议进行网络通信。

2、端口扫描是测试主机通过网络利用TCP或UDP协议向目标主机发送特定数据报文,从而判断主机端口开放状况。同样使用Nmap工具对主机上的端口进行扫描。

图5:使用Nmap-GUI工具使用SYN扫描当前IP端口

图6:使用Nmap-GUI工具对当前IP进行UDP端口扫描

接下来我们来看如何通过Java实现来看主机端口开放情况。

图7:本地IP端口开放状况

Java中支持对主机端口的TCP和UDP扫描方式,如果端口并未开放,则无法建立连接,从而无法实现网络通信。

4、 结尾

安全扫描作为渗透测试人员及网络运维人员等日常工作不可缺失的技能,能够及时获悉企业网络拓扑上的缺陷,避免企业受到损失,所以尤为重要。