系统版本扫描
BYS lKTh BYS lKTh BYS lKTh FIN探测 -- 通过发送一个FIN数据包(或任何未设置ACK或SYN标记位的数据包)
BYS lKTh 到一个打开的端口,并等待回应。RFC793定义的标准行为是“不”响
BYS lKTh 应,但诸如MS Windows、BSDi、CISCO、HP/UX、MVS和IRIX等操作系
BYS lKTh 统会回应一个RESET包。大多数的探测器都使用了这项技术。
BYS lKTh BYS lKTh BOGUS(伪造)标记位探测 -- 据我所知,Queso是第一个使用这种更聪明技术的
BYS lKTh 探测器。它原理是在一个SYN数据包TCP头中设置未定义的TCP“标记”
BYS lKTh (64或128)。低于2.0.35版本的Linux内核会在回应包中保持这个
BYS lKTh 标记,而其它操作系统好象都没有这个问题。不过,有些操作系统
BYS lKTh 当接收到一个SYN+BOGUS数据包时会复位连接。所以这种方法能够比
BYS lKTh 较有效地识别出操作系统。
BYS lKTh BYS lKTh TCP ISN 取样 -- 其原理是通过在操作系统对连接请求的回应中寻找TCP连接初
BYS lKTh 始化序列号的特征。目前可以区分的类别有传统的64K(旧UNIX系统
BYS lKTh 使用)、随机增加(新版本的Solaris、IRIX、FreeBSD、Digital
BYS lKTh UNIX、Cray和其它许多系统使用)、真正“随机”(Linux 2.0.*及更
BYS lKTh 高版本、OpenVMS和新版本的AIX等操作系统使用)等。Windows平台
BYS lKTh (还有其它一些平台)使用“基于时间”方式产生的ISN会随着时间的
BYS lKTh 变化而有着相对固定的增长。不必说,最容易受到攻击的当然是老
BYS lKTh 式的64K方式。而最受我们喜爱的当然是“固定”ISN!确实有些机器
BYS lKTh 总是使用相同的ISN,如某些3Com集线器(使用0x83)和Apple
BYS lKTh LaserWriter打印机(使用0xC7001)。
BYS lKTh BYS lKTh 根据计算ISN的变化、最大公约数和其它一些有迹可循的规律,还可
BYS lKTh 以将这些类别分得更细、更准确。
BYS lKTh BYS lKTh “无碎片”标记位 -- 许多操作系统逐渐开始在它们发送的数据包中设置IP“不分
BYS lKTh 片(无碎片)”位。这对于提高传输性能有好处(虽然有时它很讨厌
BYS lKTh -- 这也是为什么nmap不对Solaris系统进行碎片探测的原因)。但
BYS lKTh 并不是所有操作系统都有这个设置,或许并不并总是使用这个设置,
BYS lKTh 因此通过留意这个标记位的设置可以收集到关于目标主机操作系统
BYS lKTh 的更多有用信息。
(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=)
(r.{v@h,dV T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
(r.{v@h,dV T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
(r.{v@h,dV T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
(r.{v@h,dV T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
(r.{v@h,dV T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
(r.{v@h,dV PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
(r.{v@h,dV (r.{v@h,dV 让我们来看一下每一行的含义:
(r.{v@h,dV (r.{v@h,dV > FingerPrint IRIX 6.2 - 6.3 # Thanks to Lamont Granquist
(r.{v@h,dV (r.{v@h,dV 它说明这是一个IRIX 6.2 - 6.3操作系统特征,注释指出该特征由Lamont Granquist提供。
(r.{v@h,dV (r.{v@h,dV > TSeq(Class=i800)
(r.{v@h,dV (r.{v@h,dV 它说明ISN特征是"i800 class",即每一个新序列号比上一个序列号大800的整数倍。
(r.{v@h,dV (r.{v@h,dV > T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
(r.{v@h,dV (r.{v@h,dV T1代表test1。这个测试是向打开的端口发送带有多个TCP选项的SYN数据包。DF=N说明返回包的
(r.{v@h,dV "Don't fragment"位必须没有设置。W=C000|EF2A说明返回包的窗口值必须为0xC000或0xEF2A。ACK=S++说明
(r.{v@h,dV 返回包的ACK值必须为初始化序列号加1。Flags=AS说明返回包的ACK和SYN标记位必须被设置。Ops=MNWNNT说明返回
(r.{v@h,dV 包的TCP选项及其顺序必须为:
(r.{v@h,dV (r.{v@h,dV > T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
(r.{v@h,dV (r.{v@h,dV Test 2(第二个测试)向打开端口发送带有相同TCP选项的NULL(空)数据包。Resp=Y说明必须接收到返回包。
(r.{v@h,dV Ops= 说明返回包中的所有TCP选项必须都没有被设置。‘%Ops='匹配任意TCP选项。
(r.{v@h,dV (r.{v@h,dV > T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)
(r.{v@h,dV (r.{v@h,dV Test 3(第三个测试)向打开端口发送带有TCP选项的SYN|FIN|URG|PSH数据包。
(r.{v@h,dV (r.{v@h,dV > T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
(r.{v@h,dV (r.{v@h,dV 这是向打开端口发送ACK数据包。注意这里没有Resp=字符串。说明返回包不是必须的(例如数据包被丢弃或有
(r.{v@h,dV 防火墙)。
(r.{v@h,dV (r.{v@h,dV > T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
(r.{v@h,dV > T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
(r.{v@h,dV > T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
(r.{v@h,dV (r.{v@h,dV 以上测试是针对关闭端口的SYN、ACK和FIN|PSH|URG数据包测试,并设置了相同的TCP选项。
(r.{v@h,dV (r.{v@h,dV > PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
(r.{v@h,dV (r.{v@h,dV 这个是对“端口不可到达”信息的测试。DF=N前面已经介绍过了。TOS=0说明IP服务类型域应为0。接着的两个是IP
(r.{v@h,dV 包头总长度和返回IP包总长度(16进制值)。RID=E说明期望返回包RID值与发送的UDP包的值相同。RIPCK=E说明校验
(r.{v@h,dV 和应该正常(如果不正常则RIPCK=F)。UCK说明UDP包校验和也应该正常。ULEN=134是UDP包长度为0x134。DAT=E说 明正确返回UDP数据,这个是大多数情况下的缺省设置。
(r.{v@h,dV (r.{v@h,dV 一些较为著名站点的扫描结果
(r.{v@h,dV (r.{v@h,dV 注:这些都是以前的扫描结果,仅供参考。不保证它现在仍然有效或准确。
(r.{v@h,dV (r.{v@h,dV # "Hacker" sites or (in a couple cases) sites that think they are
(r.{v@h,dV www.l0pht.com => OpenBSD 2.2 - 2.4
(r.{v@h,dV www.insecure.org => Linux 2.0.31-34
(r.{v@h,dV www.rhino9.ml.org => Windows 95/NT # No comment :)
(r.{v@h,dV www.technotronic.com => Linux 2.0.31-34
(r.{v@h,dV www.nmrc.org => FreeBSD 2.2.6 - 3.0
(r.{v@h,dV www.cultdeadcow.com => OpenBSD 2.2 - 2.4
(r.{v@h,dV www.kevinmitnick.com => Linux 2.0.31-34 # Free Kevin!
(r.{v@h,dV www.2600.com => FreeBSD 2.2.6 - 3.0 Beta
(r.{v@h,dV www.antionline.com => FreeBSD 2.2.6 - 3.0 Beta
(r.{v@h,dV www.rootshell.com => Linux 2.0.35 # Changed to OpenBSD after
(r.{v@h,dV # they got owned.
(r.{v@h,dV (r.{v@h,dV # Security vendors, consultants, etc.
(r.{v@h,dV www.repsec.com => Linux 2.0.35
(r.{v@h,dV www.iss.net => Linux 2.0.31-34
(r.{v@h,dV www.checkpoint.com => Solaris 2.5 - 2.51
(r.{v@h,dV www.infowar.com => Win95/NT
(r.{v@h,dV (r.{v@h,dV # Vendor loyalty to their OS
(r.{v@h,dV www.li.org => Linux 2.0.35 # Linux International
(r.{v@h,dV www.redhat.com => Linux 2.0.31-34 # I wonder what distribution :)
(r.{v@h,dV www.debian.org => Linux 2.0.35
(r.{v@h,dV www.linux.org => Linux 2.1.122 - 2.1.126
(r.{v@h,dV www.sgi.com => IRIX 6.2 - 6.4
(r.{v@h,dV www.netbsd.org => NetBSD 1.3X
(r.{v@h,dV www.openbsd.org => Solaris 2.6 # Ahem :)
(r.{v@h,dV www.freebsd.org => FreeBSD 2.2.6-3.0 Beta
(r.{v@h,dV (r.{v@h,dV # Ivy league
(r.{v@h,dV www.harvard.edu => Solaris 2.6
(r.{v@h,dV www.yale.edu => Solaris 2.5 - 2.51
(r.{v@h,dV www.caltech.edu => SunOS 4.1.2-4.1.4 # Hello! This is the 90's :)
(r.{v@h,dV www.stanford.edu => Solaris 2.6
(r.{v@h,dV 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