用Perl實現高級遠程操作系統探測


用Perl實現高級遠程操作系統探測


創建時間:2001-05-24
文章屬性:翻譯
文章來源:[url]http://www.xfocus.org/[/url]
文章提交:stardust (bugmail_at_telekbird.com.cn)

------------------------------------------------------------------
------[ Feb 03, 2001 - by f0bic - [url]http://www.low-level.net[/url] ]------


"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 ([url]www.sun.com.au[/url]) +
+ 源端口     : 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 : 齘X???


爲了使用telnet守護進程來確定操作系統,我們需要知道在telnet.h中定義
的TELOPT(Telnet選項)的順序。除了個別例處,每個操作系統有它自己的
順序。

一旦我們得到我們的指紋信息,我們必須首先把它轉換爲十進制的數(1-
255),然後各自地把十進制值和它相應的TELOPT值想匹配。


Ascii 值 : 齘X???
十進制值 : 255 253 24 255 253 32 255 253 35 255 253 39
Telopts 值 : IAC DO  TELOPT_TTYPE IAC DO TELOPT_LINEMODE IAC DO TELOPT_XDISPLOC IAC DO

TELOPT_NEW_ENVIRON


雖然這些TELOPT值可以在 /usr/include/arpa/telnet.h 中找到,但我也把
它們放到了下面,這樣如果你想做一些 telnetd指紋檢查的時候可以用到:


  /* telnet protocol definitions */

255     IAC         /* interpret as command: */
254    DONT         /* you are not to use option */
253    DO         /* please, you use option */
252    WONT        /* I won't use option */
251    WILL        /* I will use option */
250    SB         /* interpret as subnegotiation */
249    GA         /* you may reverse the line */
248    EL         /* erase the current line */
247    EC         /* erase the current character */
246    AYT        /* are you there */
245    AO        /* abort output--but let prog finish */
244    IP        /* interrupt process--permanently */
243    BREAK         /* break */
242    DM        /* data mark--for connect. cleaning */
241    NOP        /* nop */
240    SE        /* end sub negotiation */
239    EOR        /* end of record (transparent mode) */
238    ABORT        /* Abort process */
237    SUSP        /* Suspend process */
236    xEOF        /* End of file: EOF is already used... */


  /* telnet options */

  0    TELOPT_BINARY        /* 8-bit data path */
  1     TELOPT_ECHO        /* echo */
  2     TELOPT_RCP        /* prepare to reconnect */
  3    TELOPT_SGA          /* suppress go ahead */
  4    TELOPT_NAMS        /* approximate message size */
  5    TELOPT_STATUS        /* give status */
  6    TELOPT_TM         /* timing mark */
  7    TELOPT_RCTE        /* remote controlled transmission and echo */
  8    TELOPT_NAOL        /* negotiate about output line width */
  9    TELOPT_NAOP        /* negotiate about output page size */
10    TELOPT_NAOCRD        /* negotiate about CR disposition */
11    TELOPT_NAOHTS        /* negotiate about horizontal tabstops */
12    TELOPT_NAOHTD        /* negotiate about horizontal tab disposition */
13    TELOPT_NAOFFD         /* negotiate about formfeed disposition */
14    TELOPT_NAOVTS         /* negotiate about vertical tab stops */
15    TELOPT_NAOVTD        /* negotiate about vertical tab disposition */
16    TELOPT_NAOLFD         /* negotiate about output LF disposition */
17    TELOPT_XASCII        /* extended ascii character set */
18    TELOPT_LOGOUT         /* force logout */
19    TELOPT_BM         /* byte macro */
20    TELOPT_DET         /* data entry terminal */
21    TELOPT_SUPDUP        /* supdup protocol */
22    TELOPT_SUPDUPOUTPUT    /* supdup output */
23    TELOPT_SNDLOC         /* send location */
24    TELOPT_TTYPE        /* terminal type */
25    TELOPT_EOR         /* end of record */
26    TELOPT_TUID         /* TACACS user identification */
27    TELOPT_OUTMRK        /* output marking */
28    TELOPT_TTYLOC        /* terminal location number */
29    TELOPT_3270REGIME    /* 3270 regime */
30    TELOPT_X3PAD         /* X.3 PAD */
31    TELOPT_NAWS        /* window size */
32    TELOPT_TSPEED        /* terminal speed */
33    TELOPT_LFLOW         /* remote flow control */
34    TELOPT_LINEMODE        /* Linemode option */
35    TELOPT_XDISPLOC        /* X Display location */
36    TELOPT_OLD_ENVIRON    /* Old - Environmental variables */
37    TELOPT_AUTHENTICATION     /* Authenticate */
38    TELOPT_ENCRYPT         /* Encryption option */
39    TELOPT_NEW_ENVIRON    /* New - Environmental variables */
255    TELOPT_EXOPL        /* extended options list */


當對telnetd 進行指紋探測的時候,應該記住這些檢測非常依賴於在主機上
默認的telnetd安裝方式。如果你不是在Linux機器上運行in.telnetd,那麼
這種方法可能會使你覺得運行了別的操作系統而不是實際的運行的。

這是我telnetd指紋文件的一部份:


    # daemon, daemon version, os, os version, architecture, fingerprint

    # 3Com SuperStack_II Switch
    ,,3Com,,SuperStack_II Switch,齘C,

    # HP-UX B.10.20
    ,,HP-UX,B.10.20,HP 9000,?,

    # Linux 2.2.9
    ,,Linux,2.2.9,x86,齘X???,

        # Cobalt Linux 3.0
    ,,Cobalt Linux,3.0,mips,齘X???,
      

在有些時候,用這種指紋探測方法我們可能碰上問題,幾個操作系統可以有
相同類型的指紋,會使操作系統的區分變得困難。當然,有問題就會有解決
的方法。

除了只是對telnetd用sysread()收集信息,我們可以發送telnet選項給目標
主機,收集它的迴應,與一個指紋數據庫進行比對。通過發送諸如:
IAC/DO/DONT/WILL/WONT 的命令,我們就會對每個操作系統如何對命令作出
反應有一個清楚的認識,因而對可能的操作系統有一個比較準確的猜測。


進行TSN指紋探測的一個示例代碼:

--cut--


        #!/usr/bin/perl
        #
        # TSN fingerprint example (by f0bic)
        # usage: ./tsn <host> (telnetd-port)
        # It is also possible to check for the DONT's
        # instead of for the DO's.
        
        use Socket;
        $h=$ARGV[0];
        $p="23" unless $ARGV[1];
        socket(S, PF_INET, SOCK_STREAM, 6);
        $iaddr=inet_aton($h);$paddr=sockaddr_in($p,$iaddr);
        if(connect(S, $paddr)) {
          sysread(S, $fprint, 200); # gathering telnetd fingerprint
          print "\n[$h - connected]\n\nfingerprint: $fprint\n";
          @ords = split(//, $fprint);print "ordinal: ";
      foreach $tval (@ords){print ord($tval);print " ";} # ordinal
      print "\n\n";
        } else {
        print "$host: cant connect!\n\n";
        }
    

--cut--

一旦你用tsn.pl得到了指紋信息,你就可以與一個數據庫進行比對看看是不
是有成功的匹配。


---
優點:快,不需要超級用戶權限
缺點:不太可靠,容易被記錄
---


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Telnet會話協商指紋工具:

1. Telnetfp

Author: palmers / teso
Download: [url]http://teso.scene.at/releases/telnetfp_0.1.2.tar.gz[/url]

2. Prod-1.0

Author: f0bic / low-level
Download: [url]http://www.low-level.net/f0bic/releases/prod-1.0/[/url]
Info: this is a perl implementation of the telnetd fingerprint
      technique.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



2. Identd 指紋探測

這種指紋探測需要遠程主機運行identd服務而且我們可以連接它。通過與遠
程主機上的守護進程建立連接,我們可以收集關於它的版本信息,通過與一
個指紋信息文件中的identd的類型,版本和編譯日期等信息的比對就可以對
操作系統進行猜測。下面是一個例子,在裏面對遠程機器的identd服務器做
了一個連接:


   ::(ninja)-([f0bic]--[/sys])$ telnet [url]www.chemie.fu-berlin.de[/url] 113
   Trying 160.45.22.11...
   Connected to ester.chemie.fu-berlin.de (160.45.22.11).
   Escape character is '^]'.
   VERSION
   0 , 0 : X-VERSION : pidentd 3.0.7 for IRIX64 6.5 (Sep 15 1999 11:21:21)    


參照RFC 1413,一個identd的迴應的語法是這樣的:


   <port-on-server> , <port-on-client> : <resp-type> : <add-info>


在我們的例子裏我們只是查詢版本,所以顯示的服務器與客戶端的端口都爲
0。返回的類型是X-VERSION,附加的信息是pidentd 3.0.7 for IRIX64 6.5
(Sep 15 1999 11:21:21)。這告訴我們遠程的守護進程是pidentd版本是3.0.7
在IRIX64 6.5上運行,在Sep 15 1999 11:21:21編譯。大多數identd的迴應
信息不象IRIX那樣顯示那麼多信息。下面的ident是一個FreeBSD 4.2-stable
的:


   0 , 0 : X-VERSION : 2.8.5 (Compiled: 11:18:59 Oct 23 2000)


在上面的例子裏,我們不能直接確定出遠程機器上運行的是什麼系統。然而
我們也不需要那麼多信息,也可以通過比對版本和編譯日期來確定出
FreeBSD 4.2-stable的。


---
優點:快,不需要超級用戶權限。
缺點:不太可靠,容易被記錄,運行需要認證
---


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Identd 操作系統指紋工具:

ldistfp

Author scut / teso
Download: [url]http://teso.scene.at/releases/ldistfp-0.1.2.tar.gz[/url]


identfp

Author: f0bic / lowlevel -- dethy / synnergy
Download: [url]http://www.synnergy.net/Archives/Utilities/dethy/identfp.tar.gz[/url]
Info: this is a perl implementation of the identd fingerprint
      technique.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



3. 基於TCP協議棧的指紋推測                                                                  

  

這個技術涉及數據包的處理,更可靠。因爲我們需要構造數據包,所以需要
超級用戶權限。我們必須用到SOCK_RAW (或者 Net::RawIP),這種技術是象
下面描述的這樣工作的:



+---------------+              SYN                +-------------------+
|               | ------------------------------> |                   |
|     Source    |                                 |    Destination    |
|               | <------------------------------ |                   |
+---------------+            SYN|ACK              +-------------------+
                               |
                               |
                               |
                    +----------------------+
                    | Packet Information:  |
                    |----------------------|
                    |                      |
                    | Source: <src-addr>   |
                    | Src-Port: <src-port> |
                    | Dest.: <dst-addr>    |
                    | Dst-Port: <dst-port> |
                    |                      |
                    |----------------------|
                    |                      |
                    | Window: <windowsize> |
                    | TTL: <TTL value>     |
                    | ToS: <ToS value>     |
                    | DF: <ON or OFF>      |
                    | MSS: <MSS value>     |
                    |                      |
                    +----------------------+

就象你上面看到的圖示那樣,我們收到了一個SYN|ACK迴應,它暗示端口處
於監聽狀態。如果端口不是處於監聽狀態,我們將收到一個RST|ACK迴應。

當我們收到一個SYN|ACK迴應,在開始收集操作系統的指紋信息前就連續發
生了很多事情:

        +---------+
        | SYN|ACK |
        +---------+
            |
            |      +-------------------+
             ----> | <1> 收集信息       |
                   +-------------------+                
                                |                              
                                |    +--------------------+
                                ---> | <2> 值匹配嗎?是或否 |
                                     +--------------------+
                                                 |
                                                 |
                                -------------------------------
                                |                             |
                                v                             v
                   +------------------------+     +------------------------+          
                   |     是:繼續匹配         |     | 否:不能識別的指紋信息    |
                   +------------------------+     +------------------------+
                                |
                                |
                                v
                      +-----------------------+
                      | <3> 主機路徑追蹤依舊    |
                      |     匹配?是或否        |
                      +-----------------------+
                                |  
                                |    +---------------------+
                                |--> | 否:不能識別的指紋信息 |
                                |    +---------------------+
                                |
                                |    +---------------------+
                                |--> | 是:鑑別系統          |
                                     +------------------- -+



    <1> 信息收集
            
        因爲我們需要收集Window, TTL, DF的值,所以我們要先建立一個近似匹配的指紋
        數據庫。這個指紋數據庫由缺省windowsizes, ttl值, tos值, 和DF(打開或關閉)
        。爲了適應這種格式,要建立一個能精確評估TCP Stack指紋是/否的樹結構圖表。

        TSF數據文件的例子:
  
            # os,version,architecture,window,ttl,tos,df
            # DF - 1 for ON / 0 for OFF

            AIX,4.2,,65535,64,0,1
            AIX,3.0,,16384,64,0,1
            Cisco IOS,11.3,Cisco Router,4128,255,16,1
            Solaris,,x86,9112,255,0,1
            Solaris,8,sparc,24656,64,0,1
  

        <2> TCP Stack 值匹配

        我們收集了這些值以後,要把這些值和數據庫已知的指紋進行比較是否匹配。TTL
        並不是一個常值,它依賴於包從源主機到目的主機經過的節點數。因此,我們將接
        收這個匹配並且留下TTL匹配主機路徑追蹤檢查。

        我們將再用[url]www.sun.com.au[/url]來做示範:)
            
            # 從[url]www.sun.com.au[/url]接收來的包信息

            Window: 9112 / TTL: 232 / ToS: 0 / DF: ON

            # Window, ToS, DF 都和Solaris操作系統相似,另一方面TTL值卻依舊不可信,
            # 因爲不是正確的255。這是主機路徑追蹤的終點。
              

        <3> 主機路徑追蹤 (HPP)

        追蹤包穿越的路徑,我們可以確定大概正確的TTL值並且猜測大概操作系統。

        當處理TTL值的時候有一個經驗,從數據庫取TTL的值並且讓它位於它和之前
        的TTL值加1。


           +------------------------------------+
           | TTL Value       |   TTL good match |
           |------------------------------------|
           |   32            |          0 -  32 |
           |   64            |         33 -  64 |
           |  128            |         65 - 128 |
           |  255            |        129 - 255 |
           +------------------------------------+


       如果我們的TTL值在上面的表裏,我們給出下列推測:

       包的TTL值232位於TTL匹配值129-255,所以我們可以假設TTL在目標機器裏可能是255,
       給我們一個明確匹配:


                x86 Solaris Operating System (Solaris,,x86,9112,255,0,1)


       實際上,TTL的255值並不總是從129來的,因爲那有126個節點,看起來不可行:) 但是這
       卻總是一個正確匹配的好經驗。


下面是一些TSF的範例代碼,我沒有提供整個sock_raw連接,只是採指紋部分,可以在包裏面發現它。如
果你希望知道怎樣用Perl寫SOCK_RAW連接,我強烈推薦你下載Net::RawIP(你一定需要它)然後看它的
"man"。


    #!/usr/bin/perl

    use Net::RawIP;
    
        # here's where the SOCK_RAW connection goes.
        # you can either use Socket w/ SOCK_RAW or use Net::RawIP.
        #
        # You can set whatever flags you want depending on which type
        # of scan you want to perform. Just edit the syntax:)
        #
        # $packet->set({ ip => { saddr => $src, daddr => $daddr},
        #                tcp => { source => $sport, dest => $dport, syn => 1, psh => 1 } });

        
        #


        sub fingerprint_it {
            
            $packet->bset(substr($_[2],$offset));
            my ($tos, $ttl, $saddr, $desaddr, $soport, $deport, $windowsize) =
            $packet->get( {ip => [qw(tos ttl saddr daddr)],
                           tcp => [qw(source dest window)]
                           });                                
            if($windowsize) { # yay! we've got a window!!!
              if($windowsize eq "9112") { # windowsize matching
                 if(($ttl <= "255") && ($ttl >= "129")) { # HPP TTL matching
                     $os="Solaris";
                 }
              }
              # here's where you can add some more OS matches
              # ...
              # ...
              else {
               print "\n\n Unknown Fingerprint\n\n";
               exit(0);
              }
            }
            print "\n\n-- Operating System Guess: $os\n\n";
        }
        

你可以把所有的Window, TTL, ToS, DF的值讀入到數組,把代碼變的更簡練、易懂。就象用"if"結構
顯示採集指紋的工作。


---
優點:快,比TSN指紋更準確
缺點:需要超級用戶權限
---


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
基於TCP Stack指紋的工具:

1. nmap
作者: Fyodor
下載: [url]http://www.insecure.org/nmap[/url]

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  

4. 基於多標記TCP Stack指紋 (Queso 方法).

比較基於TCP Stack指紋,Queso依靠7次檢查而不是一次。當採Queso指紋時,將從源主機發送7個不同
標誌的包到目標主機。下面是Queso指紋掃描類型的概念圖:


   +----------------+
   | QueSO Concepts |
   +-----------------------------------------------------+
   | SEND           | INFO                               |
   |-----------------------------------------------------|
   |                |                                    |
   | SYN            |     Determine State of Port        |
   |                |                                    |
   | SYN+ACK        |     SYN|ACK test                   |
   |                |                                    |
   | FIN            |     FIN test                       |
   |                |                                    |
   | FIN+ACK        |     FIN|ACK test                   |
   |                |                                    |
   | SYN+FIN        |     SYN|FIN test                   |
   |                |                                    |
   | PSH            |     PSH test                       |
   |                |                                    |
   | SYN+XXX+YYY    |     SYN|XXX|YYY test               |
   |                |                                    |
   +-----------------------------------------------------+
                                          
  

   測定端口狀態

   首先,一個SYN包發送去測定端口是否處於監聽狀態。如果是,我們將收到SYN|ACK,否則,我們將
   收到RST|ACK回答。除了回答外,7個檢查的每個方法都將測定seqnum, acknum, window是否在
   包頭出現。

  
   頭僞造


   爲了縮小大範圍可能的操作系統,一個被髮送到網上的Queso包(不管是SYN, SYN|ACK, FIN,...)
   包含了僞造的IP和TCP頭信息,而且附加信息裏裝入兩個不常用的TCP標誌(XXX和YYY)。TCP不常用
   的標誌,XXX和YYY分別使用在例子裏,通常不要修改包的狀態並且安全的和其它頭的值保持協同。

   下面是僞造的IP和TCP頭的表,連同它的僞造值。這個表的包含信息在queso遠程系統檢測工具的
   "tcpip.c"裏定義。你可能需要修改它們的值來使他們符合要求,這取決於你用什麼類型的指紋文件。

  
   +-------------------+
   | Forged IP Header  |
   |------------------------------------------+
   | header length     |   5                  |
   | ip version        |   4 (IPv4)           |
   | tos               |   0                  |
   | total length      |   40                 |
   | offset            |   0                  |
   | id                |   31337 + <src-port> |
   | ttl               |   255                |                              
   | source            |   <src-addr>         |
   | destination       |   <dest-addr>        |
   | ip checksum       |   variable           |
   | protocol          |   tcp                |
   +------------------------------------------+

  
   +-------------------+
   | Forged TCP Header |
   |------------------------------------------+
   | source port       |   <src-port>         |
   | destination port  |   <dest-port>        |
   | seq               |   variable           |
   | ack               |   0                  |
   | ( x2_offset       |   0x50 (80) )        |
   | x2 (unused)       |   0 unless x2_offset |
   | offset            |   5 unless x2_offset |
   | flags             |   variable           |
   | tcp checksum      |   variable           |
   | window            |   0x1234 (4660)      |
   | urgent pointer    |   0                  |
   +------------------------------------------+
  
  
   這些僞造的IP和TCP頭是非常重要的準確測試的TCP標誌。下面是一個對linux 2.0.35機器
   的完全Queso掃描:(T1-7 == test1 到 test7)


   T1 - SYN
  
   +------------+                SYN                   +-------------------+
   |            | -----------------------------------> |                   |
   |   Source   |                                      |    Destination    |
   |            | <----------------------------------- |                   |
   +------------+              SYN|ACK                 +-------------------+
                                 |
                      +-------------------------+
                      | Packet Information:     |
                      |-------------------------|
                      |                         |
                      |  reply: SYN|ACK         |
                      |    seq: 1 (yes)         |
                      |    ack: 1 (yes)         |
                      | window: 0x7FE0 (32736)  |
                      +-------------------------+
                      |    T1:SA:1:1:0x7FE0     |
                      +-------------------------+

  
   T2 - SYN|ACK

   +------------+              SYN|ACK                 +-------------------+
   |            | -----------------------------------> |                   |
   |   Source   |                                      |    Destination    |
   |            | <----------------------------------- |                   |
   +------------+                RST                   +-------------------+
                                  |
                      +-------------------------+
                      | Packet Information:     |
                      |-------------------------|                              
                      |                         |
                      |  reply: RST             |
                      |    seq: 0 (no)          |
                      |    ack: 0 (no)          |
                      | window: 0 (no)          |
                      +-------------------------+
                      |        T2:R:0:0:0       |
                      +-------------------------+


   T3 - FIN

   +------------+                FIN                   +-------------------+
   |            | -----------------------------------> |                   |
   |   Source   |                                      |    Destination    |
   |            | <----------------------------------- |                   |
   +------------+              no reply                +-------------------+
                                  |
                      +-------------------------+
                      | Packet Information:     |
                      |-------------------------|
                      |                         |
                      |  reply: - (none)        |
                      |    seq: - (none)        |
                      |    ack: - (none)        |
                      | window: - (none)        |
                      +-------------------------+
                      |        T3:-:-:-:-       |
                      +-------------------------+    


   T4 - FIN|ACK

   +------------+              FIN|ACK                 +-------------------+
   |            | -----------------------------------> |                   |
   |   Source   |                                      |    Destination    |
   |            | <----------------------------------- |                   |
   +------------+                RST                   +-------------------+
                                  |
                      +-------------------------+
                      | Packet Information:     |
                      |-------------------------|
                      |                         |
                      |  reply: RST             |
                      |    seq: 0 (no)          |
                      |    ack: 0 (no)          |
                      | window: 0 (no)          |
                      +-------------------------+
                      |        T4:R:0:0:0       |
                      +-------------------------+                                            

                  


   T5 - SYN|FIN

   +------------+              SYN|FIN                 +-------------------+
   |            | -----------------------------------> |                   |
   |   Source   |                                      |    Destination    |
   |            | <----------------------------------- |                   |
   +------------+            SYN|FIN|ACK               +-------------------+
                                  |
                      +-------------------------+
                      | Packet Information:     |
                      |-------------------------|
                      |                         |
                      |  reply: SYN|FIN|ACK     |
                      |    seq: 1 (yes)         |
                      |    ack: 1 (yes)         |
                      | window: 0x7FE0 (32736)  |
                      +-------------------------+
                      |    T5:SFA:1:1:0x7FE0    |
                      +-------------------------+            


   T6 - PSH

   +------------+                PSH                   +-------------------+
   |            | -----------------------------------> |                   |
   |   Source   |                                      |    Destination    |
   |            | <----------------------------------- |                   |
   +------------+              no reply                +-------------------+
                                  |
                      +-------------------------+
                      | Packet Information:     |
                      |-------------------------|
                      |                         |
                      |  reply: - (none)        |
                      |    seq: - (none)        |
                      |    ack: - (none)        |
                      | window: - (none)        |
                      +-------------------------+
                      |        T6:-:-:-:-       |
                      +-------------------------+    


   T7 - SYN|XXX|YYY

   +------------+            SYN|XXX|YYY               +-------------------+
   |            | -----------------------------------> |                   |
   |   Source   |                                      |    Destination    |
   |            | <----------------------------------- |                   |
   +------------+              SYN|ACK                 +-------------------+
                                  |
                      +-------------------------+
                      | Packet Information:     |
                      |-------------------------|
                      |                         |
                      |  reply: SYN|ACK         |
                      |    seq: 1 (yes)         |
                      |    ack: 1 (yes)         |
                      | window: 0x7FE0 (32736)  |
                      +-------------------------+
                      |     T7:SA:1:1:0x7FE0    |
                      +-------------------------+          


   當我們執行了7次測試發現匹配(或沒有:))它們。
  
    T1:SA:1:1:0x7FE0
    T2:R:0:0:0
    T3:-:-:-:-
    T4:R:0:0:0
    T5:SFA:1:1:0x7FE0
    T6:-:-:-:-
    T7:SA:1:1:0x7FE0

   我們好像發現一個匹配:Linux 2.0.35
  
  
   執行了7次測試並且僞造了TCP和IP頭,我們對可能的系統有了更準確的描述。不同的操作系統處理這


   測試,這些僞造頭有它們自己的各自的風格,這使採集指紋變的容易多了。這是"更多,更好"的方法


   你發送更多的東西到操作系統,你將得到更多你希望的更準確、詳細的匹配。


下面是基於多標誌TCP Stack指紋的示例代碼(Queso方法)。這裏沒有給出完整的代碼,否則整個篇幅都
將被代碼代替。在下面的代碼片斷裏你可以編輯什麼標誌位來建立這7個請求。

  
    
        #!/usr/bin/perl

        use Net::RawIP;

        # QueSO.pl [ by f0bic ]
        # [ well atleast part of it:) ]
        #
        # here's where the SOCK_RAW connection goes.
        # you can either use Socket w/ SOCK_RAW or use Net::RawIP.
        #
        # You can set whatever flags you want depending on which type
        # of scan you want to perform. Just edit the syntax:)
        #
        # $id = "31337" + $sport;
        # $csum = rand();
        #
        # Test 5 - SYN|FIN
        #
        # $packet->set({ ip => { saddr => $src, daddr => $daddr, ihl => "5", version => "4",
        #                        tos => "0", tot_len => "40", frag_off => "0", ttl => "255",
        #                        id => $id, check => $csum },
        #
        #                tcp => { source => $sport, dest => $dport, syn => 1, fin => 1,
        #                         seq => $seq, ack_seq => "0", doff => "5", check => $csum,
        #                         window => "0x1234", urg_ptr => "0"} });
        #                          
        # Houston, we have liftoff:)
        #

        sub fingerprint_syn_fin { # here's the fingerprinting process for the SYN|FIN scan;
            
            $packet->bset(substr($_[2],$offset));
            my ($saddr, $desaddr, $soport, $deport, $windowsize, $ack, $fin, $syn, $psh,

$urg, $rst, $seq, $seq_ack) =
            $packet->get( {ip => [qw(saddr daddr)],
                           tcp => [qw(source dest window ack fin syn psh urg rst seq

seq_ack)]
                           });                            
            # I'm sure from this point on you can figure it out on your own.
            # fin (=1 for yes / =0 for no), etc.. etc.. :)

        }


---
優點: 快,比TSN和TSF指紋更準確
缺點: 需要超級用戶,多重掃描可能被IDS系統記錄
---


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
基於多標誌TCP Stack指紋(Queso)的工具:

1. nmap
作者: Fyodor
下載: [url]http://www.insecure.org/nmap[/url]

2. QueSO
作者: savage / apostols.org
下載: [url]http://packetstorm.securify.com/UNIX/scanners/queso-980922.tar.gz[/url]

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


                                                              
5. 被動OS採集指紋/網絡映射

Lance Spitzner發佈了對於這個課題真正有趣的文檔(下面列出),他描述了採集主機指紋技術無需瞭解

它。
這個技術最基本的概念是設置網卡混雜模式並且從接收的包裏採集指紋。這有點象基於TCP Stack指紋採

集(TSF)
,但是我們減去第一步--發送一個包出去--因而我們監聽網絡傳輸。使用這個技術,也同樣可以得到

端口
打開的信息。換句話說,映射整個英特網(Copyright Subterrain.Net @ Toorcon/Defcon)。

因爲這個技術和基於TCP Stack採集指紋非常相似,我不再詳細的說明了。這是基本概念圖:




             +--> stream of network traffic (yea i know, looks lame)
         |
             |
  ====================================================================
                                    |
                                    |
                           +-----------------+
                           |                 |
                           | Passive Sniffer |
                           |                 |
                           +-----------------+
                             |              
                 +---------------------------+
                 | Packets Sniffed:          |          
                 |---------------------------|
                 |#1 - Source: <src-addr>    |
                 |     Dest. : <dst-addr>    |
                 |     S-port: <src-port>    |
                 |     D-port: <dst-port>    |
                 |     window: <windowsize>  |
                 |     tos   : <tos>         |
                 |     ttl   : <ttl>         |
                 |     mss   : <mss>         |
                 |     DF    : ON/OFF        |
                 |---------------------------|
                 |#2 - ......                |
                 |                           |
                 +---------------------------+



基於這些值採集了以後,我們可以或多或少用TSF的方法來猜測操作系統。我們也可以用一個指紋匹配文


來試圖合併這些收集的值作爲指紋文件的值。


因爲Craig Smith開發了passfing,一個用perl寫的被動OS指紋採集工具。所以我決定不提供perl代碼
,你可以去找他的程序。


Lance Spitzner's Passive Fingerprinting paper:
[url]http://packetstorm.securify.com/papers/IDS/fingerprinting.txt[/url]


---
優點: 快,和TSF一樣準確,完全隱蔽。
缺點: 需要超級用戶,無目標。
---


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
被動OS指紋/網絡映射工具:

1. Siphon
作者: bind & aempirei / subterrain security group
下載: [url]http://www.subterrain.net/projects/siphon/[/url]

2. Passfing
作者: Craig Smith
下載: [url]http://packetstorm.securify.com/UNIX/IDS/passfing.tar.gz[/url]

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++        



V. 結束語

雖然這些操作系統檢測技術非常準確,能清晰的給出主機可能運行的操作系統,但是它們並
不總能給出一個操作系統的版本。 一些操作系統有時用的是相同的指紋匹配,這使產生準
確的結果有些困難。 不過不久新的技術可能使我們採集指紋更簡單,而且更隱蔽。



參考資料及感謝:


TESO
  TelnetFP
  [url]http://teso.scene.at/[/url]

Subterrain Security Group
  The Siphon Project
  [url]http://www.subterrain.net/projects/siphon/[/url]
  
El Apostols
  For making Queso possible

Nmap OS detection
  [url]http://www.insecure.org/nmap/nmap-fingerprinting-article.html[/url]

Dethy
  Synnergy Networks ([url]http://www.synnergy.net[/url])
  1. For inspiring me to write this paper
  2. For making Net::RawIP elite ;)

Craig Smith
  Passfing

Lance Spitzner
  "IDing Remote Hosts without them knowing about it"
  Passive Fingerprinting Article



Contact:

  [email][email protected][/email]
  [url]http://www.low-level.net[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章