VoidJarr/bounce53
GitHub: VoidJarr/bounce53
bounce53 是一款面向授权渗透测试的 DNS 中继与数据外发评估工具,通过七步模型检测企业 DNS 解析器的安全弱点。
Stars: 0 | Forks: 0
# bounce53
**DNS 中继数据外发评估工具** 作者:VoidJarr
仅供授权的渗透测试使用。
使用线性七步测试模型(T1–T7)测试企业 DNS 解析器是否容易受到基于 DNS 的数据外发/中继滥用的影响:
- **T1** — 外部中继可行性(UDP + TCP)
- **T2** — 记录类型覆盖范围(UDP 完整集合;TCP 仅限 A+TXT)
- **T3** — 标签长度容忍度 + qname 最小化建议
- **T4** — 高熵/IDS 模式容忍度
- **T5** — 响应负载容量(TXT + EDNS 探测,截断,TCP 回退)
- **T6** — 速率限制(30 次查询突发 + 可选的约 90 次查询,以约 1 QPS 持续发送)
- **T7** — 直接出站绕过(UDP/53、TCP/53、DoH,尽力的 DoT)
结果包括各传输协议的详细信息、用于启发式测试的显式 OOB 验证标签,以及可操作的修复建议。默认开启 TCP,并包含嵌套的 `transport.udp` / `transport.tcp` 结果。使用 `--udp-only` 可进行更隐蔽的运行。
## 法律声明
此工具必须仅针对您拥有或获得明确书面授权进行测试的系统使用。根据适用的网络犯罪立法,未经授权针对第三方基础设施的使用可能构成刑事犯罪。
## 环境要求
- Python 3.6+
- `dig`(`dnsutils` / `bind-utils` 的一部分)
- 您控制的具有权威域名服务器(您的攻击机)的 OOB 域名 — T3/T4 确认必需
```
# Debian / Kali
sudo apt install dnsutils
# RHEL / CentOS / Fedora
sudo dnf install bind-utils
```
除标准库外无其他 Python 依赖项。
## 快速开始
```
# 克隆 / 复制脚本
chmod +x bounce53.py
# 最低要求参数
python3 bounce53.py -r 10.0.0.53 -d oob.foobar.com
# 带有自定义输出和 timeout 的完整示例
python3 bounce53.py -r 10.0.0.53 -d oob.foobar.com \
-o /tmp/client-dns-report -f json \
--timeout 8
# Quiet 模式(更低足迹 — 跳过 T4 entropy、T7 bypass 和 T6 rate-limit burst)
python3 bounce53.py -r 10.0.0.53 -d oob.foobar.com \
--skip-ratelimit --skip-entropy --skip-bypass
# TCP 默认在 T1–T6 和 T5(response)中开启。使用 --udp-only 来减少噪声 / 查询量。
python3 bounce53.py -r 10.0.0.53 -d oob.foobar.com --udp-only
# 选择性持续低速速率测试(在 burst 之后)
python3 bounce53.py -r 10.0.0.53 -d oob.foobar.com --stealth-rate
# Pipe-safe 输出(无 ANSI codes)
python3 bounce53.py -r 10.0.0.53 -d oob.foobar.com --no-color > output.txt
```
### 推荐:在第二个终端中监控您的 OOB NS
为了使 T3(标签长度)和 T4(熵)的结果具有决定性,请监视您的权威域名服务器以获取传入的查询:
```
# 在你的 OOB NS / attack server 上
sudo tcpdump -i any -n port 53
# 或通过 BIND query log
tail -f /var/log/named/queries.log
```
到达您的 NS 的查询确认了标签已穿过企业中继——即使解析器在本地返回 NXDOMAIN。
## 参数
| 标志 | 必填 | 默认值 | 描述 |
|------|----------|---------|-------------|
| `-r`, `--resolver` | ✅ 是 | — | 目标企业 DNS 解析器 IP |
| `-d`, `--oob-domain` | ✅ 是 | — | 您控制的 OOB 域名(NS 必须指向您的服务器) |
| `-o`, `--output` | No | `bounce53_report` | 输出文件的基本名称(无扩展名) |
| `-f`, `--format` | No | `txt` | 逗号分隔的输出格式(`txt`、`json`)。默认仅为 `txt`。 |
| `--timeout` | No | `5` | 每次查询的超时时间(以秒为单位) |
| `--skip-ratelimit` | No | off | 跳过 T6 — 省略 30 次查询的并发突发,减少痕迹 |
| `--skip-entropy` | No | off | 跳过 T4 — 避免发送高熵编码的子域名 |
| `--skip-bypass` | No | off | 跳过 T7 — 避免向 8.8.8.8/1.1.1.1/9.9.9.9 发送直接出站探测以及 DoH/DoT |
| `--no-color` | No | off | 禁用 ANSI 颜色输出(适用于管道传输和日志记录) |
| `--no-raw` | No | off | 从 JSON 报告中省略原始 dig 命令/输出详细信息(文件更小) |
| `--udp-only` | No | off | 禁用 TCP 子探测(T1–T6 + T5 响应容量)。默认开启 TCP,并包含嵌套的 `transport.udp` / `transport.tcp` 结果。 |
| `--stealth-rate` | No | off | 在突发之后启用 T6 持续阶段(约 90 次查询,约 1 QPS)。选择启用;增加约 90 秒。 |
| `--skip-doh-dot` | No | off | 跳过 T7 中的 DoH/DoT 子检查(UDP/53 + TCP/53 仍会运行)。 |
| `--sleep` | No | 0.5 | 测试之间休眠的秒数(默认 0.5;快速运行时使用 0)。 |
### 传输协议(UDP + TCP)— 默认开启
TCP 是一等子维度。默认情况下(除非使用 `--udp-only`),T1、T2、T3、T4、T5(响应容量)和 T6 将通过 UDP 和 TCP 运行。结果在嵌套的 `transport` 对象下报告:
```
"T1_external_relay": {
"severity": "HIGH",
"finding": "...",
"transport": {
"udp": { "vulnerable": true, "detail": "..." },
"tcp": { "vulnerable": true, "detail": "..." }
}
}
```
整体测试严重性取两种传输协议中最严重的一项(当两者同时运行时)。`--udp-only` 会在 TCP 阶段产生 `{"skipped": true, "reason": "udp-only"}`,并减少查询量/噪音。
T7(直接出站)始终尝试 UDP/53 + TCP/53;除非使用 `--skip-doh-dot`,否则将包含 DoH/DoT。
## 测试覆盖范围(T1–T7)
**T1 — 外部中继可行性**
测试解析器是否会转发对外部名称(google.com + t1-relay.)的查询。默认 UDP + TCP。
**严重性(如果任一阶段发生中继):** HIGH
**T2 — 记录类型覆盖范围**
通过 UDP(完整集合)测试 A/TXT/MX/CNAME/NS/AAAA,通过 TCP 测试 A+TXT。TXT 是用于高带宽数据外发的高风险类型。
**严重性(如果 TXT 通过 UDP 发生中继):** HIGH
**T3 — 查询负载:标签长度**
测试 30/45/60/63 字符的标签。针对每种传输协议报告 `max_passing_chars` 和 `per_label_results`。包含 `qname_minimization_risk: "unknown"`。
**需要 OOB 验证**(打印确切的较长标签以便于日志搜索)。
**严重性(60+ “通过”):** HIGH(启发式)
**T4 — 查询负载:熵 / IDS**
测试三种特定的高熵模式 + 低熵基准。基准失败会降低严重性。
**需要 OOB 验证**(打印确切的模式标签)。
**严重性(0 个模式被阻止):** HIGH(启发式)
**T5 — 响应负载容量**
测量来自 OOB 负载记录(或 google.com 回退)的 TXT 响应大小,外加 EDNS 缓冲区大小探测(512/1232/4096)、截断检测,以及看到 `TC` 时的 TCP 回退。
**严重性:** 根据观察到的 TXT 长度进行缩放(≥200 = HIGH,≥50 = MEDIUM)。
**T6 — 速率限制与持续吞吐量**
30 次查询的并发突发(UDP + TCP)。可选的 `--stealth-rate` 增加了约 90 次查询、约 1 QPS 的持续阶段,并带有成功率和持续时间统计。
**严重性(突发时无限制):** HIGH
**T7 — 直接 DNS 出站绕过**
测试评估主机通过 UDP/53、TCP/53、DoH(Cloudflare + Google)以及尽力的 DoT 到公共解析器的直接可达性。`--skip-doh-dot` 可跳过加密路径。
**严重性(任何路径可达):** CRITICAL
**强烈警告:** 结果仅反映运行该工具的机器。需从具有代表性的内部主机重新测试。
## 输出
默认情况下,仅从 `--output` 基本路径(默认为 `bounce53_report`)生成 `.txt` 报告。
使用 `-f json`(或 `-f txt,json`)也可生成机器可读的 JSON 报告,其中包含发现结果、传输协议详细信息、`raw_queries`(除非使用 `--no-raw`)、`limitations_and_caveats` 以及修复建议。
TXT 报告使用与活动终端相同的简洁、对齐的格式(包括 T3/T4/T6 的 OOB 检查标签)。
当您不需要完整的 dig 跟踪记录时,请使用 `--no-raw` 来获取更小的 JSON 文件。
## 严重性评级
| 评级 | 含义 |
|--------|---------|
| `CRITICAL` | 直接外部 DNS 绕过敞开 — 完全没有过滤 |
| `HIGH` | 中继敞开,TXT/长标签通过,无速率限制 — 完整的数据外发工具套件可行 |
| `MEDIUM` | 部分中继(仅 A 记录),软速率限制,或部分熵阻止 |
| `LOW` | 控制存在但不完整 — 有限的残余风险 |
| `NONE` | 测试通过 / 控制有效 |
整体严重性反映了所有测试中单项最严重的发现。
## 准确性与验证
T3 和 T4 依赖于解析器的 RCODE 启发式方法(针对不存在子域名的 NXDOMAIN/NOERROR)。这些响应经常由 RPZ、安全产品、防火墙或解析器本身合成——它们**不**能证明查询已到达权威服务器。
T7 仅测量评估主机的直接出站。受感染的内部主机几乎总是面临更严格的控制。
**务必**将 `raw_queries`(或为 T3/T4/T6 打印的显式 OOB 检查标签)与真实的 OOB/权威日志进行交叉比对以获取真实情况。该工具突出了您应该搜索的确切名称/模式。
这些要点(以及更多内容)包含在每份生成的报告的 LIMITATIONS & CAVEATS 部分中。
## MITRE ATT&CK 映射
| 技术 | ID | 战术 |
|-----------|----|--------|
| 应用层协议:DNS | T1071.004 | Command and Control |
| 通过替代协议外发 | T1048.003 | Exfiltration |
## 终端输出示例
```
./bounce53.py -r 192.168.91.1 -d uid.oastify.com
▗▖ ▄▄▄ █ ▐▌▄▄▄▄ ▗▞▀▘▗▞▀▚▖▄▄▄▄ ▄▄▄▄
▐▌ █ █ ▀▄▄▞▘█ █ ▝▚▄▖▐▛▀▀▘█ █
▐▛▀▚▖▀▄▄▄▀ █ █ ▝▚▄▄▖▀▀▀█ ▀▀▀█
▐▙▄▞▘ ▄▄▄█ ▄▄▄█
by VoidJarr
[INFO] Target: 192.168.91.1 | OOB: uid.oastify.com | Timeout: 5s | Output: bounce53_report | TCP: enabled
[INFO] Capture OOB traffic or check dashboard.
T1 — External Relay Viability
[PASS] UDP google.com + t1-relay.uid.oastify.com → answer(s) received
[PASS] TCP google.com + t1-relay.uid.oastify.com → answer(s) received
T2 — Record Type Coverage
[PASS] UDP relayed: A, TXT, MX, CNAME, NS, AAAA
[PASS] TCP (A+TXT only) relayed: A, TXT
T3 — Query Payload: Label Length
[PASS] UDP 30-char label (baseline) → resolver returned NXDOMAIN/NOERROR (heuristic)
[PASS] UDP 45-char label (medium exfil chunk) → resolver returned NXDOMAIN/NOERROR (heuristic)
[PASS] UDP 60-char label (typical dnscat2/DNSExfil) → resolver returned NXDOMAIN/NOERROR (heuristic)
[PASS] UDP 63-char label (DNS spec maximum) → resolver returned NXDOMAIN/NOERROR (heuristic)
[INFO] UDP max passing chars: 63
[PASS] TCP max passing chars: 63
[INFO] OOB check: 60-char: ifaucqkbifaucqkbifaucqkbifaucqkbifaucqkbifaucqkbifaucqkbifau.uid.oastify.com
63-char: ifaucqkbifaucqkbifaucqkbifaucqkbifaucqkbifaucqkbifaucqkbifaucqk.uid.oastify.com
T4 — Query Payload: Entropy / IDS
[INFO] UDP baseline reached: True
[PASS] UDP base32 encoded (repeating pattern, 40 chars) → reached auth NS
[PASS] UDP base32 encoded (random bytes, max entropy, 40 chars) → reached auth NS
[PASS] UDP hex encoded (32-char hex string) → reached auth NS
[INFO] UDP patterns blocked: 0/3
[INFO] TCP baseline reached: True
[PASS] TCP base32 encoded (repeating pattern, 40 chars) → reached auth NS
[PASS] TCP base32 encoded (random bytes, max entropy, 40 chars) → reached auth NS
[PASS] TCP hex encoded (32-char hex string) → reached auth NS
[INFO] TCP patterns blocked: 0/3
[INFO] OOB check: ifaucqkbifaucqkbifaucqkbifaucqkbifaucqkb-t4b32rep.uid.oastify.com
ja4ffihnng3vqyzjhrh4gwlodbze2tveng5klhjb-t4b32rnd.uid.oastify.com
4f3a9c2b7e1d6f8a0b5c9d3e7f2a4b6c-t4hex.uid.oastify.com
T5 — Response Payload Capacity
[PASS] UDP TXT payload → 66 chars via t5-payload.uid.oastify.com
[PASS] TCP TXT payload → 66 chars via t5-payload.uid.oastify.com
T6 — Rate Limiting & Sustained Throughput
[INFO] UDP burst: 30/30 @ 26.9 QPS (1.1s)
[INFO] TCP burst: 30/30 @ 32.3 QPS (0.9s)
[WARN] No rate limiting detected — 30/30 resolved at 26.9 QPS (UDP burst)
[INFO] OOB check: *.t6-ratelimit.uid.oastify.com
T7 — Direct DNS Egress Bypass
[PASS] UDP/53: ['8.8.8.8', '1.1.1.1', '9.9.9.9']
[PASS] TCP/53: ['8.8.8.8', '1.1.1.1', '9.9.9.9']
[PASS] DoH: ['cloudflare', 'google']
[PASS] DoT: ['8.8.8.8']
══════════════════════════════════════════════════════════════
ASSESSMENT SUMMARY
══════════════════════════════════════════════════════════════
Target Resolver : 192.168.91.1
OOB Domain : uid.oastify.com
Duration : 11.4s
Overall Risk : CRITICAL
Note : verify T3/T4/T6 via OOB; T7 reflects this host only.
Test Severity Finding
───────────────────────────────────────────────────────────────────────────────
T1 — External Relay Viability HIGH Resolver relays external DNS queries
T2 — Record Type Coverage HIGH TXT relay open — high-bandwidth covert channel viable (dnscat2, DNSExfiltrator)
T3 — Query Payload: Label Length HIGH Resolver returns NXDOMAIN/NOERROR for labels up to 63 chars
T4 — Query Payload: Entropy / IDS HIGH No SERVFAIL/drops for tested patterns
T5 — Response Payload Capacity MEDIUM Moderate TXT payload relayed (66 chars) — chunked exfil viable
T6 — Rate Limiting & Sustained Throughput HIGH No rate limiting detected — 30/30 resolved at 26.9 QPS (UDP burst)
T7 — Direct DNS Egress Bypass CRITICAL Direct DNS egress available — filtering absent or incomplete
[INFO] Report saved → bounce53_report.txt (raw queries: 108)
[INFO] Global OOB search terms: see per-T OOB Check sections above (T3/T4: full long labels; T6: *.t6-ratelimit.* and *.t6-sustained.*)
```
## 许可证
该项目基于 MIT 许可证授权。
版权所有 (c) VoidJarr
发布用于授权的攻击性安全研究和渗透测试。不提供任何担保。作者对滥用不承担任何责任。
标签:Atomic Red Team, DNS安全, Python, 数据泄露检测, 无后门, 红队评估, 逆向工具