前言
做渗透测试时,常见痛点是:查资料、跑工具、记笔记、写报告 分散在不同工具里,上下文容易断。大模型能聊天,但如果没有「能执行命令、能搜网、能存结论」的能力,往往只能给方法论,难以真正协作。
ComPilot Scan 是一个面向已授权渗透测试场景的轻量 AI 协作平台:在对话里调用终端、联网搜索、浏览器自动化和知识库,把测试过程沉淀下来。
- 开源地址:https://gitcode.com/socialman/ComPilotScan
- 技术栈:FastAPI + Vue 3 + LangGraph ReAct + SQLite
- 定位:从 ComPilot Platform 精简而来,专注「登录 + 渗透助手 + 知识库 + AI 工具链」
一、它能做什么?
1. 渗透 AI 助手(ReAct)
基于 LangGraph 的 ReAct 智能体,支持:
- 流式对话(SSE)
- 工具调用可视化(开始/结束/结果预览)
- 会话历史与自动压缩(长对话不爆上下文)
- 系统提示词针对渗透场景定制(合规、知识库、工具使用规范)
2. 知识库
AI 可直接读写,分类包括:
| 分类 | 用途 |
|---|---|
report |
测试报告 |
finding |
漏洞发现 |
target |
目标资产 |
note |
测试笔记 |
general |
通用 |
典型用法:测试阶段性结论 → kb_create 入库 → 后续 kb_search 检索,避免重复劳动。
3. 11 个 AI 工具(核心亮点)
不必为 nmap、sqlmap 各写一个插件,平台提供通用能力层:
| 工具 | 能力 |
|---|---|
terminal_run |
沙箱目录执行 Shell(nmap、curl、python 等) |
bing_search |
Bing 联网搜索,模拟浏览器请求 |
web_fetch |
单次抓页,Playwright 渲染 JS 后提取正文 |
browser |
会话级 Playwright:navigate / snapshot / click / fill / press |
kb_* |
知识库增删改查 |
get_platform_info |
平台能力说明 |
推荐工作流:
text
bing_search(找 CVE/公告)
→ browser.navigate + snapshot(读正文)
→ terminal_run(验证 PoC / 调工具)
→ kb_create(沉淀结论)
4. 基础系统能力
- JWT 登录、改密、管理员 AI 配置页
- SQLite 开箱即用,无需复杂部署
- 生产环境可关闭默认账号、限制默认 admin 登录
二、架构设计
#mermaid-svg-8DgtpYxS8rsHE5zi{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8DgtpYxS8rsHE5zi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8DgtpYxS8rsHE5zi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8DgtpYxS8rsHE5zi .error-icon{fill:#552222;}#mermaid-svg-8DgtpYxS8rsHE5zi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8DgtpYxS8rsHE5zi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8DgtpYxS8rsHE5zi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8DgtpYxS8rsHE5zi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8DgtpYxS8rsHE5zi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8DgtpYxS8rsHE5zi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8DgtpYxS8rsHE5zi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8DgtpYxS8rsHE5zi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8DgtpYxS8rsHE5zi .marker.cross{stroke:#333333;}#mermaid-svg-8DgtpYxS8rsHE5zi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8DgtpYxS8rsHE5zi p{margin:0;}#mermaid-svg-8DgtpYxS8rsHE5zi .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8DgtpYxS8rsHE5zi .cluster-label text{fill:#333;}#mermaid-svg-8DgtpYxS8rsHE5zi .cluster-label span{color:#333;}#mermaid-svg-8DgtpYxS8rsHE5zi .cluster-label span p{background-color:transparent;}#mermaid-svg-8DgtpYxS8rsHE5zi .label text,#mermaid-svg-8DgtpYxS8rsHE5zi span{fill:#333;color:#333;}#mermaid-svg-8DgtpYxS8rsHE5zi .node rect,#mermaid-svg-8DgtpYxS8rsHE5zi .node circle,#mermaid-svg-8DgtpYxS8rsHE5zi .node ellipse,#mermaid-svg-8DgtpYxS8rsHE5zi .node polygon,#mermaid-svg-8DgtpYxS8rsHE5zi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8DgtpYxS8rsHE5zi .rough-node .label text,#mermaid-svg-8DgtpYxS8rsHE5zi .node .label text,#mermaid-svg-8DgtpYxS8rsHE5zi .image-shape .label,#mermaid-svg-8DgtpYxS8rsHE5zi .icon-shape .label{text-anchor:middle;}#mermaid-svg-8DgtpYxS8rsHE5zi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8DgtpYxS8rsHE5zi .rough-node .label,#mermaid-svg-8DgtpYxS8rsHE5zi .node .label,#mermaid-svg-8DgtpYxS8rsHE5zi .image-shape .label,#mermaid-svg-8DgtpYxS8rsHE5zi .icon-shape .label{text-align:center;}#mermaid-svg-8DgtpYxS8rsHE5zi .node.clickable{cursor:pointer;}#mermaid-svg-8DgtpYxS8rsHE5zi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8DgtpYxS8rsHE5zi .arrowheadPath{fill:#333333;}#mermaid-svg-8DgtpYxS8rsHE5zi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8DgtpYxS8rsHE5zi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8DgtpYxS8rsHE5zi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8DgtpYxS8rsHE5zi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8DgtpYxS8rsHE5zi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8DgtpYxS8rsHE5zi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8DgtpYxS8rsHE5zi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8DgtpYxS8rsHE5zi .cluster text{fill:#333;}#mermaid-svg-8DgtpYxS8rsHE5zi .cluster span{color:#333;}#mermaid-svg-8DgtpYxS8rsHE5zi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8DgtpYxS8rsHE5zi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8DgtpYxS8rsHE5zi rect.text{fill:none;stroke-width:0;}#mermaid-svg-8DgtpYxS8rsHE5zi .icon-shape,#mermaid-svg-8DgtpYxS8rsHE5zi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8DgtpYxS8rsHE5zi .icon-shape p,#mermaid-svg-8DgtpYxS8rsHE5zi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8DgtpYxS8rsHE5zi .icon-shape .label rect,#mermaid-svg-8DgtpYxS8rsHE5zi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8DgtpYxS8rsHE5zi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8DgtpYxS8rsHE5zi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8DgtpYxS8rsHE5zi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 本地存储
AI 工具层
FastAPI
Vue 3 + Element Plus
渗透助手 / 知识库 / AI 配置
REST + SSE Chat
ChatRuntime + LangGraph
chat_tools 工具执行器
terminal_run
bing_search
web_fetch / browser
kb_*
SQLite
知识库表
会话索引
LangGraph Checkpoint
terminal_workspace 沙箱
设计思路:
- 工具少而精 :不绑定具体扫描器,用
terminal_run调用本机 CLI,扩展性更好。 - web_fetch vs browser 分工 :
web_fetch:一次性读文章,用完即关;browser:同一会话多步交互(SPA、表单、点击)。
- 安全边界 :
- 终端:沙箱目录 + 破坏性命令拦截;
- 联网/浏览器:SSRF 校验,禁止访问内网;
- 生产:工具开关需显式开启(
COMPILOT_*_ENABLED)。
三、5 分钟本地跑起来
环境要求
- Python 3.10+
- Node.js 18+
- 可选:本机已安装 nmap、curl 等渗透工具(供终端工具调用)
安装步骤
bash
git clone https://gitcode.com/socialman/ComPilotScan.git
cd ComPilotScan
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
playwright install chromium
cp .env.example .env
cd web && npm install && npm run build && cd ..
export JWT_SECRET=dev-secret-change-in-prod
export COMPILOT_ENV=development
export COMPILOT_ALLOW_DEFAULT_ADMIN=true
python -m uvicorn app.main:app --host 127.0.0.1 --port 8000 --reload
浏览器打开:http://127.0.0.1:8000
- 默认账号:
admin/admin123(仅开发环境建议开启) - AI 配置:在「AI 配置」页填写 API Key 和 Base URL(兼容 OpenAI 协议的中转/私有化模型均可)
开发模式(前后端分离热更新)
bash
# 终端 1
uvicorn app.main:app --reload
# 终端 2
cd web && npm run dev
四、使用示例(对话指令)
查漏洞情报:
用 Bing 搜索 CVE-2024-3400 官方说明,打开最相关的链接读正文,把要点写入知识库,分类 finding。
调用本地工具:
在终端沙箱里对 example.com 执行
curl -I,把结果保存为 note。
多步浏览器:
用 browser 打开某文档站,给我页面 snapshot,提取安装步骤。
助手会按 ReAct 流程自动选择 bing_search → browser → kb_create 等工具组合。
五、关键配置说明
.env 中常用项(完整见 .env.example):
bash
# 运行模式
COMPILOT_ENV=development
# JWT(生产必改)
JWT_SECRET=your-random-secret-at-least-32-chars
# 生产禁止默认 admin 登录
COMPILOT_ALLOW_DEFAULT_ADMIN=false
# AI(也可在 Web 界面配置)
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://api.openai.com/v1
# 工具开关(开发默认开,生产建议显式配置)
# COMPILOT_TERMINAL_ENABLED=true
# COMPILOT_BING_SEARCH_ENABLED=true
# COMPILOT_WEB_FETCH_ENABLED=true
# COMPILOT_BROWSER_ENABLED=true
部署注意:
- 仓库不包含
dist/,服务器上需执行cd web && npm run build data/含数据库、AI 配置、会话,勿提交 Git- Playwright 需执行
playwright install chromium
六、与「只聊天的大模型」差在哪?
| 对比项 | 普通 Chat | ComPilot Scan |
|---|---|---|
| 执行 nmap/curl | 只能告诉你命令 | terminal_run 真实执行 |
| 查最新 CVE | 训练数据可能过时 | bing_search 联网检索 |
| 读 JS 渲染页面 | 不支持 | web_fetch / browser |
| 测试结论沉淀 | 对话关闭即丢失 | 知识库持久化 + AI 检索 |
| 合规边界 | 依赖提示词 | 系统提示 + 工具 SSRF/沙箱 |
它不是 Burp/ZAP 的替代品,而是授权测试过程中的 AI 副驾:帮你查、帮你跑、帮你记。
七、后续规划(可自扩展方向)
- Docker 一键部署
- 多用户 / 团队协作
- 扫描任务队列与结果结构化入库
- 对接 Burp 导出、Markdown 报告模板
欢迎 Star、Issue 和 PR。
八、合规声明
ComPilot Scan 仅用于已获得书面授权的安全测试。请勿用于未授权目标的探测、攻击或任何违法用途。部署者需自行承担合规责任。