[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 程序 > 正文
用Perl實現高級遠程操作系統探測
本文出自:http://xfocus.org/ 作者:翻譯:stardust(幻覺) (2001-09-09 09:05:00)

------------------------------------------------------------------ 
------[ 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 : ^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: http://teso.scene.at/releases/telnetfp_0.1.2.tar.gz 

2. Prod-1.0 

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

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



2. Identd 指紋探測 

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


   ::(ninja)-([f0bic]--[/sys])$ telnet www.chemie.fu-berlin.de 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: http://teso.scene.at/releases/ldistfp-0.1.2.tar.gz 


identfp 

Author: f0bic / lowlevel -- dethy / synnergy 
Download: http://www.synnergy.net/Archives/Utilities/dethy/identfp.tar.gz 
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匹配主機路徑追蹤檢查。 

        我們將再用www.sun.com.au來做示范:) 
             
            # 從www.sun.com.au接收來的包信息 

            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 
下載: http://www.insecure.org/nmap 

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

   

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) &n (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
 

★  樊強制作 歡迎分享  ★