copyleftdev/leviathan

GitHub: copyleftdev/leviathan

基于 Rust 构建的高效多阶段子域名枚举引擎,通过五阶段流水线实现比传统工具更快更全面的资产发现。

Stars: 1 | Forks: 0

# leviathan **源自深渊 —— 多阶段子域名侦察引擎。** Leviathan 诞生于在 syscall 级别对 subfinder 进行 strace 追踪,识别其架构中的每一个瓶颈,并构建了一个从头开始的替代品,消除了每一个瓶颈。它不是封装、分支或重实现 —— 它是当你围绕操作系统实际工作方式从第一性原理设计时,子域名枚举应有的样子。 ``` leviathan -d hackerone.com ``` ## 为什么存在这个项目 我们在 subfinder 上运行了 `strace -c -f` 并发现: | 瓶颈 | 原因 | 实际消耗时间 | |---|---|---| | **214,744 次 futex 调用** | 每个源一个 Goroutine 加上无缓冲 channel | 62% (30.4s) | | **290,865 次 epoll_pwait** | 无跨源连接池 | 13.6% (6.7s) | | **4,220 次 nanosleep** | 带有指数退避的自旋等待速率限制器 | 12% (5.9s) | | **44% connect() 失败** | 仅 IPv4 系统上的 IPv6 回退 | 浪费的 syscalls | | **42MB 二进制文件** | 庞大的 Go 依赖树 + 调试符号 | 磁盘/内存 | subfinder 92% 的执行时间都花在*等待*上 —— 等待 mutex,等待内核的事件循环,等待它自己的速率限制器空转。在 30 秒的运行中,实际的 CPU 工作只占 2.5 秒。 Leviathan 消除了所有这些问题。 ## 改变了什么 | subfinder | leviathan | 结果 | |---|---|---| | 每个源一个 Goroutine + 无缓冲 `chan` | tokio async 任务 + 有界 MPSC | **减少 311 倍 futex 调用** | | 每个源独立的 HTTP 客户端 | 单一共享 `reqwest` 连接池 | **减少 1,476 倍 epoll 调用** | | 自旋等待速率限制器 (`nanosleep` 循环) | 基于定时器的令牌桶 (`governor`) | **减少 183 倍睡眠** | | 每次连接都进行 IPv6 回退 | 在客户端级别强制仅 IPv4 | 零 ENETUNREACH 浪费 | | `Connection: close` 头 | 默认 HTTP/2 keep-alive | TLS 会话复用 | | Go 运行时 (GC, 调度器, sysmon) | 零成本抽象的 Rust async | **减少 71 倍 CPU** | | 42MB 二进制文件 | 5.9MB (stripped) | **体积减小 86%** | | 仅被动 API | 带有主动侦察的 5 阶段流水线 | **结果增加 81%** | ## 五个阶段 Leviathan 不仅仅是查询 API。它运行一个多阶段流水线,每个阶段的发现都会输入到下一个阶段: ``` Phase 1: Passive Sources crt.sh, HackerTarget, AlienVault OTX, Wayback Machine, Anubis, CertSpotter, URLScan, RapidDNS Phase 2: DNS Record Mining + NSEC Zone Walk + TLS SAN Harvest SPF includes, DMARC rua/ruf, MX/NS/SOA/SRV/CNAME records, DNSSEC NSEC chain walking, TLS certificate Subject Alternative Names Phase 3: HTTP Header Mining + JavaScript Analysis Content-Security-Policy, CORS, Location, Link, X-Backend-Server headers, JS bundle fetching + regex extraction of hardcoded domains Phase 4: Reverse DNS /24 Sweep Resolve discovered hosts to IPs, PTR-scan every /24 CIDR for siblings Phase 5: Permutation Engine Smart brute-force: dev-api, api-staging, v2-api, etc. Generated from discovered labels, resolved via direct DNS ``` 每个阶段都会发现被动源不知道的子域名。仅 TLS 证书通常就能揭示 10-20 个名称。CSP 头将应用程序通信的每个域名列入白名单。反向 DNS 在相邻 IP 上查找兄弟域名。排列引擎捕捉命名模式。 ## 正面交锋 针对 `hackerone.com` 进行测试: | | subfinder | leviathan --passive | leviathan (full) | |---|---|---|---| | **发现的子域名** | 16 | 28 | 29 | | **实际耗时** | 30.4s | 4.8s | 44.7s | | **CPU 时间** | 2.58s | 0.04s | 2.94s | | **总 syscalls** | 524,770 | ~4,400 | ~12,000 | | **二进制大小** | 42 MB | 5.9 MB | 5.9 MB | 仅被动模式**快 6 倍**,并发现**多 75% 的子域名**。完整的 5 阶段运行耗时更长,因为它在做一些 subfinder 根本没做的事情 —— TLS 握手、DNS 记录挖掘、/24 PTR 扫描、JS 分析。 Subfinder 漏掉了 13 个 leviathan 发现的子域名。Leviathan 没有漏掉任何 subfinder 发现的子域名。 ## 用法 ``` # 基本扫描 — 全部 5 个阶段 leviathan -d example.com # 多个域名 leviathan -d example.com,target.org # 仅 Passive — API 来源,无主动探测 leviathan -d example.com --passive # Silent 模式 — 仅子域名,无 Banner/进度 leviathan -d example.com -s # JSON 输出 leviathan -d example.com --json # 写入文件 leviathan -d example.com -o results.txt # 跳过特定阶段 leviathan -d example.com --no-reverse # skip /24 PTR sweep leviathan -d example.com --no-permute # skip permutation brute-force # 调整并发和 Rate limiting leviathan -d example.com -c 50 --rate-limit 100 # Verbose — 查看每个来源的调试输出 leviathan -d example.com -v ``` ## 安装 ``` # From source git clone https://github.com/copyleftdev/leviathan.git cd leviathan cargo build --release cp target/release/leviathan /usr/local/bin/ ``` 需要 Rust 1.70+。运行时无外部依赖。 ## 架构 ``` +-----------------+ | CLI (clap) | +--------+--------+ | +--------v--------+ | Engine | | shared reqwest | | DashSet dedup | | governor ratelim| +--------+--------+ | +--------------+--------------+ | | | Phase 1: Passive Phase 2: DNS Phase 3: HTTP 8 async sources mining + NSEC headers + JS (crtsh, wayback, zone walk + scraping alienvault...) TLS SAN harvest | | | +--------------+--------------+ | +--------------+--------------+ | | Phase 4: Reverse DNS Phase 5: Permutation /24 PTR sweep of smart brute-force from discovered IPs discovered labels ``` 所有阶段共享: - **一个连接池** — 带有 HTTP/2、keep-alive、每个主机 32 个空闲连接的 `reqwest::Client` - **一个去重集合** — `DashSet` (无锁并发 hashset) 确保零重复输出 - **一个速率限制器** — `governor` 令牌桶,基于定时器,无自旋等待 - **仅 IPv4** — 消除 IPv6 回退导致的 ENETUNREACH syscall 浪费 - **有界背压** — 容量为 256 的 MPSC channel 防止无界内存增长 ## 设计哲学 **先测量。** 每个设计决策都追溯到 syscall 计数、strace 时间戳或内核事件。我们没有猜测瓶颈 —— 我们对它们进行了监测。 **最快的代码是不运行的代码。** Subfinder 进行 524,770 次 syscall 来找到 16 个子域名。Leviathan 进行约 4,400 次找到 28 个。大多数“性能优化工作”是消除不必要的工作,而不是让必要的工作更快。 **主动侦察不是可选项。** 被动 API 是一种商品 —— 每个工具都查询相同的端点并得到相同的结果。重要的子域名(内部基础设施、被遗忘的服务、配置错误的主机)存在于 TLS 证书、DNS 记录、HTTP 头和 JavaScript 包中。你必须去获取它们。 **流式处理,不要缓冲。** 结果在发现时即出现。无需等待所有源完成才能看到输出。有界 channel 提供背压,而不是无界的内存增长。 **单一二进制,无依赖。** 5.9MB 静态链接。可在任何 Linux 机器上运行。不需要 Python,不需要 Node,不需要 Docker,默认源集不需要 API 密钥。 ## 愿景 Leviathan 是一种不同侦察方法的开端。当前一代侦察工具将子域名枚举视为“查询一些 API 并去重”。这只是入场券。 方向是朝着在协议级别理解网络基础设施的**全频谱侦察引擎**: - **ASN 扩展** — 发现一个 IP,映射整个自治系统,对每个地址进行反向 DNS - **证书图遍历** — 跨组织跟踪证书链,查找共享基础设施 - **服务指纹识别** — 无需主动扫描即可识别发现的主机上运行的内容(来自 CT 日志、Shodan、Censys 的被动 banner 抓取) - **递归发现** — 子域名的子域名,跨越组织边界的 CNAME 链跟踪 - **时间分析** — 使用历史 DNS/CT 数据跟踪随时间出现和消失的内容 - **异常检测** — 标记破坏命名模式的子域名、最近出现的子域名或指向异常基础设施的子域名 约束始终不变:**测量一切,不作假设,永远不要进行不需要的 syscall。** ## 许可证 MIT
标签:DNS挖掘, ESC4, GitHub, JS分析, NSEC Zone Walking, OSINT, Rust, Rust安全工具, TLS SAN收割, Tokio, 反向DNS, 可视化界面, 子域名收集, 子域名枚举, 子域名爆破, 安全侦察, 密码管理, 异步编程, 系统安全, 网络流量审计, 通知系统