aJesus37/hCTF2

GitHub: aJesus37/hCTF2

轻量级自托管 CTF 竞赛平台,单二进制无依赖部署,支持团队赛、动态积分和内置 SQL 沙箱。

Stars: 0 | Forks: 0

# Heavens CTF 2 (hCTF2) ![hCTF2 logo](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/970d6fb1dd035710.svg) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/fc3256ca08035712.svg)](https://github.com/ajesus37/hCTF2/actions/workflows/ci.yml) [![Release](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/e5d4ee39a0035713.svg)](https://github.com/ajesus37/hCTF2/actions/workflows/release.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-purple.svg)](./LICENSE) [![Go](https://img.shields.io/badge/Go-1.24+-blue.svg)](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`
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 ```
## 安装说明 ### 选项 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 } ```
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; } } ```
### 备份 ``` # 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 进行实现,但我审查并验证了所有内容)。这不是自主的“生成即发布”代码。
标签:Chart.js, Cobra, CTF平台, DuckDB, EVTX分析, Golang, Go语言, MIT许可, OPA, SQLite, SQL Playground, SQL注入练习, TUI, WASM, WebAssembly, 动态积分, 单文件部署, 后台管理, 团队赛, 夺旗赛, 安全教育, 安全编程, 实战演练, 开源, 开箱即用, 日志审计, 积分榜, 程序破解, 竞赛系统, 网络安全, 自托管, 请求拦截, 隐私保护, 靶场, 题目管理