Strix AI 渗透工作台
背景
usestrix/strix 能自己发请求、写 PoC、出报告。日常用法是命令行扫一把,或者用官方 strix view 看这一次的产物。不想自己跑 Docker 就去 app.strix.ai。
我这边要连续扫内网站。扫完还得标无效、对单条复测、推飞书;白盒扫完给 Gitea 开 Issue。原版 CLI 一次一条;strix view 能翻本机历史,但跨 run 要验证邮箱,也没有排队和审核。所以在上游上加了这层:浏览器管任务,扫描丢给独立子进程。API 重启不会把正在跑的扫描一起杀掉。没有账号,一把 Token。
扫描不跑在 HTTP 请求里。漏洞只挂在对应任务上,没有全站汇总。viewer_token 和 Git 凭证都不会进浏览器、不会进任务记录。
相对原版改了什么
引擎没换,还是官方那套 Agent。改的是任务怎么排、扫完怎么收。
原版 CLI + strix view | 这层 | |
|---|---|---|
| 起任务 | 一条命令,扫完就走 | 排队、挂起、到点再跑;按 CPU / 内存装箱,不自己开一堆进程 |
| 看结果 | strix view 翻磁盘上的 run;跨 run 要验证邮箱 | 控制台按任务看,不绑邮箱 |
| 跑着改指令 | 无头 -n 不行;独立 strix view 也不行 | 子进程里开 interactive Viewer,iframe 里能说话 |
| 误报 | 自己改 markdown | 标无效,不进报告、不参与复测 |
| 复测 | 再开一条命令 | 同 run 续跑 / 复测;能对单条「要求测试」 |
| 报告 | 要验证邮箱才能分享 | 本机下 Markdown / ZIP;能只重写报告不重开一轮 |
| 仓库 | URL 里带凭证,或扫本机目录 | Gitea 凭证走环境变量;审计完成可自动开 Issue |
| 通知 | 无 | 飞书;needs_user 会把 Agent 的问题带上来 |
| Viewer | URL 里带 token;侧栏是官方营销壳 | 同源反代,token 不进浏览器;掉「跑 Cloud」那一套 |
| 沙箱 | 扫完容器可能还挂着 | 定时收割已结束任务的容器 |
内核里还多了几件原版没强制的:测试走指定代理、验证码走本机 OCR、finding 要写 manual_cleanup(测试改了哪、还要人清什么)。
没做的也说清:没换引擎,没做多用户 / SSO,照样要 Docker 和 LLM Key。想零部署就去官方 Cloud。
怎么跑起来
Note
Python 3.12+、uv、本机 Docker 已启动、一个 LiteLLM 能用的模型和 Key。缺 Docker 或 Key,页面能开,任务过不去。
拉代码
git clone https://github.com/AnkioTomas/strix.gitcd strixmake dev-install改
web/.env第一次跑会从
web/.env.example拷一份。至少改这三项:STRIX_API_KEY=replace-meSTRIX_LLM=openrouter/z-ai/glm-5.3LLM_API_KEY=<key>STRIX_REPORT_LANGUAGE=zhSTRIX_LLM是 LiteLLM 的模型 id。本地兼容 OpenAI 的端点再加OPENAI_API_BASE。启动
make web浏览器开 http://127.0.0.1:8787/。接口文档在
/docs。顶栏贴 Token,点「记住」
会写成 HttpOnly Cookie,Live Viewer 的 iframe 靠这个进。直连调试链接带 token,别外传。
Warning
默认绑 127.0.0.1。改成 0.0.0.0 等于把能扫内网的钥匙挂网上。只扫你有权测的目标。
建任务
左边列表,右边当前任务。页签是概览、Live Viewer、漏洞、报告、工件。
类型选 pentest,Target 填完整 URL。quick 快扫,standard 常规,deep 穷尽(默认)。
Instruction 会发给模型;备注只给自己看。要走代理或带固定头(Cookie / Authorization)就勾上,值缓在本机,不勾不生效。
不勾「挂起」就进队列,顶栏有空槽才开扫。也可以设「最早开始」,到点前不插队。
填完整 https://gitea…/org/repo.git,可选分支。别把 token 写进 URL。
私有仓在 web/.env 成对配 STRIX_GIT_USERNAME / STRIX_GIT_TOKEN。开 STRIX_GITEA_ISSUES=1 时,audit + git 源的任务扫完入库后按漏洞开 Issue,已标无效的跳过。
控制台表单现在只接 Git HTTPS。扫本地目录走 API:source.type=local。
以前用 CLI 跑出来的 strix_runs/,用「导入」。路径可以是项目目录、strix_runs/ 或单个 run。先勾「仅预览」。
按钮
| 按钮 | 什么时候能点 | 干什么 |
|---|---|---|
| 挂起 | queued | 出队;挂起中才能改扫描配置 |
| 放行 | held | 回到队列尾巴 |
| 编辑 | held | 改 target、指令、模式、代理、请求头 |
| 取消 | 运行中 | SIGTERM,不行再 KILL |
| 标记完成 | 还没 completed | 先停扫描,再标完成 |
| 重试 | 已结束 | 新开子任务,配置能改,附件会拷过去 |
| 继续 | 已结束 | 同一 run_name 接着跑,要有 agents.json |
| 复测 | 已结束 | 还是同一次 run,让 Agent 写 retest_status;有「待测」就只测那些 |
| 更新报告 | 运行中或已结束 | 按交付规范重写报告,不重开一轮 |
| 删除 | 已结束或挂起 | 清数据库和 workspace |
Tip
重试是新任务。继续 / 复测是接着上次 run。已经结束的任务不能直接改 target 再跑,要改配置就先挂起再编辑,或者走重试。
概览上看状态、耗时、token,也能下 scan_worker 日志。Live Viewer 是官方界面的同源反代;跑着的时候发消息是实时投递,结束后再发会变成 follow-up 任务。漏洞点进去才是全文,能标无效、恢复、要求测试——无效的不进报告、不参与复测。报告是 Markdown,工件是沙箱 workspace/。
排队
不是死板只跑一条。Worker 按单任务成本装箱,默认大约 30% CPU + 2 GiB:
free_cpu% ≈ cpu_count*100 − load1*100 # 100% = 1 核cpu_slots = floor(free_cpu% / STRIX_TASK_CPU_PERCENT)mem_slots = floor(可用内存GiB / STRIX_TASK_MEMORY_GB)allowed = min(STRIX_MAX_CONCURRENT, cpu_slots, mem_slots)顶栏的 slot / 「可调度」就是这个数。资源不够就停在 queued。扫完的沙箱默认每 60 秒收一次,跑着的和无关 CLI 容器不动。
配置
| 变量 | 要不要 | 干什么 |
|---|---|---|
STRIX_API_KEY | 必填 | 控制台 Token |
STRIX_LLM | 必填 | LiteLLM 模型 id,扫描认这个 |
LLM_API_KEY | 必填 | 模型密钥;shell 里已 export 的优先生效 |
STRIX_REPORT_LANGUAGE | 可选,默认 zh | 报告语言 |
| 变量 | 默认 | 干什么 |
|---|---|---|
STRIX_API_HOST / PORT | 127.0.0.1 / 8787 | 监听地址 |
STRIX_MAX_CONCURRENT | 8 | 同时跑的硬上限 |
STRIX_TASK_CPU_PERCENT | 30 | 单任务 CPU 估算(100% = 1 核) |
STRIX_TASK_MEMORY_GB | 2 | 单任务内存估算(GiB) |
STRIX_ALLOW_PRIVATE_TARGETS | 1 | 能不能扫私网 / localhost |
STRIX_FEISHU_WEBHOOK | 空 | 飞书群机器人,空就是关 |
STRIX_FEISHU_EVENTS | started,finished,failed,cancelled,needs_user | 推哪些事件 |
STRIX_FEISHU_PROXY | 空 | 只给飞书出站用,不吃系统代理 |
STRIX_GIT_USERNAME / TOKEN | 空 | 必须成对 |
STRIX_GITEA_ISSUES | 0 | 1 时审计完成后按漏洞开 Issue |
STRIX_API_AUTH_DISABLED | 0 | 仅本地调试临时关鉴权 |
飞书要 Web 进程活着才会推。needs_user 卡片会带上 Agent 问的问题。内网自签 Gitea 下,clone / Issue 固定不校 SSL,别拿去对公网 GitHub。
curl -sS -X POST http://127.0.0.1:8787/api/v1/tasks \ -H "Authorization: Bearer $STRIX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"type":"pentest","target":"http://127.0.0.1:3000","scan_mode":"quick"}'curl -sS -X POST http://127.0.0.1:8787/api/v1/tasks \ -H "Authorization: Bearer $STRIX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"type":"audit","source":{"type":"git","url":"https://gitea.example.com/org/repo.git"},"scan_mode":"quick"}'字段以本机 /docs 为准。