Maginot DNS漏洞评估脚本说明

评估脚本获取measure.py源码

1.漏洞说明

来源

[USENIX Security ‘23]The Maginot Line: Attacking the Boundary of DNS Caching Protection

基本原理介绍

该漏洞是一种针对条件DNS服务器(CDNS) 的新型缓存投毒攻击。CDNS是一种被配置为同时充当递归解析器转发器的特殊DNS服务器。

攻击的核心在于利用CDNS在处理转发查询时存在的Bailiwick检查缺陷

  1. CDNS的递归模式和转发模式共享同一个全局缓存。
  2. 攻击者诱导CDNS查询一个被配置为转发的域名(例如 attacker.com),该查询被发送到攻击者控制的权威服务器。
  3. 攻击者控制的权威服务器在响应中,恶意地包含了一条针对其他任意域(甚至是顶级域,如 .org)的伪造NS记录。
  4. 由于CDNS在转发模式下未能正确地限制权限范围,它错误地接受并缓存了这条越权的NS记录。
  5. 这个恶意NS记录污染了全局缓存。此后,任何通过该CDNS对目标域(如 .org)的查询都将被劫持到攻击者指定的恶意服务器,从而实现了对整个域的流量劫持。

影响目标

  • 设备/软件: 存在漏洞的条件DNS服务器(CDNS)。这通常是一些配置为混合模式的DNS软件。
  • 域名: 任意域名,包括顶级域(TLD)。

影响软件版本

  • BIND (9.18.1之前的部分版本)
  • Microsoft DNS (Windows Server 2022及之前版本)
  • Knot Resolver, Technitium DNS Server 的部分版本。

2.漏洞监测工具实现

漏洞监测方法原理

提供的 mdns_measure.py 脚本是一个无害的、用于检测DNS服务器是否为易受攻击的CDNS的测量工具。其原理完全基于论文中描述的客户端测量方法,通过“缓存探测”(Cache Probing)旁路信道来推断服务器的内部行为。

  1. 识别CDNS: 脚本的核心是判断一个服务器是否同时具备递归转发两种行为。

    • 递归: 脚本查询一个随机、唯一的域名(如 [uuid].google.com)。一个标准的DNS服务器会对此进行递归解析,并在过程中缓存其父域(如 google.com)的NS记录。
    • 转发: 脚本查询一个被配置为转发的域名(如 example.com)的随机子域名。如果服务器执行转发,它将查询直接扔给上游,不会在本地缓存该域名的NS记录。
    • 缓存: 脚本在每次查询后,立即发送一个非递归 (rd=0) 的NS查询来检查相应父域的NS记录是否存在于缓存中。通过检查响应是否包含匹配的NS记录,即可判断服务器的行为是recursive还是forwarding
    • 如果服务器在测试中同时表现出这两种行为,它就被识别为CDNS
  2. 检查防御措施: 在确认目标是CDNS后,脚本会检查关键的防御机制。

    • DNSSEC验证: 脚本会查询一个已知DNSSEC签名错误的域名 (sigfail.verteiltesysteme.net)。如果服务器返回SERVFAIL,则证明其开启了DNSSEC验证,能够抵御此攻击。

监测是否有害

。该工具只发送标准的DNS查询请求,不涉及任何恶意负载或攻击行为。它仅用于测量和推断目标DNS服务器的配置和行为模式。

工具输入

脚本通过命令行参数接收目标IP,并通过内部的域名列表进行配置。

# 命令行输入
# sudo python3 mdns_measure.py <TARGET_IP>

# 脚本内部配置
DOMAINS_TO_PROBE = [
"google.com", # 期望触发递归
"example.com", # 期望触发转发 (需在目标CDNS上配置)
# ... 更多域名 ...
]
DNSSEC_SIGFAIL_DOMAIN = 'sigfail.verteiltesysteme.net' # 用于DNSSEC检查
TIMEOUT = 3 # 超时时间

工具输出

彩色的文本报告,清晰地展示对每个域名的行为探测结果 (recursiveforwarding),对防御机制的检查结果,并最后给出明确的结论:[VULNERABLE] (脆弱) 或 [NOT VULNERABLE] (不脆弱)。


3.漏洞监测工具使用

环境部署

无需特殊的权威服务器。该工具是一个纯客户端的测量脚本,可以对任何可达的DNS服务器进行评估。

使用环境配置

  • Python版本: Python 3.x
  • Requirements: scapy.
    pip install scapy

使用方法

  1. 打开 mdns_measure.py 文件,根据需要调整 DOMAINS_TO_PROBE 列表,确保其中包含大量已知的域名
  2. 在攻击机/测试机上,使用root权限运行脚本,并传入目标CDNS的IP地址作为参数。
    # 假设你的CDNS IP是 10.2.0.2
    sudo python3 measure_cdns.py 10.2.0.2

预期输出示例

[*] Starting FINALIZED MAGINOTDNS vulnerability assessment for: 10.2.0.2...
[INFO] Probing 'google.com' [SUCCESS] (Behavior: recursive)
[INFO] Probing 'baidu.com' [SUCCESS] (Behavior: recursive)
[INFO] Probing 'example.com' [SUCCESS] (Behavior: forwarding)
[INFO] Check: Identifying CDNS behavior [PASS] (Server is a CDNS. Observed: ['recursive', 'forwarding'])
[INFO] Check: DNSSEC validation enabled [FAIL] (Disabled - This server lacks a key defense)

------------------------------------------------------------
[*] Final Conclusion:
[VULNERABLE]
------------------------------------------------------------