ソース情報
- リポジトリ
- Kur1sulab/blackbox
- ソースの最終更新活動
- 2026年9月23日 16:40
- 検出された SKILL.md の言語
- 中国語
- スター
- 3
- フォーク
- 1
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
ファイルエクスプローラー
4 ファイルSKILL.md を表示中
SKILL.md
ソースの指示 · 読み取り専用プレビュー- name
- go-pentest-workbench-ops
- description
- 构建/运维 Go+Docker Kali+Ollama 多模型渗透工作台。
# Go 渗透工作台构建与运维
构建基于 **Go 后端(net/http + goroutine)+ Docker Kali 工具容器 + 本地 Ollama 多模型** 的渗透测试 Web 平台。沉淀自 Kur1sulab-soul 项目的完整实战经验(Flask→Go 迁移、性能优化、多模型分工、安全加固)。
## 架构总览
```
┌──────────────────────────────────────┐
│ Go 后端 (单 exe, ~8.4MB) │
│ net/http + sync.Mutex + goroutine │
│ Web/API/任务调度/报告导出 │
└──────────┬──────────────┬────────────┘
│ docker exec │ HTTP :11434
┌──────────▼──────┐ ┌─────▼───────────┐
│ Kali 工具容器 │ │ Ollama 本地模型 │
│ (--entrypoint │ │ vext/nexus/ │
│ sleep infinity) │ │ antares/kali │
└─────────────────┘ └─────────────────┘
```
## 为什么用 Go 而不是 Flask(迁移决策)
| 指标 | Python Flask | Go net/http |
|------|-------------|-------------|
| API 响应 | ~150-300ms | <10ms |
| 工具任务创建 | ~300ms | 7ms |
| 并发 | GIL 限制 | goroutine 100+ |
| 部署 | 依赖 Python 环境 | 单 exe |
项目分层:`cmd/server/main.go`(入口)+ `internal/api/`(路由+handler)+ `internal/exec/`(docker exec 执行层)+ `internal/tools/`(工具定义+命令渲染)。工具数据用 JSON 数组,格式 `{n,cat,d,ic,cmd,params}`。
## 坑位(按踩坑频率排序)
### 1. ⚠️ Go 前端 HTML 内存缓存 —— 改前端必须重启服务
`loadIndex` 一次性读入内存(`if len(idxHTML)>0 && idxPath==webDir` 直接返回缓存),改 `web/index.html` 后**必须重启 Go 进程**才生效。分辨新旧:
```bash
curl -s http://localhost:8080/ | grep -c "新函数名" # 1=已生效 0=旧缓存
```
浏览器会进一步缓存 —— 验证用 `?v=N` 参数绕开。
### 2. 端口占用 / 僵尸进程(Windows)
`taskkill //F //IM xxx.exe`(双斜杠)在 git-bash 会报"无效参数" → 用 `taskkill /F /PID <pid>` 或 PowerShell `Stop-Process -Id <pid> -Force`。定位:`netstat -ano | grep ":8080" | grep LISTEN`。
### 3. Docker Desktop daemon 常挂
工具全部失败时看报错 `dockerDesktopLinuxEngine` pipe 不存在。冷启动:
```bash
powershell -Command "Start-Process 'C:\Program Files\Docker\Docker\Docker Desktop.exe'"
# 轮询直到 docker ps 通(5s*14 次),然后 docker start hexagent-kali-tools
```
### 4. Kali 纯工具容器模式
镜像默认 CMD 跑 Flask Web 会占 8080 端口 → 用 `--entrypoint sleep` 起纯工具容器:
```bash
docker run -d --name hexagent-kali-tools --entrypoint sleep hexagent-hexagent:latest infinity
```
Go 通过 `docker exec hexagent-kali-tools bash -c "CMD"` 调工具(连接复用、无冷启动)。
### 5. 工具命令模板注入防护(安全必修)
目标值直接替换进 shell 命令会命令注入(`x;id` 会被执行)。必须单引号包裹 + 转义:
```go
safeTarget := "'" + strings.ReplaceAll(target, "'", "'\\''") + "'"
```
前端 JS 的命令预览要同步做同样转义,否则预览和实际执行不一致。
### 6. Kali 镜像国内源
Dockerfile 内 apt 用 `--allow-insecure-repositories` + `--allow-unauthenticated`(阿里云源 SSL 证书问题);pip 用 `--break-system-packages`。清华源常被墙不通,USTC/阿里云 HTTP 可用。
### 7. ⚠️ Kali 容器内装工具集:apt 连环坑(本类任务最高频失败点)
在 `docker exec` 里给 Kali 容器批量装工具,反复遇到几类坑,**按此顺序排查**:
**坑 A —— 官方源残留导致 apt 卡死/失败**(最常见根因):
基础镜像自带 `/etc/apt/sources.list.d/kali.sources`(deb822 格式),它**不会被** `echo > /etc/apt/sources.list` 覆盖!apt 会同时用官方源 + 你的阿里云源,而官方源 `http.kali.org` 常 502。修复:**两个都清掉**:
```dockerfile
RUN rm -f /etc/apt/sources.list.d/kali.sources /etc/apt/sources.list.d/*.sources; \
echo "deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib" > /etc/apt/sources.list
```
**坑 B —— apt-get 卡死症状**:CPU 0-15% 空转、deb 缓存数不涨、dpkg.log 停在同一行。诊断顺序:
```bash
ps aux | grep apt-get | grep -v grep # 进程还活着但 CPU 低 = 卡住
ls /var/cache/apt/archives/*.deb | wc -l # 等 5s 再数,不涨 = 停滞
tail -1 /var/log/dpkg.log # 时间戳不动 = 没在配置
netstat -tn | grep ESTABLISHED # 空 = 没在下载
```
卡死原因多是**多次中断后的 dpkg 状态损坏 + 僵尸进程占锁**。清锁重试(`rm -f /var/lib/dpkg/lock*` + `dpkg --configure -a`)可能有效,但反复卡就**别在带病容器里挣扎**——直接 `docker commit` 备份 + 重建镜像(Dockerfile 一次性装全)。
**坑 C —— 大依赖包致命**:`--no-install-recommends` 必须加(wpscan 会拉 chromium ~100MB 大包断连);hashcat 的 OpenCL 依赖 `libpocl2t64` 在阿里云镜像缺失(4 次连接全失败)→ **把这类包从装机清单移出**,别硬装。
**坑 D —— 下载不稳**:装大工具集(20+ 包)时中途断连常见。对策:**拆小批**(4-6 组小 RUN,每个带 `|| apt-get install ...` 重试一次),失败重试代价小。已下载的 deb 缓存在 `/var/cache/apt/archives/` 会复用。
**推荐姿势(一口气装全)**:
```dockerfile
RUN apt-get update --allow-insecure-repositories \
&& (apt-get install -y --allow-unauthenticated --no-install-recommends nmap masscan subfinder whatweb gobuster nikto amass ffuf dirsearch dnsutils \
|| apt-get install -y --allow-unauthenticated --no-install-recommends nmap masscan subfinder whatweb gobuster nikto amass ffuf dirsearch dnsutils) \
&& rm -rf /var/lib/apt/lists/*
```
详见 `references/kali-container-apt-tooling.md`。
## 扫描流水线并行化(速度提升关键)
自动扫描流水线(recon→scanning→exploitation)**同阶段内工具必须并行**,否则串行跑 nmap→subfinder→whatweb 单工具 90s 累计 100s+。Go 实现模式:
- goroutine + WaitGroup 每工具一个,channel 收集结果
- 结果按 `phase.ToolIDs` 顺序排序后输出(保持日志可读)
- 每个 goroutine 内独立 `exec.Run(ctx, cmd, 240s)`(含超时)
- 实测:recon 4 工具并行 27s(subfinder 26.5s 为瓶颈),vs 串行 100s+,**提速 5 倍**
- 注意:callback 闭包捕获循环变量要显式传参(`go func(toolID string, tool tools.Tool){...}(toolID, tool)`)
## Ollama 多模型分工(12GB 显卡实测)
⚠️ **用户硬性规定(2026-08-20 会话纠正过)**:①「每一个地方只用一个 AI」——每角色固定绑一个模型,不搞多模型下拉选择;②「千问 27b 不要放进去」——大模型(>6GB)从审计/建议模型列表过滤;③「实时建议 ≠ kali-terminus」——kali-terminus 只做 Kali 命令生成,实时建议是渗透小模型 nexus-security。做错被纠正过,勿再犯。
4 个 AI 各专职一个模型:
| 角色 | 模型 | 说明 |
|------|------|------|
| 代码审计 | antares-audit (1B) | 白盒审计,165 tok/s,识别 CWE-89/78/79 |
| 实时建议 | nexus-security (1.5B) | 实时总结探测结果+可进攻方向 |
| Kali 命令 | kali-terminus (270M) | 生成/调用 Kali 工具命令 |
| 渗透主模型 | vext (Qwen2.5-7B+LoRA) | 给渗透方案(步骤+命令)供选择 |
⚠️ **小模型首载 50-60s**(12GB 显存 + Ollama 冷加载),必须「预挂载驻留」才快:
```bash
curl -s http://localhost:11434/api/generate -d '{"model":"nexus-security:latest","prompt":"ping","stream":false}' >/dev/null
# 驻留后实时建议 3.5s;未驻留 60s+
```
- 主模型 vext 会抢占显存导致小模型卡顿 → 串联调用而非同时全驻留(4 模型合计 ~9.5GB 超 12GB 上限)
- 显存查看:`ollama ps` / `nvidia-smi --query-gpu=memory.used --format=csv,noheader`
- 大模型(>6GB,如 qwen 27b)应从工具/审计模型列表过滤掉,仅作深度推理按需加载
## UI 重构偏好(用户硬性要求,2026-08-21 三次纠正)
⚠️ 哥哥对 UI 有明确审美要求,踩过的坑不许再犯:
1. **「不要这种 UI,上网搜索下前端 ui 设计运用下」**——默认浅色 Apple 风(白底+蓝)被否。正解:加载 `popular-web-designs` 技能(54 套真实设计系统),渗透平台选 **VoltAgent**(碳黑+翡翠绿+终端原生)或 Sentry;**先查设计系统再动手**,不要自己拍脑袋配颜色。
2. **「我要浅色风格的」**——深色 VoltAgent 又被否。最终落地:**浅色 VoltAgent 变体** = 保留布局/组件结构(HUD 卡、链路大屏、卡片语义色),只换色板:暖白底 `#f7f6f3` + 白卡 `#ffffff` + 暖灰边框 `#e4e2dd` + 翡翠绿 `#0a9d67` 强调 + 终端/代码块保留深色(专业工具惯例)。**哥哥要浅色 → 布局可深色派,色板必须浅**。
3. **「将功能都融合进一个界面」**——多页面切换被否。正解:**单界面模式** = 所有 `.page` 全显示(`display:block` 而非 `display:none` 切换),导航 `go()` 改 `scrollIntoView({behavior:'smooth'})` 锚点滚动,各区块加 `.sec-title` 统一标题(图标+名称+功能徽章),终端/编辑器高度从 `calc(100vh-xxx)` 改固定值(420px/300px),定时刷新改全区块常驻(`setInterval(()=>{loadDash();loadTools();...},10000)`)。
UI 迭代全史 + 设计令牌细节见 `references/pentest-chain-graph-and-ui.md`。
## 渗透链路知识图谱(dsh-pentest 六表模型)
渗透平台不应只是工具+发现平铺——参考 [howmp/dsh-pentest](https://github.com/howmp/dsh-pentest) 的**探索链路模型**,把渗透过程结构化记录为知识图谱:
- **六表**:`goals`(目标+授权)/ `intents`(攻击意图)/ `facts`(侦察事实,带来源)/ `findings`(漏洞结论,**可复现步骤必填**)/ `assets`(资产树,parent 关系)/ `edges`(关系边)
- **关系边词汇**:`spawns`(goal→intent) / `yields`(intent→fact) / `proves`(intent→finding) / `parent`(asset→asset),自动去重
- **确定性 id**:`<kind>-<n>`(goal-1/intent-2...)按类计数,便于前端引用
- **前端四/五列分层流**:目标→意图→事实→发现→资产,卡片彩色左边框(绿目标/灰意图/蓝资产/红发现按严重度)
- **报告生成**:目标→意图→漏洞(CVSS+复现步骤+影响资产)→资产树→漏洞汇总表
- 六表模型 + API 实现模式 + 前端布局代码见 `references/pentest-chain-graph-and-ui.md`
## 数据持久化(服务重启不丢状态)
Go 单 exe 渗透平台默认全内存态,重启即丢任务/链路/设置。落地模式:
- **JSON 快照落盘**:`persistData{Tasks,Settings,Proxies,HTTPHistory,Pentest,Scripts}` → `os.WriteFile(tmp)` + `os.Rename(tmp, file)`(原子写防写一半断电)
- **自动保存**:`StartAutoPersist()` 后台 goroutine 每 15s `SavePersist()`
- **关键操作即时保存**:任务 create/run 之后 `go s.SavePersist()`(异步不阻塞响应)
- **优雅退出**:`signal.Notify(ch, os.Interrupt)` → Ctrl+C 时先保存再 exit
- **恢复语义**:running 任务恢复为 idle(进程已不在,状态诚实);pentest 图的 seq 计数要还原(防 id 冲突)
## 工具装了但检测显示「未装」——binMap 命令名映射
武器库可用性检测用 `command -v` 找**二进制名**,但工具的 cmd 模板第一个 token 常与实际二进制不同 → **装了却显示未装**。修复:建立 `binMap`(工具名→实际二进制名):
```
pspy→pspy(cmd 是 ./pspy64) / ligolo→ligolo-mp / xsstrike→xsstrike
bloodhound→bloodhound(不是 bloodhound-python 采集器) / frp→frpc
linpeas→linpeas.sh(/opt/privesc/ 脚本要 ln -sf 到 /usr/local/bin/ 才在 PATH)
```
impacket 是特例:`GetUserSPNs.py/GetNPUsers.py` 装在 `/usr/share/doc/python3-impacket/examples/` 没进 PATH → `ln -sf ... /usr/bin/impacket-GetUserSPNs`。检测不到先查 binMap 再查 PATH,别急着判「没装」。
## 运维已编译好的工作台二进制(CyberStrikeAI 类)
不总是从源码构建——很多时候平台已有编译产物(`xxx.exe`),运维 = 「拉起来 + 找管理员凭证 + 验证」。本类目通用模式:
- **启动**:从项目目录跑 `./xxx.exe --http`;`--http` 强制明文(config 里可能有 TLS,不带会走 HTTPS 要证书)。主站点默认 8080,MCP 类端口看 config。
- **凭证坑**:管理员密码存 `data/conversations.db`(SQLite)`rbac_users` 表 `password_hash`,**bcrypt 哈希不可反推**。一次性默认密码只在首次 `ADMIN SETUP REQUIRED` 打印进 `server.log`,**改过后默认密码就废**(登录 401 `{"error":"密码错误"}`)。找回两条路:用户知道当前密码,或 `./xxx.exe --reset-admin-password`(交互式隐藏读密码 ≥8 字符,须先停服务避免 DB 锁)。
- **验证链**:① `netstat -ano | grep LISTENING | grep :8080`(别被到远端 8080 的 ESTABLISHED 扫描出站连接骗了);② curl 根路径看 `<title>`;③ POST `/api/auth/login`(GET 会 404)带 JSON 验凭证,200+token=对,401=错。
- **查库**:Windows git-bash 无 sqlite3 CLI → 用 Python sqlite3 模块读 `rbac_users`。
CyberStrikeAI 具体路径/端口/表结构/编译回顾见 `references/cyberstrikeai-ops.md`。
## 性能验证基准
```bash
time curl -s http://localhost:8080/api/dashboard # 应 <50ms(docker 状态要缓存,勿每次 docker inspect)
curl -s -X POST /api/task/create -d '{"name":"t","target":"scanme.nmap.org","tool":"nmap_fast"}' # 7ms
```
Docker 状态用 30s 周期 goroutine 刷新缓存,避免每次 API 调用 `docker inspect`(~300ms 开销)。
## 上线前审计清单
- [ ] 命令注入:BuildCmd 目标单引号包裹(`'x;id'` 变字面量)
- [ ] 全部 API 端点 200(逐个 curl 探活)
- [ ] 任务状态流转 idle→running→done(真实工具跑通)
- [ ] 前端 XSS:esc() 覆盖所有动态输出
- [ ] panic recover + 日志截断(4000 行)+ 命令超时控制
- [ ] Docker daemon 健康 + Kali 工具容器在跑
- [ ] 报告导出 JSON + Markdown(渗透平台标配)
## 支持文件
- `references/kurisulab-soul-architecture.md` — Kur1sulab-soul 具体实现(项目结构、API 路由清单、AI 分工代码位点)
- `references/kali-container-apt-tooling.md` — Kali 容器内批量装工具集的 apt 连环坑排查手册(官方源残留/kali.sources/dpkg 锁卡死/阿里云缺包/拆批重试)
- `references/pentest-chain-graph-and-ui.md` — dsh-pentest 六表链路模型 + UI 重构三版迭代全史(浅色 Apple→深色 VoltAgent→浅色 VoltAgent→单界面融合)+ 执行纪律坑(execute_code 落盘/端口占用静默失败)
- `references/cyberstrikeai-ops.md` — CyberStrikeAI(Go 单二进制作编平台)运维:`--http` 启动、admin 凭证(SQLite rbac_users bcrypt 不可反推 / 一次性密码改后即废 / --reset-admin-password)、验证链、Python sqlite3 查库
GitHubで見る