论文部分内容阅读
众所周知,绝大多数安全漏洞都是针对特定操作系统的,所以,识别远程主机操作系统对于实现攻击非常重要。例如,在端口扫描时发现端口80打开了,而且其服务器程序是有安全漏洞的WEB SERVER,这时你只要找到相应的漏洞攻击程序就可以使服务器进程崩溃。依靠TCP/IP特征探测器,你可以知道主机正在运行“Windows NT”还是“Linux 2.0.35”,然后使用相应的漏洞程序和shellcode代码。
目前,网上有很多黑客站点,可以从上面下载一些攻击工具,这些工具可能被不正当使用。有些人喜欢一次对多台机器进行操作系统和端口扫描,例如,有人把Sun comsat服务器的一个安全漏洞公布了,他们就会特意地去寻找“Solaris 2.6”操作系统和“UDP/512”端口,然后不停地去攻击这些机器。这些人并没有什么技术,也不能说明他能够发现漏洞或修补漏洞。
这样的攻击,或这样的攻击工具是什么原理,怎样实现的呢?
传统技术
利用堆栈特征探测操作系统是一种独特的方法。它会满足大多数的要求,这种方法可能是迄今为止最有效的:
login> telnet xxx.xxx.xxx.xxx
Trying xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx
Escape character is ^].
Digital UNIX(xxx.xxx.xxx.xxx)(ttyp2)
Login:
这是我们经常可以看到的现象,现在的大多数系统都还带有这样的显示,而很多系统管理员们也没有意识到应该去掉它们。从系统安全的角度来说,这是一种很愚蠢的行为。公开操作系统给蓄意攻击者提供了很大的方便!
随着这个问题的严重性被广泛意识到,越来越多的系统管理员已经开始将这样的显示去掉,不再泄露重要的信息,通过这种方式获得操作系统类型和版本遇到了困难,变得不那么可行了。
即使关闭登录显示,许多应用程序仍然为访问者提供了这类信息。例如,当登录到某台FTP服务器时:
login> ftp xxx.xxx.xxx.xxx
Trying xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx
Escape character is ^].
220 ftp29 FTP server(UNIX(r) System V Release 4.0)ready.
SYST
215 UNIX Type:L8 Version:SUNOS
首先,它在缺省的显示里告诉你操作系统的信息。然后当输入“SYST”命令时,它会提供更多的信息。
许多其它的应用程序也能提供类似信息。例如WEB服务器:
login> echo GET / HTTP/1.0\n | nc hotbot.com 80 | egrep ^Server:
Server: Microsoft-IIS/4.0
login>
通过这样的方法,我们也能轻易知道这台机器运行的是什么操作系统。
几个操作系统特征探测程序
我们现在可以在网上找到一些获取主机操作系统的工具。
1.Nmap是一个使用TCP/IP堆栈特征探测操作系统类型的程序。这个程序使用了一些简单的TCP标记位测试来区分“Linux”、“4.4BSD”、“Win95”或“Unknown”操作系统主机。
2.另一个程序是checkos,由Shok编写并于1998年1月在“Confidence Remains High Issue #7”上发表。它采用相同的技术。
3.Su1d也写了一个操作系统检测程序。程序名为SS,版本3.11能够检测12种不同操作系统类型。
以上谈到的所有程序都具有同样的特点,那就是依靠很少的测试和响应来确定系统类型。我们希望知道“这台机器运行的是OpenBSD、FreeBSD或者NetBSD”,还想知道具体版本和其它更多的信息。例如,“Solaris 2.6”比“Solaris”包含有更多的信息。为了能达到这种更高的探测要求,在nmap中使用了更多的操作系统特征技术。
特征探测方法的原理
目前有许多的协议栈特征探测技术。最简单的就是寻找各种操作系统间的不同并写出探测程序。当使用了足够的不同特征时,操作系统的探测精度就有了很大保证。例如nmap能够可靠地区分出Solaris 2.4、Solaris 2.5-2.5.1和Solaris 2.6,也能区分2.0.30、2.0.31-34或2.0.35版本的Linux内核。以下是一些这方面的技术:
BOGUS(伪造)标记位探测:Queso是第一个使用这种技术的探测器。它原理是在一个SYN数据包TCP头中设置未定义的TCP“标记”(64或128)。低于2.0.35版本的Linux内核会在回应包中保持这个标记,而其它操作系统好象都没有这个问题。不过,有些操作系统当接收到一个SYN+BOGUS数据包时会复位连接。所以这种方法能够比较有效地识别出操作系统。
FIN探测:通过发送一个FIN数据包(或任何未设置ACK或SYN标记位的数据包)到一个打开的端口,并等待回应。RFC793定义的标准行为是“不”响应,但诸如MS Windows、BSDi、CISCO、HP/UX、MVS和IRIX等操作系统会回应一个RESET包。大多数的探测器都使用了这项技术。
TCP ISN 取样:其原理是通过在操作系统对连接请求的回应中寻找TCP连接初始化序列号的特征。目前可以区分的类别有传统的64K(旧UNIX系统使用)、随机增加(新版本的Solaris、IRIX、FreeBSD、Digital UNIX、Cray和其它许多系统使用)、真正“随机”(Linux 2.0.*及更高版本、OpenVMS和新版本的AIX等操作系统使用)等。Windows平台(还有其它一些平台)使用“基于时间”方式产生的ISN会随着时间的变化而有着相对固定的增长。不必说,最容易受到攻击的当然是老式的64K方式。而最受我们喜爱的当然是“固定”ISN。确实有些机器总是使用相同的ISN,如某些3Com集线器(使用0x83)和Apple LaserWriter打印机(使用0xC7001)。根据计算ISN的变化、最大公约数和其它一些有迹可循的规律,还可以将这些类别分得更细、更准确。
“无碎片”标记位:许多操作系统逐渐开始在它们发送的数据包中设置IP“不分片(无碎片)”位。这对于提高传输性能有好处(这也是为什么nmap不对Solaris系统进行碎片探测的原因)。但并不是所有操作系统都有这个设置,或许并不总是使用这个设置,因此通过留意这个标记位的设置可以收集到关于目标主机操作系统的更多有用信息。
TCP 初始化“窗口”:就是检查返回数据包的“窗口”大小。以前的探测器仅仅通过RST数据包的非零“窗口”值来标识为“起源于BSD 4.4”。而象queso和nmap这些新的探测器会记录确切的窗口值,因为该窗口随操作系统类型有较为稳定的数值。这种探测能够提供许多有用的信息,因为某些系统总是使用比较特殊的窗口值(例如,据我所知AIX是唯一使用0x3F25窗口值的操作系统)。而在声称“完全重写”的NT5的TCP堆栈中,Microsoft使用的窗口值总是0x402E。这个数值同时也被OpenBSD和FreeBSD使用。
ACK值:也许你认为ACK值总是很标准的,但事实上操作系统在ACK域值的实现也有所不同。例如,假设向一个关闭的TCP端口发送一个FIN|PSH|URG包,许多操作系统会将ACK值设置为ISN值,但Windows和某些打印机会设置为seq+1。如果向打开的端口发送SYN|FIN|URG|PSH包,Windows的返回值就会非常不确定。有时是seq序列号值,有时是S++,而有时回送的是一个似乎很随机性的数值。我们很怀疑为什么MS总是能写出这种莫名其妙的代码。
ICMP错误信息查询:有些操作系统根据RFC 1812的建议对某些类型的错误信息发送频率作了限制。例如,Linux内核(在net/ipv4/icmp.h)限制发送“目标不可到达”信息次数为每4秒80次,如果超过这个限制则会再减少1/4秒。一种测试方法是向高端随机UDP端口发送成批的数据包,并计算接收到的“目标不可到达”数据包的数量。在nmap中只有UDP端口扫描使用了这个技术。这种探测操作系统方法需要稍微长的时间,因为需要发送大量的数据包并等待它们的返回。这种数据包处理方式也会对网络性能造成某种程度的影响。
ICMP信息引用:RFC定义了一些ICMP错误信息格式。如对于一个端口不可到达信息,几乎所有操作系统都只回送IP请求头+8字节长度的包,但Solaris返回的包会稍微长一点,Linux则返回更长的包。这样即使操作系统没有任何监听任何端口,nmap仍然有可能确定Linux和Solaris操作系统的主机。
ICMP错误信息回显完整性:我们在前面已谈到,机器必须根据接收到的数据包返回“端口不可到达”(如果确实是这样)数据包。有些操作系统会在初始化处理过程中弄乱了请求头,这样当你接收到这种数据包时会出现不正常。例如,AIX和BSDi返回的IP包中的“总长度”域会被设置为20字节(太长了)。某些BSDi、FreeBSD、OpenBSD、ULTRIX和VAX操作系统甚至会修改请求头中的IP ID值。另外,由于TTL值的改变导致校验和需要修改时,某些系统(如AIX、FreeBSD等)返回数据包的检验和会不正确或为0。有时这种情况也出现在UDP包检验和。总的说来,nmap使用了九种不同的ICMP错误信息探测技术来区分不同的操作系统。
服务类型(TOS):对于ICMP的“端口不可到达”信息,经过对返回包的服务类型(TOS)值的检查,几乎所有的操作系统使用的是ICMP错误类型0,而Linux使用的值是0xC0。
片段(碎片)处理:不同操作系统在处理IP片段重叠时采用了不同的方式。有些用新的内容覆盖旧的内容,而又有些是以旧的内容为优先。有很多探测方法能确定这些包是被如何重组的,从而能帮助确定操作系统类型。
TCP选项:这是收集信息的最有效方法之一。其原因是:1)它们通常真的是“可选的”,因此并不是所有的操作系统都使用它们。2)向目标主机发送带有可选项标记的数据包时,如果操作系统支持这些选项,会在返回包中也设置这些标记。3)可以一次在数据包中设置多个可选项,从而增加了探测的准确度。
防护措施
1.用户进行远程访问(如:TELNET,FTP等)的信息显示时,去掉关于操作系统的信息。
2.改变登陆提示信息的显示内容,如,提供一个虚假的操作系统信息,蒙蔽攻击者。
3.关掉主机的ICMP响应,过滤外界的ICMP请求。
4.上述防范方法只限于针对一些传统技术的检测方法,对于现在的一些检测软件,如上面介绍的NMAP,上述方法并不能起到有效的作用,针对这样的检测,系统管理员可通过安装相应安全防护软件,来保护自己的信息,如: 防火墙,IDS(入侵监测系统)。