远程DNS缓存攻击__网络攻防实验三
一、實驗描述
DNS(Domain Name System)是一個多層次的分布式數(shù)據(jù)庫系統(tǒng),其基本功能是完成域名解析,即提供域名和IP 地址之間的映射關(guān)系,為Internet 用戶提供便利。DNS 服務(wù)器只記錄本地資源的所有授權(quán)主機,若想查詢非本地的主機信息,
則要向信息持有者(權(quán)威DNS 服務(wù)器)發(fā)送查詢請求。為了避免每次查詢都發(fā)送請求,DNS 服務(wù)器會把權(quán)威DNS 服務(wù)器返回的查詢結(jié)果保存在緩存中,并保持一定時間,這就構(gòu)成了DNS 緩存(DNS Cache)。DNS 緩存中毒攻擊就是通過污染DNS Cache,用虛假的IP 地址信息替換Cache 中主機記錄的真實IP 地
址信息,從而改變域名和IP 的映射關(guān)系。這樣使得用戶在訪問某網(wǎng)站時會被錯誤引導(dǎo)至攻擊者的網(wǎng)站中,從而被其獲取重要的隱私信息。本實驗主要是搭建實驗環(huán)境,完成遠程DNS 緩存中毒攻擊實驗(Kaminsky 攻擊)。
二、實驗參考資料
老師給的資料http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Networking/DNS_Remote/
修改過的代碼下載地址,兩個地址一個在百度云盤,一個直接在CSDN
http://download.csdn.net/detail/zengxyuyu/9704739
http://download.csdn.net/detail/zengxyuyu/9704749
一些可以看的幫助文檔,這個文檔做的不完整
http://wenku.baidu.com/link?url=MUEXKX4nYbYP2CIcrp6sbzZ8xChuHyqqU-bg9f5SJX74NVA2w3XUnpp7dvNCsRCDtrv8tczKx9m5zZ90StWGENpAP7coKDp6MMivyba-GBq
三、實驗分析
首先,我們的目標是使得用戶在訪問www.example.com時,本地DNS服務(wù)器把該域名解析為我們設(shè)定的惡意IP地址,當(dāng)用戶訪問該域下的其他域名時,本地DNS服務(wù)器會向假的DNS服務(wù)器請求應(yīng)答。
www.example.com的真實權(quán)威域名服務(wù)器IP地址是93.184.216.34,它的DNS服務(wù)器由ICANN管理。 當(dāng)用戶對該域名執(zhí)行dig命令或在瀏覽器打開網(wǎng)站時,用戶的機器就會發(fā)送一個DNS請求到本地DNS服務(wù)器,并最終從www.example.com的DNS服務(wù)器獲取到正確的IP地址。
要實現(xiàn)目標,我們實際上是對Apollo(本地DNS服務(wù)器)進行投毒,使得用戶在對該域名執(zhí)行dig命令或在瀏覽器打開網(wǎng)站時,變成是向攻擊者的DNS服務(wù)器ns.dnslabattacker.net 提交請求,由此我們可以自己設(shè)定一個惡意IP地址,并使得用戶被重定向到這個地址而不是在www.example.com DNS服務(wù)器中設(shè)定的正確IP地址。
具體來說,這個項目可以分為兩個任務(wù),一是緩存投毒,二是結(jié)果驗證。在第一個任務(wù)中,我們要對Apollo進行投毒,使得Apollo的DNS緩存中,ns.dnslabattacker.net 被設(shè)定為example.com域名的域名服務(wù)器。 在第二個任務(wù)中,要驗證投毒是否成功,也即檢驗在用戶機上對www.example.com 使用dig命令確實返回我們設(shè)定的惡意IP地址。
如果Apollo中已經(jīng)緩存好了example.com DNS服務(wù)器的地址,就不用再查詢根DNS服務(wù)器了,這時會直接向example.com DNS服務(wù)器提出對域名的查詢。攻擊時利用的正是這一特性,我們可以向Apollo多次提交example.com 域下的不同域名的查詢包,這樣Apollo會向example.com DNS服務(wù)器提交多次查詢,而此時我們通過大量偽造對應(yīng)的應(yīng)答包來進行匹配,只要能先于真正example.com DNS服務(wù)器應(yīng)答包到達,則感染成功,Apollo會記錄我們偽造包的信息,包括查詢的域名和偽造的惡意IP,還有域名對應(yīng)的偽造的DNS及DNS的ip,這樣就成功毒化了。
歸納一下,毒化緩存主要有以下三個約束:
TTL約束: 域名不能夠已經(jīng)在dns cache server的緩存中
Guess約束:transaction id能夠成功匹配。
Time約束:偽造包要比真正DNS服務(wù)器返回包快。
為了克服約束1,就有了Kaminsky Attack這種攻擊方法。Kaminsky的主要技術(shù)是繞開TTL的約束,使得攻擊具有較高的成功率。而且,Kaminsky并不只是毒化一個域名,它能把被攻擊域名的權(quán)威域名服務(wù)器也進行毒化,改造為faked name server(偽造的權(quán)威域名服務(wù)器),從而具有極大的危害性。
四、實驗步驟
(一)網(wǎng)絡(luò)配置
1.虛擬機的網(wǎng)絡(luò)連接模式為Nat模式,就是讓虛擬系統(tǒng)借助NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)功能,通過宿主機器所在的網(wǎng)絡(luò)來訪問公網(wǎng)。
2.使用三臺虛擬機,一臺Apollo(本地DNS服務(wù)器,同時也是受害DNS服務(wù)器,Victim DNS server),一臺用戶(User,或者說客戶端),一臺攻擊者(Attacker),下文中統(tǒng)一稱呼都是Apollo,用戶和攻擊者。 不過我這次沒有配置靜態(tài)IP,所以實驗時IP地址會與下圖不一致。依次是192.168.109.140、192.168.109.141和192.168.109.139。
因為在Nat模式下,進入虛擬機,自動被分配IP,只需ifconfig查詢一下三臺主機的IP是什么,
這是教程上給的結(jié)構(gòu)圖:
(二)配置本地DNS服務(wù)器
1.安裝bind9
2.以下兩條命令可以幫助我們更好地進行實驗:
rndc flush rndc dumpdb -cache其中第一條命令是把DNS緩存清空,第二條命令是把緩存轉(zhuǎn)儲到named_dump.db文件。named_dump.db在/var/cache/bind目錄下
3.配置Apollo的DNS查詢端口為33333,如果不設(shè)置的話,端口是隨機的,則遠程攻擊時難度會更大(除了猜transaction ID還得猜port)。具體來說是通過修改Apollo的/etc/bind/named.conf.options文件實現(xiàn)的。
4.除了設(shè)置固定的端口以外,我們還需要關(guān)閉dnssec-validation服務(wù),這是設(shè)置用來防止DNS緩存投毒攻擊的。如果不關(guān)閉的話,攻擊會非常困難。注釋掉named.conf.options文件中的對應(yīng)條目,并且加入關(guān)閉dnssec服務(wù)的語句:
5.啟動DNS服務(wù)器:service bind9 start
重啟DNS服務(wù)器:service bind9 restart
(三)配置客戶端
在客戶端我們需要配置使得Apollo (192.168.109.139) 成為客戶端(192.168.109.141)的默認DNS服務(wù)器,通過修改客戶端的DNS配置文件來實現(xiàn)。
1.修改etc文件夾下的resolv.conf文件
注意,因為Ubuntu系統(tǒng)中,resolv.conf會被DHCP客戶端覆寫,這樣我們加入的內(nèi)容就會被消除掉,為了避免這個狀況我們要禁止DHCP。
2.禁止DHCP
點擊All Settings,然后點擊Network,在Wired選項卡點擊Options按鈕,然后在IPv4 Settings選項卡中把Method更改為Automatic(DHCP) addresses only,然后把DNS servers更改為前面設(shè)置的本地DNS服務(wù)器的ip地址。
因為沒有找到實驗指導(dǎo)中Network Icon的Auto eth0選項,所以這里直接手動從命令行重啟一下網(wǎng)卡:
為了確保萬無一失,重啟一次虛擬機來使修改生效也行。再查看一下此時的DNS服務(wù)器,確實就我們剛剛配置的,DHCP被禁止了,沒有對我們的修改進行覆蓋,這樣就證明配置成功了。
(四)配置攻擊者
攻擊者可以是網(wǎng)絡(luò)上任意一臺主機,我們可以通過raw socket編程來偽造DNS包進行攻擊。但同時我們也要實現(xiàn)一個假的DNS服務(wù)器,這樣當(dāng)受害者使用域名訪問網(wǎng)站時,我們可以把他們導(dǎo)向惡意網(wǎng)站了。這里我們把假的DNS服務(wù)器和攻擊者的機器設(shè)置為同一臺,但實際上可以是不同的主機。
1.配置攻擊者的默認DNS服務(wù)器,使得在攻擊者的機器上查詢DNS時會向Apollo發(fā)出請求。這一步驟和配置用戶機是一樣的,修改resolv.conf文件,然后關(guān)閉DHCP服務(wù)即可。
2.偽造DNS應(yīng)答包
我們從實驗參考資料可以下載一份udp.c的文件,在這個項目中,我們使用raw socket編寫c代碼來實現(xiàn),需要填充好DNS包的各個字段。
在用戶主機上dig www.example.com
使用Wareshark捕捉:
一般每一個域名都至少要有兩個DNS服務(wù)器,這樣如果其中一個DNS服務(wù)器出現(xiàn)問題,另外一個也可以返回關(guān)于這個域名的數(shù)據(jù),多個DNS服務(wù)器上的DNS記錄應(yīng)是相同的。
上圖的兩條數(shù)據(jù)一個是DNS,查詢一個是DNS應(yīng)答。
實驗提供了程序udp.c,對它進行修改以便能實現(xiàn)在短時間內(nèi)向發(fā)送大量DNS 請求包和回復(fù)包,從而成功替換受害者DNS 服務(wù)器緩存的對應(yīng)關(guān)系。
代碼下載地址:見最下方資源下載地址
(五)開始攻擊
在root權(quán)限下
1.編譯udp.c
2.清空被攻擊者緩存
3.發(fā)動攻擊的命令,第一個IP是攻擊者IP,第二個IP是被攻擊者IP,檢查IP不能寫反
./udp 192.168.109.140 192.168.109.139注意:該命令必須在root權(quán)限下運行,否則會出現(xiàn)error
4.Apollo收到大量應(yīng)答包
一般一次就會成功,如果一次不成功,重啟bind9,清空緩存,再次攻擊
如果攻擊成功,那么Apollo的DNS緩存就會像上圖一樣,可以看到example.com 的NS記錄變成了我們偽造的ns.dnslabattacker.net。
攻擊者ctrl+c命令可以結(jié)束攻擊
(六)驗證是否成功
1.將緩存導(dǎo)入
rndc dumpdb -cache cd /var/cache/bind gedit named_dump.db
說明DNS緩存已中毒,攻擊成功
2.為了檢驗是否真的成功,我們可以在用戶機上使用對www.example.com 使用dig命令,查看返回的IP地址。
可以看到下圖
這是因為當(dāng)Apollo收到緩存中不存在的DNS記錄的查詢時,它就會向我們設(shè)置的偽造域名服務(wù)器ns.dnslabattacker.net提交查詢,因為這個域名服務(wù)器是不存在的,Apollo會發(fā)現(xiàn)這一點,然后把這條DNS記錄設(shè)置為無效記錄,這樣毒化就失效了。這時可能會想,能不能在偽造應(yīng)答包時給ns.dnslabattacker.net設(shè)置一個IP地址,從而使得偽造的域名服務(wù)器變?yōu)檎鎸崱按嬖凇钡哪?#xff1f;
答案是否定的,原因和前面分析為什么Apollo不直接接受.com的DNS返回的example.com的DNS a.iana-servers.net 的地址是一樣的。因為我們偽造應(yīng)答包是從a.iana-servers.net或者b.iana-servers.net這兩個域名服務(wù)器返回的,它們不是負責(zé)管轄example.com這個域的權(quán)威域名服務(wù)器,所以即使我們設(shè)置了IP地址,Apollo也不會采納。
有兩個方案解決這個問題:
方案一、使用真正的域名
如果我們有真正的域名就不需要用ns.dnslabattacker.net這個假的了,直接替換掉偽造應(yīng)答包中的ns.dnslabattacker.net就可以了。當(dāng)然前提是我們的域名解析到了主機上面,能夠提供應(yīng)答,像本地攻擊實驗?zāi)菢优渲镁涂梢粤恕?/p>
方案二、使用偽造的域名
因為我們沒有真正的域名,所以實驗中采用這個方案。直接在Apollo的DNS配置中增加一個ns.dnslabattacker.net對應(yīng)的IP地址,把它指向攻擊者的主機。這樣Apollo就不需要去問上級DNS服務(wù)器ns.dnslabattacker.net的IP地址是什么,自然也就不會穿幫了。
2.方案2的具體配置
a).配置Apollo的/etc/bind/named.conf.local文件
db.attacker文件長這樣:
; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA localhost. root.localhost. (2 ; Serial604800 ; Refresh86400 ; Retry2419200 ; Expire604800 ) ; Negative Cache TTL ; @ IN NS ns.dnslabattacker.net. @ IN A 192.168.109.140 @ IN AAAA ::1倒數(shù)第二行的IP是攻擊者的IP
這樣Apollo就不需要去問上級DNS服務(wù)器ns.dnslabattacker.net的IP地址是什么,直接向攻擊者詢問example.com的IP是什么,攻擊者告訴給了一個其他網(wǎng)站的IP,用戶就被導(dǎo)向了其他網(wǎng)站,還以為是example.com的網(wǎng)站
b).給攻擊者裝一個bind9,作為一個DNS服務(wù)器,當(dāng)被攻擊者向攻擊者詢問example.com的IP的時候,給它一個想要的IP
配置攻擊者,把example.com.db拷到/etc/bind下
在文件里加入下列內(nèi)容:
zone "example.com" {type master;file "/etc/bind/example.com.db"; };
example.com文件內(nèi)容如下:
3.重啟Apollo
攻擊者再次攻擊,攻擊成功后
用戶機dig www.example.com,得到驗證,返回IP為1.1.1.1
五、資源下載地址
http://download.csdn.net/detail/zengxyuyu/9704739
http://download.csdn.net/detail/zengxyuyu/9704749
總結(jié)
以上是生活随笔為你收集整理的远程DNS缓存攻击__网络攻防实验三的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝宝的个人博客开通了
- 下一篇: K8S集群安装Pod网络附加组件