oryxlabs/PolarDNS

GitHub: oryxlabs/PolarDNS

PolarDNS 是一个用 Python 编写的专用权威 DNS 服务器,能够生成各种畸形和非标准 DNS 响应,用于对 DNS 解析器、客户端和库进行渗透测试与漏洞研究。

Stars: 236 | Forks: 21

PolarDNS logo PolarDNS is a specialized authoritative DNS server written in Python 3.x, originally developed as a tool for security testing of DNS recursive resolvers from the server-side.

It allows the operator to produce custom DNS responses, making it suitable for in-depth DNS protocol testing purposes. _ PolarDNS 可用于测试: - DNS 解析器(服务端) - DNS 客户端 - DNS 库 - DNS 解析器和 dissectors - 任何处理 DNS 信息的软件 它同时支持 UDP 和 TCP 协议,并为操作员提供了对 DNS 协议层的完全控制能力。 PolarDNS 服务器可以生成各种非标准和不合规的 DNS 响应,包括违反 RFC 规范的高度异常和格式错误的 DNS 响应。 这对于以下方面非常有用: - 功能测试 - RFC 合规性测试 - 漏洞研究 ## 安装 有三种可用的方法来安装 PolarDNS。 PolarDNS 需要 Python 3.11 或更高版本,并且没有额外的依赖项。 ### 方法 1:通过 Pip 安装 这是安装和运行 PolarDNS 最简单的方法: ``` pip install polardns polardns ``` ### 方法 2:传统安装 你也可以克隆仓库并直接运行 PolarDNS: ``` git clone https://github.com/oryxlabs/PolarDNS.git cd PolarDNS python polardns.py ``` 如果你计划调试或修改代码,或者添加新功能,推荐使用此方法。 ### 方法 3:在 Docker 中运行 PolarDNS 你还可以在 Docker 容器中运行 PolarDNS: ``` docker run -p 53:53/tcp -p 53:53/udp oryxlabs/polardns ``` ## 运行 PolarDNS PolarDNS 服务器可以通过 `polardns/polardns.toml` 配置文件进行配置。 - 出于测试目的,默认配置在本地运行应该没有问题。 - 但是,你可能希望通过添加你的域名和域名服务器 IP 地址来调整配置。 启动 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 ``` 这表明服务器已启动并正在运行。 ## 使用 PolarDNS 默认情况下,服务器开始在所有网络接口上的 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 ``` 你应该会收到一条 IP 地址为 ``2.3.4.5`` 的 ``A`` 记录,类似于以下截图所示: PolarDNS example usage 这表明服务器正在正常工作。 ## 主要概念 通过请求 PolarDNS 服务器解析内容,本质上是在向它发出如何响应的指令。这意味着由你(客户端)来指定 PolarDNS 服务器应为你生成什么样的响应。 例如,考虑以下查询: ``` dig always.ttl2000000000.slp1500.yourdomain.com @127.0.0.1 ``` 你应该会再次收到一条包含 ``2.3.4.5`` IP 地址的 ``A`` 记录,但这一次的 TTL 值为 2,000,000,000(63.4 年),并且在发送响应之前会有 1.5 秒的延迟: PolarDNS custom TTL and latency 在上面的示例中,我们使用了 [`always`](https://oryxlabs.github.io/PolarDNS/catalogue/html/always.html) 基础功能(它总是会解析出内容),并将其与 [`ttl`](https://oryxlabs.github.io/PolarDNS/catalogue/html/ttl.html) 修改器结合使用以调整 TTL 值,以及 [`slp`](https://oryxlabs.github.io/PolarDNS/catalogue/html/slp.html) 修改器以便在发送响应之前进行等待。 ## PolarDNS 功能 PolarDNS 具有以下主要功能: 1. **功能 (Features)**:可以生成各种 DNS 响应。大多数功能都带有参数,这意味着可以调整它们的行为以生成多种不同的 DNS 响应。 2. **响应修改器 (Response modifiers)**:可以进一步修改从 PolarDNS 服务器发出的 DNS 响应。修改器独立于所选功能,可以自由组合。 目前已实现超过 70 种不同的功能和 19 种响应修改器。通过使用不同的功能并将它们与不同的响应修改器结合使用,可以生成无数种给定的响应变体。 请参阅包含所有已实现 **功能** 和 **响应修改器** 的 **[目录](https://oryxlabs.github.io/PolarDNS/catalogue/catalogue.html)**。 这赋予了 PolarDNS 生成高度异常、反常规甚至格式错误的 DNS 响应的能力,使操作员能够了解接收方如何处理此类情况,以及接收方在技术上是否健壮和成熟。 PolarDNS 能够生成的 DNS 响应示例包括: - 别名 (CNAME) 链和别名循环 - DNS 头部格式错误(ID、Flags、节数) - 注入未经请求的记录(缓存投毒) - 注入任意长度的任意字节 - 不完整 / 空 / NULL 字节响应 - 压缩问题(循环、无效指针) - 缓慢传输的分块响应 - 非法标签或域名长度 - 任意大小的任意数量的 TXT 记录 - 数据包长度操纵(TCP) - 其他 这些可能会导致发现各种漏洞,例如: - 懒惰域攻击 - 幽灵域攻击 - 域名锁定攻击 - 缓存投毒 - 资源耗尽 - 崩溃、DoS 有关更多详细信息、更多示例和用例,请参阅 [BlackHat MEA 2023](https://github.com/oryxlabs/PolarDNS/tree/main/docs/pptx) 演示文稿(包括 BONUS 幻灯片)。 ## 测试递归 DNS 解析器 以下是你开始测试递归 DNS 服务器所需准备事项的简要概述。 1. 使用你喜欢的域名注册商购买一个用于测试的域名,例如 ``example123.com``。 2. 获取 2 台具有公共静态 IP 地址的 Linux VPS 实例 - 这些将作为你的域名服务器。 3. 在这两个实例上部署 PolarDNS 服务器。 4. 编辑每个实例上的 ``polardns/polardns.toml`` 配置文件,并相应地更改你的域名和域名服务器 IP 地址 - 两者的配置应保持一致。 5. 在域名注册商处,选择使用你自己的域名服务器来管理该域名。你需要指定主 NS 和辅 NS - 提供你实例的 IP 地址。 现在,你的基础设施应该已经准备好对你选择的任何递归 DNS 解析器进行测试了。 ### 测试过程分解 为了开始测试目标 DNS 递归解析器,你必须将你的查询定向到目标 DNS 解析器,例如 ``` dig always.example123.com @ ``` 例如,要测试 CloudFlare 公共 DNS: ``` dig always.example123.com @1.1.1.1 ``` 在解析过程中,目标 DNS 解析器将联系你的权威 PolarDNS 域名服务器(负责管理你的 ``example123.com`` 测试域)来解析查询。 你的其中一台 PolarDNS 服务器将响应目标 DNS 解析器。解析器将接收、解析并处理来自 PolarDNS 的响应。随后,它会将最终答案返回给你(客户端)。 以下是测试过程的可视化概述: 使用 PolarDNS 测试 DNS 解析器 通过指示 DNS 解析器解析你的 ``example123.com`` 域下的各种子域,你可以有效地测试 DNS 解析器的行为,并观察它如何处理各种意外情况(响应)。 例如,当它收到格式错误的 DNS 响应、注入了记录的响应或包含非法字符的记录时,它会如何处理?它最终又会向你(客户端)发送什么样的回答? ## 使用 GitHub Actions 进行自动化 E2E 测试 PolarDNS 可以与各种 DNS 解析器集成,以运行全面的端到端 (E2E) DNS 服务器测试套件。 此集成由 GitHub Actions 提供支持,目前为以下六种 DNS 解析器提供了参考模板: - BIND9 ([e2e-bind9.yaml](https://github.com/oryxlabs/PolarDNS/blob/main/.github/workflows/e2e-bind9.yaml)) - CoreDNS ([e2e-coredns.yaml](https://github.com/oryxlabs/PolarDNS/blob/main/.github/workflows/e2e-coredns.yaml)) - Dnsmasq ([e2e-dnsmasq.yaml](https://github.com/oryxlabs/PolarDNS/blob/main/.github/workflows/e2e-dnsmasq.yaml)) - Knot Resolver ([e2e-knot-v5.yaml](https://github.com/oryxlabs/PolarDNS/blob/main/.github/workflows/e2e-knot-v5.yaml), [e2e-knot-v6.yaml](https://github.com/oryxlabs/PolarDNS/blob/main/.github/workflows/e2e-knot-v6.yaml)) - PowerDNS ([e2e-powerdns.yaml](https://github.com/oryxlabs/PolarDNS/blob/main/.github/workflows/e2e-powerdns.yaml)) - Unbound ([e2e-unbound.yaml](https://github.com/oryxlabs/PolarDNS/blob/main/.github/workflows/e2e-unbound.yaml)) 当 GitHub Action 被触发时(例如,在提交代码时或手动触发),工作流将执行以下步骤: 1. 在 Docker 容器中启动选定的 DNS 解析器 2. 在单独的 Docker 容器中启动 PolarDNS 3. 将选定的解析器连接到 PolarDNS 4. 针对选定的 DNS 解析器运行 E2E 测试套件 要添加你自己的 E2E 测试,只需将它们放入 [test-e2e/](https://github.com/oryxlabs/PolarDNS/tree/main/test-e2e) 目录中。 正在寻找功能齐全的 DNS 服务器 E2E 测试套件?请联系 `ivan.jedek@oryxlabs.com`。 ## 添加新功能 向 PolarDNS 添加新功能对于发现真正新颖的 DNS 问题至关重要。借助 PolarDNS,你可以相对轻松地做到这一点。 PolarDNS 允许你快速添加新功能、尝试你的想法或开发 PoC,而无需构建自己的 DNS 服务器。你所需要的只是理解 Python 代码的能力以及对 DNS 协议进行实验的好奇心。 这里有一份详细的、循序渐进的 [贡献指南](https://github.com/oryxlabs/PolarDNS/blob/main/CONTRIBUTING.md) 帮助你入门。在那里,你不仅能找到如何添加新功能,还能了解如何调试 PolarDNS、提交 issue、分享想法等内容。 ## 链接 以下是一些在使用 PolarDNS 时非常有用的优秀资源。 DNS 协议相关链接: - https://en.wikipedia.org/wiki/List_of_DNS_record_types - https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml DNS 服务器: - https://en.wikipedia.org/wiki/Comparison_of_DNS_server_software - https://www.lifewire.com/free-and-public-dns-servers-2626062 ## 致谢 感谢所有对 PolarDNS 做出贡献的人!❤️
标签:DNS服务器, DNS解析, DNS解析器, Docker, GitHub, Python, Python安全, RFC规范, TCP, UDP, 协议测试, 合规性测试, 安全测试, 安全防御评估, 客户端测试, 开源项目, 情报收集, 攻击性安全, 无后门, 权威DNS, 测试工具, 漏洞研究, 畸形数据包, 网络协议分析, 网络安全, 请求拦截, 隐私保护