Boreas37/ctfd-vmforge-plugin

GitHub: Boreas37/ctfd-vmforge-plugin

为CTFd提供基于Proxmox VE的按需虚拟机管理插件。

Stars: 0 | Forks: 0

# ctfd-vmforge 一个为每个玩家提供**自己的按需挑战虚拟机**的 [CTFd](https://github.com/CTFd/CTFd) 插件,通过**每个用户的 WireGuard VPN** 可达——这是 Proxmox VE 的原生解决方案,针对 [CTFd-Whale](https://github.com/frankli0324/ctfd-whale)(针对 Docker/Kubernetes)。 当玩家点击**启动挑战虚拟机**时,插件会从 Proxmox 的模板中克隆一个虚拟机,等待它获取 IP,然后玩家通过 WireGuard 攻击它。 在**解决**或**TTL 过期**后,虚拟机会自动销毁。 ## 功能 - **每个用户的挑战虚拟机**——从 Proxmox 模板链接克隆(即时,写时复制)。 - **每个用户的 WireGuard VPN**——每个用户一个配置,下载一次,适用于每个挑战(HackTheBox 风格)。或者如果您更喜欢,可以切换到按虚拟机范围配置。 - **两种 IP 发现模式:** - `agent`——cloud-init 设置静态 IP,QEMU 客户端代理报告它。 - `dhcp-lease`——不需要代理;虚拟机通过 DHCP 获取 IP,插件通过 MAC 地址读取租约(非常适合您无法修改的任意 VulnHub/Windows 图像)。 - **异步配置**——`Start` 立即返回;克隆/启动在后台发生,UI 轮询直到就绪。许多同时启动永远不会阻止网站。 - **每个挑战一个虚拟机**(数据库强制执行)。 - **解决、手动停止或 TTL 过期后自动拆解**——释放虚拟机、IP 和资源。 - **管理 UI**——虚拟机管理程序 CRUD、“测试连接”和实时虚拟机仪表板。 - **无需修改 CTFd 核心**——插件式,所有配置通过管理面板进行。 - 密钥(Proxmox 令牌、WireGuard 服务器私钥)在静止状态下是 **Fernet 加密的**。 目标 **CTFd 3.8.x**、**Python 3.11+**、**Proxmox VE 8/9**。 ## 工作原理 ``` player CTFd host VM (this plugin runs here) ┌──────────┐ WireGuard UDP ┌───────────────────────────────────┐ │ wg client│──────────────────▶│ wg0 ─┐ │ └──────────┘ │ │ routes to challenge subnet │ │ Proxmox API (clone/start/destroy)│ └───────┬────────────────────────────┘ ▼ ┌──────────────────────────────────────────┐ │ Proxmox VE — clones challenge VM from a │ │ template onto an isolated challenge bridge│ └──────────────────────────────────────────┘ ``` 该插件通过 `proxmoxer` REST 客户端(API 令牌认证)与 Proxmox 通信。挑战虚拟机位于专用桥接/子网上;WireGuard 主机将玩家路由到它们。有关完整拓扑和设置的详细信息,请参阅 [INSTALL.md](INSTALL.md)。 ## 快速开始 1. **安装插件** cd /opt/CTFd/CTFd/plugins git clone https://github.com/Boreas37/ctfd-vmforge-plugin.git ctfd_vmforge pip install -r ctfd_vmforge/requirements.txt # 重启 CTFd 2. **准备 Proxmox**——一个 API 令牌、一个挑战虚拟机 **模板**、一个 WireGuard 服务器,以及(对于 `dhcp-lease` 模式)挑战子网上的 DHCP 服务器。完整说明请参阅 [INSTALL.md](INSTALL.md)。 3. **在 CTFd 中配置**(管理员→插件配置/`Configs`):WireGuard 服务器密钥+端点、虚拟机管理程序(主机、API 令牌、节点)、IP 发现模式以及客户端允许的 IP(挑战子网)。配置键在 [`config.py`](ctfd_vmforge/config.py)中列出。 4. **创建一个类型为 **`vm_challenge`** 的挑战,将其指向您的模板 VMID,设置 CPU/RAM/TTL,并添加标志。 然后玩家打开挑战→**启动挑战虚拟机**→下载他们的 VPN 配置→连接→攻击→提交标志。 ## 配置键 所有都位于 CTFd 的 `Configs` 表中(前缀 `VMFORGE_`),可从管理面板编辑: | 键 | 含义 | |---|---| | `WG_INTERFACE` / `WG_CONFIG_PATH` | 服务器接口+配置文件(例如 `wg0`,`/etc/wireguard/wg0.conf`) | | `WG_SERVER_ENDPOINT` | 向客户端宣传的公共 `host:port` | | `WG_SERVER_PUBKEY` / `WG_SERVER_PRIVKEY` | 服务器密钥(私钥存储为 Fernet 加密) | | `WG_SUBNET` | 客户端隧道 IP 的池(例如 `10.13.13.0/24`) | | `WG_CLIENT_ALLOWEDIPS` | 客户端通过隧道路由的内容 = 您的挑战子网 | | `VM_POOL` | 挑战虚拟机的 Proxmox 池 | | `VM_IP_DISCOVERY` | `agent` 或 `dhcp-lease` | | `VM_DHCP_LEASE_FILE` | dnsmasq 租约文件(对于 `dhcp-lease` 模式) | | `VM_NET_SUBNET` / `VM_NET_GATEWAY` / `VM_NET_RANGE` | 静态 IP 分配(对于 `agent` 模式) | | `VM_CLONE_FULL` | `1` = 完整克隆,默认 `0` = 链接克隆 | | `DEFAULT_TTL` | 默认虚拟机生命周期(秒) | 虚拟机管理程序连接详细信息(主机、API 令牌、节点)通过管理 UI 存储为 `HypervisorConfig` 行,而不是配置文件中。 ## 添加更多挑战 对于每个挑战虚拟机镜像,简要来说:将其放在 **挑战桥接** 上,确保虚拟机 **使用 DHCP**(对于 `dhcp-lease` 模式)与 **`e1000`** 网卡,从模板中**移除 `persistent-net` udev 规则**(这是破坏旧 Linux/VulnHub 图像克隆的第 1 件事),将其转换为 **Proxmox 模板**,然后创建 CTFd 的 `vm_challenge` + 标志。完整的、可复制粘贴的配方(包括 `virt-customize` 修复和 EFI 处理)在 [INSTALL.md](INSTALL.md#adding-a-challenge-vm) 中。 ## 路线图/尚未完成 - 每个用户的网络隔离选项(防火墙,使 VPN 用户只能访问自己的虚拟机)。 - `TerraformProvisioner` / `LibvirtProvisioner`(接口在 `provisioners/` 中已存根)。 - 异步/每个用户-WireGuard 路径的验证测试套件。 ## 许可证 MIT — 请参阅 [LICENSE](LICENSE)。
标签:CTFd 插件, DHCP, IP 发现, Proxmox VE, Python 开发, WireGuard VPN, 云基础设施, 克隆, 加密存储, 安全测试, 安全竞赛, 安全配置, 异步配置, 挑战赛, 攻击性安全, 数据库管理, 特权提升, 生成式AI安全, 用户界面, 自动化部署, 虚拟机, 资源管理, 逆向工具