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, 数据泄露检测, 无后门, 红队评估, 逆向工具