今天我們要來學DNS的實作,我們會從查詢到模擬劫持再到抓包,跟昨天一樣會使用Linux系統。
首先要準備的工具有這些:dig、dnsmasq、bind9、tcpdump
指令:
sudo apt update
sudo apt install -y dnsutils dnsmasq bind9 bind9utils bind9-doc tcpdump
在這個實作當中主要是讓大家理解基本紀錄型別(A、MX、TXT等)與遞迴流程。
指令:
dig A example.com
dig example.com ANY
dig MX example.com
dig TXT example.com
四個指令的結果在這邊
A紀錄:
所有記錄:
MX記錄:
TXT:
這邊我們以A紀錄為例,跟大家說明這個輸出結果是甚麼意思,首先看到HEADER的部分,這是回應標頭,內容包含了這些
回答部分
在這個步驟我們可以了解DNS問題從哪裡被回答(遞迴resolver會向root/tld/authoritative查)
指令:
dig example.com +trace
圖片是輸出結果,這邊我們可以看到step-by-step的結果,先問 root(.)接著是.com的NS,最後則問 example.com的authoritative name server
這是第三個步驟,我們要做的事是快速當起DNS server,把某個domain指向我們確定的IP(模擬被汙染的狀況)
簡單安裝與最簡單的設定
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo bash -c 'cat > /etc/dnsmasq.conf <<EOF
listen-address=127.0.0.1
port=5353
no-resolv
server=1.1.1.1 # upstream resolver
address=/test.local/127.0.0.1
address=/example.com/127.0.0.1
log-queries
log-facility=/var/log/dnsmasq.log
EOF'
sudo systemctl restart dnsmasq
sudo systemctl status dnsmasq --no-pager
在第一個指令我們會先輩分原設定,接下來寫一個最簡單的dnsmasq.conf並把test.local跟example.com指到本機,最後重新啟動dnsmasq以下是我的實作截圖
其中大家可能看到 Failed to set DNS configuration: Unit dbus-org.freedesktop.resolve1.service not found.會有點慌,但先不要急,這在我們的測試中並不影響,這只是 dnsmasq 嘗試自動更新系統 DNS 的警告,不影響我們用 @127.0.0.1指定查詢
接下來我們進行測試,輸入指令向本地 resolver查詢:
dig @127.0.0.1 -p 5353 example.com A +short
理論上結果會看到127.0.0.1,由此可知我們可以直接控制domain指向哪個 IP,模擬權威或快取污染
注意!如果你曾經使用5353埠請記得先用命令停止它或使用其他未占用的埠進行測試,而no-resolv則表示不要從 /etc/resolv.conf讀upstream伺服器
模擬在受控環境示範當resolver或權威被改寫時,用戶會被導到惡意IP
我們先開一個額外的WSL並開啟80埠,指令為:
sudo python3 -m http.server 80 &
這時候我們可以用指令模擬,然後就會連到127.0.0.1的服務上,指令:
curl -v --resolve example.com:80:127.0.0.1 http://example.com/
--resolve example.com:80:127.0.0.1會直接告訴 curl:example.com直接到127.0.0.1,而我們的輸出為 Connected to example.com (127.0.0.1) port 80這表示 curl確實連上了我們指定的 IP(127.0.0.1),而不是 example.com的真實公網IP,也就是我們要模擬的DNS劫持。
接下來我們要試著抓取封包,使用指令:
sudo tcpdump -n -i lo port 80 -w dns.pcap
接著我們就會看到它開始監聽了,這時我們傳送http請求(在另一個終端機),指令:
curl -v http://example.com --resolve example.com:80:127.0.0.1
此時我們回到抓封包的終端並按Ctrl+c停止抓包就能看到抓包的結果
傳送http請求:
抓取封包畫面:
如果想要顯示封包則可以使用這個指令:
sudo tcpdump -r dns.pcap -n
以上也就是我們今天要做的基礎實作,從基本的查詢再到抓取封包,明天我們將會介紹一些新的東西(畢竟目前欠的實作已經補完了)