not-narleeek/pi-caido

GitHub: not-narleeek/pi-caido

将 Caido 的 HTTP 代理、Repeater 和 HTTPQL 搜索能力封装为 pi agent 工具,使 AI 代理在渗透测试和 CTF 场景下能统一捕获、检索和重放所有 HTTP 流量。

Stars: 0 | Forks: 0

# pi-caido `pi-caido` 是一个 [pi 包](https://pi.dev/packages),它将 Caido 暴露为六个一等 agent 工具,外加一个 `/caido` 命令和一个实时状态页脚。它封装了一个小巧、**无依赖** 的 Python 自动化客户端,直接与 Caido 的 GraphQL API 通信。无需 Burp 扩展,无需浏览器自动化,无需额外的 daemon —— 只需要一个 Python 文件和一个 TypeScript 扩展。 ## 目录 - [功能简介](#what-it-does) - [环境要求](#requirements) - [安装](#install) - [首次运行设置](#first-run-setup) - [快速开始](#quick-start) - [架构](#architecture) - [工作原理](#how-it-works) - [配置](#configuration) - [HTTPQL 快速参考](#httpql-quick-reference) - [安全说明](#security-notes) - [故障排除](#troubleshooting) - [许可证](#license) ## 功能简介 agent 发出的每一个 HTTP 请求都可以路由经过 Caido,并且随后会: - 被 Caido 的 HTTP 历史记录**捕获**(可在 GUI 中实时查看), - 可使用 Caido 的 HTTPQL 过滤语言进行**搜索**, - 可与其余流量一起**重放**和导出。 具体而言,该包为 agent 提供了以下工具: | 工具 | agent 用途 | |------|----------------------------| | `caido_request` | 通过 Caido 的 Repeater 发送 HTTP 请求,并返回状态、headers 和 body。对于手动构造请求,优先使用此工具而不是 `curl`。 | | `caido_search` | 使用 HTTPQL 过滤捕获的历史记录,例如 `resp.raw.cont:"flag{"`。 | | `caido_get_request` | 根据 id 导出完整的原始请求/响应对。 | | `caido_history` | 列出最近捕获的请求。 | | `caido_proxy` | 打印代理 URL + CA 证书路径,以及用于将 `curl`、`httpx`、`ffuf`、`feroxbuster` 等工具路由到 Caido 的 `http_proxy` / `SSL_CERT_FILE` 环境变量配置。 | | `caido_scope` | 列出 scope 或添加新的允许/拒绝 host 通配符。 | 以及一个供您使用的 `/caido` 命令: ``` /caido status (instance · auth · project · request count) /caido start|stop launch / kill a headless Caido instance /caido proxy proxy URL + CA cert + export lines /caido httpql HTTPQL cheatsheet /caido send -u URL -m POST … fire a request through the Repeater /caido search 'resp.code.eq:500' /caido get full raw request+response /caido history ``` 实时的页脚 (🌐 `caido · · 42 reqs`) 可以让您一眼查看就绪状态。 ## 环境要求 | 组件 | 版本 | 说明 | |-----------|---------|-------| | **pi** | 任意近期版本 | 加载此包的 agent —— `npm i -g @earendil-works/pi-coding-agent` | | **Caido** | 2024.x+ | 桌面应用程序 (GUI) 或 `caido-cli`。从 安装 | | **Python** | 3.8+ | **仅使用标准库** —— 无需 `pip install`。`python3` 必须在 `PATH` 中 | | **Node** | 18+ | 用于 TypeScript 扩展 | Python 客户端仅使用标准库 (`urllib`, `json`, `base64`, `socket`, `subprocess`, `argparse`)。在 Python 端无需进行任何安装。 ## 安装 从三种来源中**选择一种**。默认情况下,`pi install` 会写入用户设置 (`~/.pi/agent/settings.json`);如果需要写入项目本地设置,请添加 `-l`。 ### 1. 从 git 安装(推荐 —— 始终最新) ``` pi install git:github.com/not-narleeek/pi-caido ``` 如果需要保证可复现性,可以固定 tag/commit: ``` pi install git:github.com/not-narleeek/pi-caido@v0.1.0 ``` ### 2. 从 npm 安装(一旦发布) ``` pi install npm:pi-caido ``` ### 3. 从本地克隆安装(用于开发) ``` git clone https://github.com/not-narleeek/pi-caido cd pi-caido npm install # installs TypeScript peer deps for local type-checking pi install . # or: pi install ./pi-caido (absolute or relative path) ``` 验证是否已加载: ``` pi list # pi-caido should appear under packages /caido status # inside a pi session ``` 在不将其提交到设置的情况下进行尝试: ``` pi -e git:github.com/not-narleeek/pi-caido # ephemeral, current run only ``` ## 首次运行设置 Caido 的数据操作(历史记录、搜索、发送)需要一个**激活的项目**,并且只有真实登录的用户才能创建项目。请执行一次以下操作: 1. 打开 **Caido GUI**,使用您的 **免费 Caido 云账号**登录,并创建/打开一个项目。(这会在磁盘上初始化一个用户和项目。) 2. *可选但推荐:* 在 Caido → **Settings → API** 中,创建一个 **API token** 并将其导出: export CAIDO_API_TOKEN=cai_xxx 设置了 token 后,首次使用时会自动启动一个 headless 实例,您将永远不需要运行 GUI。 从现在开始,agent 可以自动发现您正在运行的 Caido 实例(或启动一个 headless 实例),一切都能“正常运行”。 ## 快速开始 在 pi session 内部(您的代码仓库、CTF 目录等任何地方): ``` # 让 agent 发送请求并查看它如何到达 Caido > send a GET to http://challenge.ctf.io:8080/ and look for anything juicy # agent 使用 caido_request(或 caido_proxy + bash 工具)代替普通的 curl。 ``` 将扫描器路由经过 Caido,以便捕获其流量: ``` > point ffuf at https://target.htb/ and brute /usr/share/wordlists/dirb/common.txt # agent 调用 caido_proxy,然后运行: # export http_proxy=http://127.0.0.1:8080 https_proxy=http://127.0.0.1:8080 # export REQUESTS_CA_BUNDLE=/home/.../.pi/caido/ca.crt SSL_CERT_FILE=... # ffuf -x http://127.0.0.1:8080 -u https://target.htb/FUZZ -w common.txt # ...并且每次命中都可以通过 caido_search 进行搜索。 ``` 在捕获的内容中查找 flag: ``` > search captured traffic for the flag format # agent 运行 caido_search 'resp.raw.cont:"flag{"' 和 caido_get_request 。 ``` 页脚会实时更新:🌐 `caido · ctf · 318 reqs`。 ## 架构 分为三层,没有隐藏的活动部件: ``` ┌──────────────────────────────────────────────────────────────────┐ │ pi (the agent) │ │ │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ extensions/caido.ts ←── this package (TypeScript) │ │ │ │ • 6 tools: caido_request · caido_search · caido_get_* │ │ │ │ caido_history · caido_proxy · caido_scope │ │ │ │ • /caido command • live status footer │ │ │ └───────────────────┬────────────────────────────────────────┘ │ │ │ spawnSync("python3", [scripts/caido.py …])│ │ ┌───────────────────▼────────────────────────────────────────┐ │ │ │ scripts/caido.py ←── this package (stdlib Python) │ │ │ │ • discover / launch headless instance │ │ │ │ • guest-or-API-token auth │ │ │ │ • ensure an active project │ │ │ │ • send via Repeater, search HTTPQL, export, scope, … │ │ │ └───────────────────┬────────────────────────────────────────┘ │ └───────────────────────┼────────────────────────────────────────────┘ │ HTTP + GraphQL (/graphql, /ca.crt) ┌───────────────────────▼────────────────────────────────────────────┐ │ Caido instance (GUI or headless) │ │ Repeater · HTTP history · Scope · Findings · Proxy (e.g. :8080) │ └────────────────────────────────┬───────────────────────────────────┘ │ proxy (http_proxy / https_proxy) ┌─────────▼─────────┐ │ target web app │ └────────────────────┘ ``` **为什么要这样拆分?** - **`caido.ts`** 是 *agent 接口*:它定义了工具(名称、schema、prompt 指导、渲染)、`/caido` 命令和页脚。它**不包含**任何网络逻辑 —— 它只是调用 Python 客户端并格式化 JSON。这使得 TypeScript 层非常轻量,并让 pi 自己的工具 pipeline 来处理渲染、截断和流式传输。 - **`caido.py`** 是 *Caido 接口*:它负责实例生命周期、身份验证、项目引导以及所有的 GraphQL 调用。作为纯标准库 Python,它可以在任何存在 `python3` 的地方运行,**零安装步骤**,您也可以将其作为 CLI 独立使用(见下文)。 - **Caido 实例**是*事实来源*:所有捕获的流量都存储在那里,因此 agent 和盯着 GUI 的人看到的内容始终是一致的。 ### 文件布局 ``` pi-caido/ ├── extensions/ │ └── caido.ts # pi extension: tools, /caido command, footer ├── scripts/ │ └── caido.py # dependency-free GraphQL automation client (+ CLI) ├── docs/ │ ├── ARCHITECTURE.md # deeper dive into lifecycle & data flow │ └── HTTPQL.md # HTTPQL reference ├── package.json # pi manifest (pi.extensions) + npm metadata ├── tsconfig.json # local type-checking only (pi compiles the extension) ├── README.md ├── CHANGELOG.md └── LICENSE ``` ## 工作原理 ### 1. 实例发现与自动启动 当工具运行时,扩展程序首先确保 Caido 实例是可以访问的。`caido.py` 会按顺序尝试: 1. 通过探测本地端口 (`8080, 8180, 8443, 8085, …`) 来**发现**正在运行的实例。如果您的 GUI/CLI 已经启动,它将被重用。 2. **重新附加**到它之前启动的 headless 实例(记录在 `~/.pi/caido/instance.json` 中)。 3. **启动** headless 实例,命令为 `caido-cli --invisible --no-open --allow-guests --listen 127.0.0.1:`,并等待 `/graphql` 响应。该进程是脱离的 (`setsid`),因此即使 agent 退出,它也能继续运行。 ### 2. 身份验证 身份验证优先级(第一个非空的生效): 1. **`$CAIDO_API_TOKEN`**(或 `~/.pi/caido/token`)→ 拥有完全访问权限,可以创建项目。 2. **访客登录** (`loginAsGuest`) → 只能使用*已存在*的项目,不能创建项目。这就是为什么需要存在一次性 GUI 登录的原因。 如果 API token 无效/过期,会自动回退到访客身份。 ### 3. 项目引导 数据调用需要一个*当前项目*。客户端会: 1. 读取 `currentProject`。如果已设置,则完成。 2. 否则列出项目;如果存在任何项目,则选择第一个并将其固定为 `selectOnStart`。 3. 如果不存在任何项目,则尝试执行 `createProject`(仅对真实用户/API token 成功)。如果失败,它将返回一条清晰的“请打开一次 GUI”的消息,而不是崩溃。 ### 4. 发送请求 (`caido_request`) 请求通过 Caido 的 **Repeater** 发送,因此它会像其他任何流量一样记录在历史记录中: 1. 解析 URL → `{host, port, isTLS, SNI}` + path。 2. 构建一个原始的 HTTP/1.1 字节 blob (`_build_raw`),并根据需要添加 `Host`/`Content-Length`。 3. 使用原始请求作为种子执行 `createReplaySession`。 4. 执行 `startReplayTask` 来实际触发它 (异步)。 5. **轮询**重放条目,直到请求 id 准备就绪(或者出错 / 在约 6 秒时超时)。 6. 根据 id 获取完整的请求+响应,并解码 base64 payload。 然后扩展程序会渲染状态/headers/body,进行截断以保持输出较小,同时将完整数据保留在 Caido 中,以便 `caido_get_request` 检索。 ### 5. 搜索历史记录 (`caido_search`) `caido_search` 会将您的 [HTTPQL](docs/HTTPQL.md) 表达式直接传递给 Caido 的 `requests(filter:)` GraphQL 字段,并返回 `id · status · method host path · size` 行。完整的 body 通过 `caido_get_request ` 返回。 ### 6. 路由扫描器 (`caido_proxy`) `caido_proxy` 将 Caido 的 CA 证书 (`/ca.crt`) 获取到磁盘并打印: ``` export http_proxy=http://127.0.0.1:8080 https_proxy=http://127.0.0.1:8080 export REQUESTS_CA_BUNDLE=/home/.../.pi/caido/ca.crt SSL_CERT_FILE=/home/.../.pi/caido/ca.crt ``` agent 会在调用 `curl`/`httpx`/`ffuf`/`feroxbuster` 之前,在 `bash` 工具中应用这些配置,因此这些工具发出的每一个请求都会流经 Caido 并变得可搜索。 ### 独立 CLI `scripts/caido.py` 也是一个可独立使用的 CLI —— 在脚本、CI 或 pi 外部非常方便: ``` python3 scripts/caido.py status python3 scripts/caido.py send -m POST -u http://localhost:8000/api -H 'Content-Type:application/json' -d '{"k":1}' python3 scripts/caido.py search 'resp.raw.cont:"flag{"' --limit 5 python3 scripts/caido.py get python3 scripts/caido.py proxy python3 scripts/caido.py httpql-help ``` 每个子命令都支持 `--json` 以用于机器输出。 ## 配置 所有配置均为可选。合理的默认设置意味着大多数配置下需要零配置。 | 环境变量 | 默认值 | 用途 | |---------|---------|---------| | `CAIDO_API_TOKEN` | *(未设置 → 使用访客身份)* | Caido API token (完全访问权限;启用自动项目创建 + 仅 headless 运行)。 | | `CAIDO_PY` | *(内置)* | 覆盖 `caido.py` 的路径 (开发/调试)。依次回退到内置脚本,然后是 `~/.pi/scripts/caido.py`。 | | `CAIDO_STATE_DIR` | `~/.pi/caido` | 写入实例元数据、CA 证书和 `instance.log` 的位置。 | 状态文件(位于 `$CAIDO_STATE_DIR` 下): ``` instance.json # pid + port + base_url of a headless instance we started token # API token if you'd rather store it than export the env var ca.crt # Caido CA cert, fetched on demand instance.log # headless instance stdout/stderr ``` ## HTTPQL 快速参考 HTTPQL 是 Caido 用于 HTTP 历史记录的过滤语言。形式为:`namespace.field.operator:value`。 ``` req.method.eq:"POST" resp.code.eq:200 resp.raw.cont:"flag{" req.host.eq:"challenge.ctf.io" req.path.cont:"/admin" or req.path.regex:/^\/api\/v[0-9]+/ resp.code.gt:400 and resp.raw.cont:"stack" ``` 完整参考:[docs/HTTPQL.md](docs/HTTPQL.md),或者在 pi 内部运行 `/caido httpql`。 ## 安全说明 - **以您的权限运行。** 与所有 pi 包一样,此扩展程序会执行代码 (`python3`,并间接执行 `caido-cli`)。在安装前请检查源代码 —— 只有两个文件 (`extensions/caido.ts`, `scripts/caido.py`)。 - **访客身份验证绝大部分情况下是只读的。** 如果没有 API token,客户端将使用访客登录,这可以使用现有项目但不能创建项目。它也无法读取其他用户的数据。 - **Headless 实例仅限回环地址。** 它在 `127.0.0.1:` 上监听并且是脱离的,不向网络暴露。 - **CA 证书**是 Caido 的拦截根证书;请像对待任何代理 CA 一样对待它。它存储在您的状态目录下,具有正常的文件权限。 - **Tokens** 永远不会离开您的机器;它们仅作为 `Bearer` header 发送到您本地的 Caido 实例。 ## 故障排除 | 症状 | 修复方法 | |---------|-----| | `⚠ Caido not ready: … no active project` | 打开一次 Caido GUI,登录,创建/打开一个项目。或者设置 `CAIDO_API_TOKEN`。 | | `caido-cli exited early` / 实例无法启动 | 检查 `$CAIDO_STATE_DIR/instance.log`。确保 `caido`/`caido-cli` 已安装并在 `PATH` 中,或者在 `scripts/caido.py` (`CAIDO_CLI`) 中设置路径。 | | 访客登录被拒绝 | 实例启动时没有带上 `--allow-guests`,或者访客模式被禁用。通过 `/caido start`(此包)启动,或者设置一个 API token。 | | `python3: not found` | 安装 Python ≥3.8 并确保它在 `PATH` 中。 | | 扫描器遇到 TLS 错误 | 您忘记了 CA 环境变量 —— `caido_proxy` 会打印它们;当 agent 驱动扫描器时会自动设置它们。 | | 想要一个全新的实例 | `/caido stop` 然后 `/caido start`,或者删除 `$CAIDO_STATE_DIR/instance.json`。 | ## 许可证 [MIT](LICENSE) — 可自由使用、修改和分发。感谢提及来源,但非必须。
标签:MITM代理, Python, TypeScript, 安全合规, 安全插件, 无后门, 流量捕获, 网络代理, 网络拓扑, 网络调试, 自动化, 逆向工具