摘要
本文主要讨论如何通过探测远程主机的TCP/IP堆栈来收集宝贵的主机系统。首先讲述几种没有包括堆栈探测技术的“传统”的主机操作系统扫描方法。接着是现在较为常见的堆栈特征扫描工具的基本原理。然后讨论一些能使远程主机“在不知不觉间”泄露其信息的技术。最后主要是nmap扫描工具的一些实现细节。
动机
我想谁都已经非常清楚知道远程主机操作系统有多么重要,因此这里只是作一简单叙述。首先最有用的一点在于绝大多数安全漏洞都是针对特定操作系统的。例如你在作端口扫描时发现端口53打开了,而且其守护服务器是有安全漏洞的BIND版本,这时你只要找到相应的漏洞攻击程序就可轻而易举地使守护进程崩溃。依靠优秀的TCP/IP特征探测器,你可以很快知道主机是运行’Solaris 2.5.1′还是’Linux 2.0.35′,然后使用相应的漏洞程序和shellcode代码。
这个工具也可能被不正当地使用。有些人喜欢一次对多台机器(例如50000台)进行操作系统和端口扫描,例如如果Sun comsat守护服务器的一个安全漏洞被公布了,他们就会特意地去寻找‘Solaris 2.6′操作系统和’UDP/512′端口,然后不厌其烦地去攻击这些机器。我们通常将这种人称为”SCRIPT KIDDIE”(注:就象是只会抄袭别人的小孩)。这种人并没有什么技术,也不能说明他能够发现漏洞或修补漏洞。而对于那些即使自己发现了漏洞,但却只会通过攻击他人网页来企图证明自己如何出色而系统管理员如何愚蠢的人,人们更会嗤之以鼻。
我们称之为“社交工程(social engineering)”也是另一种可能的不正当用途。例如当骇客扫描到目标公司网络时nmap报告发现了一台’Datavoice TxPORT PRISM 3000 T1 CSU/DSU 6.22/2.06‘,他就会以“Datavoice技术支持”的身份给这间公司打电话:“我们正准备公布一个安全漏洞,但我们希望在此之前为我们的客户安装补丁程序。这个补丁程序我刚刚给您寄出去。……”某些天真的管理员会真的以为只有真正来自Datavoice公司的技术工程师才知道那么多关于他们的CSU/DSU设备的资料,从而……
另一个可能的用途是评价你准备有合作的公司。当在选择一个新的ISP时,扫描一下该网络看看在使用设备。如果是一大堆的低档路由器和用Windows机器提供PPP服务,那即使是”¥99/年”的价格你也会觉得不值。:)
传统技术
利用堆栈特征探测操作系统是一种独特的方法。我想它会满足大多数的要求,虽然目前也还流行有其它方法。不过下面这种方法可能仍然是迄今为止最有效的:
playground~> telnet hpux.u-aizu.ac.jp
Trying 163.143.103.12…
Connected to hpux.u-aizu.ac.jp.
Escape character is ‘^]’.
HP-UX hpux B.10.01 A 9000/715 (ttyp2)
login:
如此公开地宣布本机运行的是什么系统根本就是一种商业炒作!现在的大多数系统都还带有这种banner,而管理员们也没有意识到应该去掉它们。虽然是存在许多探测主机操作系统的方法,但这绝对不能成为为公开主机操作系统这种愚蠢行为辩护的理由。
随着这个问题的严重性被广泛意识到,越来越多的人已经开始将banner去掉,许多系统的banner也不再泄露重要的信息,这种通过查找banner获得操作系统类型和版本的方法会遇到许多困难,变得不那么可行了。但是,至少目前版本的昂贵商业扫描器(如ISS)仍然只使用这种古老的方法来试图获取主机操作系统类型和版本。相比之下,下载nmap和queso会节约你大量的金钱。:)
即使关闭了banner,许多应用程序却仍然乐于向访问者提供这类信息。例如,当登录到某台FTP服务器时:
payfonez> telnet ftp.netscape.com 21
Trying 207.200.74.26…
Connected to ftp.netscape.com.
Escape character is ‘^]’.
220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready.
SYST
215 UNIX Type: L8 Version: SUNOS
首先,它在缺省的banner里告诉你系统的信息。然后当输入’SYST’命令时,它会更乐意地向你提供更多的信息。
如果支持匿名FTP,我们可以下载/bin/ls或其它二进制文件来(至少)确定主机的硬件平台。
其它许多应用程序也能提供类似信息。例如WEB服务器:
playground> echo ‘GET / HTTP/1.0\n’ | nc hotbot.com 80 | egrep ‘^Server:’
Server: Microsoft-IIS/4.0
playground>
嗯。。。现在我们知道这台机器运行的是什么破操作系统了。:)
其它“传统”的技术还包括DNS主机记录(INFO)、社交工程(social engineering)和SNMP等。这里就不再多说了。
几个操作系统特征探测程序
Nmap不是第一个使用TCP/IP堆栈特征探测操作系统类型的程序。Johan编写的IRC欺骗器sirc从第三版(或更早)就已经包含了很基本的特征探测技术。这个程序使用了一些简单的TCP标记位测试来区分”Linux”、”4.4BSD”、”Win95″或”Unknown”操作系统主机。
另一个类似的程序是checkos,由Shok编写并于1998年1月在”Confidence Remains High Issue #7″上发表。它采用了与sirc完全相同的技术,甚至某些代码也完全一致。其实checkos在公开发表前就已在私底下流传了很久,因此我不知道是哪个程序抄袭了另一个程序。在传播过程中,checkos增加了telnet banner检查功能(虽然这是一项很老的技术)。据Shok说,checkos从来就没打算公开,因此他并没有考虑过版权问题。
Su1d也写了一个操作系统检测程序。程序名为SS,版本3.11能够检测12种不同操作系统类型。我这个程序使用了nmap的某些网络代码。
然后是queso。这个很新的程序比起以前的其它程序有了很大的飞跃。它不但增加了不少新的测试,还是第一个(我所知道的)将操作系统特征与代码分离的程序。其它扫描程序的代码与下面相似:
/* from ss */
if ((flagsfour & TH_RST) && (flagsfour & TH_ACK) &&
(winfour == 0) && (flagsthree & TH_ACK))
reportos(argv[2],argv[3],”Livingston Portmaster
ComOS”);
而queso将这些操作系统特征都单独存放到一个配置文件中,这样只需将新的操作系统特征添加到配置文件中即可,从而极大地增强了程序的可扩展性。
Queso由Apostols.org的Savage编写。
以上谈到的所有程序都存在一个问题,那就是仍然局限于依靠为数不多的测试和响应来确定系统类型。我们不但希望仅仅知道“这台机器运行的是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内核。以下是一些这方面的技术:
FIN探测 — 通过发送一个FIN数据包(或任何未设置ACK或SYN标记位的数据包)
到一个打开的端口,并等待回应。RFC793定义的标准行为是“不”响
应,但诸如MS Windows、BSDi、CISCO、HP/UX、MVS和IRIX等操作系
统会回应一个RESET包。大多
