PSH 到一个打开的端口,
Windows 会非常古怪。
一些时候它送回序列号,但也有可能送回序列号加1, 甚至还
可能送回一个随机数。我们觉得奇怪,不知微软写的是些什么
代码。
ICMP 错误信息终结 -- 一些(聪明的)操作系统跟从RFC 1812的建
议限制各种错误信息的发送率。例如,Linux 内核(在net/ipv4/icmp.h)
限制目的不可达消息的生成每4 秒钟80个,违反导致一个1/4
秒的处罚。测试的一种办法是发一串包到一些随机的高UDP 端
口并计数收到的不可达消息。没见过用它的,而且实际上我也
没有把它加进nmap(除了作为UDP 端口扫描用)。这个测试会
让OS辨识多花一些时间因为需要送一批包再等它们回来。而且
对付网络丢包会很痛苦。
ICMP 消息引用 -- RFC 规定ICMP错误消息可以引用一部分引起错误
的源消息。对一个端口不可达消息,几乎所有实现只送回IP请
求头外加8 字节。然而,Solaris 送回的稍多,而Linux 更多。
这使得nmap甚至在没有对方没有监听端口的情况下认出Linux
和Solaris 主机。
ICMP 错误消息回应完整性 -- 我这个想法来自Theo De Raadt (OpenBSD
开发负责人)贴在comp.security.unix的文章。刚刚提到,机
器会把原始消息的一部分和端口不可达错误一起送回。然而一
些机器倾向于在初始化处理时用你的消息头作为“草稿纸”所
以再得到时会有些许的改动。例如,AIX 和BSDI送回一个IP“
全长”域在20字节处。一些 BSDI,FreeBSD,OpenBSD,ULTRIX,
和VAXen 改变了你送的IP ID 。因为TTL 改变而改变了检查和,
有些机器(AIX, FreeBSD, 等)送回错误的或0 检查和。总之,
nmap作9 种测试在ICMP错误上以分辨出这类细微差别。
服务类型 -- 对于ICMP端口不可达消息我察看送回包的服务类型(TOS)
值。几乎所有实现在这个ICMP错误里用0 除了Linux 用0xc0。
这不是标准的TOS 值,而是一个未使用优先域(AFAIK) 的一部
分。我不知道为什么如此,但如果他们改成0 我们还能够分辨
旧系统_而且_还能分辨出旧系统和新系统。
分段控制 -- 这是安全网络公司(现在由一帮在NAI 的Windows 用户
所拥有)的Thomas H. Ptacek喜爱的技术。它获益于事实即不
同实现经常以不同方式控制覆盖IP段。一些会用新的覆盖旧的
部分,另一些情况中旧的优先。有很多不同可能你可以用来决
定如何重组数据包。我没有加入这一特性因为没有简便的方式
发送IP分段(特别是,在Solaris 上是不允许的)。关于覆盖
段的更多信息,可以看IDS 的论文(www.secnet.com)
TCP 选项 -- 这简直是泄漏信息的金矿。它的好处在于:
1) 这通常是可选的(哈!):) 所以并非所有实现都支持。
2) 若一个实现发出设置了选项的请求,目标通过设置它在回
应中表示支持。
3) 可以在一个数据包中设置而一次测试所有选项。
Nmap发送这些选项的几乎所有可能的包:
Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops;
当你得到回应,看看那个选项被送回也就是被支持。一些操作
系统如最近的FreeBSD 机器支持上面所有的,而其他,如Linux 2.0.X
支持的则很少。最近的Linux 2.1.x 内核支持上面所有的。另
一方面,它们又有更易受攻击的TCP 序列生成方式。去看看。
即使几个操作系统支持同样的选项集,有时仍可以通过选项的
_值_分辨出它们。例如,如果送一个小的MSS值给Linux机器,
它会用那个MSS 生成一个回答给你。其他主机会给你不同的值。
甚至即使你得到同样的支持选项集和同样得值,你仍可以通过
选项提供的_顺序_和填充字进行辨识,例如Solaris返回'NNTNWME'
表示:
而Linux 2.2.122返回MENNTNW。同样的选项,同样的值,但不
同顺序!
没见过其他OS检测工具利用TCP 选项,但它非常有用。
因同样原因有其他几个有用的选项我会探测,象那些支持T/TCP
和选择性确认。
开发年代 -- 甚至使用上面所有测试,nmap仍不能从TCP 栈区分Win95,
WinNT,或Win98。这很令人惊讶,尤其是Win98 比Win95 晚出
现4 年。你可能想它们不得不从某些方面进行改善(象支持更
多的TCP 选项)这样我们可以检测到改变而分辨出它们。不幸
的是,不是这样的。NT的栈显然就是放在95里的蹩脚的东西。
而且到98也没加改动。
但别放弃希望,还有个办法。你可以简单的进行早期的Windows
DOS 攻击(Ping of Death, Winnuke, 等)而比当时的如Teardrop
和Land多做一些。就是在每个攻击之后,ping它们看是否垮
掉了。等到你最后crash 掉它们,你就能缩小的某一服务包
或补丁。
这个没加进nmap,尽管我承认它非常诱人:)。
SYN洪水限度 -- 一些操作系统会停止新的连接尝试如果你送太多的
伪造SYN 给它(伪造包避免你的内核复位连接)。许多操作系
统只能处理8 个包。最近的Linux 内核(包括其他操作系统)
允许不同的方式如SYN cookie来防止这成为严重问题。所以你
可以试着从伪造地址发8 个包到目标打开的端口再尝试你还能
否建立连接以发现一些信息。这没在nmap中实现因为有人不喜
欢你用SYN 洪水,甚至你解释这只是想知道它运行的操作系统
也不能使他们平静。
NMAP实现和结果
我已经作了一个上面说的OS探测技术的参考实现(除了我说不包括的)。
我把它们加到了我的Nmap扫描器这样在分析指纹时它已经知道了什么
端口是打开还是关闭的而不用你再告诉。它也能在Linux,*BSD, 和
Solaris 2.51和2.6, 以及其他一些操作系统间移植。
新版的nmap读一个指纹模板文件。下面是语法的例子:
FingerPrint IRIX 6.2 - 6.4 # Thanks to Lamont Granquist
TSeq(Class=i800)
T1(DF=N%W=C000
关键词:运用TCP/IP协议栈指纹进行远程设置系统辨识