onlygoku/dbz-cyber-arena
GitHub: onlygoku/dbz-cyber-arena
一款生产就绪的龙珠主题 CTF 竞赛平台,解决安全培训和竞赛场景下快速搭建、公平竞技和作弊检测的核心需求。
Stars: 0 | Forks: 0
# 🐉 Dragon Ball Z Cyber Arena — CTF 平台
一个功能齐全、生产就绪的 Capture The Flag 竞赛平台,以 Dragon Ball Z 和中国赛博朋克美学为主题。
## 功能概述
| 功能 | 详情 |
|---|---|
| **主题** | Dragon Ball Z + 赛博朋克黑客美学 |
| **计分** | 静态分值,所有挑战共 6000 分 |
| **队伍** | 最多 3 名成员,通过邀请码加入 |
| **Flag 格式** | `PREFIX{inner_value}` — 前缀可在管理面板配置 |
| **尝试次数** | 每个挑战 10 次;超出限制后每次错误提交扣 10 分 |
| **速率限制** | 每队每秒 1 次提交 |
| **动态 Flag** | 选定挑战使用基于每队 HMAC 派生的 flag |
| **积分榜** | 实时排行榜,带 10 秒缓存;最后一小时冻结 |
| **实时动态** | 解题事件实时流式更新 |
| **庆祝动画** | Flag 正确时显示全屏弹窗 |
| **Boss 挑战** | Shenron Ultimate Wish (1000 分) 触发 Shenron 画布动画 |
| **First Blood** | 每个挑战的首个解题队伍获得徽章 |
| **Dragon Radar** | 队伍仪表板上的 SVG 雷达图,显示分类进度 |
| **自动提示** | 根据经过时间或解题数量阈值自动发布提示 |
| **挑战导入** | 通过 ZIP 上传或目录扫描自动导入挑战 |
| **安全监控** | 检测过多提交、同 IP 组队、快速解题等行为 |
| **管理面板** | 全面管理:用户、队伍、挑战、提交记录、安全日志 |
| **邮箱验证** | 基于 SMTP;开发模式下自动验证 |
## 快速开始 (本地 Docker Compose)
### 前置条件
- Docker ≥ 24
- Docker Compose ≥ 2.x
### 步骤
```
# 克隆 repository
git clone https://github.com/yourorg/ctf-platform.git
cd ctf-platform
# 复制 environment file (如需编辑)
cp .env.example .env
# 启动所有 services
docker compose up --build
# 打开 platform
open http://localhost:5000
# 管理员登录 (默认)
# 邮箱: admin@ctf.local
# 密码: AdminPass123!
```
平台**自动**执行以下操作:
- 创建 PostgreSQL schema
- 创建管理员账户
- 从 `challenges/` 目录导入所有挑战
## 本地开发 (无 Docker)
```
# 创建 virtual environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装 dependencies
pip install -r requirements.txt
# 设置 environment
cp .env.example .env
# 编辑 .env — 将 DATABASE_URL 设置为您的本地 PostgreSQL 实例
# 运行
FLASK_ENV=development python run.py
```
## 部署到 Render.com
### 选项 A — Blueprint (推荐)
1. 将代码推送到 GitHub。
2. 在 [Render Dashboard](https://dashboard.render.com) 中,点击 **New → Blueprint**。
3. 连接你的 GitHub 仓库。
4. Render 读取 `render.yaml` 并创建:
- 一个运行 Gunicorn 的 **Web Service**
- 一个 **PostgreSQL** 数据库
5. 通过 **Render → Environment → Secret Files** 设置敏感环境变量:
- `ADMIN_PASSWORD` — 你的安全管理员密码
- `MAIL_USERNAME` / `MAIL_PASSWORD` — SMTP 凭据
6. 部署。首次启动会自动初始化数据库和管理员账户。
### 选项 B — 手动
1. 在 Render 上**创建 PostgreSQL 数据库** (Free 或 Starter 套餐)。
2. **创建 Web Service**:
- 环境:Python 3
- 构建命令:`pip install -r requirements.txt`
- 启动命令:`gunicorn run:app --bind 0.0.0.0:$PORT --workers 2 --timeout 60`
3. 添加 `.env.example` 中的所有环境变量 (将密钥标记为 Secret)。
4. 将 `DATABASE_URL` 设置为步骤 1 中的 Internal Database URL。
### 环境变量参考
| 变量 | 必填 | 描述 |
|---|---|---|
| `SECRET_KEY` | ✅ | Flask session secret (使用 Render 自动生成) |
| `DATABASE_URL` | ✅ | PostgreSQL 连接字符串 |
| `ADMIN_EMAIL` | ✅ | 管理员账户邮箱 (首次启动时创建) |
| `ADMIN_PASSWORD` | ✅ | 管理员账户密码 |
| `FLAG_PREFIX` | ✅ | Flag 前缀,例如 `THA` → `THA{...}` |
| `CTF_NAME` | — | 比赛显示名称 |
| `DYNAMIC_FLAG_SECRET` | ✅ | 用于每队动态 flag 的 HMAC 密钥 |
| `MAX_TEAM_SIZE` | — | 默认值:3 |
| `MAX_ATTEMPTS` | — | 默认值:10 |
| `PENALTY_POINTS` | — | 默认值:10 |
| `SCOREBOARD_CACHE_TTL` | — | 积分榜刷新间隔秒数 (默认值:10) |
| `MAIL_SUPPRESS_SEND` | — | 设置为 `true` 以跳过邮件发送 (开发模式) |
| `MAIL_SERVER` | — | SMTP 主机 |
| `MAIL_USERNAME` | — | SMTP 用户名 |
| `MAIL_PASSWORD` | — | SMTP 密码 |
## 挑战格式
### 目录结构
```
challenges/
└── my_challenge/
├── challenge.json # Metadata
├── description.md # Challenge description (HTML supported)
├── flag.txt # Inner flag value only (no PREFIX{})
└── files/ # Optional downloadable files
```
### challenge.json Schema
```
{
"title": "My Challenge",
"category": "web",
"difficulty": "easy",
"points": 150,
"is_dynamic": false,
"is_hidden": false,
"is_boss": false,
"connection_info": "nc pwn.server.com 1337",
"hints": [
{
"content": "Hint text here",
"cost": 0,
"auto_release_minutes": 30,
"auto_release_solves": null,
"is_visible": false
}
]
}
```
### Flag 格式
在 `flag.txt` 中**仅存储内部值**:
```
my_secret_flag_value
```
平台会自动添加配置的前缀:
```
THA{my_secret_flag_value}
```
### 通过管理面板导入
1. 将挑战目录打包为 Zip:`zip -r my_challenge.zip my_challenge/`
2. 前往 **Admin → Challenges → Import ZIP**
3. 上传 zip 文件
## 动态 Flag
在 `challenge.json` 中启用 `"is_dynamic": true`。
每个队伍收到一个唯一的 flag,派生自:
```
HMAC-SHA256(DYNAMIC_FLAG_SECRET, secret:team_id:challenge_id)[:8]
```
示例结果:`THA{a91f3c7e}`
平台会根据队伍的具体值验证提交的 flag。
## 管理面板
访问地址 `/admin` (需要管理员账户)。
| 区域 | 描述 |
|---|---|
| **Dashboard** | 统计数据、事件控制、挑战健康监控 |
| **Challenges** | 创建、编辑、隐藏/显示、删除、ZIP 导入 |
| **Users** | 搜索、封禁/解封、验证、提升为管理员 |
| **Teams** | 封禁、暂停、重置进度 |
| **Submissions** | 所有 flag 提交的分页日志 |
| **Security** | 可疑活动日志 (过多尝试、同 IP、快速解题) |
| **Settings** | 比赛开始/停止、积分榜冻结、flag 前缀、公告 |
## 积分榜冻结
在比赛的**最后一小时**:
1. 管理员点击 **Freeze Scoreboard** (也可手动触发)。
2. 公共积分榜显示冻结时的排名。
3. 管理员可以看到实时积分榜。
4. 比赛结束时,点击 **End Event** — 公布实时排名。
## Shenron Boss 挑战
当 **Shenron Ultimate Wish** 挑战被解开时:
1. 正确的 flag 提交触发庆祝弹窗。
2. **全屏画布动画** 渲染 Shenron — 神龙 — 带着粒子效果飞过屏幕。
3. 首个解出该题的队伍获得 🩸 **First Blood** 徽章。
## 项目结构
```
ctf-platform/
├── app/
│ ├── __init__.py # App factory, bootstrap
│ ├── models/ # SQLAlchemy models
│ │ ├── user.py
│ │ ├── team.py
│ │ ├── challenge.py
│ │ ├── submission.py
│ │ ├── event.py
│ │ └── security.py
│ ├── routes/ # Flask blueprints
│ │ ├── auth.py # Register, login, verify
│ │ ├── team.py # Create, join, manage
│ │ ├── challenges.py # List, detail, flag submit
│ │ ├── scoreboard.py # Leaderboard + feed
│ │ ├── admin.py # Full admin panel
│ │ └── api.py # JSON polling endpoints
│ ├── services/ # Business logic
│ │ ├── flag_service.py # Validation, dynamic flags
│ │ ├── score_service.py # Score calculation
│ │ ├── cache_service.py # In-process TTL cache
│ │ ├── hint_service.py # Auto-release hints
│ │ ├── security_service.py # Anomaly detection
│ │ ├── email_service.py
│ │ └── challenge_import.py
│ ├── templates/ # Jinja2 templates
│ ├── static/ # CSS, JS, images
│ └── utils/ # Decorators, helpers
├── challenges/ # Bundled example challenges
├── docker/
│ └── postgres/init.sql
├── config.py
├── run.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── render.yaml
├── Procfile
└── .env.example
```
## 安全说明
- 所有密码使用 Werkzeug 的 `generate_password_hash` (scrypt/pbkdf2) 进行哈希处理。
- Flag 比较使用 `hmac.compare_digest` 以防止计时攻击。
- 动态 flag 生成使用带有服务器端密钥的 HMAC-SHA256。
- 管理员路由要求用户记录具有 `is_admin=True`。
- 速率限制在提交层强制执行 (每队每秒 1 次提交)。
- 安全事件会被记录以供管理员审查。
## 许可证
MIT — 可免费用于教育和竞赛用途。
*Power up. Hack the planet. Gather the Dragon Balls.* 🐉
标签:CTF平台, DNS解析, Docker, Flask, HMAC校验, meg, PostgreSQL, Python, Render部署, SVG动画, Syscall, TailwindCSS, WebSocket, Web开发, 七龙珠, 依赖分析, 信息安全, 动态Flag, 后端开发, 夺旗赛, 安全培训, 安全监控, 安全防御评估, 实时记分板, 开源项目, 无后门, 测试用例, 竞赛系统, 管理员面板, 网络安全, 请求拦截, 赛博朋克, 逆向工具, 邮件验证, 隐私保护, 黑客技术