Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1367831
  • 博文数量: 946
  • 博客积分: 52360
  • 博客等级: 大将
  • 技术积分: 13080
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-07 17:31
文章分类

全部博文(946)

文章存档

2011年(1)

2008年(945)

我的朋友

分类: C/C++

2008-08-07 17:38:26

下载本文示例代码
一、介绍

近年来,网络安全评估软件逐渐被网络安全界所接收,而且在很大的范围内快速地传播起来。远程操作系统探测作为评估软件的一个部分,必须具备几个条件:
- 精确性:避免错误的探测结果;
- 防火墙和入侵检测系统的影响:避免影响(或被影响于)防火墙和入侵检测系统;
- 文雅:低的网络流通和无危险分段;
- 灵巧:易于扩展标识数据库和自动探测函数;
- 速度:高速的指纹探测工具应该允许大范围的网络扫描。
我向大家介绍一个新的操作系统指纹探测工具-RING。在某些情况下其他的工具也许会失败,但RING所具备的良好的特性和相当准确的结果一定会让你满意的。
RING是一个开放源代码的软件,它主要是面向试验性的概念和测试的目的。

二、技术发展水平

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工作的效果就不那么好了。

三、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发起连接)

Client Server
│--------SYN--------->│
│<------SYN-ACK-------│
│--------ACK--------->│

数据报在网络上传输的过程中,某些分段可能在传输时丢失了,而理论上每一个数据报都必须被接收方所确认。TCP自己就维持了一张已被确认数据报的列表。
注:如果某个数据报没有在期望的时间内被接收到,那么它将被看作丢失处理。

而且,TCP会自动处理各种先后收到的数据报的真实顺序,然后它将会以正确的顺序发送到上层系统。
网络系统的阻塞将会导致数据报的丢失。任何网络容纳能力的大小都归因于物理底层的传输能力或路由的能力。
注:如果网络阻塞发生了,那么可能会有一些数据报被丢失了。而TCP又重发了那些被丢失的数据报,这样网络的阻塞状况将会变的越来越严重。因此,如果网络阻塞发生了,数据报的重传速度将会降低。

虽然TCP强调了这种机制,但在RFC793中并没有利用什么规则去计算确认数据报之间延迟的大小。

四、临时的分析

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之间的无箭头直线表示没有数据传输):

A B
│--------SYN--------->│
│<------SYN-ACK-------│--------------
│---------------------│ 时间间隔为 t1
│<------SYN-ACK-------│--------------
│---------------------│ 时间间隔为 t2
│---------------------│
│<------SYN-ACK-------│--------------
│---------------------│
│---------------------│ 时间间隔为 t3
│---------------------│
│---------------------│
│<------SYN-ACK-------│--------------

4.3 静态分析
因为数据报可能通过了一些不稳定的网络,比如Internet,这样很可能接收到的连续数据报之间的延迟(r_i)和它们被发送时的延迟(s_i)就不再相同了。
假如我们收到来自目标主机的两个连续的数据报时,测量到的延迟为3.01秒,但是很有可能他们在发送时相互间的延迟为3.0秒。问题在于某些系统实现时将3.2秒作为发送两个连续数据报的时间延迟。而介于3.0秒和3.2秒之间的区间因为太小,以至于无法区分接收到的数据报究竟是来自哪种系统的。
为了避免这个问题,我们可以使用TCP的时间截选项,这样就可以更好的得到何时发送数据报的信息了。在每个数据报里都设置时间截选项将会提高探测结果的准确度。不过,使用时间截选项也许会增加我们判断的难度,因为时间截选项可能会返回一些不准确的时间数据。

这种方法就是建立在指纹的获取以及与现有指纹数据库比较的基础之上的。通常的测量“距离”的方式为求得对应延迟之间的差值:
Distance=∑│ r_i - s_i │
其中r_i为与接收到的第i个数据报相关的时间延迟,s_i为指纹数据库中的相应顺序数据报的时间延迟。
因此,探测到的最可能的操作系统将是求得“距离”最短时的指纹数据库中对应的操作系统。而“距离”的求得并没有考虑TCP数据报头部的一些重要标记(如SYN,ACK,RST,FIN……)的影响。而这些标记往往又能探测到目标主机的运行状态。序号和确认号,这些信息却可以用来区分不同的系统实现方式。

五、RING的执行和现实结果

5.1 库
为了开发的简便,RING使用了标准的C语言和UNIX下的一些库文件。比如Dug Song''s Libdnet library,Mike D. Schiffman Libnet library,Lawrence Berkeley national liboratory Libpcap library。
Libdnet库被用来对防火墙进行控制,它提供了一个API允许控制某些UNIX的防火墙(比如ipchains,ipfilters,ipf……)
Libpcap通常被用来进行网络的监听,以及数据报的分析。

5.2 运行过程
RING对远程主机的探测需要一些初始化参数,目标主机的IP地址,目标主机上一个开放的TCP端口,扫描主机的IP地址以及用于监听数据报的网络接口。
然后,RING将会执行下面的步骤:
- 源端口的选择;
- 使用libdnet,建立起本地过滤设施,阻挡来自目标主机的数据报;
- 使用libpcap监听收到的数据报;
- 使用libnet,发送一个TCP SYN数据报到探测目标主机;
- 在默认/调整过的延迟内监听回送的数据报
- 将收到的回送数据报与以知的签名相比较

5.3 实际的结果
在其他工具无法区分远程主机系统时,RING仍然能提供非常准确的结果。例如,一台Win2k主机,一台FreeBSD主机,即使它们是隐藏在通常配制的防火墙后面,RING也是有可能区分出他们来的。
Win2k和FreeBSD的实现有一个非常相似的地方,因为他们共享了相同的IP栈技术。如果他们这两个操作系统上只有一个开放的端口,NMAP在通常情况下是无法区分两者的。
如果实现的技术非常的相识,我们将会探测另外的Reset数据报做来进一步的分析,这对RING来说应该是足以区分远程主机的操作系统。
如下是Win2k和FreeBSD的比较:
(以下各表中,各个系统对应的数据为重传数据报的时间延迟,以秒为单位。如下图第一行数据: 1st表示远程主机的第一次重传,而后Windows 2k下面的3表示window 2k系统的第一次重传延迟为3秒,再后的FreeBSD 4.4下面的3也表示FreeBSD 4.4系统第一次重传的延迟为3秒。)
____________________________________________
│Retries│===Windows 2k====│=FreeBSD 4.4=│
│==1st==│========3========│======3======│
│==2nd==│========6========│======6======│
│==3rd==│=no more retries=│=====12======│
│==4th==│=================│=====24======│
----------------------------------------------------
│=Reset=│==no reset sent==│=reset after 30 sec.=│
----------------------------------------------------

RING同样可以区分出相同操作系统的不同版本:
-------------------------------------------------
│Retries│===Linux2.2.14===│====Linux 2.4====│
│==1st==│=======3,5=======│======4,26=======│
│==2nd==│=======6,5=======│========6========│
│==3rd==│======12,5=======│=======12========│
│==4th==│======24,5=======│=======24========│
│==5th==│======48,5=======│======48,2=======│
│==6th==│======96,5=======│=no more retries=│
│==7th==│======120,5======│=================│
│==8th==│=no more retries=│=================│
-------------------------------------------------
│=Reset=│====no reset====│====no reset====│
-------------------------------------------------

-------------------------------------------------
│Retries│===Windows 98====│===Windows 2k===│
│==1st==│========3========│========3========│
│==2nd==│========6========│========6========│
│==3rd==│=======12========│=no more retries=│
│==4th==│=no more retries=│=================│
-------------------------------------------------
│=Reset=│=====no reset====│=====no reset====│
-------------------------------------------------

以下是在不同的设备上现实的区别:
---------------------------------------------------------
│Retries│minolta printer│ cisco router │3com switch│
│==1st==│======4,5======│======2========│====3,5====│
│==2nd==│======4,5======│======3,9======│====4,4====│
│==3rd==│=======9=======│======5,9======│====4,4====│
│==4th==│=======18======│no more retries│====4,4====│
│==5th==│=======36======│===============│====4,4====│
│==6th==│=======72======│===============│====4,4====│
│==7th==│======144======│===============│====4,4====│
│==8th==│======285======│===============│====4,4====│
│==9th==│======576======│===============│====4,4====│
│==10th=│======169======│===============│====4,4====│
│==11th=│======169======│===============│====4,4====│
│==12th=│======169======│===============│====4,4====│
---------------------------------------------------------
│=Reset=│=====Reset=====│===no reset====│==no reset=│
---------------------------------------------------------
注意,经过一系列的重传后,一些系统会发送一个RST数据报警告扫描主机终止传输,进而停止重传数据报。

六、讨论与扩充

6.1 优势
RING使用的技术的最大优势就是它只需要一个打开的端口。如果目标主机是被防火墙所保护的,那么很可能就只开了一个端口,其他的端口则是被过滤了的。
在相同的防火墙配置情况下,NMAP就不会那么有效了,因为它是基于一些关闭端口了,而这些关闭的端口往往是被过滤了。
而且,RING的技术是使用了一个标准的TCP数据报,它将不会对目标主机造成任何的不利影响。
另一方面,这种探测方式需要花比NMAP或Xprobe更多的时间。这是测量连续数据报时间延迟的一个固有的缺点。
6.2 保护
有什么办法可以阻止RING对操作系统指纹的探测呢?因为传送的是标准的数据报,因此目标主机不可能将之从通常的数据传输中区分开来。
数据报的重传是显而易见的,但是数据报的丢失和重传在网络上又是时常发生的事情。
如果一个入侵检测系统为了防止网络上过多的垃圾信息而中止了某个连接,这样将会降低TCP的错误率并恢复网络的流通容量。
在某些操作系统中,可以通过修改TCP/IP栈某些成员的数据进而达到避开RING探测的作用。但是我并不推荐这种方法,因为它会严重威胁到TCP/IP栈的稳定性。
另一个可能的方法是将主机隐藏于代理之后,或是使用防火墙技术来实现SYN转发或SYN网关技术。SYN转发或SYN保护技术是专门用来对付SYN洪水攻击的。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SYN转发原理:
(注:以下各图中,相同名称的为同一台主机,无箭头的直线没有任何意义。如下图:三个client均指同一客户端,三个firewall均指同一个防火墙)

client ------SYN ------> firewall ---------------- target
client <--- SYN-ACK----- firewall ---------------- target

如果在某个时间段内防火墙没有收到等待的ACK数据报,那么这个连接将会被中止:

client <------RST------- firewall ---------------- target

相反,传输将会继续进行:

client ---------------- firewall -------SYN------> target
client ------ACK------> firewall <--- SYN-ACK----- target
client ---------------- firewall -------ACK------> target

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SYN网关原理:

client ------SYN------> firewall -------SYN------> target
client <----SYN-ACK---- firewall <-----SYN-ACK---- target

如果在某个时间段内防火墙没有收到等待的ACK数据报,那么它将会中断本次连接:

client ---------------- firewall ------RST------> target

相反,连接将会继续进行:

client ------ACK------> firewall ------ACK------> target

6.3 将来的改进
在TCP的传输流中另一种状态也有相同的功能,试图重发那些被假装丢弃的数据报,这就是FIN_WAIT_1状态。它可以和前面的探测技术结合使用,也可以用在对进行了SYN保护系统的探测之中。这种有趣的技术可以通过实施了SYN网关保护机制的网络,进而实现对真正目标主机的系统指纹探测。
---------------------------------------------
│Retries│===Linux2/4====│==Windows 2k===│
│==1st==│======0,8======│=======3=======│
│==2nd==│======1,3======│=======6=======│
│==3rd==│======2,6======│======12=======│
│==4th==│======5,2======│======24=======│
│==5th==│=====10,5======│======48=======│
│==6th==│=====20,8======│no more retries│
│==7th==│=====41,6======│===============│
│==8th==│no more retries│===============│
---------------------------------------------
│=Reset=│===no reset===│====no reset===│
---------------------------------------------

七、结论

RING 使用了一个建立在常规,无危险TCP传输上的新的操作系统探测技术。它通过分析目标主机在各次重传数据报之间的延迟来判断远程主机操作系统的指纹。如果将其和其他的操作系统探测技术相结合,应该会收到更好的效果。


Reference:
1 ) << Ring-full-paper >> by Intranode Research Team
2 ) << Remote OS detection via TCP/IP Stack FingerPrinting >> by Fyodor
3 ) << ICMP based remote OS TCP/IP stack fingerprinting techniques >> by Ofir Arkin & Fyodor Yarochkin

下载本文示例代码
阅读(190) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~