系统版本扫描
(r.{v@h,dV (r.{v@h,dV (r.{v@h,dV FIN探测 -- 通过发送一个FIN数据包(或任何未设置ACK或SYN标记位的数据包)
(r.{v@h,dV 到一个打开的端口,并等待回应。RFC793定义的标准行为是“不”响
(r.{v@h,dV 应,但诸如MS Windows、BSDi、CISCO、HP/UX、MVS和IRIX等操作系
(r.{v@h,dV 统会回应一个RESET包。大多数的探测器都使用了这项技术。
(r.{v@h,dV (r.{v@h,dV BOGUS(伪造)标记位探测 -- 据我所知,Queso是第一个使用这种更聪明技术的
(r.{v@h,dV 探测器。它原理是在一个SYN数据包TCP头中设置未定义的TCP“标记”
(r.{v@h,dV (64或128)。低于2.0.35版本的Linux内核会在回应包中保持这个
(r.{v@h,dV 标记,而其它操作系统好象都没有这个问题。不过,有些操作系统
(r.{v@h,dV 当接收到一个SYN+BOGUS数据包时会复位连接。所以这种方法能够比
(r.{v@h,dV 较有效地识别出操作系统。
(r.{v@h,dV (r.{v@h,dV TCP ISN 取样 -- 其原理是通过在操作系统对连接请求的回应中寻找TCP连接初
(r.{v@h,dV 始化序列号的特征。目前可以区分的类别有传统的64K(旧UNIX系统
(r.{v@h,dV 使用)、随机增加(新版本的Solaris、IRIX、FreeBSD、Digital
(r.{v@h,dV UNIX、Cray和其它许多系统使用)、真正“随机”(Linux 2.0.*及更
(r.{v@h,dV 高版本、OpenVMS和新版本的AIX等操作系统使用)等。Windows平台
(r.{v@h,dV (还有其它一些平台)使用“基于时间”方式产生的ISN会随着时间的
(r.{v@h,dV 变化而有着相对固定的增长。不必说,最容易受到攻击的当然是老
(r.{v@h,dV 式的64K方式。而最受我们喜爱的当然是“固定”ISN!确实有些机器
(r.{v@h,dV 总是使用相同的ISN,如某些3Com集线器(使用0x83)和Apple
(r.{v@h,dV LaserWriter打印机(使用0xC7001)。
(r.{v@h,dV (r.{v@h,dV 根据计算ISN的变化、最大公约数和其它一些有迹可循的规律,还可
(r.{v@h,dV 以将这些类别分得更细、更准确。
(r.{v@h,dV (r.{v@h,dV “无碎片”标记位 -- 许多操作系统逐渐开始在它们发送的数据包中设置IP“不分
(r.{v@h,dV 片(无碎片)”位。这对于提高传输性能有好处(虽然有时它很讨厌
(r.{v@h,dV -- 这也是为什么nmap不对Solaris系统进行碎片探测的原因)。但
(r.{v@h,dV 并不是所有操作系统都有这个设置,或许并不并总是使用这个设置,
(r.{v@h,dV 因此通过留意这个标记位的设置可以收集到关于目标主机操作系统
(r.{v@h,dV 的更多有用信息。
(r.{v@h,dV (r.{v@h,dV TCP 初始化“窗口” -- 就是检查返回数据包的“窗口”大小。以前的探测器仅仅通
(r.{v@h,dV 过RST数据包的非零“窗口”值来标识为“起源于BSD 4.4”。而象queso
(r.{v@h,dV 和nmap这些新的探测器会记录确切的窗口值,因为该窗口随操作系
(r.{v@h,dV 统类型有较为稳定的数值。这种探测能够提供许多有用的信息,因
(r.{v@h,dV 为某些系统总是使用比较特殊的窗口值(例如,据我所知AIX是唯一
(r.{v@h,dV 使用0x3F25窗口值的操作系统)。而在声称“完全重写”的NT5的TCP
(r.{v@h,dV 堆栈中,Microsoft使用的窗口值总是0x402E。更有趣的是,这个数
(r.{v@h,dV 值同时也被OpenBSD和FreeBSD使用。
(r.{v@h,dV (r.{v@h,dV ACK值 -- 也许你认为ACK值总是很标准的,但事实上操作系统在ACK域值的实
(r.{v@h,dV 现也有所不同。例如,假设向一个关闭的TCP端口发送一个FIN|PSH|
(r.{v@h,dV URG包,许多操作系统会将ACK值设置为ISN值,但Windows和某些愚
(r.{v@h,dV 蠢的打印机会设置为seq+1。如果向打开的端口发送SYN|FIN|URG|
(r.{v@h,dV PSH包,Windows的返回值就会非常不确定。有时是seq序列号值,有
(r.{v@h,dV 时是S++,而有时回送的是一个似乎很随机性的数值。我们很怀疑为
(r.{v@h,dV 什么MS总是能写出这种莫名其妙的代码。
(r.{v@h,dV (r.{v@h,dV ICMP错误信息查询 -- 有些(聪明的)操作系统根据RFC 1812的建议对某些类型
(r.{v@h,dV 的错误信息发送频率作了限制。例如,Linux内核(在net/ipv4/
(r.{v@h,dV icmp.h)限制发送“目标不可到达”信息次数为每4秒80次,如果超过
(r.{v@h,dV 这个限制则会再减少1/4秒。一种测试方法是向高端随机UDP端口发
(r.{v@h,dV 送成批的数据包,并计算接收到的“目标不可到达”数据包的数量。
(r.{v@h,dV 在nmap中只有UDP端口扫描使用了这个技术。这种探测操作系统方法
(r.{v@h,dV 需要稍微长的时间,因为需要发送大量的数据包并等待它们的返回。
(r.{v@h,dV 这种数据包处理方式也会对网络性能造成某种程度的影响。
(r.{v@h,dV (r.{v@h,dV ICMP信息引用 -- RFC定义了一些ICMP错误信息格式。如对于一个端口不可到达
(r.{v@h,dV 信息,几乎所有操作系统都只回送IP请求头+8字节长度的包,但
(r.{v@h,dV Solaris返回的包会稍微长一点,Linux则返回更长的包。这样即使
(r.{v@h,dV 操作系统没有任何监听任何端口,nmap仍然有可能确定Linux和
(r.{v@h,dV Solaris操作系统的主机。
(r.{v@h,dV (r.{v@h,dV ICMP错误信息回显完整性 -- 我们在前面已谈到,机器必须根据接收到的数据
(r.{v@h,dV 包返回“端口不可到达”(如果确实是这样)数据包。有些操作系统
(r.{v@h,dV 会在初始化处理过程中弄乱了请求头,这样当你接收到这种数据包
(r.{v@h,dV 时会出现不正常。例如,AIX和BSDI返回的IP包中的“总长度”域会
(r.{v@h,dV 被设置为20字节(太长了)。某些BSDI、FreeBSD、OpenBSD、
(r.{v@h,dV ULTRIX和VAX操作系统甚至会修改请求头中的IP ID值。另外,由于
(r.{v@h,dV TTL值的改变导致校验和需要修改时,某些系统(如AIX、FreeBSD
(r.{v@h,dV 等)返回数据包的检验和会不正确或为0。有时这种情况也出现在
(r.{v@h,dV UDP包检验和。总的说来,nmap使用了九种不同的ICMP错误信息探
(r.{v@h,dV 测技术来区分不同的操作系统。
(r.{v@h,dV (r.{v@h,dV 服务类型(TOS) -- 对于ICMP的“端口不可到达”信息,经过对返回包的服务类
(r.{v@h,dV 型(TOS)值的检查,几乎所有的操作系统使用的是ICMP错误类型
(r.{v@h,dV 0,而Linux使用的值是0xC0。
(r.{v@h,dV (r.{v@h,dV 片段(碎片)处理 -- 不同操作系统在处理IP片段重叠时采用了不同的方式。
(r.{v@h,dV 有些用新的内容覆盖旧的内容,而又有些是以旧的内容为优先。有
(r.{v@h,dV 很多探测方法能确定这些包是被如何重组的,从而能帮助确定操作
(r.{v@h,dV 系统类型。
(r.{v@h,dV (r.{v@h,dV TCP选项 -- 这是收集信息的最有效方法之一。其原因是:
(r.{v@h,dV (r.{v@h,dV 1)它们通常真的是“可选的”,因此并不是所有的操作系统都使用
(r.{v@h,dV 它们。
(r.{v@h,dV 2)向目标主机发送带有可选项标记的数据包时,如果操作系统支
(r.{v@h,dV 持这些选项,会在返回包中也设置这些标记。
(r.{v@h,dV 3)可以一次在数据包中设置多个可选项,从而增加了探测的准确
(r.{v@h,dV 度。
(r.{v@h,dV (r.{v@h,dV Nmap在几乎每一个探测数据包中都设置了如下选项:
(r.{v@h,dV (r.{v@h,dV Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops;
(r.{v@h,dV (r.{v@h,dV 当接收到返回包时,检查返回了哪些选项,它们就是目标操作系统
(r.{v@h,dV 支持的选项。有些操作系统(如较新版本的FreeBSD)支持以上所
(r.{v@h,dV 有选项,而有些(如Linux 2.0.x)则几乎都不支持。Linux 2.1.x
(r.{v@h,dV 内核支持以上所有选项。
(r.{v@h,dV (r.{v@h,dV 如果有几个操作系统支持相同的选项,可以通过选项的值来进行区
(r.{v@h,dV 分。例如,如果向Linux机器发送一个很小的MSS值,它一般会将此
(r.{v@h,dV MSS值返回,而其它系统则会返回不同数值。
(r.{v@h,dV (r.{v@h,dV 如果支持相同的选项,返回值也相同,又怎么办呢?仍然可以通过
(r.{v@h,dV 返回选项的顺序进行区分。如Solaris系统返回‘NNTNWME',代表:
(r.{v@h,dV (r.{v@h,dV 而如果是Linux 2.1.122系统,相同的选项,相同的返回值,但顺
(r.{v@h,dV 序却有所不同:MENNTNW。
(r.{v@h,dV (r.{v@h,dV 目前还没有其它操作系统探测工具利用TCP选项,但它确实非常有效!
(r.{v@h,dV (r.{v@h,dV 另外还有其它一些选项也可用于进行探测,如T/TCP支持等。NMAP探测细节和结果
(r.{v@h,dV (r.{v@h,dV 上面我们讨论了操作系统类型探测的多种技术(除了某些攻击性方法外)。这些技术都在nmap扫描器中实现。Nmap
(r.{v@h,dV 扫描器收集了众多操作系统端口打开和关闭时的特征,支持目前流行的Linux、*BSD和Solaris 2.5.1/2.6多种操作系统。
(r.{v@h,dV (r.{v@h,dV 目前版本的nmap扫描器从一个文件中读取操作系统特征模板。下面是一个实例:
(r.{v@h,dV (r.{v@h,dV FingerPrint IRIX 6.2 - 6.4 # Thanks to Lamont Granquist
(r.{v@h,dV TSeq(Class=i800)
(r.{v@h,dV T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
(r.{v@h,dV T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
3J~kiy.nfW T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
3J~kiy.nfW T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
3J~kiy.nfW T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
3J~kiy.nfW T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
3J~kiy.nfW T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
3J~kiy.nfW PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
3J~kiy.nfW 3J~kiy.nfW 让我们来看一下每一行的含义:
3J~kiy.nfW 3J~kiy.nfW > FingerPrint IRIX 6.2 - 6.3 # Thanks to Lamont Granquist
3J~kiy.nfW 3J~kiy.nfW 它说明这是一个IRIX 6.2 - 6.3操作系统特征,注释指出该特征由Lamont Granquist提供。
3J~kiy.nfW 3J~kiy.nfW > TSeq(Class=i800)
3J~kiy.nfW 3J~kiy.nfW 它说明ISN特征是"i800 class",即每一个新序列号比上一个序列号大800的整数倍。
3J~kiy.nfW 3J~kiy.nfW > T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
3J~kiy.nfW 3J~kiy.nfW T1代表test1。这个测试是向打开的端口发送带有多个TCP选项的SYN数据包。DF=N说明返回包的
3J~kiy.nfW "Don't fragment"位必须没有设置。W=C000|EF2A说明返回包的窗口值必须为0xC000或0xEF2A。ACK=S++说明
3J~kiy.nfW 返回包的ACK值必须为初始化序列号加1。Flags=AS说明返回包的ACK和SYN标记位必须被设置。Ops=MNWNNT说明返回
3J~kiy.nfW 包的TCP选项及其顺序必须为:
3J~kiy.nfW 3J~kiy.nfW > T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
3J~kiy.nfW 3J~kiy.nfW Test 2(第二个测试)向打开端口发送带有相同TCP选项的NULL(空)数据包。Resp=Y说明必须接收到返回包。
3J~kiy.nfW Ops= 说明返回包中的所有TCP选项必须都没有被设置。‘%Ops='匹配任意TCP选项。
3J~kiy.nfW 3J~kiy.nfW > T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)
3J~kiy.nfW 3J~kiy.nfW Test 3(第三个测试)向打开端口发送带有TCP选项的SYN|FIN|URG|PSH数据包。
3J~kiy.nfW 3J~kiy.nfW > T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
3J~kiy.nfW 3J~kiy.nfW 这是向打开端口发送ACK数据包。注意这里没有Resp=字符串。说明返回包不是必须的(例如数据包被丢弃或有
3J~kiy.nfW 防火墙)。
3J~kiy.nfW 3J~kiy.nfW > T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
3J~kiy.nfW > T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
3J~kiy.nfW > T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
3J~kiy.nfW 3J~kiy.nfW 以上测试是针对关闭端口的SYN、ACK和FIN|PSH|URG数据包测试,并设置了相同的TCP选项。
3J~kiy.nfW 3J~kiy.nfW > PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
3J~kiy.nfW 3J~kiy.nfW 这个是对“端口不可到达”信息的测试。DF=N前面已经介绍过了。TOS=0说明IP服务类型域应为0。接着的两个是IP
3J~kiy.nfW 包头总长度和返回IP包总长度(16进制值)。RID=E说明期望返回包RID值与发送的UDP包的值相同。RIPCK=E说明校验
3J~kiy.nfW 和应该正常(如果不正常则RIPCK=F)。UCK说明UDP包校验和也应该正常。ULEN=134是UDP包长度为0x134。DAT=E说 明正确返回UDP数据,这个是大多数情况下的缺省设置。
3J~kiy.nfW 3J~kiy.nfW 一些较为著名站点的扫描结果
3J~kiy.nfW 3J~kiy.nfW 注:这些都是以前的扫描结果,仅供参考。不保证它现在仍然有效或准确。
3J~kiy.nfW 3J~kiy.nfW # "Hacker" sites or (in a couple cases) sites that think they are
3J~kiy.nfW www.l0pht.com => OpenBSD 2.2 - 2.4
3J~kiy.nfW www.insecure.org => Linux 2.0.31-34
3J~kiy.nfW www.rhino9.ml.org => Windows 95/NT # No comment :)
3J~kiy.nfW www.technotronic.com => Linux 2.0.31-34
3J~kiy.nfW www.nmrc.org => FreeBSD 2.2.6 - 3.0
3J~kiy.nfW www.cultdeadcow.com => OpenBSD 2.2 - 2.4
3J~kiy.nfW www.kevinmitnick.com => Linux 2.0.31-34 # Free Kevin!
3J~kiy.nfW www.2600.com => FreeBSD 2.2.6 - 3.0 Beta
3J~kiy.nfW www.antionline.com => FreeBSD 2.2.6 - 3.0 Beta
3J~kiy.nfW www.rootshell.com => Linux 2.0.35 # Changed to OpenBSD after
3J~kiy.nfW # they got owned.
3J~kiy.nfW 3J~kiy.nfW # Security vendors, consultants, etc.
3J~kiy.nfW www.repsec.com => Linux 2.0.35
3J~kiy.nfW www.iss.net => Linux 2.0.31-34
3J~kiy.nfW www.checkpoint.com => Solaris 2.5 - 2.51
3J~kiy.nfW www.infowar.com => Win95/NT
3J~kiy.nfW 3J~kiy.nfW # Vendor loyalty to their OS
3J~kiy.nfW www.li.org => Linux 2.0.35 # Linux International
3J~kiy.nfW www.redhat.com => Linux 2.0.31-34 # I wonder what distribution :)
3J~kiy.nfW www.debian.org => Linux 2.0.35
3J~kiy.nfW www.linux.org => Linux 2.1.122 - 2.1.126
3J~kiy.nfW www.sgi.com => IRIX 6.2 - 6.4
3J~kiy.nfW www.netbsd.org => NetBSD 1.3X
3J~kiy.nfW www.openbsd.org => Solaris 2.6 # Ahem :)
3J~kiy.nfW www.freebsd.org => FreeBSD 2.2.6-3.0 Beta
3J~kiy.nfW 3J~kiy.nfW # Ivy league
3J~kiy.nfW www.harvard.edu => Solaris 2.6
3J~kiy.nfW www.yale.edu => Solaris 2.5 - 2.51
3J~kiy.nfW www.caltech.edu => SunOS 4.1.2-4.1.4 # Hello! This is the 90's :)
3J~kiy.nfW www.stanford.edu => Solaris 2.6
3J~kiy.nfW www.mit.edu => Solaris 2.5 - 2.51 # Coincidence that so many good
3J~kiy.nfW # schools seem to like Sun?
3J~kiy.nfW # Perhaps it is the 40%
3J~kiy.nfW # .edu discount :)
3J~kiy.nfW www.berkeley.edu => UNIX OSF1 V 4.0,4.0B,4.0D
3J~kiy.nfW www.oxford.edu => Linux 2.0.33-34 # Rock on!
3J~kiy.nfW 3J~kiy.nfW # Lamer sites
3J~kiy.nfW www.aol.com => IRIX 6.2 - 6.4 # No wonder they are so insecure :)
3J~kiy.nfW www.happyhacker.org => OpenBSD 2.2-2.4 # Sick of being owned, Carolyn?
3J~kiy.nfW # Even the most secure OS is
3J~kiy.nfW # useless in the hands of an
3J~kiy.nfW # incompetent admin.
3J~kiy.nfW 3J~kiy.nfW # Misc
3J~kiy.nfW www.lwn.net => Linux 2.0.31-34 # This Linux news site rocks!
3J~kiy.nfW www.slashdot.org => Linux 2.1.122 - 2.1.126
3J~kiy.nfW www.whitehouse.gov => IRIX 5.3
3J~kiy.nfW sunsite.unc.edu => Solaris 2.6
3J~kiy.nfW 3J~kiy.nfW 3J~kiy.nfW