|
|
※阅读文章※ |
用Perl实现高级远程操作系统探测作者:stardust(幻觉) [文章出自: www.fanqiang.com] ------------------------------------------------------------------ ------[ Feb 03, 2001 - by f0bic - http://www.low-level.net ]------ "Half of the work that is done is this world, is to make things appear what they are not." -- Elias Root Beadle 摘要 这个文档从PERL编程的角度讨论操作系统探测的理论和实践。深入的讨论了 远程操作系统探测的方法和概念,并用PERL实现。 I. 介绍 几年来,许多关于如何确定一个远程主机上运行的操作系统的方法和技术被 公布出来。因为这些操作系统探测方法依赖于特定的因素,而这些因素并不 总是存在的,所以这些操作系统的探测并不能保证100%的准确性。 II. 基本的操作系统探测方法 在涉及到高级的操作系统探测概念之前,我要简要介绍一下几种其他几种探 测远程主机操作系统的方法。这些方法可能是很老,但它们可以使我们完成 探测。 (1) 抓取telnet标识 我想这很容易理解。比如说你连接到远程主机的上telnetd ,就可以看到登 录的时候telnet打出了什么标识。 :) (2) 抓取FTP标识 和telnet的概念一样,只要针对ftpd而不是telnetd。 (3) http的head方法 你可以通过检查web服务器(httpd)的方法来确定目标上运行的操作系统。比 如Web是Microsoft-IIS,那么操作系统基本上就是WindowsNT/2k了。 好了,我想已经基本上总结了现今的几种基本的操作系统的探测方法了。 III. 远程操作系统探测和方式路径追踪概念 有许多种技术用来探测一个主机的操作系统。这个文档讨论了以下四种: * telnetd 指纹: 依靠telnet会话协商和选项。 * identd 指纹: 依靠identd/auth (113)是否打开。 * TCP 协议堆指纹: 依靠数据包中的Window,TTL,ToS和DF等参数。 * Queso 指纹: 依靠数据包中的Window,Seq,Ack_seq等参数。 依靠各种 IP/TCP 头标记。 * 被动指纹: 与TCP 协议堆指纹很接近。 依靠Window,TTL,ToS和DF等参数。 依靠网络流量。 在以下的几节中我将深入的讨论上面提到的几种方法。 一些术语: * Window:TCP包中的窗口值,在未收到确认的情况下包中所能发送的最大 数据量。 * TTL:存活时间,一个包在被丢弃之前所能通过的最大节点数。 * ToS:服务的类型 * DF:不分片标记位 * MSS:最大的段大小 这些因素可以被用来决定一个远程机器上运行了什么操作系统。依靠所有以 上这些标记的组合,与一个标记数据库进行比对就可以猜测出操作系统。下 面是一个入站连接的tcpdump片断: 00:44:09.194998 eth0 < 203.9.66.52.www > my.ip.com.domain: S 2006693595:2006693595(0) ack 1 win 9112 <mss 536> (DF) (ttl 232, id 25119) 我们忽略包中的一些其他信息,可以得到下面的东西: +-> 设备 +-> 目的地址 +-> 不分片位 | | | eth0 < 203.9.66.52.www > my.ip.com.domain: win 9112 (DF) (ttl 232) | | | +-> 源地址 | +-> 存活时间值 | +-> TCP 窗口值 Tcpdump 收集了包中的以下信息: +++++++++++++++++++++++++++++++++++++++++++++ + 目的地址 : my.ip.com + + 目的端口 : domain (53) + + 源地址 : 203.9.66.52 (www.sun.com.au) + + 源端口 : www (80) + + 窗口值 : 9112 (0x2398) + + 存活时间值 : 232 + + 服务类型值 : 0 + + 不分片位 : ON + + 最大片断值 : 536 + +++++++++++++++++++++++++++++++++++++++++++++ 从窗口值看可能是一个Solaris机器。存活时间值和服务类型值看也符合Solaris 系统的特征。Solaris系统的默认存活时间值是255,在数据包沿它的路径到达 目标地址的过程中,经过一定数量的节点,存活时间值可能会减到232。 一点有关窗口值的小说明: 一般来说,一个高的窗口值意味着是一个UNIX机器,而一个低的窗口值 则很可能是一个windows机器,路由器,交换机等.... 下面的traceroute证实了我们存活时间值接近255的猜测: 1 my.ip.com (127.0.0.1) 148.010 ms 138.609 ms 118.812 ms 2 ??.kpnbelgium.be (194.119.225.185) 129.111 ms 138.566 ms 118.877 ms 3 ??.kpnbelgium.be (194.119.228.161) 119.008 ms 119.300 ms 128.546 ms ... ... 20 fddi0-0.chw1.sydney.telstra.net (139.130.36.227) 509.930 ms 519.879 ms 509.941 ms 21 sunmi1.lnk.telstra.net (139.130.37.142) 538.911 ms !X 509.879 ms !X 549.903 ms !X 节点21是我们进出internet的最后节点,那个 !X 信号意思是通讯出于管理 目的被禁止的意思。 我们的存活时间值 : 232 节点数 : 21 + --- 总存活时间值 : 253 到达Solaris系统默认的存活时间值255,少了两个节点,所以我们知道了 在节点21后还有两个节点。第一个为位于内网的网际互联设备,第二个就是 目标主机(203.9.66.52),它有Solaris系统的存活时间值255。现在我们 可以说(以相当的肯定程序上)说203.9.66.52是一个Solaris机器。 远程主机的路径追踪对操作系统的指纹来说是一个很重要的问题。一个数据 包所走过的路径可明显地决定操作系统指纹的匹配。所以,对这些存活时间 上区别做些缓冲有很大用处。 IV. 用Perl实现远程系统的探测的方法 1. Telnetd 会话协商(TSN)和Telnet选项。 这项技术涉及到远程系统上运行的telnetd,允许你去连接。当与telnetd的 socket连接初始化完成后,我们执行sysread()操作来收集telnet会话的协商 指纹信息。这个指纹看起来会是这样的: Linux <= 2.2.16 : 文章加入时间: 2004-11-17 15:01:52 责任编辑: w9 (2378 人次查阅) |