Windows下DNS ID欺骗的原理与实现
域名系統(tǒng)(DNS)是一種用于TCP/IP應(yīng)用程序的分布式數(shù)據(jù)庫,它提供主機(jī)名字和IP地址之間的轉(zhuǎn)換信息。通常,網(wǎng)絡(luò)用戶通過UDP協(xié)議和DNS服務(wù)器進(jìn)行通信,而服務(wù)器在特定的53端口監(jiān)聽,并返回用戶所需的相關(guān)信息。
一、DNS協(xié)議的相關(guān)數(shù)據(jù)結(jié)構(gòu)
01.DNS數(shù)據(jù)報(bào):02.typedef struct?dns
03.{
04.unsigned short id;
05.//標(biāo)識,通過它客戶端可以將DNS的請求與應(yīng)答相匹配;
06.unsigned short flags;
07.//標(biāo)志:[QR | opcode | AA| TC| RD| RA | zero | rcode ]
08.unsigned short quests;
09.//問題數(shù)目;
10.unsigned short answers;
11.//資源記錄數(shù)目;
12.unsigned short author;
13.//授權(quán)資源記錄數(shù)目;
14.unsigned short addition;
15.//額外資源記錄數(shù)目;
16.}DNS,*PDNS;
在16位的標(biāo)志中:QR位判斷是查詢/響應(yīng)報(bào)文,opcode區(qū)別查詢類型,AA判斷是否為授權(quán)回答,TC判斷是否可截?cái)?#xff0c;RD判斷是否期望遞歸查詢,RA判斷是否為可用遞歸,zero必須為0,rcode為返回碼字段。
DNS查詢數(shù)據(jù)報(bào):
01.typedef struct query02.{
03.unsinged char??*name;
04.//查詢的域名,這是一個(gè)大小在0到63之間的字符串;
05.unsigned short type;
06.//查詢類型,大約有20個(gè)不同的類型
07.unsigned short classes;
08.//查詢類,通常是A類既查詢IP地址。
09.}QUERY,*PQUERY;
DNS響應(yīng)數(shù)據(jù)報(bào):
01.typedef struct response02.{
03.unsigned short name;
04.//查詢的域名
05.unsigned short type;
06.//查詢類型
07.unsigned short classes;
08.//類型碼
09.unsigned int? ?ttl;
10.//生存時(shí)間
11.unsigned short length;
12.//資源數(shù)據(jù)長度
13.unsigned int? ?addr;
14.//資源數(shù)據(jù)
15.}RESPONSE,*PRESPONSE;
二、windows下DNS ID欺騙的原理
我們可以看到,在DNS數(shù)據(jù)報(bào)頭部的id(標(biāo)識)是用來匹配響應(yīng)和請求數(shù)據(jù)報(bào)的。現(xiàn)在,讓我們來看看域名解析的整個(gè)過程。客戶端首先以特定的標(biāo)識向DNS服務(wù)器發(fā)送域名查詢數(shù)據(jù)報(bào),在DNS服務(wù)器查詢之后以相同的ID號給客戶端發(fā)送域名響應(yīng)數(shù)據(jù)報(bào)。這時(shí)客戶端會將收到的DNS響應(yīng)數(shù)據(jù)報(bào)的ID和自己發(fā)送的查詢數(shù)據(jù)報(bào)ID相比較,如果匹配則表明接收到的正是自己等待的數(shù)據(jù)報(bào),如果不匹配則丟棄之。
假如我們能夠偽裝DNS服務(wù)器提前向客戶端發(fā)送響應(yīng)數(shù)據(jù)報(bào),那么客戶端的DNS緩存里域名所對應(yīng)的IP就是我們自定義的IP了,同時(shí)客戶端也就被帶到了我們希望的網(wǎng)站。條件只有一個(gè),那就是我們發(fā)送的ID匹配的DSN響應(yīng)數(shù)據(jù)報(bào)在DNS服務(wù)器發(fā)送的響應(yīng)數(shù)據(jù)報(bào)之前到達(dá)客戶端。下圖清楚的展現(xiàn)了DNS ID欺騙的過程:
Client <–response–| . . . . . .. . . . . . . . . . DNS Server
? ?? ?? ?? ?? ?? ?? ?? ?? ? |<–[a.b.c == 112.112.112.112]– Your Computer
到此,我想大家都知道了DNS ID欺騙的實(shí)質(zhì)了,那么如何才能實(shí)現(xiàn)呢?這要分兩種情況:
1. 本地主機(jī)與DNS服務(wù)器,本地主機(jī)與客戶端主機(jī)均不在同一個(gè)局域網(wǎng)內(nèi),方法有以下幾種:向客戶端主機(jī)隨機(jī)發(fā)送大量DNS響應(yīng)數(shù)據(jù)報(bào),命中率很低;向DNS服務(wù)器發(fā)起拒絕服務(wù)攻擊,太粗魯;BIND漏洞,使用范圍比較窄。
2. 本地主機(jī)至少與DNS服務(wù)器或客戶端主機(jī)中的某一臺處在同一個(gè)局域網(wǎng)內(nèi):我們可以通過ARP欺騙來實(shí)現(xiàn)可靠而穩(wěn)定的DNS ID欺騙,下面我們將詳細(xì)討論這種情況。
首先我們進(jìn)行DNS ID欺騙的基礎(chǔ)是ARP欺騙,也就是在局域網(wǎng)內(nèi)同時(shí)欺騙網(wǎng)關(guān)和客戶端主機(jī)(也可能是欺騙網(wǎng)關(guān)和DNS服務(wù)器,或欺騙DNS服務(wù)器和客戶端主機(jī))。我們以客戶端的名義向網(wǎng)關(guān)發(fā)送ARP響應(yīng)數(shù)據(jù)報(bào),不過其中將源MAC地址改為我們自己主機(jī)的MAC地址;同時(shí)以網(wǎng)關(guān)的名義向客戶端主機(jī)發(fā)送ARP響應(yīng)數(shù)據(jù)報(bào),同樣將源MAC地址改為我們自己主機(jī)的MAC地址。這樣以來,網(wǎng)關(guān)看來客戶端的MAC地址就是我們主機(jī)的MAC地址;客戶端也認(rèn)為網(wǎng)關(guān)的MAC地址為我們主機(jī)的MAC地址。由于在局域網(wǎng)內(nèi)數(shù)據(jù)報(bào)的傳送是建立在MAC地址之上了,所以網(wǎng)關(guān)和客戶端之間的數(shù)據(jù)流通必須先通過本地主機(jī)。詳細(xì)介紹請參見《詳談?wù){(diào)用winpcap驅(qū)動寫arp多功能工具》。
在監(jiān)視網(wǎng)關(guān)和客戶端主機(jī)之間的數(shù)據(jù)報(bào)時(shí),如果發(fā)現(xiàn)了客戶端發(fā)送的DNS查詢數(shù)據(jù)報(bào)(目的端口為53),那么我們可以提前將自己構(gòu)造的DNS響應(yīng)數(shù)據(jù)報(bào)發(fā)送到客戶端。注意,我們必須提取有客戶端發(fā)送來的DNS查詢數(shù)據(jù)報(bào)的ID信息,因?yàn)榭蛻舳耸峭ㄟ^它來進(jìn)行匹配認(rèn)證的,這就是一個(gè)我們可以利用的DNS漏洞。這樣客戶端會先收到我們發(fā)送的DNS響應(yīng)數(shù)據(jù)報(bào)并訪問我們自定義的網(wǎng)站,雖然客戶端也會收到DNS服務(wù)器的響應(yīng)報(bào)文,不過已經(jīng)來不及了,哈哈。
三、核心代碼分析
主程序創(chuàng)建兩個(gè)線程,一個(gè)線程進(jìn)行實(shí)時(shí)的ARP欺騙,另一個(gè)線程監(jiān)聽接收到的數(shù)據(jù)報(bào),若發(fā)現(xiàn)有域名服務(wù)查詢數(shù)據(jù)報(bào),則立即向客戶端發(fā)送自定義的DSN響應(yīng)數(shù)據(jù)報(bào)。測試環(huán)境:Windows2000 + VC6.0 + Winpcap_3.0_alpha,注冊表:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersIPEnableRouter = 0×1。
1.sniff線程:
01.PacketSetHwFilter(lpadapter,NDIS_PACKET_TYPE_PROMISCUOUS);02.//將網(wǎng)卡設(shè)置為混雜模式
03.PacketSetBuff(lpadapter,500*1024);
04.//設(shè)置網(wǎng)絡(luò)適配器的內(nèi)核緩存;
05.PacketSetReadTimeout(lpadapter,1);
06.//設(shè)置等待時(shí)間;
07.PacketReceivePacket(lpadapter,lppacketr,TRUE);
08.//接收網(wǎng)絡(luò)數(shù)據(jù)報(bào);
09.checksum((USHORT*)temp,sizeof(PSD)+sizeof(UDPHDR)+sizeof(DNS)+ulen+sizeof(QUERY)+sizeof(RESPONSE));
10.//計(jì)算校驗(yàn)和;
11.PacketInitPacket(lppackets,sendbuf,sizeof(ETHDR)+sizeof(IPHDR)+sizeof(UDPHDR)+sizeof(DNS)+ulen+4+sizeof(RESPONSE));
12.//初始化一個(gè)_PACKET結(jié)構(gòu),發(fā)送DNS響應(yīng)數(shù)據(jù)報(bào);
2.arpspoof線程;
1.PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));2.//初始化ARP響應(yīng)數(shù)據(jù)報(bào);
3.PacketSendPacket(lpadapter,lppackets,TRUE);
4.//發(fā)送ARP欺騙的響應(yīng)數(shù)據(jù)報(bào);
3.getmac()函數(shù)
1.GetAdaptersInfo(padapterinfo,&adapterinfosize);2.//獲取網(wǎng)絡(luò)適配器的屬性;
3.SendARP(destip,0,pulmac,&ullen);
4.//發(fā)送ARP請求數(shù)據(jù)報(bào),過去網(wǎng)絡(luò)主機(jī)的MAC地址;
4.main()函數(shù)
01.PacketGetAdapterNames((char *)adaptername,&adapterlength);02.//獲得本地主機(jī)的網(wǎng)絡(luò)適配器列表和描述;
03.lpadapter=PacketOpenAdapter(adapterlist[open-1]);?
04.//打開指定的網(wǎng)絡(luò)適配器;
05.CreateThread(NULL,0,sniff,NULL,0,&threadrid);
06.CreateThread(NULL,0,arpspoof,NULL,0,&threadsid);
07.//創(chuàng)建兩個(gè)線程;
08.WaitForMultipleObjects(2,thread,FALSE,INFINITE);
09.//等待其中的某個(gè)線程結(jié)束;
四、小結(jié)與后記
局域網(wǎng)內(nèi)的網(wǎng)絡(luò)安全是一個(gè)值得大家關(guān)注的問題,往往容易發(fā)起各種欺騙攻擊,這是局域網(wǎng)自身的屬性所決定的–網(wǎng)絡(luò)共享。本文所講解的DNS ID欺騙是基于ARP欺騙之上的網(wǎng)絡(luò)攻擊,如果在廣域網(wǎng)上,則比較麻煩。不過也有一些例外情況:如果IE中使用代理服務(wù)器,欺騙不能進(jìn)行,因?yàn)檫@時(shí)客戶端并不會在本地進(jìn)行域名請求;如果你訪問的不是網(wǎng)站主頁,而是相關(guān)子目錄的文件,這樣你在自定義的網(wǎng)站上不會找到相關(guān)的文件,登陸以失敗告終。如果你不幸被欺騙了,先禁用本地連接,然后啟用本地連接就可以清除DNS緩存。
源代碼下載頁面:
http://download.csdn.net/detail/swanabin/6560761
轉(zhuǎn)載于:https://www.cnblogs.com/vcerror/p/4289188.html
總結(jié)
以上是生活随笔為你收集整理的Windows下DNS ID欺骗的原理与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: REDIS 在电商中的实际应用场景(转)
- 下一篇: 谁偷了我的符