1> 介绍
近年来,网络安全评估软件逐渐被网络安全界所接收,而且在很大的范围内快速地传播起来。远程操作系统探测作为评估软件的一个部分,必须具备几个条件:
- 精确性:避免错误的探测结果;
- 防火墙和入侵检测系统的影响:避免影响(或被影响于)防火墙和入侵检测系统;
- 文雅:低的网络流通和无危险分段;
- 灵巧:易于扩展标识数据库和自动探测函数;
- 速度:高速的指纹探测工具应该允许大范围的网络扫描。
我向大家介绍一个新的操作系统指纹探测工具-RING。在某些情况下其他的工具也许会失败,但RING所具备的良好的特性和相当准确的结果一定会让你满意的。
RING是一个开放源代码的软件,它主要是面向试验性的概念和测试的目的。
2> 技术发展水平
2.1 操作系统探测技术的简短历史
- 获取标识信息 在很多探测工具中都使用了此项技术来获得某些服务的标识信息。它往往是通过对二进制文件的收集和分析来实现的。
- TCP分段(标准/非标准)响应分析 它是依靠不同操作系统对特定分段的不同反应来区分的。比较流行的工具有Savage的QueSO和Fyodor的NMAP,他们都使用了很多来自于这种技术的变种。
- ICMP响应分析 它是刚推出不久的一种技术。它通过发送UPD或ICMP的请求报文,然后分析各种ICMP应答。Ofir Arkin的X-Probe就是使用的这种技术,在通常情况下,X-Probe工作的比较好,但是在防火墙阻塞某些协议时,得到的结果就不那么尽如人意了。
- 初始化序列号(ISN)分析 在TCP栈中不同的exploits随机产生,通过鉴别足够的测试结果来确定远程主机的操作系统。(详情请见 Zalewski,M.(Apr,2001),Strange Attractors and TCP/IP Sequence Number Analysis)
- 特殊的操作系统 拒绝服务同样可以用在操作系统指纹的探测上,而不仅仅是被黑客所使用。在一些非常特殊的情况下,拒绝服务能探测到准确的结果。
2.2 堆栈查询技术的细节
堆栈查询技术通过测量远程主机TCP/IP堆栈对不同请求的响应来探测系统。大多数操作系统将会以特别的方式来响应特别的分段请求。
NMAP和QueSO就是基于这种技术的。它们产生一组TCP和UDP请求发送到远程目标主机的开放(未开放)端口。这时,远程主机响应的有用信息就会被探测工具所接收到,然后对其进行分析。
这些技术通常使安全评估软件在较小的延迟内,得到一些关于类型和版本之类的信息。
在好几方面,这种技术是如此的准确:
- 每个操作系统(即使打过某个补丁)通常会使用它们自己的IP栈实现。
- TCP/IP规范并不是被严格的执行,每个不同的实现将会拥有它们自己的特性,这样就为成功探测带来了可能。
- 规范可能被打乱,一些选择性的特性被使用,而其他的一些系统则可能没有使用。
- 某些私自对IP协议的改进也可能被实现,这就成为了某些操作系统的特性。
2.3 典型工具的一些限制
NMAP可以识别500个不同的操作系统,但前提是网络环境的稳定性,目标主机必须开放一个TCP端口,一个关闭的TCP端口和一个关闭的UDP端口。如果不满足上面的条件,探测结果的精确度就会有很大程度的降低。
当前的网络系统,为了安全起见,往往只向外打开一个可见的TCP端口,而其他的端口所接收到的数据报却是被防火墙或包过滤装置所过滤掉了。
在这样的被防火墙保护的网络环境下,基于ICMP协议,关闭的UDP端口和关闭的TCP端口的探测工具,如NMAP,Xprobe工作的效果就不那么好了。
3> TCP/IP协议的使用
TCP作为一个数据传输协议是建立在IP协议之上的,它的定义可以在RFC793上找到。而TCP/IP协议则是在Internet上主要使用的网络协议。
TCP的成功在于它的可靠性:对错误的探测和管理,数据流动和阻塞的控制,重传机制等。
为了达到这样的要求,TCP就成为了面向连接的协议。它的运行机制如下:
1. 建立连接
2. 数据传输
3. 终止连接
TCP是建立在IP协议之上的,在发生网络阻塞或路由问题时,IP协议不能够提供可靠的端到端数据传送。而且,IP是一个非连接的协议,所以连接的控制都是建立在TCP层上的。
TCP协议在其头部提供了对连接的多方面控制。序号和确认号是为了更好的管理数据报的重发并能很好的控制各种特别的错误状况。TCP数据报头部码元字段的URG,ACK,PSH,RST,SYN和FIN是为了管理TCP连接状态而设置的。详情请见RFC793。
为了以后更好的理解RING的原理,以下列出TCP建立连接的三次握手:(Client主动向Server发起连接)
数据报在网络上传输的过程中,某些分段可能在传输时丢失了,而理论上每一个数据报都必须被接收方所确认。TCP自己就维持了一张已被确认数据报的列表。
注:如果某个数据报没有在期望的时间内被接收到,那么它将被看作丢失处理。
而且,TCP会自动处理各种先后收到的数据报的真实顺序,然后它将会以正确的顺序发送到上层系统。
网络系统的阻塞将会导致数据报的丢失。任何网络容纳能力的大小都归因于物理底层的传输能力或路由的能力。
注:如果网络阻塞发生了,那么可能会有一些数据报被丢失了。而TCP又重发了那些被丢失的数据报,这样网络的阻塞状况将会变的越来越严重。因此,如果网络阻塞发生了,数据报的重传速度将会降低。
虽然TCP强调了这种机制,但在RFC793中并没有利用什么规则去计算确认数据报之间延迟的大小。
4> 临时的分析
4.1 原理
数据报的重传为我们提供了另一种分析远程主机操作系统的方式。我们将通过分析目标主机在各次重传数据报之间的延迟来判断远程主机操作系统的指纹。
这种方式已经在RFC793中被定义了,但是却留下了一些利用的余地。而且,一些实现并没有完全遵循目前的标准。
为了让我们了解这种方式,也就是体会超时机制的作用,我们必须强调远程主机的IP栈要处在非标准的状态下。
而这种状况可以容易地被模仿,只须简单的放弃对远程主机SYN-ACK数据报的确认就可以达到。
通过测量重传的两个相邻数据报之间的延迟,或观察一些其他的信息,比如TCP的标记,序号,确认号,这些都可以得到一些关于远程主机操作系统的有用信息。
如果每个操作系统都有其自己的特点,那么建立一个典型的系统标识数据库将会成为一种可能。不管测试的主机或网络状况如何,操作系统将是唯一影响测试结果的因素。因此,探测那些建立在不同主机上却使用相同操作系统而得到的结果,将会是一样的(前提是网络状况比较稳定)
通过将目标主机指纹与操作系统指纹数据库里的相比较,将有可能知道远程主机所运行的操作系统。
新的操作系统的标识将会被很容易的纪录下来,它们将会和操作系统的名字联系起来。
4.2 DIY
这种操作系统指纹探测技术将会使用探测仪器的两个部分。一个数据报过滤装置,比如个人防火墙,另一个就是数据报监听装置。
探测仪器的配制:一种简单的模仿网络阻塞的方法就是在扫描主机上安装一个个人防火墙,并设置一些过滤规则来禁止接收所有来自目标主机的数据报。这时,数据报监听装置将会接收到所有的来自目标主机的数据报,由于防火墙的存在,扫描主机不会发送任何确认信息,这样就无法建立起完整的TCP连接。在某个时间段之后,远程主机就会终止与扫描主机的任何关系。
测试过程:测试过程将由三个不同的步骤组成。
- 防火墙的设置
- 试图与目标主机建立标准的连接
- 目标主机发送确认数据报
下面将详细的描述实现的过程:
- 选择一台主机,并确认某个存在的打开的端口。比如远程主机为192.168.0.10,它的TCP 80端口是打开的(系统开启的Web服务);
- 配置防火墙使其阻塞掉所有的来自目标主机;(192.168.0.10)的数据报。
- 监听来自目标主机TCP80端口的所有数据报;
- 向目标主机发送一个SYN数据报,试图与之建立连接;
- 分析所有来自目标主机的相邻数据报之间的延迟 。
实际上,我们测量的并不是目标主机发送连续数据报之间的时间间隔,而是我们收到的来自目标主机连续数据报之间的时间间隔。如果这些时间间隔几乎是固定的,那么我们可以大胆的假设他们是相等的。
下面是探测时数据报的流动情况(A表示扫描主机,B表示被探测的目标主机,A与B之间的无箭头直线表示没有数据传输):
4.3 静态分析
因为数据报可能通过了一些不稳定的网络,比如Internet,这样很可能接收到的连续数据报之间的延迟(r_i)和它们被发送时的延迟(s_i)就不再相同了。
假如我们收到来自目标主机的两个连续的数据报时,测量到的延迟为3.01秒,但是很有可能他们在发送时相互间的延迟为3.0秒。问题在于某些系统实现时将3.2秒作为发送两个连续数据报的时间延迟。而介于3.0秒和3.2秒之间的区间因为太小,以至于无法区分接收到的数据报究竟是来自哪种系统的。
为了避免这个问题,我们可以使用TCP的时间截选项,这样就可以更好的得到何时发送数据报的信息了。在每个数据报里都设置时间截选项将会提高探测结果的准确度。不过,使用时间截选项也许会增加我们判断的难度,因为时间截选项可能会返回一些不准确的时间数据。
这种方法就是建立在指纹的获取