当前位置--> 首 页 --> 文 章 -->Security

※阅读文章※

用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 人次查阅)
 
Copyright © 1998-2004 中国PHP联盟 All rights reserved.