isneoz1/webcap
GitHub: isneoz1/webcap
通过 CDP 驱动真实浏览器捕获并解密完整网络流量,附带被动安全审计功能的开源 Rust 工具。
Stars: 1 | Forks: 0
webcap
指向一个 URL。获取它的所有网络流量——已解密。
`webcap` 通过 DevTools Protocol 驱动真实的 Chrome/Edge,并记录页面发起的**每一个** request。浏览器负责处理 TLS,因此您可以获得**已解密的 HTTPS**——完整的 request/response body——**无需代理,也无需安装证书**。给它一个或多个 URL;它会实时捕获所有内容,并生成一个带主题的 HTML 仪表板。

## 功能
- 🔓 **解密 HTTPS** — 明文查看 request 与 response body,无需 MITM 设置
- 🌐 **一切内容** — XHR/fetch、scripts、images、fonts、iframes、**workers**、WebSocket frames
- 🍪 **Headers、cookies、`Set-Cookie`**、重定向、远程 IP、TLS 证书与计时
- 🐛 **Console 日志与 JS 错误**,与网络请求一同捕获
- 🛡️ **被动安全审计** — 真实、有证据支撑的发现结果(无误报 fuzzing)
- 🕸️ **同源爬虫** (`--crawl`) 覆盖整个站点
- ⚡ **实时** — 每个 body 在下载完成的瞬间被抓取,以流式传输到 `live.jsonl`,**零重复**
- 📊 **带主题的 HTML 仪表板** — 可搜索、可过滤、独立且离线可用
- 💾 **JSON / JSONL / HAR** 输出(HAR 可在 Chrome 与 Firefox DevTools 中打开)
- 👁️ 用于 SSE/long-poll 的 **Watch 模式**,使用 **`--save-assets`** 将每个 response 提取到磁盘
## 安全审计
每次运行都会对捕获的流量进行被动审计,并**仅报告真实、有证据支撑的问题**——每条发现结果都会引用浏览器观察到的确切 header、cookie、body 或 TLS 参数,因此实际上不存在误报。绝对不会发送任何攻击 payload。

检查内容包括:缺失/脆弱的**安全 headers**(CSP、HSTS、X-Frame-Options、nosniff、Referrer-Policy)、**不安全的 cookies**(Secure/HttpOnly/SameSite)、response 中**泄露的 secrets 与 API keys**、**混合内容**、详细的 **error/stack-trace 与 SQL-error 泄露**、**目录列表**、暴露的 **source maps 及敏感文件**(`.env`、`.git` 等)、具有已知 CVE 的**过时 JS 库**、**脆弱的 TLS**,以及明文 **HTTP**。发现结果将被写入 `audit.json` 并显示在仪表板的 **AUDIT** 标签页中。
## 快速开始
需要 [Rust 工具链](https://rustup.rs)以及已安装的 Chrome/Edge。
```
git clone https://github.com/isneoz1/webcap
cd webcap
cargo install --path . # installs the `webcap` command
webcap https://example.com --open # capture + open the dashboard
```
## 示例
```
# 基础 — 捕获站点并打开 dashboard
webcap https://example.com --open
# 无需 scheme(默认为 https://)
webcap example.com
# 在一次运行中处理多个 URL
webcap https://a.com https://b.com https://c.com
# 输出格式
webcap https://example.com --format json # default: one document
webcap https://example.com --format jsonl # one line per request
webcap https://example.com --format har # opens in DevTools / Charles
# 自定义输出目录
webcap https://example.com -o my-capture
# 抓取整个站点(跟随同源链接 2 层深度,最多 100 个页面)
webcap https://example.com --crawl 2 --max-pages 100
# 跳过 security audit
webcap https://example.com --no-audit
# Watch 模式:固定时间记录(SSE / long-poll / 实时页面)
webcap https://example.com --duration-ms 60000
# 调整 idle detection 和硬性时间上限(毫秒)
webcap https://example.com --settle-ms 3000 --max-wait-ms 45000
# 多个 URL 之间的暂停
webcap https://a.com https://b.com --delay-ms 1000
# 限制带宽(kbit/s)
webcap https://example.com --throttle-kbps 512
# 将每个响应体提取到文件(assets/)
webcap https://example.com --save-assets
# 限制每个响应体的大小(字节)
webcap https://example.com --max-body-bytes 1000000
# 伪装 User-Agent
webcap https://example.com --user-agent "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0)"
# 指定特定的浏览器
webcap https://example.com --chrome "C:\Program Files\Google\Chrome\Application\chrome.exe"
# 显示浏览器窗口(调试)
webcap https://example.com --headful
# 精简捕获/生成的内容
webcap https://example.com --no-bodies # skip response bodies
webcap https://example.com --no-console # skip console / JS errors
webcap https://example.com --no-scroll # don't auto-scroll
webcap https://example.com --no-stream # don't write live.jsonl
webcap https://example.com --no-report # don't generate report.html
webcap https://example.com --quiet # no per-request output
# Kitchen sink
webcap https://example.com https://api.example.com \
--format har -o full-run --duration-ms 30000 \
--save-assets --throttle-kbps 1024 --open
```
## 所有选项
| 选项 | 描述 | 默认值 |
|---|---|---|
| `
...` | 一个或多个要捕获的页面(缺少 scheme 时默认为 `https://`) | — |
| `-o, --out ` | 输出目录 | `webcap-out` |
| `--format ` | `json` \| `jsonl` \| `har` | `json` |
| `--settle-ms ` | 结束页面抓取的空闲窗口时间 | `2000` |
| `--max-wait-ms ` | 每个页面的硬性时间上限 | `30000` |
| `--duration-ms ` | Watch 模式:记录 N 毫秒,忽略空闲时间 | off |
| `--crawl ` | 跟踪同源链接 N 层深度(整个站点) | `0` |
| `--max-pages ` | 爬取时最多访问的页面数 | `50` |
| `--delay-ms ` | URL 之间的暂停时间 | `0` |
| `--throttle-kbps ` | 节流带宽 (kbit/s) | off |
| `--max-body-bytes ` | 单个 body 的体积上限 | `5000000` |
| `--save-assets` | 将所有 response body 转储到 `assets/` | off |
| `--open` | 完成后打开 HTML 报告 | off |
| `--no-audit` | 跳过被动安全审计 | — |
| `--no-bodies` | 跳过获取 response bodies | — |
| `--no-console` | 跳过 console / JS 错误捕获 | — |
| `--no-scroll` | 不自动滚动页面 | — |
| `--no-stream` | 不写入 `live.jsonl` | — |
| `--no-report` | 不生成 `report.html` | — |
| `--headful` | 显示浏览器窗口 | headless |
| `--chrome ` | 要使用的浏览器可执行文件 | auto |
| `--user-agent ` | 覆盖 User-Agent | 浏览器默认值 |
| `-q, --quiet` | 屏蔽每个 request 的输出 | — |
| `-h, --help` | 显示帮助信息 | — |
## 输出 (`webcap-out/`)
| 文件 | 内容 |
|---|---|
| `report.html` | 带主题的仪表板 — Requests、**Audit**、Console 与 Cookies 标签页 |
| `audit.json` | 包含严重程度、证据与修复建议的安全发现 |
| `live.jsonl` | 实时流,每个 request 一行 JSON |
| `capture.json` · `.har` · `.jsonl` | 所选 `--format` 格式的完整捕获内容 |
| `assets/…` | 作为文件保存的每一个 response body (`--save-assets`) |
## 工作原理
启动带有临时 DevTools 端口的无头 Chrome,通过 WebSocket 连接(纯 Rust 实现——无需原生 TLS stack,由浏览器掌控 TLS),启用 `Network`/`Page`/`Runtime`/`Log` 域,自动附加到子 frames 和 workers 进行导航,然后将每个事件流式传输到有序且去重的捕获记录中,并在完成时提取每个 body。
## 授权使用
仅对**您拥有或明确授权测试**的站点捕获流量。`webcap` 仅记录它在您机器上启动的浏览器的流量——它绝不会拦截任何其他人的连接。
## 许可证
MIT © 2026 **NEOZ** ([isneoz1](https://github.com/isneoz1))标签:CDP协议, HTTPS解密, Rust, Snort++, Web安全审计, 可视化界面, 多模态安全, 网络流量审计, 网络流量抓包, 自动化爬虫, 被动扫描, 通知系统