发信人: lano() 
整理人: (2000-02-10 14:25:43), 站内信件
 | 
 
 
=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=
 
 By Fyodor [email protected] (www.insecure.org)
    backend [email protected] (http://www.isbase.com/)
 
 
 摘要
 
 
     本文主要讨论如何通过探测远程主机的TCP/IP堆栈来收集宝贵的主机系统。 首先讲述几种没有包括
 堆栈探测技术的“传统”的主机操作系统扫描方法。接着是现在较为常见的堆栈 特征扫描工具的基本原
 理。然后讨论一些能使远程主机“在不知不觉间”泄露其信息的技术。最后主要 是nmap扫描工具的一些
 实现细节。
 
 
 
 动机
 
 
     我想谁都已经非常清楚知道远程主机操作系统有多么重要,因此这里只是作 一简单叙述。首先最有
 用的一点在于绝大多数安全漏洞都是针对特定操作系统的。例如你在作端口扫描 时发现端口53打开了,
 而且其守护服务器是有安全漏洞的BIND版本,这时你只要找到相应的漏洞攻击程 序就可轻而易举地使守
 护进程崩溃。依靠优秀的TCP/IP特征探测器,你可以很快知道主机是运行'Solar is 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 '^Serve r:'
 Server: Microsoft-IIS/4.0
 playground>
 
     嗯。。。现在我们知道这台机器运行的是什么破操作系统了。:)
 
     其它“传统”的技术还包括DNS主机记录(INFO)、社交工程(social engi neering)和SNMP等。这里就不再多说了。
 
 
 
 几个操作系统特征探测程序
 
 
     Nmap不是第一个使用TCP/IP堆栈特征探测操作系统类型的程序。Johan编写的 IRC欺骗器sirc从第三版
 (或更早)就已经包含了很基本的特征探测技术。这个程序使用了一些简单的TC P标记位测试来区分
 "Linux"、"4.4BSD"、"Win95"或"Unknown"操作系统主机。
 
     另一个类似的程序是checkos,由Shok编写并于1998年1月在"Confidence Re mains 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能够可靠地区分出So laris 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包。大多数的探测器都使用了这项技术。
 
 BOGUS(伪造)标记位探测 -- 据我所知,Queso是第一个使用这种更聪明技术的 
             探测器。它原理是在一个SYN数据包TCP头中设置未定义的TCP“标记 ”
             (64或128)。低于2.0.35版本的Linux内核会在回应包中保持这个 
             标记,而其它操作系统好象都没有这个问题。不过,有些操作系统 
             当接收到一个SYN+BOGUS数据包时会复位连接。所以这种方法能够比 
             较有效地识别出操作系统。
 
 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的T CP
             堆栈中,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)可以一次在数据包中设置多个可选项,从而增加了探测的准确
                 度。
 
             Nmap在几乎每一个探测数据包中都设置了如下选项:
 
     Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Op s;
 
             当接收到返回包时,检查返回了哪些选项,它们就是目标操作系统 
             支持的选项。有些操作系统(如较新版本的FreeBSD)支持以上所
              有选项,而有些(如Linux 2.0.x)则几乎都不支持。Linux 2.1.x 
             内核支持以上所有选项。
 
             如果有几个操作系统支持相同的选项,可以通过选项的值来进行区 
             分。例如,如果向Linux机器发送一个很小的MSS值,它一般会将此 
             MSS值返回,而其它系统则会返回不同数值。
 
             如果支持相同的选项,返回值也相同,又怎么办呢?仍然可以通过 
             返回选项的顺序进行区分。如Solaris系统返回‘NNTNWME’,代表 :
            
     
 
             而如果是Linux 2.1.122系统,相同的选项,相同的返回值,但顺
              序却有所不同:MENNTNW。
 
             目前还没有其它操作系统探测工具利用TCP选项,但它确实非常有效 !
 
             另外还有其它一些选项也可用于进行探测,如T/TCP支持等。
 
     译者注:还有至少两种颇具攻击性的探测方法。由于它们能导致拒绝服务攻 击,而这也是在nmap中没有实现
 这些方法的主要原因。
 
 
 
 NMAP探测细节和结果
 
 
     上面我们讨论了操作系统类型探测的多种技术(除了某些攻击性方法外)。 这些技术都在nmap扫描器中实现。
 Nmap扫描器收集了众多操作系统端口打开和关闭时的特征,支持目前流行的Linu x、*BSD
 和Solaris 2.5.1/2.6多种操作系统。
 
     目前版本的nmap扫描器从一个文件中读取操作系统特征模板。下面是一个实 例:
 
 FingerPrint  IRIX 6.2 - 6.4 # Thanks to Lamont Granquist
 TSeq(Class=i800)
 T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
 T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
 T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
 T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
 T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
 T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
 T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
 PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
 
     让我们来看一下每一行的含义:
 
 > FingerPrint  IRIX 6.2 - 6.3 # Thanks to Lamont Granquist
 
     它说明这是一个IRIX 6.2 - 6.3操作系统特征,注释指出该特征由Lamont G ranquist提供。
 
 > TSeq(Class=i800)
 
     它说明ISN特征是"i800 class",即每一个新序列号比上一个序列号大800的 整数倍。
 
 > T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
 
     T1代表test1。这个测试是向打开的端口发送带有多个TCP选项的SYN数据包。 DF=N说明返回包的
 "Don't fragment"位必须没有设置。W=C000|EF2A说明返回包的窗口值必须为0xC 000或0xEF2A。ACK=S++说明返
 回包的ACK值必须为初始化序列号加1。Flags=AS说明返回包的ACK和SYN标记位必 须被设置。Ops=MNWNNT说明返
 回包的TCP选项及其顺序必须为:
 
 
 
 > T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
 
     Test 2(第二个测试)向打开端口发送带有相同TCP选项的NULL(空)数据包 。Resp=Y说明必须接收到返
 回包。Ops= 说明返回包中的所有TCP选项必须都没有被设置。‘%Ops=’匹配任意 TCP选项。
 
 > T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)
 
     Test 3(第三个测试)向打开端口发送带有TCP选项的SYN|FIN|URG|PSH数据 包。
 
 > T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
 
     这是向打开端口发送ACK数据包。注意这里没有Resp=字符串。说明返回包不 是必须的(例如数据包被丢
 弃或有防火墙)。
 
 > T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
 > T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
 > T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
 
     以上测试是针对关闭端口的SYN、ACK和FIN|PSH|URG数据包测试,并设置了相 同的TCP选项。
 
 > PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) 
 
     这个是对“端口不可到达”信息的测试。DF=N前面已经介绍过了。TOS=0说明 IP服务类型域应为0。接
 着的两个是IP包头总长度和返回IP包总长度(16进制值)。RID=E说明期望返回包 RID值与发送的UDP包的
 值相同。RIPCK=E说明校验和应该正常(如果不正常则RIPCK=F)。UCK说明UDP包 校验和也应该正常。
 ULEN=134是UDP包长度为0x134。DAT=E说明正确返回UDP数据,这个是大多数情况 下的缺省设置。
 
 
 
 一些较为著名站点的扫描结果
 
 
 注:这些都是以前的扫描结果,仅供参考。不保证它现在仍然有效或准确。
 
 # "Hacker" sites or (in a couple cases) sites that think they are
 www.l0pht.com        => OpenBSD 2.2 - 2.4
 www.insecure.org     => Linux 2.0.31-34
 www.rhino9.ml.org    => Windows 95/NT     # No comment :)
 www.technotronic.com => Linux 2.0.31-34
 www.nmrc.org         => FreeBSD 2.2.6 - 3.0
 www.cultdeadcow.com  => OpenBSD 2.2 - 2.4
 www.kevinmitnick.com => Linux 2.0.31-34  # Free Kevin!
 www.2600.com         => FreeBSD 2.2.6 - 3.0 Beta
 www.antionline.com   => FreeBSD 2.2.6 - 3.0 Beta
 www.rootshell.com    => Linux 2.0.35  # Changed to OpenBSD after
                                       # they got owned.
 
 # Security vendors, consultants, etc.
 www.repsec.com       => Linux 2.0.35
 www.iss.net          => Linux 2.0.31-34
 www.checkpoint.com   => Solaris 2.5 - 2.51
 www.infowar.com      => Win95/NT
 
 # Vendor loyalty to their OS
 www.li.org           => Linux 2.0.35 # Linux International
 www.redhat.com       => Linux 2.0.31-34 # I wonder what distribution : )
 www.debian.org       => Linux 2.0.35
 www.linux.org        => Linux 2.1.122 - 2.1.126
 www.sgi.com          => IRIX 6.2 - 6.4
 www.netbsd.org       => NetBSD 1.3X
 www.openbsd.org      => Solaris 2.6     # Ahem :)
 www.freebsd.org      => FreeBSD 2.2.6-3.0 Beta
 
 # Ivy league
 www.harvard.edu      => Solaris 2.6
 www.yale.edu         => Solaris 2.5 - 2.51
 www.caltech.edu      => SunOS 4.1.2-4.1.4  # Hello! This is the 90's : )
 www.stanford.edu     => Solaris 2.6
 www.mit.edu          => Solaris 2.5 - 2.51 # Coincidence that so many  good
                                            # schools seem to like Sun? 
                                            # Perhaps it is the 40%
                                            # .edu discount :)
 www.berkeley.edu     => UNIX OSF1 V 4.0,4.0B,4.0D
 www.oxford.edu       => Linux 2.0.33-34  # Rock on!
 
 # Lamer sites
 www.aol.com          => IRIX 6.2 - 6.4  # No wonder they are so insecu re :)
 www.happyhacker.org  => OpenBSD 2.2-2.4 # Sick of being owned, Carolyn ?
                                         # Even the most secure OS is
                                         # useless in the hands of an
                                         # incompetent admin.
 
 # Misc
 www.lwn.net          => Linux 2.0.31-34 # This Linux news site rocks!
  www.slashdot.org     => Linux 2.1.122 - 2.1.126
 www.whitehouse.gov   => IRIX 5.3
 sunsite.unc.edu      => Solaris 2.6
 
 版权所有,未经许可,不得转载 
 欢迎访问我们的站点http://www.isbase.com/ 
 绿色兵团给你安全的保障
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.106.14.215]
  | 
 
 
 |