aJesus37/hCTF2
GitHub: aJesus37/hCTF2
轻量级自托管 CTF 竞赛平台,单二进制无依赖部署,支持团队赛、动态积分和内置 SQL 沙箱。
Stars: 0 | Forks: 0
# Heavens CTF 2 (hCTF2)

[](https://github.com/ajesus37/hCTF2/actions/workflows/ci.yml)
[](https://github.com/ajesus37/hCTF2/actions/workflows/release.yml)
[](./LICENSE)
[](https://go.dev)
**Heavens CTF 2** (**hCTF2**) 是一个自托管的 CTF (Capture The Flag) 平台。单个二进制文件,无依赖,可在 Go 支持的任何地方运行。
## 功能特性
- **单个二进制文件** — 内嵌所有资源、模板和迁移;复制一个文件即可运行
- **完整 CLI** — 为管理员和参与者提供 cobra 子命令;包含表格、markdown 和交互式浏览器的 charmbracelet TUI
- **自动迁移** — 启动时自动应用 schema 升级,无数据丢失
- **挑战管理** — 分类、难度、flag 掩码、分值提示、文件附件
- **团队竞赛** — 创建团队、基于邀请链接的加入方式、团队记分榜
- **竞赛生命周期** — 具有时间限制的竞赛,包含草稿→注册→进行中→结束的转换,各竞赛独立记分榜、记分榜黑箱期
- **实时提交流** — 全局 `/submissions` 页面和各竞赛的 feed;管理员可查看所有尝试及 flag 文本
- **动态积分** — 根据解答数量衰减积分
- **积分演变图表** — 使用 Chart.js 可视化顶级竞争者的积分时间线
- **SQL 练习场** — 针对每道挑战的 DuckDB WASM 沙箱,用于 SQL 类 CTF 挑战
- **暗色/亮色主题** — 持久化切换,无内容闪烁
- **管理员面板** — 对挑战、问题、提示、分类、用户和竞赛的完整增删改查
- **导入/导出** — 挑战数据的 JSON 备份和恢复
- **速率限制** — 针对每个用户的 flag 提交节流
- **CTFtime 导出** — CTFtime.org JSON 格式的记分榜
- **OpenAPI 文档** — 可浏览的 Swagger UI,位于 `/api/openapi`
## 快速开始
```
docker compose up -d
```
打开 http://localhost:8090 — 默认凭据:`admin@hctf.local` / `changeme`
## 安装说明
### 选项 1:二进制文件(最快)
从 [Releases](https://github.com/ajesus37/hCTF2/releases) 下载最新的二进制文件:
```
curl -L https://github.com/ajesus37/hCTF2/releases/latest/download/hctf2-linux-amd64 -o hctf2
chmod +x hctf2
./hctf2 serve --admin-email admin@example.com --admin-password yourpassword
```
### 选项 2:从源码构建
需要 Go 1.24+ 和 [Task](https://taskfile.dev):
```
git clone https://github.com/ajesus37/hCTF2.git
cd hctf2
./setup.sh # checks requirements and downloads dependencies
task build
./hctf2 serve --admin-email admin@example.com --admin-password yourpassword
```
## 配置
所有服务器选项通过 `hctf2 serve` 的标志设置。有关完整的注释参考,请参阅 [CONFIGURATION.md](CONFIGURATION.md)。
| 选项 | 标志 | 默认值 |
|--------|------|---------|
| 端口 | `--port` | `8090` |
| 数据库 | `--db` | `./hctf2.db` |
| 管理员邮箱 | `--admin-email` | — |
| 管理员密码 | `--admin-password` | — |
| 每日消息 | `--motd` | — |
### CLI
该二进制文件也可作为运行中服务器的功能齐全的 CLI 客户端:
```
# 认证
hctf2 login --server http://localhost:8090 --email admin@example.com --password yourpassword
# 交互式浏览挑战 (TTY)
hctf2 challenge browse
# 提交 flag
hctf2 flag submit FLAG{...}
# 实时提交动态 (每 5s 自动刷新)
hctf2 submissions --watch
# 查看个人资料
hctf2 user profile
# 管理员:创建挑战 (TTY 交互式,或通过 flags)
hctf2 challenge create --title "My Challenge" --category Web --difficulty Easy --points 200
hctf2 challenge export --output backup.json
hctf2 challenge import backup.json
# 管理员:管理竞赛
hctf2 competition create "CTF 2026"
hctf2 competition start
hctf2 competition scoreboard
# 管理员:管理用户
hctf2 user list
hctf2 user promote
# 管理员:导出/导入完整平台配置 (challenges, competitions, settings)
hctf2 config export -o backup.yaml
hctf2 config import backup.yaml
# 用于脚本编写的 JSON 输出
hctf2 --json challenge list | jq '.[] | .title'
```
所有 create/update 命令在 TTY 上以交互方式提示。传递 `--quiet` 以抑制输出(仅返回 ID),传递 `--json` 获取机器可读的输出。
运行 `hctf2 --help` 查看完整的命令树。
## 自托管
### Docker(推荐)
```
docker run -d \
-p 8090:8090 \
-v hctf2-data:/data \
-e JWT_SECRET="$(openssl rand -base64 32)" \
ghcr.io/ajesus37/hCTF2 \
serve --db /data/hctf2.db --admin-email admin@hctf.local --admin-password changeme
```
或使用 Docker Compose(参见仓库中的 `docker-compose.yml`):
```
docker compose up -d
```
### 反向代理 (Caddy)
```
ctf.example.com {
reverse_proxy localhost:8090
}
```
### 备份
```
# Docker volume
docker compose exec hctf2 cat /data/hctf2.db > hctf2.db.backup-$(date +%Y%m%d)
# 或者如果使用 bind mount
cp ./data/hctf2.db ./data/hctf2.db.backup-$(date +%Y%m%d)
```
### 升级
拉取最新镜像并重启 — 迁移会自动运行:
```
docker compose pull
docker compose up -d
```
无需手动迁移步骤。
### 进阶:裸机二进制
如果您更喜欢直接运行二进制文件而不使用 Docker:
```
./hctf2 serve --db /var/lib/hctf2/hctf2.db \
--admin-email admin@example.com \
--admin-password yourpassword \
--jwt-secret "$(openssl rand -base64 32)"
```
使用您喜欢的进程管理器(例如 supervisord, runit)来保持其运行。
## 安全性
- 使用 bcrypt (cost 12) 对密码进行哈希处理
- JWT token 存储在 HttpOnly cookie 中
- 所有 SQL 查询均使用参数化语句
- 默认无遥测或分析
- 管理员路由受角色中间件保护
### JWT 密钥配置
**生产环境(必填):**
```
./hctf2 serve --jwt-secret "$(openssl rand -base64 32)"
```
或通过环境变量:
```
export JWT_SECRET="$(openssl rand -base64 32)"
./hctf2 serve
```
**开发环境(不安全):**
```
./hctf2 serve --dev # Allows default JWT secret with warning
```
服务器将拒绝在没有适当 JWT 密钥(最少 32 个字符)的情况下以生产模式启动。有关详细信息,请参阅 [CONFIGURATION.md](CONFIGURATION.md)。
## 文档
| 文档 | 内容 |
|-----|----------|
| [CONFIGURATION.md](CONFIGURATION.md) | 所有配置选项详情 |
| [ARCHITECTURE.md](ARCHITECTURE.md) | 代码库结构说明 |
| [OPERATIONS.md](OPERATIONS.md) | 部署、监控、备份、故障排除 |
| [SQL_PLAYGROUND.md](SQL_PLAYGROUND.md) | DuckDB WASM SQL 挑战模式 |
| [TESTING.md](TESTING.md) | 运行和编写测试 |
## 贡献
欢迎提交 Issue 和 PR。要在本地运行:
```
task deps
task run # starts on :8090 with a default admin
task test # run tests
```
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
## 构建方式
架构、数据库 schema 和核心后端均是在没有任何 AI 辅助的情况下设计和实现的。我们将 AI 工具用于特定的、范围明确的任务——起草样板代码、建议重构、编写文档——并且每一项更改都会经过审查,通常会被人类维护者重写(除了前端。虽然架构是由人类选择的,但这并非我的核心技能,因此我让 AI 进行实现,但我审查并验证了所有内容)。这不是自主的“生成即发布”代码。
docker-compose.yml 示例
``` services: hctf2: image: ghcr.io/ajesus37/hCTF2:latest ports: - "8090:8090" volumes: - ./data:/data environment: JWT_SECRET: ${JWT_SECRET:-change-me-in-production} command: > --db /data/hctf2.db --admin-email admin@hctf.local --admin-password changeme restart: unless-stopped ```Nginx 配置
``` server { server_name ctf.example.com; location / { proxy_pass http://127.0.0.1:8090; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ```标签:Chart.js, Cobra, CTF平台, DuckDB, EVTX分析, Golang, Go语言, MIT许可, OPA, SQLite, SQL Playground, SQL注入练习, TUI, WASM, WebAssembly, 动态积分, 单文件部署, 后台管理, 团队赛, 夺旗赛, 安全教育, 安全编程, 实战演练, 开源, 开箱即用, 日志审计, 积分榜, 程序破解, 竞赛系统, 网络安全, 自托管, 请求拦截, 隐私保护, 靶场, 题目管理