copyleftdev/mano
GitHub: copyleftdev/mano
一款用 Rust 编写的极速 HTTP 探测与指纹识别工具,通过连接池复用和异步调度优化实现比 httpx 更轻量高效的资产探测能力。
Stars: 0 | Forks: 0
# mano
**鲨鱼 —— 快速 HTTP 探测与指纹识别工具。**
Mano 的诞生源于在 syscall 层面对 httpx 进行 strace 分析,映射其 Go 运行时中的每一个瓶颈,并构建了一个 Rust 替代方案来逐一消除这些瓶颈。它能探测 HTTP 服务、提取标题、指纹识别技术栈、获取 TLS 证书并计算 body 哈希 —— 所有这些都在一个 4.9MB 的二进制文件中完成,体积缩小 93%,速度提升 6 倍。
专为与 [leviathan](https://github.com/copyleftdev/leviathan) 配合使用而设计:
```
leviathan -d hackerone.com -s | mano -s --title --status-code --tech-detect
```
海怪负责发现目标。鲨鱼负责吞噬它们。
## 为什么存在这个项目
我们在 httpx 上运行了 `strace -c -f`,发现:
| 瓶颈 | 原因 | 影响 |
|---|---|---|
| **1,783 次 futex 调用** (66%) | Goroutine 调度 + 无缓冲 channel | 17 个目标导致 Mutex 抖动 |
| **1,222 次 nanosleep** (8.7%) | Go 运行时 sysmon + 调度器自旋让权 (spin-yielding) | 每个目标 72 次休眠 |
| **零连接池** | `DisableKeepAlives: true`, `MaxIdleConnsPerHost: -1` | 每次请求都进行全新的 TLS 握手 |
| **DNS 扩散爆炸** | 每个主机名并行查询 5 个解析器 | 每个目标 12 次 connect() 调用 |
| **IPv6 ENETUNREACH 浪费** | 在仅支持 IPv4 的系统上优先尝试 IPv6 | 17 次失败的 connect() syscall |
| **69MB 二进制文件** | 编译入了 Wappalyzer DB、无头浏览器、MongoDB/MySQL/PostgreSQL 驱动 | 即使未使用也全部包含在内 |
| **每个目标 481 次 syscall** | 上述所有问题的总和 | 巨大的内核开销 |
httpx 使用 124% 的 CPU 在 1.6 秒内探测 17 个目标。这些 CPU 消耗大部分源于 Go 运行时的自我消耗。
## 改变了什么
| httpx (Go) | mano (Rust) | 结果 |
|---|---|---|
| 每个目标一个 Goroutine + 无缓冲 chan | tokio async + `buffer_unordered` | **futex 调用减少 31%** |
| `DisableKeepAlives: true` | 共享连接池并启用 keep-alive | TLS 会话复用 |
| 每个目标查询 5 个 DNS 解析器 | 带缓存的系统解析器 | 无 DNS 扩散浪费 |
| 到处都是 IPv6 回退 | 客户端层级仅使用 IPv4 | 零 ENETUNREACH 错误 |
| Go 运行时 (GC, sysmon, scheduler) | Rust async, 零成本抽象 | **CPU 消耗减少 88 倍** |
| 69MB 二进制文件 (wappalyzer, headless, DB) | 4.9MB (stripped) | **体积缩小 93%** |
| 每次运行 1,222 次 nanosleep | 3 次 clock_nanosleep | **休眠次数减少 407 倍** |
## 正面交锋
17 个 HackerOne 子域名,启用所有字段:
| | httpx | mano |
|---|---|---|
| **实际耗时 (Wall clock)** | 1.59s | 0.25s |
| **CPU 时间** | 1.98s | 0.04s |
| **CPU 利用率** | 124% | 15% |
| **总 Syscall 数** | 8,183 | 5,546 |
| **Futex 调用** | 1,783 | 1,228 |
| **nanosleep 调用** | 1,222 | 3 |
| **二进制大小** | 69 MB | 4.9 MB |
| **发现存活主机** | 11 | 11 |
**实际耗时快 6.4 倍。CPU 消耗少 49 倍。二进制体积小 93%。** 结果完全一致。
## 使用方法
```
# 基础探测 — 优先 HTTPS,回退 HTTP
mano -u hackerone.com
# 探测列表(兼容 httpx)
mano -l targets.txt
# 通过管道从 leviathan 或 subfinder 输入
leviathan -d hackerone.com -s | mano
# 所有字段
mano -l targets.txt -a
# 选择所需内容
mano -l targets.txt -s --title --status-code --tech-detect --server
# JSON 输出
mano -l targets.txt --json
# 跟随重定向
mano -l targets.txt -L --status-code
# 按状态码过滤
mano -l targets.txt --mc 200,301,302 # only show these
mano -l targets.txt --fc 404,403 # hide these
# 哈希与 TLS
mano -l targets.txt --hash --tls-grab
# 高并发
mano -l targets.txt -c 200
# 输出到文件
mano -l targets.txt -o results.txt
```
## 功能特性
- **HTTP 探测** — HTTPS 优先,自动回退到 HTTP
- **标题提取** — 快速正则匹配,无需完整 DOM 解析
- **技术检测** — 基于服务器头和 body 的模式匹配 (nginx, Cloudflare, WordPress, React, Django 等)
- **TLS 证书获取** — Subject CN, SANs, issuer
- **Body 哈希** — MD5, SHA-256
- **状态码 / content-length / server header**
- **行数和字数统计**
- **响应时间测量**
- **状态码过滤** — 匹配 (`--mc`) 和过滤 (`--fc`)
- **JSON 输出** — 每行一个结果,包含所有字段
- **Stdin 管道** — 可在管道流中直接替换 httpx
- **跟随重定向** — 可配置的重定向策略
## 设计哲学
**构建之前先测量。** 每一个架构决策都能追溯到 strace 的时间戳或 syscall 计数。
**只编译你用到的部分。** httpx 发布版高达 69MB,因为它包含了 wappalyzer 的完整数据库、一个无头 Chrome 桥接器以及三个数据库驱动 —— 即使你只想获取状态码。mano 编译后仅为 4.9MB,包含 HTTP 探测实际所需的一切。
**共享连接。** httpx 有意禁用 keep-alive (`DisableKeepAlives: true`),因为它探测的是不同的主机。但当你探测同一个 Cloudflare 边缘节点背后的 50 个子域名时,你需要为同一个 IP 支付 50 次 TLS 握手的开销。mano 使用共享连接池 —— 同一主机的探测会自动复用连接。
**不要与调度器对抗。** httpx 会产生 50 个 goroutine,它们立即在 channel 发送时阻塞,触发 futex 等待。mano 使用 `buffer_unordered` —— tokio 在无争用的情况下调度工作。
## 愿景
Mano 是双工具侦察流水线中的表层探测器:
```
leviathan (deep) → mano (surface)
find subdomains probe every host
DNS/CT/OSINT HTTP fingerprint
```
目标是构建一个**完整的攻击面分析器**:
- **Favicon 哈希** — MMH3/MD5,用于 Shodan 交叉比对
- **JARM 指纹识别** — TLS 配置指纹识别
- **兼容 Wappalyzer 的技术检测** — 加载自定义指纹数据库
- **截图捕获** — 无需内置浏览器的无头渲染
- **响应差异比对** — 检测运行之间的变化
- **API 模式** — 通过 HTTP 提供结果,以便与其他工具集成
- **自定义提取** — 对 response body 进行 regex/CSS 选择器提取
约束原则:**绝不发布用户未请求的代码。所有功能均为可选。保持二进制文件体积小巧。**
## 安装
```
git clone https://github.com/copyleftdev/mano.git
cd mano
cargo build --release
cp target/release/mano /usr/local/bin/
```
需要 Rust 1.70+。
## 许可证
MIT
标签:Body Hash, C2日志可视化, Httpx 替代, HTTP 探测, Qt框架, Rust, TLS 证书, 主机安全, 侦察流水线, 可视化界面, 实时处理, 密码管理, 异步编程, 技术栈检测, 指纹识别, 插件系统, 服务识别, 标题提取, 漏洞扫描辅助, 状态码, 端口探查, 网络安全, 网络流量审计, 轻量级二进制, 通知系统, 隐私保护