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记录, 中间人攻击前置, 可视化界面, 子域名挖掘, 开源项目, 异步编程, 性能优化, 检测绕过, 网络安全工具, 网络流量审计, 轻量级工具, 通知系统, 高效并发