ReliableSecurity/Pohenix
GitHub: ReliableSecurity/Pohenix
一款自托管渗透测试管理平台,将资产管理、多种扫描工具编排、漏洞 triage、WSTG 检查和报告生成整合为统一工作流。
Stars: 0 | Forks: 0
# Asset Manager (Phoenix — PenTest 平台)
**Phoenix**(代码仓库 **Pohenix**)—— 一款专为渗透测试和 Red Team 团队设计的 self-hosted Web 平台:提供用于资产管理、启动扫描、漏洞 triage、WSTG 检查清单、循环 fuzz 以及生成 PDF/DOCX 报告的统一平台。界面支持俄语和英语;通过 **Keycloak SSO** 进行访问控制,支持 admin / editor / pentester 等角色。
该平台覆盖了完整的工作流程:从导入目标和 nmap 侦察,到 Nuclei/Nikto/SQLmap 扫描,再到手动 triage findings、WSTG 检查以及向客户导出报告 —— 全程无需在十几个独立的工具之间来回切换。
**项目详细说明:** [docs/PROJECT.md](docs/PROJECT.md)
## 关于平台
Phoenix 基于 **项目 → 公司 → 主机 → 服务 → 漏洞** 的层级结构构建。每次扫描都会绑定到对应的项目和公司;扫描结果会被解析并存入数据库,更新服务状态,并归入漏洞表和 discovered paths 表中。非管理员用户只能看到分配给自己的项目(通过 project assignments + RBAC 控制)。
扫描队列(**BullMQ + Redis**)和独立的 **worker** 容器不会阻塞 UI:状态、live-日志和 SSE 事件会实时推送到前端。Docker 镜像中预装了 nmap、nikto、nuclei(包含 20 万+ 社区模板)、gobuster、dirb、sqlmap 等工具;所有命令均在具有安全策略的隔离环境中执行。
## 核心功能
| 模块 | 功能说明 |
| ------ | -------- |
| **Dashboard** | 主机、服务、活动扫描概览,支持快速启动预设 |
| **扫描** | 扫描预设(nmap、nuclei、nikto 等),实时输出(live-вывод),结果导入,connectivity 诊断 |
| **Nuclei** | 社区模板批量执行,chunk 最高至 5000,支持选择模板及 network/http 预设 |
| **Discovered paths** | Fuzz/导入路径,按主机/域名过滤,按类型分页,支持 pause/stop/resume |
| **WSTG** | OWASP WSTG 分类,启动测试并关联到对应服务 |
| **漏洞** | Severity(严重程度)、状态、截图、模板,支持批量导入 |
| **报告** | 报告模板,WYSIWYG 编辑器,支持导出 PDF 和 DOCX |
| **Admin** | 用户管理,audit log,webhooks,API keys(`phx_…`),代理 |
| **Auth** | Keycloak OIDC,JWT + refresh cookies,支持完整的 logout,不会发生静默 re-login |
## 技术栈
| 层级 | 技术 |
| ---- | ---------- |
| Frontend | React 18, Vite, TypeScript, TanStack Query, Radix UI, Tailwind |
| Backend | Express 5, Drizzle ORM, PostgreSQL 16 |
| Auth | Keycloak 26 (realm `phoenix`), httpOnly cookies, CSRF |
| Infra | Docker Compose (app, worker, postgres, redis, keycloak, fuzz-target) |
| Realtime | SSE `/api/events/stream`, BullMQ |
## v1.2+ 更新内容
- 支持按主机、域名和 URL 过滤 discovered paths;每种类型分页显示 30 条记录
- 修复了 fuzzing 阶段的 pause/stop/resume 问题(API 中的 `companyId`)
- 新增“您已退出”界面,并在 logout 后阻止自动重新登录
- 扫描诊断(`/scan-diagnostics`),提供 connectivity 相关提示
- Nuclei 的 chunk 提升至 5000;支持批量执行社区模板
- 清理了无用的预设;提供了标准的 Network 预设(CVE、services 等)
- 引入 PageContainer,统一页面外壳,Phoenix Logo,以及 hot-deploy 脚本
## 快速开始 (Docker + Keycloak)
需要安装 **Docker** 和 **Docker Compose**。
如果找不到 `docker compose` 命令(在 Kali 上通常是因为缺少 `docker-compose-plugin` 包):
```
chmod +x script/install-docker-compose.sh
./script/install-docker-compose.sh
docker compose version
```
如果要在不全局安装 Node 的情况下运行 npm 测试:`./script/enable-npm.sh` (corepack)。
```
cp .env.example .env
./script/setup-lab.sh # проверка Docker, .env, секретов
docker compose up --build -d
```
请 **务必** 通过此地址访问应用:**http://127.0.0.1:5000**
(不要使用 `localhost` —— Keycloak 的 callback 注册在 `127.0.0.1` 上)。
登录 **通过 Keycloak** 进行(Phoenix 内部的登录/密码表单已被禁用)。
| 服务 | URL |
| -------------- | ----------------------------------------- |
| Phoenix | http://127.0.0.1:5000 |
| Keycloak Admin | http://localhost:8080 (`admin` / `admin`) |
### Keycloak 账号信息 (realm `phoenix`)
| 用户名 | 密码 | Phoenix 中的角色 |
| ---------- | ------------ | -------------- |
| **admin** | **admin123** | admin |
| kc-admin | kc-admin123 | admin |
| editor1 | editor123 | editor |
| pentester1 | pentester123 | pentester |
如果登录界面的用户名输入框已填入 `admin`,但输入密码 `admin123` 无法登录 —— 请运行 `./script/keycloak-reset-lab-passwords.sh`(因为在重新导入时,realm JSON 中的密码有时不会生效)。
Keycloak 的登录页面使用了 **phoenix** 主题(与应用内的 `/login` 界面风格一致)。
更改主题后请执行:`chmod +x script/keycloak-apply-theme.sh && ./script/keycloak-apply-theme.sh`
或者重新创建 Keycloak 容器:`docker compose up -d --force-recreate keycloak`
停止运行:`docker compose down`
## Keycloak:添加用户
1. 访问 http://localhost:8080 → Administration Console → realm **phoenix** → Users → Create user。
2. 填写 username、email,并启用该用户。
3. 进入 Credentials → 设置密码。
4. 进入 Role mapping → 分配 realm role:`admin`、`editor` 或 `pentester`。
5. 首次通过 http://127.0.0.1:5000 登录时,系统会自动在 Phoenix 数据库中创建相应记录。
## 环境变量 (主要)
| 变量名 | 默认值 | 描述 |
| ----------------------- | -------------------------------------------------- | ----------------------------------------------- |
| `KEYCLOAK_ENABLED` | `1` | SSO |
| `LOCAL_LOGIN_ENABLED` | `0` | 本地登录(`1` 仅用于调试/测试) |
| `KEYCLOAK_CALLBACK_URL` | `http://127.0.0.1:5000/api/auth/keycloak/callback` | Redirect URI |
| `COOKIE_SECURE` | `0` | 在 127.0.0.1 上使用 HTTP 时设为 `0` |
| `SESSION_SECRET` | — | 生产环境中务必修改 |
| `REDIS_URL` | `redis://redis:6379` | BullMQ + SSE (在 Docker 中) |
| `WEBHOOK_MAX_RETRIES` | `5` | webhooks 投递重试次数 |
| `REDIS_DISABLED` | — | `1` — 不使用 Redis/worker (同步 export) |
完整列表请查看:`.env.example` 和 [docs/PROJECT.md](docs/PROJECT.md)。
## 常用命令
```
docker compose logs -f app
docker compose logs -f keycloak
npm run test:smoke
PLAYWRIGHT_SKIP_WEBSERVER=1 npm run test:e2e
npm run release:checklist # pre-release gate
```
Compose overlays:[docs/docker-compose-profiles.md](docs/docker-compose-profiles.md)(limits、TLS、secrets、networks)。
## 架构 (简述)
```
Проект → Компания → Хост → Сервис → Уязвимости
↓
Сканы / WSTG / Paths / Отчёты
```
Backend:`server/routes/` 中的模块化路由(scans、fuzz、wstg、reports、nuclei、diagnostics)。
Auth:Keycloak OIDC → JWT + refresh cookies;worker 与 API 并行处理扫描队列。
详情请见:[docs/PROJECT.md](docs/PROJECT.md),runbook 位于 `docs/runbook-*.md`,smoke 测试矩阵位于 `docs/scan-smoke-matrix.md`。
## 截图
界面截图和图表存放在 [`docs/images/`](docs/images/) 目录中。
| 文件 | 描述 |
| ------------------------------- | ------------------------------------- |
| `docs/images/dashboard.png` | 主面板:主机、服务、扫描 |
| `docs/images/scans.png` | 扫描列表及实时输出 |
| `docs/images/report-editor.png` | 报告编辑器 |
## 故障排除
**登录时提示 RATE_LIMITED** —— 请更新 app 镜像(auth 路径已从全局限制中排除)。
**通过 Keycloak 登录后又要求重新登录** —— 请直接访问 http://127.0.0.1:5000(不要用 localhost),并检查 `COOKIE_SECURE=0`。
**点击“退出”后无需密码即可再次登录** —— 请重新构建技术栈并在 Keycloak 中配置 post-logout URI:
```
docker compose up --build -d
chmod +x script/keycloak-configure-logout.sh script/keycloak-reset-lab-passwords.sh
./script/keycloak-configure-logout.sh # обязательно, если в KC было post.logout.redirect.uris = "+"
./script/keycloak-reset-lab-passwords.sh # если admin123 не подходит
```
验证流程:“退出” → Keycloak logout → `/login?logged_out=1` → 点击“通过 Keycloak 登录”按钮 → 登录表单。在 `127.0.0.1` 上的 `accessToken`/`refreshToken` cookies 应当已被清除(通过 DevTools → Application 查看)。
客户端 `asset-manager` 的 Post-logout URIs:
- `http://127.0.0.1:5000/login`
- `http://127.0.0.1:5000/login?logged_out=1`
**Keycloak callback error** —— client 中的 redirect URI 必须与 `KEYCLOAK_CALLBACK_URL` 完全一致。
## 许可证
MIT
标签:CISA项目, Docker, GNU通用公共许可证, GPT, Keycloak, Node.js, PostgreSQL, React, Syscalls, XXE攻击, 安全防御评估, 密码管理, 插件系统, 搜索引擎查询, 漏洞管理, 版权保护, 自动化攻击