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攻击, 安全防御评估, 密码管理, 插件系统, 搜索引擎查询, 漏洞管理, 版权保护, 自动化攻击