当用户在浏览器中输入一个网站名称(如 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 服务器的响应将比您伪造的响应更快,您的攻击将很难成功。