DNS 攻击实验 - 本地攻击
Section outline
-
-
把 zip 文件下载到 VM 里, 然后用 unzip 命令解压缩。
-
-
当用户在浏览器中输入一个网站名称(如 www.example.com)时,用户的计算机会向本地 DNS 服务器发送一个 DNS 请求来查询该主机名的 IP 地址。攻击者可以嗅探 DNS 请求消息,然后立即创建一个假的 DNS 响应,并将其发送回用户计算机。如果假响应比真实响应先到达,它将被用户计算机接受(见下图)。请编写一个程序来发起这样的攻击。以下提供了一个代码框架。
#!/usr/bin/env python3 from scapy.all import * import sys NS_NAME = "example.com" def spoof_dns(pkt): if (DNS in pkt and NS_NAME in pkt[DNS].qd.qname.decode('utf-8')): print(pkt.sprintf("{DNS: %IP.src% --> %IP.dst%: %DNS.id%}")) ip = IP(...) # 创建 IP 对象 udp = UDP(...) # 创建 UDP 对象 Anssec = DNSRR(...) # 创建答案记录 dns = DNS(...) # 创建 DNS 对象 spoofpkt = ip/udp/dns # 拼装出伪造的 DNS 数据包 send(spoofpkt) myFilter = "..." # 设置过滤器 pkt=sniff(iface='...', filter=myFilter, prn=spoof_dns)
当攻击程序正在运行时,您可以在用户计算机上运行 dig 命令。该命令将触发用户机器向本地 DNS 服务器发送 DNS 查询,该查询最终将发送到 example.com 域的权威名称服务器(如果缓存中没有答案)。如果您的攻击成功,您应该能够在响应中看到伪造的信息。请比较攻击前后的结果。在发起攻击之前,请确保清空本地 DNS 服务器的缓存。如果缓存中已有答案,来自本地 DNS 服务器的响应将比您伪造的响应更快,您的攻击将很难成功。 -
上述攻击的目标是用户的计算机。为了实现长期影响,每次用户的计算机发送 DNS 查询请求 www.example.com 时,攻击者的机器必须发送伪造的 DNS 响应。这效率不高。有一个更好的方式,可以攻击 DNS 服务器,而不是用户的计算机。
当本地 DNS 服务器接收到查询时,它首先从自己的缓存中查找答案。如果答案已经缓存,DNS 服务器将直接使用缓存中的信息进行回复。如果缓存中没有答案,DNS 服务器就会从其他 DNS 服务器获取答案。当它获得答案后,便会将答案存储到缓存中,下次查询时就不需要再向其他 DNS 服务器发请求。
因此,如果攻击者能够伪造其他 DNS 服务器的响应,本地 DNS 服务器会将伪造的响应存入缓存,并保持一定时间。下次,当用户的计算机想要查询相同的主机名时,它将从缓存中获得伪造的响应。这样,攻击者只需要伪造一次,影响就能持续到缓存信息过期为止。这个攻击被称为 DNS 缓存投毒。
请修改前一个任务中的程序来实现此攻击。在发起攻击之前,确保 DNS 服务器的缓存为空。可以使用以下命令来清空缓存:
# rndc flush
您可以检查本地 DNS 服务器的缓存,查看是否已经中毒。以下命令会首先将缓存的内容转储到一个文件中,然后显示该文件的内容:
# rndc dumpdb -cache # cat /var/cache/bind/dump.db
-
在上一个任务中,我们的 DNS 缓存投毒攻击仅影响了一个主机名,即 www.example.com。如果用户尝试获取另一个主机名(如 mail.example.com)的 IP 地址,我们需要再次发起攻击。如果我们能够发起一次攻击,并影响整个 example.com 域,这样会更高效。
方法是利用 DNS 响应中的权威(Authority)部分。在伪造响应时,除了伪造答案(Answer 部分),我们还可以在权威部分添加以下内容。当本地 DNS 服务器缓存了这一条目后,ns.attacker32.com 将被用作将来对 example.com 域中任何主机名查询的域名服务器。由于 ns.attacker32.com 是由攻击者控制的,因此它可以为任何查询提供伪造的答案。在我们的设置中,这台机器的 IP 地址是10.9.0.153。
;; AUTHORITY SECTION: example.com. 259200 IN NS ns.attacker32.com.
请在您的攻击代码中添加伪造的 NS 记录,并发起攻击。背景知识里面提供了如何在 DNS 响应包中包含 NS 记录的示例。在进行攻击之前,请记得先清空本地 DNS 服务器的缓存。如果攻击成功,当您在用户计算机上运行 dig 命令查询 example.com 域中的任何主机名时,您将得到 ns.attacker32.com 提供的伪造 IP 地址。请同时检查本地 DNS 服务器的缓存,查看伪造的 NS 记录是否已被缓存。 -
在之前的攻击中,我们成功地在本地 DNS 服务器的缓存投毒,使 ns.attacker32.com 成为 example.com 域的域名服务器。受到这个成功的启发,我们希望将其影响扩展到其他域。也就是说,在由查询 www.example.com 引发的伪造响应中,我们希望在权威部分添加以下条目,使得ns.attacker32.com 也被用作 google.com 的域名服务器。
;; AUTHORITY SECTION: example.com. 259200 IN NS ns.attacker32.com. google.com. 259200 IN NS ns.attacker32.com.
请稍微修改您的攻击代码,以便在本地 DNS 服务器上发起上述攻击。攻击后,检查 DNS 缓存并查看哪些记录已被缓存。请描述并解释您的观察结果。需要注意的是,我们攻击的查询仍然是对 example.com 的查询,而不是对 google.com 的查询。 -
在 DNS 响应中,有一个叫做附加部分(Additional Section)的记录,用于提供附加信息。在实际应用中,它通常用来提供某些主机名的 IP 地址,特别是那些出现在权威部分的主机名。本任务的目标是伪造该部分中的一些条目,并观察它们是否会成功缓存到目标本地 DNS 服务器中。特别是,当响应 www.example.com 的查询时,我们在伪造响应中除了答案部分的条目之外,还添加以下条目,:
;; AUTHORITY SECTION: example.com. 259200 IN NS ns.attacker32.com. example.com. 259200 IN NS ns.example.com. ;; ADDITIONAL SECTION: ns.attacker32.com. 259200 IN A 1.2.3.4 🄰 ns.example.net. 259200 IN A 5.6.7.8 🄱 www.facebook.com. 259200 IN A 3.4.5.6 🄲
条目 🄰 和 🄱 与权威部分中的主机名相关。条目 🄲 与响应中的任何条目无关,但它为用户提供了“额外的”帮助,这样用户就不需要查找 Facebook 的 IP 地址。请使用 Scapy 来伪造这样的 DNS 响应。您的任务是报告哪些条目会被成功缓存,哪些条目不会被缓存,并解释原因。 -
你需要提交一份带有截图的详细实验报告来描述你所做的工作和你观察到的现象。你还需要对一些有趣或令人惊讶的观察结果进行解释。请同时列出重要的代码段并附上解释。只是简单地附上代码不加以解释不会获得学分。实验报告的提交方式会由你的老师进行具体安排。