copyleftdev/puhi
GitHub: copyleftdev/puhi
基于Rust和tokio构建的高性能异步DNS解析与暴力破解工具,通过共享缓存解析器设计大幅超越dnsx性能
Stars: 0 | Forks: 0
# puhi
**海鳝 —— 快速异步 DNS 解析器与暴力破解工具。**
Puhi 的诞生源于在 syscall 层面对 dnsx 进行 strace 分析,发现在处理 17 个主机名时产生了 33,047 次系统调用,随后构建了一个 Rust 替代品以消除 Go 运行时的开销。它使用一个带有缓存机制的共享异步解析器,而不是 100 个分别向 8 个解析器打开独立 UDP socket 的 goroutine。
侦察舰队的一部分,与 [leviathan](https://github.com/copyleftdev/leviathan) 和 [mano](https://github.com/copyleftdev/mano) 协同工作:
```
leviathan -d hackerone.com -s | puhi --resp --recon | mano -s --title --status-code
```
海怪负责发现目标。海鳝负责映射每条记录。鲨鱼负责吞噬它们。
## 为什么会有这个项目
对 dnsx 运行 `strace -c -f` 揭示了以下问题:
| 瓶颈 | 调用次数 | 耗时 | 占比 |
|---|---|---|---|
| **futex 竞争** | 7,168 (220 errors) | 1.02s | 53% |
| **epoll_pwait 抖动** | 16,005 | 0.16s | 8% |
| **nanosleep 自旋等待** | 690 | 0.32s | 17% |
| **41MB 二进制文件** | — | — | 臃肿 |
17 个主机名产生了 33,047 次系统调用 —— **每个域名 1,944 次系统调用。** 100 个 goroutine 在无缓冲 channel 上争抢,同时 16,005 次 epoll 调用让内核的事件循环不堪重负。
## 改变了什么
| dnsx (Go) | puhi (Rust) | 结果 |
|---|---|---|
| 100 个 goroutines + 无缓冲 channel | tokio `buffer_unordered` | **futex 调用减少 83%** |
| 16,005 epoll_pwait | 639 epoll_wait | **epoll 调用减少 25 倍** |
| 690 nanosleep (自旋等待) | 2 clock_nanosleep | **sleep 减少 345 倍** |
| 每个主机名查询 8 个解析器 | 单一缓存解析器 | 无 DNS 扇出浪费 |
| 41MB 二进制文件 | 2.1MB (stripped) | **体积减少 95%** |
## 正面交锋
17 个 HackerOne 子域名,查询所有记录类型:
| | dnsx | puhi |
|---|---|---|
| **实际耗时 (Wall clock)** | 1.09s | 0.14s |
| **CPU 时间** | 0.13s | 0.03s |
| **发现的记录数** | 120 | 157 |
| **系统调用总数** | 33,047 | 5,132 |
| **二进制文件大小** | 41 MB | 2.1 MB |
**快 8 倍。记录多 31%。系统调用少 6 倍。二进制文件小 95%。**
针对相同目标,puhi 比 dnsx 多发现了 37 条 DNS 记录 —— 包括 CAA 记录、额外的 CNAME 链,以及 dnsx 完全遗漏的 SRV 记录。
## 用法
```
# 解析 A 记录 (默认)
puhi -l hosts.txt
# 所有记录类型
puhi -l hosts.txt --recon --resp
# 特定类型
puhi -l hosts.txt -a --aaaa --mx --txt --resp
# 通过管道来自 leviathan
leviathan -d target.com -s | puhi --resp -a --cname
# 仅响应值 (无主机名)
puhi -l hosts.txt --resp-only -a
# JSON 输出
puhi -l hosts.txt --recon -j
# DNS 暴力破解
puhi -d example.com -w wordlist.txt -a --resp
# 单一目标
puhi -u hackerone.com --recon --resp
# 高并发
puhi -l hosts.txt -t 500 -a
# 输出到文件
puhi -l hosts.txt -o results.txt --recon --resp
```
## 记录类型
| 标志 | 类型 | 描述 |
|---|---|---|
| `-a` | A | IPv4 地址 |
| `--aaaa` | AAAA | IPv6 地址 |
| `--cname` | CNAME | 规范名称 |
| `--mx` | MX | 邮件交换服务器 |
| `--ns` | NS | 域名服务器 |
| `--txt` | TXT | 文本记录 (SPF, DKIM, 验证) |
| `--soa` | SOA | 起始授权机构 |
| `--srv` | SRV | 服务记录 |
| `--ptr` | PTR | 反向 DNS |
| `--caa` | CAA | 证书颁发机构授权 |
| `--recon` | ALL | 查询所有类型 |
## 设计哲学
**一个解析器,一个缓存。** dnsx 为每个 goroutine 创建独立的 DNS 连接。puhi 共享一个单一的 `hickory-resolver` 实例 —— 缓存的结果被自动复用,没有重复查询。
**tokio::join 用于并行记录类型查询。** puhi 不再为每种记录类型生成 goroutine,而是使用 `tokio::join!` 在单个任务内并发查询所有 10 种记录类型。零调度开销。
**2.1MB,因为 DNS 解析不需要 41MB。** 没有 HybridMap 磁盘存储,没有 CDN 检测数据库,没有 PDCP 云集成。只有 DNS 查询,纯粹且快速。
## 舰队
```
leviathan → puhi → mano
find map probe
subdomains DNS HTTP
```
## 安装
```
git clone https://github.com/copyleftdev/puhi.git
cd puhi
cargo build --release
cp target/release/puhi /usr/local/bin/
```
需要 Rust 1.70+。
## 许可证
MIT
标签:A记录, CNAME记录, DNS枚举, DNS爆破, DNS解析, DNS记录枚举, ESC4, Leviathan生态系统, MX记录, Nmap集成, OSINT, Rust, SRV记录, 中间人攻击前置, 可视化界面, 子域名挖掘, 开源项目, 异步编程, 性能优化, 检测绕过, 网络安全工具, 网络流量审计, 轻量级工具, 通知系统, 高效并发