oryxlabs/PolarDNS
GitHub: oryxlabs/PolarDNS
PolarDNS 是一个用 Python 编写的专用权威 DNS 服务器,能够生成各种畸形和非标准 DNS 响应,用于对 DNS 解析器、客户端和库进行渗透测试与漏洞研究。
Stars: 236 | Forks: 21
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 服务器解析内容,本质上是在向它发出如何响应的指令。这意味着由你(客户端)来指定 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 秒的延迟:
在上面的示例中,我们使用了 [`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 @
通过指示 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, 测试工具, 漏洞研究, 畸形数据包, 网络协议分析, 网络安全, 请求拦截, 隐私保护