1. 程式人生 > >Windows下DNS ID欺騙的原理與實現

Windows下DNS ID欺騙的原理與實現

域名系統(DNS)是一種用於TCP/IP應用程式的分散式資料庫,它提供主機名字和IP地址之間的轉換資訊。通常,網路使用者通過UDP協議和DNS伺服器進行通訊,而伺服器在特定的53埠監聽,並返回使用者所需的相關資訊。

一、DNS協議的相關資料結構

01.DNS資料報:
02.typedef struct dns
03.{
04.unsigned short id;
05.//標識,通過它客戶端可以將DNS的請求與應答相匹配;
06.unsigned short flags;
07.//標誌:[QR | opcode | AA| TC| RD| RA | zero | rcode ]
08.unsigned short quests;
09.//問題數目;
10.unsigned short answers;
11.//資源記錄數目;
12.unsigned short author;
13.//授權資源記錄數目;
14.unsigned short addition;
15.//額外資源記錄數目;
16.}DNS,*PDNS;

在16位的標誌中:QR位判斷是查詢/響應報文,opcode區別查詢型別,AA判斷是否為授權回答,TC判斷是否可截斷,RD判斷是否期望遞迴查詢,RA判斷是否為可用遞迴,zero必須為0,rcode為返回碼欄位。

DNS查詢資料報:

01.typedef struct query
02.{
03.unsinged char  *name;
04.//查詢的域名,這是一個大小在0到63之間的字串;
05.unsigned short type;
06.//查詢型別,大約有20個不同的型別
07.unsigned short classes;
08.//查詢類,通常是A類既查詢IP地址。
09.}QUERY,*PQUERY;

DNS響應資料報:

01.typedef struct response
02.{
03.unsigned short name;
04.//查詢的域名
05.unsigned short type;
06.//查詢型別
07.unsigned short classes;
08.//型別碼
09.unsigned int   ttl;
10.//生存時間
11.unsigned short length;
12.//資源資料長度
13.unsigned int   addr;
14.//資源資料
15.}RESPONSE,*PRESPONSE;

二、windows下DNS ID欺騙的原理

我們可以看到,在DNS資料報頭部的id(標識)是用來匹配響應和請求資料報的。現在,讓我們來看看域名解析的整個過程。客戶端首先以特定的標識向DNS伺服器傳送域名查詢資料報,在DNS伺服器查詢之後以相同的ID號給客戶端傳送域名響應資料報。這時客戶端會將收到的DNS響應資料報的ID和自己傳送的查詢資料報ID相比較,如果匹配則表明接收到的正是自己等待的資料報,如果不匹配則丟棄之。

假如我們能夠偽裝DNS伺服器提前向客戶端傳送響應資料報,那麼客戶端的DNS快取裡域名所對應的IP就是我們自定義的IP了,同時客戶端也就被帶到了我們希望的網站。條件只有一個,那就是我們傳送的ID匹配的DSN響應資料報在DNS伺服器傳送的響應資料報之前到達客戶端。下圖清楚的展現了DNS ID欺騙的過程:

Client <–response–| . . . . . .. . . . . . . . . . DNS Server

                            |<–[a.b.c == 112.112.112.112]– Your Computer

到此,我想大家都知道了DNS ID欺騙的實質了,那麼如何才能實現呢?這要分兩種情況:

1. 本地主機與DNS伺服器,本地主機與客戶端主機均不在同一個區域網內,方法有以下幾種:向客戶端主機隨機發送大量DNS響應資料報,命中率很低;向DNS伺服器發起拒絕服務攻擊,太粗魯;BIND漏洞,使用範圍比較窄。

2. 本地主機至少與DNS伺服器或客戶端主機中的某一臺處在同一個區域網內:我們可以通過ARP欺騙來實現可靠而穩定的DNS ID欺騙,下面我們將詳細討論這種情況。

首先我們進行DNS ID欺騙的基礎是ARP欺騙,也就是在區域網內同時欺騙閘道器和客戶端主機(也可能是欺騙閘道器和DNS伺服器,或欺騙DNS伺服器和客戶端主機)。我們以客戶端的名義向閘道器傳送ARP響應資料報,不過其中將源MAC地址改為我們自己主機的MAC地址;同時以閘道器的名義向客戶端主機發送ARP響應資料報,同樣將源MAC地址改為我們自己主機的MAC地址。這樣以來,閘道器看來客戶端的MAC地址就是我們主機的MAC地址;客戶端也認為閘道器的MAC地址為我們主機的MAC地址。由於在區域網內資料報的傳送是建立在MAC地址之上了,所以閘道器和客戶端之間的資料流通必須先通過本地主機。詳細介紹請參見《詳談呼叫winpcap驅動寫arp多功能工具》。

在監視閘道器和客戶端主機之間的資料報時,如果發現了客戶端傳送的DNS查詢資料報(目的埠為53),那麼我們可以提前將自己構造的DNS響應資料報傳送到客戶端。注意,我們必須提取有客戶端傳送來的DNS查詢資料報的ID資訊,因為客戶端是通過它來進行匹配認證的,這就是一個我們可以利用的DNS漏洞。這樣客戶端會先收到我們傳送的DNS響應資料報並訪問我們自定義的網站,雖然客戶端也會收到DNS伺服器的響應報文,不過已經來不及了,哈哈。

三、核心程式碼分析

主程式建立兩個執行緒,一個執行緒進行實時的ARP欺騙,另一個執行緒監聽接收到的資料報,若發現有域名服務查詢資料報,則立即向客戶端傳送自定義的DSN響應資料報。測試環境:Windows2000 + VC6.0 + Winpcap_3.0_alpha,登錄檔:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersIPEnableRouter = 0×1。

1.sniff執行緒:

01.PacketSetHwFilter(lpadapter,NDIS_PACKET_TYPE_PROMISCUOUS);
02.//將網絡卡設定為混雜模式
03.PacketSetBuff(lpadapter,500*1024);
04.//設定網路介面卡的核心快取;
05.PacketSetReadTimeout(lpadapter,1);
06.//設定等待時間;
07.PacketReceivePacket(lpadapter,lppacketr,TRUE);
08.//接收網路資料報;
09.checksum((USHORT*)temp,sizeof(PSD)+sizeof(UDPHDR)+sizeof(DNS)+ulen+sizeof(QUERY)+sizeof(RESPONSE));
10.//計算校驗和;
11.PacketInitPacket(lppackets,sendbuf,sizeof(ETHDR)+sizeof(IPHDR)+sizeof(UDPHDR)+sizeof(DNS)+ulen+4+sizeof(RESPONSE));
12.//初始化一個_PACKET結構,傳送DNS響應資料報;

2.arpspoof執行緒;

1.PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
2.//初始化ARP響應資料報;
3.PacketSendPacket(lpadapter,lppackets,TRUE);
4.//傳送ARP欺騙的響應資料報;

3.getmac()函式

1.GetAdaptersInfo(padapterinfo,&adapterinfosize);
2.//獲取網路介面卡的屬性;
3.SendARP(destip,0,pulmac,&ullen);
4.//傳送ARP請求資料報,過去網路主機的MAC地址;

4.main()函式

01.PacketGetAdapterNames((char *)adaptername,&adapterlength);
02.//獲得本地主機的網路介面卡列表和描述;
03.lpadapter=PacketOpenAdapter(adapterlist[open-1]); 
04.//開啟指定的網路介面卡;
05.CreateThread(NULL,0,sniff,NULL,0,&threadrid);
06.CreateThread(NULL,0,arpspoof,NULL,0,&threadsid);
07.//建立兩個執行緒;
08.WaitForMultipleObjects(2,thread,FALSE,INFINITE);
09.//等待其中的某個執行緒結束;

四、小結與後記

區域網內的網路安全是一個值得大家關注的問題,往往容易發起各種欺騙攻擊,這是區域網自身的屬性所決定的–網路共享。本文所講解的DNS ID欺騙是基於ARP欺騙之上的網路攻擊,如果在廣域網上,則比較麻煩。不過也有一些例外情況:如果IE中使用代理伺服器,欺騙不能進行,因為這時客戶端並不會在本地進行域名請求;如果你訪問的不是網站主頁,而是相關子目錄的檔案,這樣你在自定義的網站上不會找到相關的檔案,登陸以失敗告終。如果你不幸被欺騙了,先禁用本地連線,然後啟用本地連線就可以清除DNS快取。

原始碼下載頁面: