1 引言

  网络扫描,是基于Internet的、探测远端网络或主机信息的一种技术,也是保证系统和网络安全必不可少的一种手段。主机扫描,是指对计算机主机或者其它网络设备进行安全性检测,以找出安全隐患和系统漏洞。总体而言,网络扫描和主机扫描都可归入漏洞扫描一类。漏洞扫描本质上是一把双刃剑:黑客利用它来寻找对网络或系统发起攻击的途径,而系统管理员则利用它来有效防范黑客入侵。通过漏洞扫描,扫描者能够发现远端网络或主机的配置信息、 TCP/UDP端口的分配、提供的网络服务、服务器的具体信息等。

  2 漏洞扫描原理

  漏洞扫描可以划分为ping扫描、端口扫描、OS探测、脆弱点探测、防火墙扫描五种主要技术,每种技术实现的目标和运用的原理各不相同。按照 TCP/IP协议簇的结构,ping扫描工作在互联网络层:端口扫描、防火墙探测工作在传输层;0S探测、脆弱点探测工作在互联网络层、传输层、应用层。 ping扫描确定目标主机的IP地址,端口扫描探测目标主机所开放的端口,然后基于端口扫描的结果,进行OS探测和脆弱点扫描。

  2.1 Ping扫描

  ping扫描是指侦测主机IP地址的扫描。ping扫描的目的,就是确认目标主机的TCP/IP网络是否联通,即扫描的IP地址是否分配了主机。对没有任何预知信息的黑客而言,ping扫描是进行漏洞扫描及入侵的第一步;对已经了解网络整体IP划分的网络安全人员来讲,也可以借助ping扫描,对主机的IP分配有一个精确的定位。大体上,ping扫描是基于ICMP协议的。其主要思想,就是构造一个ICMP包,发送给目标主机,从得到的响应来进行判断。根据构造ICMP包的不同,分为ECH0扫描和non—ECHO扫描两种。

  2.1.1 ECH0扫描

  向目标IP地址发送一个ICMP ECHOREQUEST(ICMP type 8)的包,等待是否收至UICMP ECHO REPLY(ICMP type 0)。如果收到了ICMP ECHO REPLY,就表示目标IP上存在主机,否则就说明没有主机。值得注意的是,如果目标网络上的防火墙配置为阻止ICMP ECH0流量,ECH0扫描不能真实反映目标IP上是否存在主机。

  此外,如果向广播地址发送ICMPECHO REQUEST,网络中的unix主机会响应该请求,而windows主机不会生成响应,这也可以用来进行OS探测。

  2.1.2 non-ECH0扫描

  向目的IP地址发送一个ICMP TIMESTAMP REQUEST(ICMP type l3),或ICMP ADDRESS MASK REQUEST (ICMP type l7)的包,根据是否收到响应,可以确定目的主机是否存在。当目标网络上的防火墙配置为阻止ICMP ECH0流量时,则可以用non.ECH0扫描来进行主机探测。

  2.2端口扫描

  端口扫描用来探测主机所开放的端口。端口扫描通常只做最简单的端口联通性测试,不做进一步的数据分析,因此比较适合进行大范围的扫描:对指定 IP地址进行某个端口值段的扫描,或者指定端口值对某个IP地址段进行扫描。根据端口扫描使用的协议,分为TCP扫描和UDP扫描。

  2.2.1 TCP扫描

  主机间建立TCP连接分三步(也称三次握手):

  (1)请求端发送一个SYN包,指明打算连接的目的端口。

  (2)观察目的端返回的包:

  返回SYN/ACK包,说明目的端口处于侦听状态;

  返回RST/ACK包,说明目的端口没有侦听,连接重置。

  (3)若返回SYN/ACK包,则请求端向目的端口发送ACK包完成3次握手,TCP连接建立。

  根据TCP连接的建立步骤,TCP扫描主要包含两种方式:

  (1)TCP全连接和半连接扫描

  全连接扫描通过三次握手,与目的主机建立TCP连接,目的主机的log文件中将记录这次连接。而半连接扫描(也称TCP SYN扫描)并不完成TCP三次握手的全过程。扫描者发送SYN包开始三次握手,等待目的主机的响应。如果收到SYN/ACK包,则说明目标端口处于侦听状态,扫描者马上发送RST包,中止三次握手。因为半连接扫描并没有建立TCP连接,目的主机的log文件中可能不会记录此扫描。

  (2)TCP隐蔽扫描

  根据TCP协议,处于关闭状态的端口,在收到探测包时会响应RST包,而处于侦听状态的端口则忽略此探测包。根据探测包中各标志位设置的不同,TCP隐蔽扫描又分为SYN/ACK扫描、FIN扫描、XMAS(圣诞树)扫描和NULL扫描四种。

  SYN/ACK扫描和FIN扫描均绕过TCP三次握手过程的第一步,直接给目的端口发送SYN/ACK包或者FIN包。因为TCP是基于连接的协议,目标主机认为发送方在第一步中应该发送的SYN包没有送出,从而定义这次连接过程错误,会发送一个RST包以重置连接。而这正是扫描者需要的结果— 只要有响应,就说明目标系统存在,且目标端口处于关闭状态。

  XMAS扫描和NULL扫描:这两类扫描正好相反,XMAS扫描设置TCP包中所有标志位(URG、ACK、RST、PSH、SYN、FIN),而NULL扫描则关闭TCP包中的所有标志位。

  2.2.2 UDP端口扫描

  UDP协议是数据包协议,为了要发现正在服务的UDP端口,通常的扫描方式是构造一个内容为空的UDP数据包送往目的端口。若目的端口上有服务正在等待,则目的端口返回错误的消息;若目的端口处于关闭状态,则目的主机返回ICMP端口不可达消息。因为UDP端口扫描软件要计算传输中丢包的数量,所以UDP端口扫描的速度很慢。

  2.3 0S探测

  OS探测有双重目的:一是探测目标主机的0S信息,二是探测提供服务的计算机程序的信息。比如OS探测的结果是:OS是Windows XP sp3,服务器平台是IIS 4.0。

  2.3.1二进制信息探测

  通过登录目标主机,从主机返回的banner中得知OS类型、版本等,这是最简单的0S探测技术。

  

二进制信息 www.elecfans.com


 

  图1 二进制信息

 从图l可以看出,在telnet连上FTP服务器后,服务器返回的banner已经提供了server的信息,在执行ftp的syst命令后可得到更具体的信息。

  2.3.2 HTTP响应分析

  在和目标主机建立HTTP连接后,可以分析服务器的响应包得出OS类型。比如响应包中可能包含如下信息:

  

响应包分析

 

  图2 响应包分析

  从图2中对响应包中的数据分析,可以得到server的信息。

  2.3.3栈指纹分析

  网络上的主机都会通过TCP/IP或类似的协议栈来互通互联。由于0S开发商不唯一,系统架构多样,甚至是软件版本的差异,都导致了协议栈具体实现上的不同。对错误包的响应,默认值等都可以作为区分0S的依据。

  (1)主动栈指纹探测

  主动栈指纹探测是主动向主机发起连接,并分析收到的响应,从而确定OS类型的技术。

  1)FIN探测。跳过TCP三次握手的顺序,给目标主机发送一个FIN包。RFC793规定,正确的处理是没有响应,但有些OS,如MS Windows,CISC0,HP/UX等会响应一个RST包。

  2)Bogus标志探测。某些OS会设置SYN包中TCP头的未定义位(一般为64或128),而某些0S在收到设置了这些Bogus位的SYN包后,会重置连接。

  3)统计ICMP ERROR报文。RFCl812中规定了ICMP ERROR消息的发送速度。Linux设定了目标不可达消息上限为80个/4秒。0S探测时可以向随机的高端UDP端口大量发包,然后统计收到的目标不可达消息。用此技术进行OS探测时时间会长一些,因为要大量发包,并且还要等待响应,同时也可能出现网络中丢包的情况。

  4)ICMPERROR报文引用。RFC文件中规定,ICMP ERROR消息要引用导致该消息的ICMP消息的部分内容。例如对于端口不可达消息,某些OS返回收到的IP头及后续的8个字节,Solaris返回的 ERROR消息中则引用内容更多一些,而Linux比Solaris还要多。

  (2)被动栈指纹探测

  被动栈指纹探测是在网络中监听,分析系统流量,用默认值来猜测0S类型的技术。

  1)TCP初始化窗口尺寸。通过分析响应中的初始窗口大小来猜测OS的技术比较可靠,因为很多0S的初始窗口尺寸不同。比如AIX设置的初始窗口尺寸是0x3F25,而Windows NT5、OpenBSD、FreeBSD设置的值是0x402E。

  2)Don’t Fragment位。为了增进性能,某些0S在发送的包中设置了DF位,可以从DF位的设置情况中做大概的判断。

  3)TCPISN采样。建立TCP连接时,SYN/ACK中初始序列号ISN的生成存在规律,比如固定不变、随机增加 (Solaris,FreeBSD等),真正的随机(Linux 2.0.*),而Windows使用的是时间相关模型,ISN在每个不同时间段都有固定的增量。

  2.4脆弱点扫描

  从对黑客攻击行为的分析和脆弱点的分类,绝大多数扫描都是针对特定操作系统中特定的网络服务来进行,即针对主机上的特定端口。脆弱点扫描使用的技术主要有基于脆弱点数据库和基于插件两种。

  2.4.1基于脆弱点数据库的扫描

  首先构造扫描的环境模型,对系统中可能存在的脆弱点、过往黑客攻击案例和系统管理员的安全配置进行建模与分析。其次基于分析的结果,生成一套标准的脆弱点数据库及匹配模式。最后由程序基于脆弱点数据库及匹配模式自动进行扫描工作。脆弱点扫描的准确性取决于脆弱点数据库的完整性及有效性。

2.4.2基于插件的扫描

  插件是由脚本语言编写的子程序模块,扫描程序可以通过调用插件来执行扫描。添加新的功能插件可以使扫描程序增加新的功能,或者增加可扫描脆弱点的类型与数量。也可以升级插件来更新脆弱点的特征信息,从而得到更为准确的结果。插件技术使脆弱点扫描软件的升级维护变得相对简单,而专用脚本语言的使用也简化了编写新插件的编程工作,使弱点扫描软件具有很强的扩展性。

  2.5防火墙规则探测

  采用类似于traceroute的IP数据包分析法,检测能否给位于过滤设备后的主机发送一个特定的包,目的是便于漏洞扫描后的入侵或下次扫描的顺利进行。通过这种扫描,可以探测防火墙上打开或允许通过的端口,并且探测防火墙规则中是否允许带控制信息的包通过,更进一步,可以探测到位于数据包过滤设备后的路由器。

  3 常见漏洞扫描程序

  通常在制定漏洞扫描策略时,扫描者会考虑程序的操作系统、所应用的技术、易用性、准确性等因素。其中,程序的可用性是最重要的,也是最基本的,但是可控性和准确性同样不容忽视。

  3.1 Unix/Linux平台

  3.1.1 hping

  hping支持TCP、UDP、ICMP、RAW-IP多种协议。特点在于能进行ping扫描、端口扫描、0S探测、防火墙探测等多种扫描,并能自定义发送的ICMP/UDP/TCP包到目标地址并且显示响应信息。

  3.1.2 icmpush&icmpquery

  icmpush&icmpquery的特点在于完全应用了ICMP协议,可以定制ICMP包的结构以及种类。扫描者可以用这套工具把目标网络的各个子网全部查找出来,从而可以撇开广播地址而集中扫描某几个特定的子网。

  3.1.3 Xprobe 2

  是专业的端口扫描、OS探测程序。特点在于自身的0S特征数据库详细,进行OS探测的可靠性较好。

  3.1.4 THC-Anap

  OS探测程序。特点在于扫描速度快,扫描结果可靠。

  3.1.5 Whisker

  针对CGI的脆弱点探测程序。应用了多线程、多文件扫描技术,脆弱点数据库更新频繁,对扫描结果自行复核,从而扫描结果可靠性好。

  3.1.6 Nessus

  脆弱点探测程序。应用了主动扫描、高速扫描技术,可设置扫描过程。特点在于支持DMZ区以及多物理分区网络的大范围扫描。

  3.1.7 Firewalk

  防火墙探测程序。使用类似traceroute的技术来分析IP包的响应,从而测定防火墙的访问控制列表和绘制网络拓扑图。

  3.2 Windows平台

  3.2.1 Pinger

  是一个图形化的ping扫描工具。特点在于可以指定要ping的IP地址,以图形的形式显示扫描结果,并保存至文本文件。

  3.2.2 Fport

  是端口扫描程序。特点在于可以把扫描出的端口与使用该端口的程序相匹配,扫描速度快,匹配程度较好。

  3.2.3 SuperScan

  可以进行ping扫描、端口扫描、0S探测,并且白带一个木马端口列表,可以检测目标计算机是否有木马。

  3.2.4 GFILANguard

  脆弱点探测程序。特点在于集成了网络审计、补丁管理功能,可以自动生成网络拓扑图、自动补丁管理。

  上述漏洞扫描程序及特点如表1所示。

  4 结论

  一般而言,综合地应用多种扫描方法或扫描程序可以得到比较满意的结果。但是漏洞扫描从其技术原理上分析,有不可忽视的副作用。比如对大范围的 IP地址或者端口进行某种扫描,反复高速的发出特定的连接请求,所造成的结果就是目标网络及主机上存在大量的连接请求数据包,可以造成网络拥塞,主机无法正常使用,这正是DoS攻击的方法及表现。因此若要防范漏洞扫描以及可能的DoS攻击,要做到以下三点:

  1.在防火墙及过滤设备上采用严格的过滤规则,禁止扫描的数据包进入系统。

  2.主机系统除了必要的网络服务外,禁止其它的网络应用程序。

  3.对于只对内开放的网络服务,更改其提供服务的端口。

  此外,网络扫描时发送的数据或多或少都会含有扫描者自身相关信息,从而也可以抓取扫描时的数据包,对扫描者进行反向追踪,这也是一个值得研究的方向。