iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0

今天我們要來學DNS的實作,我們會從查詢到模擬劫持再到抓包,跟昨天一樣會使用Linux系統。

準備工具跟測試環境

首先要準備的工具有這些:dig、dnsmasq、bind9、tcpdump

指令:

sudo apt update
sudo apt install -y dnsutils dnsmasq bind9 bind9utils bind9-doc tcpdump
  • dnsutils:包含 dig、nslookup
  • dnsmasq:輕量的 resolver/authoritative小伺服器,方便快速測試
  • bind9:可做完整權威DNS並做DNSSEC簽章
  • tcpdump:抓封包,有助於觀察DNS流量

一.基本查詢:dig/nslookup

在這個實作當中主要是讓大家理解基本紀錄型別(A、MX、TXT等)與遞迴流程。

指令:

dig A example.com

dig example.com ANY

dig MX example.com

dig TXT example.com
  • A記錄(IPv4)
  • 所有記錄(ANY)
  • MX記錄(郵件)
  • TXT(SPF、其它)

四個指令的結果在這邊

A紀錄:
https://ithelp.ithome.com.tw/upload/images/20251002/201780081wNc8wURcN.png

所有記錄:
https://ithelp.ithome.com.tw/upload/images/20251002/20178008hNJRxYyomU.png

MX記錄:
https://ithelp.ithome.com.tw/upload/images/20251002/20178008xM6j1C7Mqv.png

TXT:
https://ithelp.ithome.com.tw/upload/images/20251002/20178008JxzYxLwOYl.png

這邊我們以A紀錄為例,跟大家說明這個輸出結果是甚麼意思,首先看到HEADER的部分,這是回應標頭,內容包含了這些

  • status:NOERROR → 查詢成功且沒有錯誤
  • qr:這是查詢的回應(query response)
  • rd:我們要求遞迴查詢(recursion desired)
  • ra:DNS伺服器支持並執行了遞迴(recursion available)
  • QUERY:1→ 只問了一個問題
  • ANSWER:6→ 回傳了6條答案(6個A記錄)
  • AUTHORITY:0→ 沒有額外的權威DNS server資訊
  • ADDITIONAL:1→ 有1條附加資訊(這裡是EDNS的OPT)

回答部分

  • 6條A記錄,代表example.com可以對應到這6個IPv4地址
  • 73:這是TTL(Time To Live),意思是快取這筆記錄 73 秒後就需要重新查詢
  • IN:Internet class(幾乎所有DNS查詢都是這個)
  • A:IPv4地址紀錄

二.追蹤遞迴解析流程

在這個步驟我們可以了解DNS問題從哪裡被回答(遞迴resolver會向root/tld/authoritative查)

指令:

dig example.com +trace

https://ithelp.ithome.com.tw/upload/images/20251002/20178008FEKturuqBP.png
https://ithelp.ithome.com.tw/upload/images/20251002/20178008V0gAveAD8B.png

圖片是輸出結果,這邊我們可以看到step-by-step的結果,先問 root(.)接著是.com的NS,最後則問 example.com的authoritative name server

三.用dnsmasq建一個簡單的本地DNS(權威/forwarder)

這是第三個步驟,我們要做的事是快速當起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以下是我的實作截圖

https://ithelp.ithome.com.tw/upload/images/20251002/20178008NLgAoywtKf.png

其中大家可能看到 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

https://ithelp.ithome.com.tw/upload/images/20251002/20178008t3WLmevzuM.png

理論上結果會看到127.0.0.1,由此可知我們可以直接控制domain指向哪個 IP,模擬權威或快取污染

注意!如果你曾經使用5353埠請記得先用命令停止它或使用其他未占用的埠進行測試,而no-resolv則表示不要從 /etc/resolv.conf讀upstream伺服器

四.模擬DNS劫持

模擬在受控環境示範當resolver或權威被改寫時,用戶會被導到惡意IP

我們先開一個額外的WSL並開啟80埠,指令為:

sudo python3 -m http.server 80 &

https://ithelp.ithome.com.tw/upload/images/20251002/20178008T5L9epkkOQ.png

這時候我們可以用指令模擬,然後就會連到127.0.0.1的服務上,指令:

curl -v --resolve example.com:80:127.0.0.1 http://example.com/

https://ithelp.ithome.com.tw/upload/images/20251002/20178008maXP1LpmLi.png

--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請求:https://ithelp.ithome.com.tw/upload/images/20251002/20178008YnJ1MASJQw.png

抓取封包畫面:https://ithelp.ithome.com.tw/upload/images/20251002/20178008Uyr54Fli8g.png

如果想要顯示封包則可以使用這個指令:

sudo tcpdump -r dns.pcap -n

https://ithelp.ithome.com.tw/upload/images/20251002/20178008tAhsV5A88l.png

今日小結

以上也就是我們今天要做的基礎實作,從基本的查詢再到抓取封包,明天我們將會介紹一些新的東西(畢竟目前欠的實作已經補完了)


上一篇
Day21 -TLS實作
系列文
Izumi從零開始的30日WEB馬拉松22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言