章节大纲

  • 当用户在浏览器中输入一个网站名称(如 www.example.com)时,用户的计算机会向本地 DNS 服务器发送一个 DNS 请求来查询该主机名的 IP 地址。攻击者可以嗅探 DNS 请求消息,然后立即创建一个假的 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 服务器的响应将比您伪造的响应更快,您的攻击将很难成功。