DLL0x/CFlagger
GitHub: DLL0x/CFlagger
面向 SOC、DFIR 和 CTI 团队的综合网络安全训练平台,提供 CTF 挑战、学习路径和团队竞赛功能。
Stars: 0 | Forks: 0
Cyber Security Training Platform
面向 SOC、DFIR 和 CTI 团队的综合训练平台。
CTF 挑战 · 学习路径 · 团队竞赛 · 基于角色的访问控制
## 目录
- [功能特性](#features)
- [技术栈](#tech-stack)
- [系统架构](#architecture)
- [快速安装](#quick-install)
- [选项 1:内部部署](#option-1-internal-deployment)
- [选项 2:云端部署](#option-2-cloud-deployment)
- [本地开发](#local-development)
- [默认凭据](#default-credentials)
- [项目结构](#project-structure)
- [安全特性](#security-features)
- [团队方向](#team-sectors)
- [截图与演示](#screenshots--demo)
- [环境变量](#environment-variables)
- [API 概览](#api-overview)
- [故障排除](#troubleshooting)
- [开发说明](#development-notes)
- [更新日志](#changelog)
- [支持](#support)
- [许可证](#license)
## 功能特性
### 核心训练
- **团队训练** — 为 SOC、DFIR 和 CTI 团队提供专门的训练方向
- **CTF 挑战** — 真实的调查场景,支持证据下载、单题尝试次数限制及分数追踪
- **学习路径** — 结构化课程,包含阶段学习、测验(70% 及格线)、进度追踪和用户评分
- **团队竞赛 (CTF 活动)** — 限时活动,包含场景、证据文件、排行榜及团队封禁功能
- **进度追踪** — 基于积分的系统,提供排行榜、提交历史和成就
### 平台功能
- **基于角色的访问控制** — 包含管理员、团队负责人和分析师角色,并实行严格的团队隔离
- **会话管理** — 支持会话版本控制、设备追踪和远程会话终止的 JWT 机制
- **双重认证 (2FA) 支持** — 基于 TOTP 的双重认证
- **用户资料** — 头像选择、社交链接(Twitter、Discord、LinkedIn、GitHub)、密码管理
- **更新与日志** — 管理员管理的平台更新,带有实时 SSE 通知
- **公告** — 管理员发布的公告,支持类别过滤
- **审计日志** — 全面的操作记录,包含 IP 追踪和时间戳
### 管理员功能
- **挑战构建器** — 创建和编辑包含问题、提示、Flag 和证据的挑战
- **学习路径构建器** — 基于阶段的课程创建,带有内置测验构建器
- **CTF 构建器** — 创建包含场景、证据文件和单题尝试次数限制的 CTF 活动
- **CTF 控制面板** — 实时参赛者监控、团队封禁/解封、提交追踪、活动锁定
- **用户管理** — 密码重置、角色分配、账户激活
## 技术栈
| 层级 | 技术 |
|-------|------------|
| **Frontend** | React 19, Vite 7, Tailwind CSS, shadcn/ui |
| **Middleware / API 网关** | Nginx (反向代理, SSL 终结, 静态资源分发) |
| **Backend** | Node.js 20+, Express, JWT, bcryptjs |
| **Database** | PostgreSQL 15, Sequelize ORM |
| **容器化** | Docker & Docker Compose |
| **安全** | Helmet.js, express-rate-limit, CORS, 安全 Cookie |
## 系统架构
```
┌─────────────────────────────────────────────────────────────────┐
│ CLIENT BROWSER │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ HTTPS Request │ │
│ └──────────────────────┬───────────────────────────────────┘ │
└─────────────────────────┼───────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ FRONTEND — NGINX (Container: 8080 / 8443) │
│ Host Mapping: 8080→8080 | 8443→8443 │
│ (React SPA + Reverse Proxy) │
│ │
│ ┌──────────────────────────┐ ┌──────────────────────────────┐ │
│ │ Static React SPA │ │ API Proxy (/api/*) │ │
│ │ index.html / assets │ │ → Backend:5000 │ │
│ └──────────────────────────┘ └──────────────────────────────┘ │
└─────────────────────────┬───────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ BACKEND API (Port 5000) │
│ Internal Docker Network Only │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Express.js Application │ │
│ │ • Authentication (JWT + Sessions) │ │
│ │ • Authorization (Role-based access) │ │
│ │ • Rate Limiting (Per-client IP) │ │
│ │ • Input Validation (express-validator) │ │
│ │ • Security Headers (Helmet.js) │ │
│ └──────────────────────┬───────────────────────────────────┘ │
└─────────────────────────┼───────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ DATABASE (Port 5432) │
│ Internal Docker Network Only │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ PostgreSQL 15 │ │
│ │ • Users, Teams, Challenges │ │
│ │ • Progress, Competitions, Audit Logs │ │
│ │ • Sessions, Achievements, Announcements │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
### 数据流
```
User Request
│
▼
┌─────────────────┐ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐
│ Frontend/Nginx │──▶ │ Express │──▶│ Sequelize │──▶│ PostgreSQ │
│ (Static + API │ │ (Auth + │ │ (ORM + │ │ (Data │
│ Proxy) │◄───│ Business) │◄───│ Models) │◄───│ Storage) │
└─────────────────┘ └─────────────┘ └─────────────┘ └──────────────┘
│
▼
React SPA Response
```
## 快速安装
```
git clone https://github.com/DLL0x/CFlagger.git
cd CFlagger
```
### 选项 1:内部部署
用于内部网络部署。服务器可以连接互联网,但应用程序不对外网公开。
#### 前置条件
- Linux 服务器(推荐 Ubuntu 22.04+)
- Docker & Docker Compose
- 内部 DNS 或基于 IP 的访问
#### 快速安装
```
# 1. 复制应用文件到服务器
# (通过 USB、SCP 或内部文件共享)
cp -r CFlagger /opt/CFlagger
cd /opt/CFlagger
# 2. 运行安装程序
sudo bash install-offline.sh
```
安装程序将自动执行以下操作:
- 验证 Docker & Docker Compose 是否已安装
- 生成安全的数据库和 JWT 密钥
- 使用您的内部 IP 创建 `.env` 文件
- 配置防火墙(仅限 HTTP)
- 部署应用程序
- 运行健康检查
#### 手动步骤(如需)
```
# 1. Clone 仓库
git clone https://github.com/DLL0x/CFlagger.git /opt/CFlagger
cd /opt/CFlagger
# 2. 生成环境文件
cp .env.example .env
DB_PASS=$(openssl rand -base64 32)
JWT_SEC=$(openssl rand -hex 64)
sed -i "s#^DB_PASSWORD=.*#DB_PASSWORD=$DB_PASS#" .env
sed -i "s#^POSTGRES_PASSWORD=.*#POSTGRES_PASSWORD=$DB_PASS#" .env
sed -i "s#^JWT_SECRET=.*#JWT_SECRET=$JWT_SEC#" .env
sed -i "s#^CORS_ORIGIN=.*#CORS_ORIGIN=http://192.168.1.100#" .env
# 检查生成的文件
cat .env
```
```
# 3. Deploy
docker compose -f docker-compose.prod.yml up -d --build
# 4. Verify
docker compose ps
curl http://192.168.1.100:8080/api/health
```
#### 内部网络说明
- 在内部使用 HTTP(无需 SSL)
- 仅绑定到内部网络接口
- 防火墙:阻止对端口 5000 和 5432 的外部访问
- 只有端口 8080(或自定义端口)需要允许内部访问
### 选项 2:云端部署
用于带有 HTTPS 和全面安全加固的公网部署。
#### 前置条件
- 云端 VPS(最低 2 vCPU,2GB RAM)
- 公网 IP 地址
- 域名(推荐用于 SSL)
- Docker & Docker Compose
#### 快速安装
```
# 单行命令(在您的云服务器上以 root 身份运行)
curl -fsSL https://raw.githubusercontent.com/DLL0x/CFlagger/main/install-cloud.sh | sudo bash
```
或者先克隆并在本地运行:
```
git clone https://github.com/DLL0x/CFlagger.git /opt/CFlagger
cd /opt/CFlagger
sudo bash install-cloud.sh
```
安装程序将自动执行以下操作:
- 安装 Docker & Docker Compose
- 生成安全的数据库和 JWT 密钥
- 创建 `.env` 文件
- 配置防火墙(端口 22、8080、8443)
- 部署应用程序
- 使用 Let's Encrypt 设置 SSL/TLS(可选)
- 配置每日数据库备份
- 运行健康检查
#### 手动步骤(如需)
```
# 1. 准备服务器
ssh root@your-server-ip
curl -fsSL https://get.docker.com | sh
# 2. Clone 并配置
mkdir -p /opt/CFlagger
cd /opt/CFlagger
git clone https://github.com/DLL0x/CFlagger.git .
# 3. 生成环境文件
cp .env.example .env
DB_PASS=$(openssl rand -base64 32)
JWT_SEC=$(openssl rand -hex 64)
sed -i "s#^DB_PASSWORD=.*#DB_PASSWORD=$DB_PASS#" .env
sed -i "s#^POSTGRES_PASSWORD=.*#POSTGRES_PASSWORD=$DB_PASS#" .env
sed -i "s#^JWT_SECRET=.*#JWT_SECRET=$JWT_SEC#" .env
sed -i "s#^CORS_ORIGIN=.*#CORS_ORIGIN=https://cflagger.yourdomain.com#" .env
# 检查生成的文件
cat .env
```
```
# 4. Deploy
docker compose -f docker-compose.prod.yml up -d --build
# 5. Verify
curl -I https://cflagger.yourdomain.com:8443
```
#### 云端安全清单
- [ ] 仅将端口 8080 和 8443 暴露到互联网
- [ ] SSH(端口 22)仅限制为您的 IP 访问
- [ ] 数据库端口 5432 未对外暴露
- [ ] 后端端口 5000 未对外暴露
- [ ] 使用有效的 SSL 证书强制执行 HTTPS
- [ ] 已生成强 `JWT_SECRET`
- [ ] 首次登录后已更改管理员密码
- [ ] 已配置定期的数据库备份
#### 防火墙配置 (UFW)
```
ufw default deny incoming
ufw allow 8080/tcp
ufw allow 8443/tcp
ufw allow from YOUR_IP to any port 22
ufw enable
```
## 本地开发
### 前置条件
- Node.js 20+
- PostgreSQL 15
- npm 或 yarn
### Windows 开发
```
# 1. 安装依赖
cd backend; npm install
cd ../frontend; npm install
# 2. 配置环境
cd backend
copy .env.example .env
# 使用本地数据库凭据编辑 .env
# 3. 启动 PostgreSQL 服务 (Windows)
# 确保 PostgreSQL 正在 localhost:5432 上运行
# 4. 启动后端(专用终端)
cd backend; node server.js
# 5. 启动前端(专用终端)
cd frontend; cmd /c "npm run dev"
```
**注意**:在 Windows 上,PowerShell 执行策略会阻止 npm 脚本。请始终使用 `cmd /c "npm run ..."`。
### Docker 开发
```
# 使用支持热重载的自定义开发 Dockerfiles
docker compose -f docker-compose.dev.yml up --build -d
```
### 访问端点
| 环境 | URL |
|-------------|-----|
| Frontend (开发) | http://localhost:5173 |
| Frontend (生产) | https://yourdomain.com:8443 |
| Backend API (开发) | http://localhost:5000 |
| Backend API (生产) | 仅限内部(通过 nginx 代理) |
| Database (开发) | localhost:5432 |
## 默认凭据
在首次部署时,数据库会自动填充默认用户。**请检查后端日志以获取随机生成的管理员密码:**
```
docker compose logs backend | grep "ADMIN USER CREATED"
```
| 角色 | 用户名 | 默认团队 |
|------|----------|--------------|
| Admin | `admin` | SOC |
| Team Lead | `soc-lead` | SOC |
| Team Lead | `dfir-lead` | DFIR |
| Team Lead | `cti-lead` | CTI |
| Analyst | `analyst1` | SOC |
| Analyst | `analyst2` | DFIR |
| Analyst | `analyst3` | CTI |
## 项目结构
```
CFlagger/
├── docker-compose.yml # Production orchestration
├── docker-compose.prod.yml # Production config
├── docker-compose.dev.yml # Development with hot-reload
├── docker-compose.override.yml # Dev port mappings
├── backend/ # Node.js API
│ ├── server.js # Entry point
│ ├── Dockerfile # Production image
│ ├── Dockerfile.dev # Development image
│ ├── src/
│ │ ├── models/ # Sequelize ORM models
│ │ ├── routes/ # API route handlers
│ │ ├── middleware/ # Auth, authorization, validation
│ │ └── utils/ # Seed data and helpers
│ └── uploads/ # Challenge artifact storage
├── frontend/ # React SPA
│ ├── Dockerfile # Production nginx build
│ ├── Dockerfile.dev # Development Vite server
│ ├── nginx.conf # Default nginx config
│ ├── nginx.prod.conf # Production SSL config
│ └── src/
│ ├── pages/ # Route pages
│ ├── components/ # Reusable UI components
│ ├── hooks/ # React hooks (auth, data)
│ └── types/ # TypeScript definitions
├── db/init/ # Database initialization scripts
├── install-cloud.sh # Cloud / online automated installer
├── install-offline.sh # Internal network automated installer
├── ssl/ # SSL certificates (production)
└── company-logo/ # Platform branding assets
```
## 安全特性
- **JWT 认证**,带有会话版本控制和设备追踪
- **Bcrypt 密码哈希**,带有自适应开销因子
- **基于团队的资源隔离** — 团队之间实行严格的边界控制
- **审计日志** — 所有操作均记录 IP 地址和时间戳
- **Helmet.js 安全头** — HSTS、CSP、X-Frame-Options、X-Content-Type-Options
- **速率限制** — 对所有端点进行基于客户端 IP 的限制
- **输入验证** — 在所有路由上使用 express-validator
- **安全 Cookie** — `httpOnly`、`secure` (HTTPS)、`SameSite=strict`
- **文件上传安全** — 扩展名验证 + 强制下载处理
- **CORS 限制** — 带有凭据的单源策略
## 团队方向
### SOC — 安全运营中心
- 可疑的 PowerShell 执行
- 暴力破解攻击检测
- 通过 SMB 的横向移动
### DFIR — 数字取证与事件响应
- 内存转储分析
- 勒索软件调查
- 浏览器取证
### CTI — 网络威胁情报
- APT 活动归因
- 暗网情报
- 恶意软件 TTP 分析
## 截图与演示
## 环境变量
将 `.env.example` 复制到 `.env` 并配置以下变量:
| 变量 | 必填 | 描述 |
|----------|----------|-------------|
| `DB_USER` | 是 | PostgreSQL 用户名 |
| `DB_PASSWORD` | 是 | PostgreSQL 密码(由安装程序自动生成) |
| `DB_NAME` | 是 | 数据库名称 |
| `DB_HOST` | 是 | 数据库主机(Docker 环境下为 `db`) |
| `DB_PORT` | 是 | 数据库端口(`5432`) |
| `POSTGRES_PASSWORD` | 是 | PostgreSQL 超级用户密码 |
| `JWT_SECRET` | 是 | 用于 JWT 签名的密钥(自动生成) |
| `ADMIN_SEED_PASSWORD` | 否 | 可选的管理员初始密码 |
| `NODE_ENV` | 是 | `production` 或 `development` |
| `CORS_ORIGIN` | 是 | 允许的源 URL |
## API 概览
后端在 `/api/*` 下提供 REST API。主要端点组包括:
| 端点 | 描述 |
|----------|-------------|
| `POST /api/auth/login` | 用户认证 |
| `POST /api/auth/register` | 用户注册(仅限管理员) |
| `GET /api/auth/me` | 当前用户资料 |
| `GET /api/challenges` | 挑战列表 |
| `POST /api/submissions` | 提交 Flag |
| `GET /api/leaderboard` | 积分排行榜 |
| `GET /api/progress` | 用户进度 |
| `GET /api/achievements` | 用户成就 |
| `GET /api/notifications` | 通知流 |
| `GET /api/audit` | 审计日志(管理员) |
| `GET /api/health` | 健康检查端点 |
## 故障排除
### 安装问题
| 问题 | 解决方案 |
|-------|----------|
| 找不到 Docker | 确保 Docker 和 Docker Compose 已安装。使用 `install-cloud.sh` 自动安装。 |
| 后端启动失败 | 检查 `.env` 配置。确保已设置 `JWT_SECRET` 和 `DB_PASSWORD`。 |
| 数据库连接错误 | 使用 Docker 时验证 `DB_HOST=db`。通过 `docker compose ps` 检查数据库是否健康。 |
| 端口 8080 已被占用 | 停止占用 8080 端口的现有服务,或在 `docker-compose.prod.yml` 中更改前端端口映射。 |
### 获取管理员密码
```
docker compose logs backend | grep "ADMIN USER CREATED"
```
### 重置数据库
```
docker compose -f docker-compose.prod.yml down -v
docker compose -f docker-compose.prod.yml up -d --build
```
## 开发说明
- **PowerShell npm 脚本**:被执行策略阻止 — 请使用 `cmd /c "npm run ..."`
- **后台任务**:请勿用于长时间运行的服务器(1 小时后超时)— 请使用专用终端窗口
- **Sequelize sync**:在开发环境中使用 `alter: true` 会自动处理模型变更
- **数据库列**:请使用 `user_rating` / `user_comment`(而非 `rating` / `review`)
- **TypeScript 构建**:如果 `tsc -b` 失败,请使用 `npx vite build` 进行生产构建
## 更新日志
有关最新的更新和版本历史,请查看 [Releases](https://github.com/DLL0x/CFlagger/releases)。
**当前版本:1.1.0**
## 支持
如有问题、疑问或功能请求,请在 [GitHub Issues](https://github.com/DLL0x/CFlagger/issues) 页面提交 issue。
## 许可证
仅供内部使用 — CFlagger Platform
标签:CISA项目, CTF平台, CTI培训, DFIR培训, Docker, GNU通用公共许可证, IP 地址批量处理, Node.js, OPA, PostgreSQL, React, SOC培训, Syscalls, Web安全, XXE攻击, 云部署, 企业安全培训, 内部部署, 团队管理, 基于角色的访问控制, 威胁情报, 子域名变形, 学习路径, 安全教育, 安全竞赛, 安全防御评估, 实战演练, 库, 应急响应, 开发者工具, 开源安全工具, 数字取证, 无线安全, 漏洞攻防, 网络安全培训平台, 网络安全教育, 网络靶场, 自动化攻击, 自动化脚本, 蓝队分析, 蓝队培训, 请求拦截, 逆向工程平台, 靶场