PolarDNS 是一个专门的权威 DNS 服务器,使用 Python 3.x 编写,最初作为从服务器端对 DNS 递归解析器进行安全测试的工具而开发。
_
PolarDNS 可用于测试:
它支持 UDP 和 TCP 协议,使操作员能够完全控制 DNS 协议层。
PolarDNS 服务器可以生成各种非标准和不兼容的 DNS 响应,违反 RFC 规范,包括高度异常和格式错误的 DNS 响应。
这对于以下方面很有用:
PolarDNS 需要 Python 3.11 或更新版本,并且没有额外的依赖项。
这是安装和运行 PolarDNS 最简单的方式:
pip install polardns
polardns
您也可以克隆仓库并直接运行 PolarDNS:
git clone https://github.com/oryxlabs/PolarDNS.git
cd PolarDNS
python polardns.py
如果您计划调试或修改代码,或添加新功能,建议使用此方法。
您也可以在 Docker 容器中运行 PolarDNS:
docker run -p 53:53/tcp -p 53:53/udp oryxlabs/polardns
PolarDNS 服务器可通过 polardns/polardns.toml 配置文件进行配置。
启动 PolarDNS 后,您应该看到类似以下的输出:
python polardns.py
1741599804.9039893 | PolarDNS v1.6.1 server starting up
1741599804.9039893 | Using '/path/to/your/polardns/polardns.toml' config file
1741599804.9039893 | Starting listener at tcp://0.0.0.0:53
1741599804.9039893 | Starting listener at udp://0.0.0.0:53
这表明服务器已启动并运行。
默认情况下,服务器在所有接口的 UDP 和 TCP 端口 53 (0.0.0.0:53) 上监听,准备回答 DNS 查询。
您可以通过发送以下示例查询在本地测试它,该查询应该始终解析到某个地址。
以 UDP 模式查询:
dig always.yourdomain.com @127.0.0.1
以 TCP 模式查询:
dig always.yourdomain.com @127.0.0.1 +tcp
您应该收到一个 A 记录,IP 地址为 2.3.4.5,类似于这个截图:
这表明服务器工作正常。
通过让 PolarDNS 服务器解析某个域名,您实际上是在指示它应该如何响应您。这意味着您(客户端)告诉 PolarDNS 服务器它应该为您生成什么样的响应。
例如,考虑以下查询:
dig always.ttl2000000000.slp1500.yourdomain.com @127.0.0.1
您应该再次收到一个 A 记录,IP 地址为 2.3.4.5,但这次 TTL 值为 2,000,000,000(63.4 年),并且在 1.5 秒延迟后返回:
在上面的例子中,我们使用了 always 基本功能(始终解析到某个地址),并结合了 ttl 修饰符来调整 TTL 值,以及 slp 修饰符在发送响应前等待一段时间。
PolarDNS 具有以下主要功能:
目前实现了 70 多种不同的功能和 19 种响应修饰符。通过使用不同的功能并结合不同的响应修饰符,可以生成给定响应的无数变体。
请参阅附带的 目录,其中列出了所有实现的功能和响应修饰符。
这使 PolarDNS 能够生成极其异常、不正常甚至格式错误的 DNS 响应,使操作员能够了解接收端如何处理此类情况,以及接收端在技术上是否健壮和成熟。
PolarDNS 可以生成的一些 DNS 响应示例包括:
这些可以导致发现各种漏洞,例如:
请参阅 BlackHat MEA 2023 的演示文稿(包括 BONUS 幻灯片)以获取更多详细信息、更多示例和用例。
以下是开始测试递归 DNS 服务器所需的高层概述。
example123.com。polardns/polardns.toml 配置文件,并相应更改您的域名和 nameserver IP 地址——两个实例配置相同。现在您的基础设施应该准备好测试您选择的任何递归 DNS 解析器了。
要开始测试目标 DNS 递归解析器,您需要将查询定向到目标 DNS 解析器,例如:
dig always.example123.com @<TARGET-RESOLVER-IP>
例如,要测试 CloudFlare 公共 DNS:
dig always.example123.com @1.1.1.1
在解析过程中,目标 DNS 解析器将联系您的权威 PolarDNS nameserver(管理您的 example123.com 测试域名)来解析查询。
您的其中一个 PolarDNS 服务器将响应目标 DNS 解析器。解析器将接收、解析和处理来自 PolarDNS 的响应。然后,它会将最终答案返回给您(客户端)。
以下是测试过程的视觉概览:

通过指示 DNS 解析器解析您 example123.com 域名下的各种子域,您可以有效地测试 DNS 解析器的行为,并查看它如何处理各种意外情况(响应)。
例如,当它获得格式错误的 DNS 响应、带有注入记录的响应或包含非法字符的记录时,它如何处理?它最终会向您(客户端)发送什么样的答案?
PolarDNS 可以与各种 DNS 解析器集成,以运行一套全面的端到端 (E2E) DNS 服务器测试套件。
此集成由 GitHub Actions 驱动,参考模板(工作流)目前可用于以下六个 DNS 解析器:
当 GitHub Action 被触发时(例如,在提交或手动触发时),工作流会执行以下步骤:
要添加您自己的 E2E 测试,只需将它们放在 test-e2e/ 目录中。
正在寻找功能完整的 DNS 服务器 E2E 测试套件?请联系 [email protected]。
向 PolarDNS 添加新功能对于发现真正新颖的 DNS 问题至关重要。使用 PolarDNS,您可以相对轻松地做到这一点。
PolarDNS 允许您快速添加新功能、尝试您的想法或开发 PoC,而无需构建自己的 DNS 服务器。您只需要理解 Python 代码的能力和对实验 DNS 协议的好奇心。
有一个详细的、循序渐进的 贡献指南 可以帮助您入门。在那里,您不仅可以了解如何添加新功能,还可以了解如何调试 PolarDNS、提交问题、分享想法等。
以下是一些在使用 PolarDNS 时非常有用的优秀资源。
DNS 协议相关链接:
DNS 服务器:
感谢所有为 PolarDNS 做出贡献的人!❤️