n0xnull/BlueForge
GitHub: n0xnull/BlueForge
BlueForge 是一个开源的防御性安全加固竞赛平台,通过自动化评分和实时排行榜,让参赛者在限时环境中修补真实漏洞,替代传统人工评分流程。
Stars: 0 | Forks: 0
# 🛡️ BlueForge
### 防御加固竞赛平台 — *守护主机,而不仅仅是夺旗。*
将一组 Ubuntu VM 指向打分服务器,让参赛者在限时环境下修补
真实漏洞,并看着排行榜**实时**更新
伴随每一次修复自动完成 —— 全自动,无需手动刷新,无需电子表格评分。
免费且开源,可在 Vercel + Supabase 上自托管。
[](LICENSE)
[]()
[]()
[](https://vercel.com)
[](https://supabase.com)
[]()
[](https://www.linkedin.com/in/abil-khosim-itsec/)
[⬇️ 快速开始](#-quickstart) · [✨ 功能](#-key-features) · [⚙️ 工作原理](#️-how-it-works) · [📖 技术设计](docs/TECHNICAL-DESIGN.md) · [🧯 故障排除](#-troubleshooting-organizer--participant-vm) · [⚠️ 免责声明](DISCLAIMER.md)
**排行榜** — 实时排名、分数和倒计时,无需刷新。
**管理控制台** — 创建会话,开始/暂停/停止,管理参赛者,自动刷新。
**参赛者 kiosk** — 一个配套窗口(非全屏锁定),因此参赛者可以在注册并实时跟踪分数的同时,
继续使用终端进行工作。
## 💻 系统要求
| | 组织者(Web) | 参赛者(每台 VM) |
|---|---|---|
| 托管 | 免费的 Vercel + Supabase 项目 | — |
| OS | — | Ubuntu (20.04–26.04),通过 `image/build/provision.sh` 进行配置 |
| Runtime | Node.js 20+(仅用于开发/构建 — Vercel 在云端构建) | Python 3.10+,root 权限(读取 `/etc/shadow` 等) |
| 网络 | 公共 HTTPS endpoint(Vercel) | 连接到该 endpoint 的出站 HTTPS — agent 仅*向外轮询*,因此在 NAT 后也能正常工作 |
## 🚀 快速开始
### 1. 数据库 (Supabase)
1. 在 [supabase.com](https://supabase.com) 创建一个免费项目。
2. 在 **SQL Editor** 中,依次运行 `db/schema.sql` 和 `db/seed/difficulties.sql`。
3. 记下你的 **Project URL**、**anon key** 和 **service_role key**(Settings → API)。
### 2. Web 门户 (Next.js)
```
cd web
cp .env.example .env.local # fill in Supabase creds + AGENT_HMAC_SECRET
npm install
npm run dev # http://localhost:3000
```
部署到 Vercel:导入仓库 → 将根目录设置为 `web/` → 填入
环境变量。
### 3. Agent(在每台参赛者的 Ubuntu VM 内)
```
cd agent
cp config.example.yaml config.yaml # set portal_url to your deployed web URL
pip install -r requirements.txt
sudo python3 main.py # open http://localhost:9090 to register
```
或者启动 kiosk 配套应用程序,而不是直接运行 bare agent:
`python3 kiosk.py`(关于在 VM 启动时自动启动,请参阅 [`docs/kiosk-setup.md`](docs/kiosk-setup.md))。
### 4. 运行竞赛
1. 在 **`/admin`** 上:创建一个会话,选择难度(简单/中等/困难),获取 **session code**。
2. 参赛者使用该 code 在 `localhost:9090` 进行注册。
3. 组织者点击 **START** → 每个 agent 同时开始评分 → **`/`** 上显示实时分数。
4. **STOP** 冻结分数 → 导出结果。
## 🎛️ 各组件功能
| 组件 | 功能描述 |
|---|---|
| `agent/` | Python agent — 运行检查、计算分数、签名并发送结果、提供本地 kiosk UI |
| `web/app/api/v1/*` | 签名的 agent 对接 API — 注册、状态、分数、心跳、快照、时钟同步 |
| `web/app/page.tsx` | 公开的实时排行榜 |
| `web/app/admin/page.tsx` | 组织者控制台 — 会话、参赛者、开始/暂停/停止、取消资格 |
| `db/` | Postgres schema + 种子数据(难度、检查项)+ `leaderboard` 视图 |
| `image/build/provision.sh` | 将 15 个预设漏洞植入基础 Ubuntu VM |
## ⚙️ 工作原理
```
[ participant VM: blueforge-agent ] --HTTPS (polling, signed)--> [ Next.js /v1 API ]
|
[ Supabase: Postgres + Realtime ]
|
[ Web: live Leaderboard + Admin console ]
```
agent 位于 NAT 之后,仅*向外轮询* — 服务器永远不需要
直接访问参赛者的 VM。每个评分周期:与
服务器同步时钟(无需手动修复时钟) → 获取竞赛状态 → 运行
当前检查项 → 计算分数(纯函数,`eligible = failed at
START`) → 签名并发送。完整设计见
[`docs/TECHNICAL-DESIGN.md`](docs/TECHNICAL-DESIGN.md)。
## 🗺️ 路线图
- **v0.2** *(当前)* — 涵盖 3 个真实难度级别的 15 项检查,kiosk 配套应用,管理员自动刷新,agent 时钟偏差修复。
- **v0.3** — 更丰富的社区贡献检查插件 API,证据查看器 UI,CSV/PDF 结果导出。
- **v0.4** — Windows 参赛者 VM 支持(agent 移植),为减少资源占用使用 Go 重写 agent。
- **v1.0** — 生产环境加固:完整的重放保护、速率限制、多组织者机构。
详情请参阅 [`docs/V0.2-PLAN.md`](docs/V0.2-PLAN.md) 以及完整的 TDD 路线图 (§29)。
## 🧯 故障排除(组织者 / 参赛者 VM)
供组织者在参赛者 VM 上最常执行的两项操作的快速参考。完整的分步指南
(印尼语)位于
[`docs/DEPLOYMENT-GUIDE.md`](docs/DEPLOYMENT-GUIDE.md#-troubleshooting)。
**在全新的 VM 克隆上首次运行:**
```
# 首先清除 shell history —— 克隆的 VM 不应泄露前一个用户的命令
cat /dev/null > ~/.bash_history && history -c && history -w
cd ~/BlueForge
git pull
sudo bash image/build/provision.sh # plants the 15 intentional vulnerabilities
```
**将代码更新拉取到已安装的 VM 上** — 实际在启动时运行的 kiosk/agent
是一个由 `install-kiosk.sh` 安装到
`/opt/blueforge-agent/` 的**独立副本**,而不是 git checkout 本身。
仅靠 `git pull` **不会**更新正在运行的内容 — 你必须重新同步:
```
cd ~/BlueForge
git pull
sudo bash agent/kiosk/install-kiosk.sh # resyncs code into /opt + restarts the service
sudo systemctl restart blueforge-agent
```
**参赛者意外关闭了 kiosk 窗口:** `kiosk.py` 现在会在大约 2 秒内
自动重新打开窗口 — 无需任何操作。如果
窗口确实卡住了,请双击桌面上的
**"Restart BlueForge"** 快捷方式(无需终端),或者运行
`bash /opt/blueforge-agent/kiosk/restart-kiosk.sh`。
**常用诊断命令:**
```
systemctl status blueforge-agent dhc-telnetd # are the services alive?
ps aux | grep -E "kiosk.py|main.py" # is the kiosk/agent actually running?
journalctl --user -b | grep -i -E "kiosk|webview|gtk" # kiosk autostart logs this boot
diff ~/BlueForge/agent/kiosk.py /opt/blueforge-agent/kiosk.py # in sync?
```
## ⚠️ 免责声明
本平台出于训练目的,故意在 VM 中植入安全漏洞。
**仅限隔离/物理隔离的竞赛网络使用** — 部署前请参阅
[DISCLAIMER.md](DISCLAIMER.md)。
## 📄 许可证
[MIT](LICENSE) © 2026 Abil Khosim。
**管理控制台** — 创建会话,开始/暂停/停止,管理参赛者,自动刷新。
**参赛者 kiosk** — 一个配套窗口(非全屏锁定),因此参赛者可以在注册并实时跟踪分数的同时,
继续使用终端进行工作。