域名系統(tǒng)(DNS)是一種用于TCP/IP應(yīng)用程序的分布式數(shù)據(jù)庫,它提供主機名字和IP地址之間的轉(zhuǎn)換信息。通常,網(wǎng)絡(luò)用戶通過UDP協(xié)議和DNS服務(wù)器進行通信,而服務(wù)器在特定的53 端口監(jiān)聽,并返回用戶所需的相關(guān)信息。
一.DNS協(xié)議的相關(guān)數(shù)據(jù)結(jié)構(gòu)
DNS數(shù)據(jù)報:
|
在16位的標(biāo)志中:QR位判斷是查詢/響應(yīng)報文,opcode區(qū)別查詢類型,AA判斷是否為授權(quán)回答,TC判斷是否可截斷,RD判斷是否期望遞歸查詢,RA判斷是否為可用遞歸,zero必須為0,rcode為返回碼字段。
DNS查詢數(shù)據(jù)報:
|
二.Windows下DNS ID欺騙的原理
我們可以看到,在DNS數(shù)據(jù)報頭部的id(標(biāo)識)是用來匹配響應(yīng)和請求數(shù)據(jù)報的。現(xiàn)在,讓我們來看看域名解析的整個過程。客戶端首先以特定的標(biāo)識向DNS服務(wù)器發(fā)送域名查詢數(shù)據(jù)報,在DNS服務(wù)器查詢之后以相同的ID號給客戶端發(fā)送域名響應(yīng)數(shù)據(jù)報。這時客戶端會將收到的DNS響應(yīng)數(shù)據(jù)報的ID和自己發(fā)送的查詢數(shù)據(jù)報ID相比較,如果匹配則表明接收到的正是自己等待的數(shù)據(jù)報,如果不匹配則丟棄之。
假如我們能夠偽裝DNS服務(wù)器提前向客戶端發(fā)送響應(yīng)數(shù)據(jù)報,那么客戶端的DNS緩存里域名所對應(yīng)的IP就是我們自定義的IP了,同時客戶端也就被帶到了我們希望的網(wǎng)站。條件只有一個,那就是我們發(fā)送的ID匹配的DSN響應(yīng)數(shù)據(jù)報在DNS服務(wù)器發(fā)送的響應(yīng)數(shù)據(jù)報之前到達客戶端。下圖清楚的展現(xiàn)了DNS ID欺騙的過程:
|
到此,我想大家都知道了DNS ID欺騙的實質(zhì)了,那么如何才能實現(xiàn)呢?這要分兩種情況:
1. 本地主機與DNS服務(wù)器,本地主機與客戶端主機均不在同一個局域網(wǎng)內(nèi),方法有以下幾種:向客戶端主機隨機發(fā)送大量DNS響應(yīng)數(shù)據(jù)報,命中率很低;向DNS服務(wù)器發(fā)起拒絕服務(wù)攻擊,太粗魯;BIND漏洞,使用范圍比較窄。
2. 本地主機至少與DNS服務(wù)器或客戶端主機中的某一臺處在同一個局域網(wǎng)內(nèi):我們可以通過ARP欺騙來實現(xiàn)可靠而穩(wěn)定的DNS ID欺騙,下面我們將詳細討論這種情況。
首先我們進行DNS ID欺騙的基礎(chǔ)是ARP欺騙,也就是在局域網(wǎng)內(nèi)同時欺騙網(wǎng)關(guān)和客戶端主機(也可能是欺騙網(wǎng)關(guān)和DNS服務(wù)器,或欺騙DNS服務(wù)器和客戶端主機)。我們以客戶端的名義向網(wǎng)關(guān)發(fā)送ARP響應(yīng)數(shù)據(jù)報,不過其中將源MAC地址改為我們自己主機的MAC地址;同時以網(wǎng)關(guān)的名義向客戶端主機發(fā)送ARP響應(yīng)數(shù)據(jù)報,同樣將源MAC地址改為我們自己主機的MAC地址。這樣以來,網(wǎng)關(guān)看來客戶端的MAC地址就是我們主機的MAC地址;客戶端也認(rèn)為網(wǎng)關(guān)的MAC地址為我們主機的MAC地址。由于在局域網(wǎng)內(nèi)數(shù)據(jù)報的傳送是建立在MAC地址之上了,所以網(wǎng)關(guān)和客戶端之間的數(shù)據(jù)流通必須先通過本地主機。
在監(jiān)視網(wǎng)關(guān)和客戶端主機之間的數(shù)據(jù)報時,如果發(fā)現(xiàn)了客戶端發(fā)送的DNS查詢數(shù)據(jù)報(目的端口為53),那么我們可以提前將自己構(gòu)造的DNS響應(yīng)數(shù)據(jù)報發(fā)送到客戶端。注意,我們必須提取有客戶端發(fā)送來的DNS查詢數(shù)據(jù)報的ID信息,因為客戶端是通過它來進行匹配認(rèn)證的,這就是一個我們可以利用的DNS漏洞。這樣客戶端會先收到我們發(fā)送的DNS響應(yīng)數(shù)據(jù)報并訪問我們自定義的網(wǎng)站,雖然客戶端也會收到DNS服務(wù)器的響應(yīng)報文,不過已經(jīng)來不及了,哈哈。
三.核心代碼分析
主程序創(chuàng)建兩個線程,一個線程進行實時的ARP欺騙,另一個線程監(jiān)聽接收到的數(shù)據(jù)報,若發(fā)現(xiàn)有域名服務(wù)查詢數(shù)據(jù)報,則立即向客戶端發(fā)送自定義的DSN響應(yīng)數(shù)據(jù)報。測試環(huán)境:Windows2000 + VC6.0 + Winpcap_3.0_alpha,注冊表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter = 0x1。
|
四.小結(jié)與后記
局域網(wǎng)內(nèi)的網(wǎng)絡(luò)安全是一個值得大家關(guān)注的問題,往往容易發(fā)起各種欺騙攻擊,這是局域網(wǎng)自身的屬性所決定的--網(wǎng)絡(luò)共享。本文所講解的DNS ID欺騙是基于ARP欺騙之上的網(wǎng)絡(luò)攻擊,如果在廣域網(wǎng)上,則比較麻煩。不過也有一些例外情況:如果IE中使用代理服務(wù)器,欺騙不能進行,因為這時客戶端并不會在本地進行域名請求;如果你訪問的不是網(wǎng)站主頁,而是相關(guān)子目錄的文件,這樣你在自定義的網(wǎng)站上不會找到相關(guān)的文件,登陸以失敗告終。如果你不幸被欺騙了,先禁用本地連接,然后啟用本地連接就可以清除DNS緩存。


