扫描器的重要性体现在:
扫描器能够暴露网络上潜在的脆弱性。
无论扫描器被管理员利用,或者被黑客利用,都有助于加强系统的安全性。
它能使得漏洞被及早发现,而漏洞迟早会被发现的。
扫描器可以满足很多人的好奇心。
扫描器除了能扫描端口,往往还能够:发现系统存活情况,以及哪些服务在运行
用已知的漏洞测试这些系统
对一批机器进行测试,简单的迭代过程
有进一步的功能,包括操作系统辨识、应用系统识别。
一. 常见漏洞扫描器类型
1.1 端口扫描器
Nmap被称为扫描器之王。这种类型扫描器很容易引起误解,很多人认为对于nmap这种port scaner,功能仅限于扫描端口,这实际上是一个很大的误区,如果我们看一下它的功能,就会发现功能还是非常广泛的,包括操作系统的服务判定、操作系统指纹的判定、防火墙及IDS的规避技术。Nmap从技术角度来说是非常出色的,并且可以完成大范围的早期评估工作。实际上nmap的端口扫描的不管是主机开放端口、服务、操作系统版本,它的大部分依据都来自于端口扫描的结果,根据其结果去判定其他信息。所以,认为nmap只能扫描端口是一个误区。
1.2 漏洞扫描器
以nessus为免费产品代表,nessus的安装应用程序、脚本语言都是公开的,但从版本3开始它就转向一个私有的授权协议,其扫描引擎仍然免费,不过对其支持和最新的漏洞定义要收费,不过收费是有时间限制的,如果不想付钱的话,可以等待15天,15天之后,其大部分插件都将是免费插件。Nessus目前最新版本到了3.2。这种扫描器不仅可以检查系统漏洞,还可以检查一部分的配置失误。
1.3 WEB应用扫描器
这类扫描器相对而言,做的比较专,仅用于评估网站的安全性,对于系统、网络的基础情况一般不关注,关注的焦点主要是WEB应用。常见的有appscan、webinspect。主要检测WEB应用数据提交、信息泄露等问题。
二. 商业扫描器特点
基本上大部分商业扫描器都工作在黑盒模式,在这种模式下无法看到源代码,以一个近似于渗透者或攻击者的身份去看待需要评估的系统。这种扫描器特点有:
2.1 漏洞精确扫描
由于在商业化应用中,对误报、漏报的容忍程度比较低。但目前的情况,误报和漏报还是无法规避的。具体扫描的信息有:
状态扫描:即其开放的服务、通信的情况、OS版本、应用服务的版本。
漏洞扫描(验证):验证当前系统是否存在可以利用、不可以利用的漏洞,如果可以利用,某些扫描器可以进行写入文件或者拿到shell之类的功能。
弱口令扫描:对于开放的服务进行弱口令扫描,这也是很重要的一个功能。
2.2 修补措施
商用扫描器在漏洞精确扫描之后,会给出一些建议和技术手段来屏蔽漏洞。最初是提供一些修补建议,这种方式对专业技术人员来说有相当价值,但对于一些技术较薄弱或者比较懒惰的用户,修补建议的作用就被忽略了。在新一代的商用扫描器中,提出了修补联动的概念,通过发送注册表去提示用户,用户双击注册表,就可以导入需要修改、升级补丁的信息,并且还可以和WSUS进行联动。这样就可以基本上达到自动化的修补。
三. 常见扫描主要技术
要了解常见扫描的主要技术,还要以扫描器工作的流程开始,以nmap为例,整个扫描流程如下:
1、存活性扫描:是指大规模去评估一个较大网络的存活状态。例如跨地域、跨系统的大型企业。但是被扫描主机可能会有一些欺骗性措施,例如使用防火墙阻塞ICMP数据包,可能会逃过存活性扫描的判定。
2、端口扫描:针对主机判断端口开放和关闭情况,不管其是不是存活。端口扫描也成为存活性扫描的一个有益补充,如果主机存活,必然要提供相应的状态,因此无法隐藏其存活情况。
3、服务识别:通过端口扫描的结果,可以判断出主机提供的服务及其版本。
4、操作系统识别:利用服务的识别,可以判断出操作系统的类型及其版本。
这就是以nmap为代表的扫描过程。
3.1 主机存活扫描技术
主机扫描的目的是确定在目标网络上的主机是否可达。这是信息收集的初级阶段,其效果直接影响到后续的扫描。Ping就是最原始的主机存活扫描技术,利用icmp的echo字段,发出的请求如果收到回应的话代表主机存活。
常用的传统扫描手段有:
1. ICMP Echo扫描 精度相对较高。通过简单地向目标主机发送ICMP Echo Request 数据包,并等待回复的ICMP Echo Reply 包,如Ping。
2. ICMP Sweep 扫描:sweep这个词的动作很像机枪扫射,icmp进行扫射式的扫描,就是并发性扫描,使用ICMP Echo Request一次探测多个目标主机。通常这种探测包会并行发送,以提高探测效率,适用于大范围的评估。
3. Broadcast ICMP扫描:广播型icmp扫描,利用了一些主机在icmp实现上的差异,设置ICMP请求包的目标地址为广播地址或网络地址,则可以探测广播域或整个网络范围内的主机,子网内所有存活主机都会给以回应。但这种情况只适合于UNIX/Linux系统。
4. Non-Echo ICMP扫描:在ICMP协议中不光光只有ICMP ECHO的ICMP查询信息类型,在ICMP扫描 技术中也用到Non-ECHO ICMP技术(不仅仅能探测主机,也可以探测网络设备如路由)。利用了ICMP的服务类型(Timestamp和Timestamp Reply 、Information Request和Information Reply 、Address Mask Request 和Address Mask Reply)。
3.2 规避技术
为到达规避防火墙和入侵检测设备的目的, ICMP协议提供网络间传送错误信息的功能也成为了主要的扫非常规描手段。其主要原理就是利用被探测主机产生的ICMP错误报文来进行复杂的主机探测。
常用的规避技术大致分为4类:
1. 异常的IP包头 :向目标主机发送包头错误的IP包,目标主机或过滤设备会反馈ICMP Parameter Problem Error信息。常见的伪造错误字段为Header Length 和IP Options。不同厂家的路由器和操作系统对这些错误的处理方式不同,返回的结果也不同。
2. 在IP头中设置无效的字段值:向目标主机发送的IP包中填充错误的字段值,目标主机或过滤设备会反馈ICMP Destination Unreachable信息。这种方法同样可以探测目标主机和网络设备。
3. 通过超长包探测内部路由器:若构造的数据包长度超过目标系统所在路由器的PMTU且设置禁止分片标志, 该路由器会反馈 Fragmentation Needed and Don’t Fragment Bit was Set差错报文。
4. 反向映射探测:用于探测被过滤设备或防火墙保护的网络和主机。构造可能的内部IP地址列表,并向这些地址发送数据包。当对方路由器接收到这些数据包时,会进行IP识别并路由,对不在其服务的范围的IP包发送ICMP Host Unreachable或ICMP Time Exceeded 错误报文,没有接收到相应错误报文的IP地址可被认为在该网络中。
举例来看:
![点击这里用新窗口浏览图片](http://www.heibai.net/article/pic/144530601.png)
图1
当发送一个数据包的时候,数据包头部会显示其封装类型,这里显示的是tcp协议。其编号是06,看到06就可以知道这是一个tcp报文。如果把报文标识成不可识别的协议,例如:
![点击这里用新窗口浏览图片](http://www.heibai.net/article/pic/144549201.png)
图2
协议字段里显示是unknown,编号是b2,这个协议是未知的,那嗅探器也会返回给一个unknown。就是这样发送一个不可识别的协议给其他主机的时候,对方主机也无法识别。当不可识别的时候
![点击这里用新窗口浏览图片](http://www.heibai.net/article/pic/144602252.png)
图3
对方认为自己的协议栈上无法识别,第一个动作就是先把数据包丢弃,丢掉报文之后去通知对方,返回了这条icmp的信息。类型为3,目标不可达,其code是2,告诉你目标不可达的原因是协议不可达。当你发送一个错误的数据包,对方不可识别就返回给你一个icmp信息,达到了探测对方的目的。
端口扫描技术
在完成主机存活性判断之后,就应该去判定主机开放信道的状态,端口就是在主机上面开放的信道,0-1024为知名端口,端口总数是65535。端口实际上就是从网络层映射到进程的通道。通过这个关系就可以掌握什么样的进程使用了什么样的通信,在这个过程里面,能够通过进程取得的信息,就为查找后门、了解系统状态提供了有力的支撑。常见流行的端口扫描技术通常有:
3.3.1 TCP扫描:
利用三次握手过程与目标主机建立完整或不完整的TCP连接。
TCP connect()扫描: tcp的报头里,有6个连接标记,分别是urg、ack、psh、rst、syn、fin。通过这些连接标记不同的组合方式,可以获得不同的返回报文。例如,发送一个syn置位的报文,如果syn置位瞄准的端口是开放的,syn置位的报文到达的端口开放的时候,他就会返回syn+ack,代表其能够提供相应的服务。我收到syn+ack后,返回给对方一个ack。这个过程就是着名的三次握手。这种扫描的速度和精度都是令人满意的。
Reverse-ident扫描:这种技术利用了Ident协议(RFC1413),tcp端口113.很多主机都会运行的协议,用于鉴别TCP连接的用户。
identd 的操作原理是查找特定 TCP/IP 连接并返回拥有此连接的进程的用户名。它也可以返回主机的其他信息。但这种扫描方式只能在tcp全连接之后才有效,并且实际上很多主机都会关闭ident服务。
Tcp syn扫描:向目标主机的特定端口发送一个SYN包,如果端口没开放就不会返回syn+ack,这时会给你一个rst,停止建立连接。由于连接没有完全建立,所以称为半开放扫描。但由于syn flood作为一种ddos攻击手段被大量采用,因此很多防火墙都会对syn报文进行过滤,所以这种方法并不能总是有用。
其他还有fin、NULL、Xmas等扫描方式。
3.3.2 UDP扫描
由于现在防火墙设备的流行,tcp端口的管理状态越来越严格,不会轻易开放,并且通信监视严格。为了避免这种监视,达到评估的目的,就出现了秘密扫描。这种扫描方式的特点是利用UDP端口关闭时返回的ICMP信息,不包含标准的TCP三次握手协议的任何部分,隐蔽性好,但这种扫描使用的数据包在通过网络时容易被丢弃从而产生错误的探测信息。
但是,UDP扫描方式的缺陷很明显,速度慢、精度低。UDP的扫描方法比较单一,基础原理是:当你发送一个报文给udp端口,该端口是关闭状态时,端口会返回给一个icmp信息,所有的判定都是基于这个原理。如果关闭的话,什么信息都不发。
Traceroute扫描:tracert 向30000以上的高端口(一般认为,主机的30000以上高端口利用率非常低,任何主机都不会轻易开放这种高端口,默认都是关闭的)。如果对方端口关闭,会返回给icmp信息,根据这个往返时间,计算跳数、路径信息,了解延时情况。这是tracerote原理,也是从这个原理上演变出来udp扫描技术。
使用udp扫描要注意的是1、udp状态、精度比较差,因为udp是不面向连接的,所以整个精度会比较低。2、udp扫描速度比较慢,tcp扫描开放1秒的延时,在udp里可能就需要2秒,这是由于不同操作系统在实现icmp协议的时候为了避免广播风暴都会有峰值速率的限制(因为icmp信息本身并不是传输载荷信息,不会有人拿他去传输一些有价值信息。操作系统在实现的时候是不希望icmp报文过多的。为了避免产生广播风暴,操作系统对icmp报文规定了峰值速率,不同操作系统的速率不同) 利用udp作为扫描的基础协议,就会对精度、延时产生较大影响。
当前在渗透测试过程中对于端口的扫描是非常灵活的,06年的黑帽大会上,就有人利用了开发了工具探测网内哪台主机打开了80端口,这样的技术在当前的互联网上利用的非常普遍。
![点击这里用新窗口浏览图片](http://www.heibai.net/article/pic/144623566.png)
图4
服务及系统指纹
在判定完端口情况之后,继而就要判定服务。
3.4.1 根据端口判定
这种判定服务的方式就是根据端口,直接利用端口与服务对应的关系,比如23端口对应telnet,21对应ftp,80对应http。这种方式判定服务是较早的一种方式,对于大范围评估是有一定价值的,但其精度较低。例如使用nc这样的工具在80端口上监听,这样扫描时会以为80在开放,但实际上80并没有提供http服务,由于这种关系只是简单对应,并没有去判断端口运行的协议,这就产生了误判,认为只要开放了80端口就是开放了http协议。但实际并非如此,这就是端口扫描技术在服务判定上的根本缺陷。
Banner的方式相对精确,获取服务的banner,是一种比较成熟的技术,可以用来判定当前运行的服务,对服务的判定较为准确。而且不仅能判定服务,还能够判定具体的服务版本信息。例如下图,根据头部信息发现对方是redhat linux,基本上可以锁定服务的真实性。
图5
这种技术比较灵活。像http,ftp,telnet都能够获取一些banner信息。为了判断服务类型、应用版本、OS平台,通过模拟各种协议初始化握手,就可以获取信息 。
但是在安全意识普遍提升的今天, 对Banner的伪装导致精度大幅降低。例如IIS&Apache:修改存放Banner信息的文件字段进行修改,这种修改的开销很低。现在流行的一个伪装工具Servermask ,不仅能够伪造多种主流Web服务器Banner,还能伪造Http应答头信息里的项的序列。
使用前
图6
使用后
图7
变的不仅是红色的部分,而且整个返回序列都变化了。这个变化是手工难已修改的。如果不能成功的修改序列,那就可能给有经验的渗透者提供依据。
3.4.3 指纹技术
指纹技术利用TCP/IP协议栈实现上的特点来辨识一个操作系统。可辨识的OS的种类,包括哪些操作系统,甚至小版本号。指纹技术有主动和被动两种。
主动识别技术:采用主动发包,利用多次的试探,去一次一次筛选不同信息,比如根据ACK值判断,有些系统会发送回所确认的TCP分组的序列号,有些会发回序列号加1。还有一些操作系统会使用一些固定的tcp窗口。某些操作系统还会设置IP头的DF位来改善性能。这些都成为判断的依据。这种技术判定windows的精度比较差,只能够判定一个大致区间,很难判定出其精确版本,但是在unix,网络设备时甚至可以判定出小版本号,比较精确。如果目标主机与源主机跳数越多,精度越差。因为数据包里的很多特征值在传输过程中都已经被修改或模糊化,会影响到探测的精度。nmap –O参数就是其代表。
被动识别技术:不是向目标系统发送分组,而是被动监测网络通信,以确定所用的操作系统。利用对报头内DF位,TOS位,窗口大小,TTL的嗅探判断。因为并不需要发送数据包,只需要抓取其中的报文,所以叫做被动识别技术。例如telnet对方,并用snort监听数据包:
得到这些信息后,熟悉系统的人可猜测到操作系统是Solaris 2.6-2.7。在nmap中,也有操作系统的指纹库,可以从指纹库中去匹配。其代表扫描工具有 Siphon,天眼。
ICMP指纹识别技术 :这种工具的出现较晚,大概在2001-2002年,在黑帽大会上提出,并开发出相应的工具xprobe,其优势是只需要通过icmp,发送一批UDP包给高端关闭的端口,然后计算返回来的不可达错误消息。通常情况下送回IP头+8个字节,但是个别系统送回的数据更多一些。根据ICMP回应的TOS、TTL值、校验和等信息,通过这些信息以树状的形式去过滤,最终精确锁定。下图只是整个判定过程中的一小量部分,类似的图还有很多张。
图8
例如TTL值,当你发送icmp 的echo请求,对方回应的ttl值是有一定规律可循的,一般是4个数值,32(win95,唯一值为32的操作系统),64,128(windows家族,只有win95例外),256。64和256比较难以分辨,大多数的unix和linux都可能是。 代表性扫描工具 Xprobe。