kevin-cazal/deploy_challenges
GitHub: kevin-cazal/deploy_challenges
将 ctflci 兼容的 CTF 挑战仓库通过 Docker 容器自动部署到 CTFd 实例的自动化工具。
Stars: 0 | Forks: 0
# 部署 challenges
将兼容 [ctfcli](https://github.com/CTFd/ctfcli) 的挑战仓库部署到 CTFd 实例。
挑战仓库必须遵循 [ctfcli 兼容布局](CHALLENGE_REPOSITORY.md)。参考实现:[osint_investigator_ctf_challenges](https://github.com/Manta-Epitech-Academy/osint_investigator_ctf_challenges)。
## Docker 镜像
发布到 [GitHub Container Registry](https://github.com/kevin-cazal/deploy_challenges/pkgs/container/deploy_challenges):
```
ghcr.io/kevin-cazal/deploy_challenges:latest
```
标签:`latest`(默认分支)、commit SHA,以及 git 标签上的 `v*` semver。
### 从 git 仓库部署(CTFd 位于宿主机)
```
export GPG_PASSPHRASE='…' # required if challenges use private/flag.txt.gpg
docker run --rm \
-e GPG_PASSPHRASE \
--add-host=host.docker.internal:host-gateway \
ghcr.io/kevin-cazal/deploy_challenges:latest \
https://github.com/Manta-Epitech-Academy/osint_investigator_ctf_challenges.git \
--subdir challenges \
--url http://host.docker.internal:9042/ctfd/default \
--token ctfd_YOUR_ADMIN_TOKEN
```
在 macOS/Windows Docker Desktop 上,通常无需 `--add-host` 即可使用 `host.docker.internal`。
### 从私有 git 仓库部署(SSH)
该镜像包含 `openssh-client` 和 GitHub 主机密钥。挂载你的 SSH 密钥(或 agent)。
默认情况下,Git clone 使用 `ssh -F /dev/null`,因此在 Docker 中挂载到宿主机且所有权错误的 `~/.ssh/config` 不会阻碍 clone。
```
export GPG_PASSPHRASE='…'
docker run --rm \
-e GPG_PASSPHRASE \
-v "$HOME/.ssh:/root/.ssh:ro" \
ghcr.io/kevin-cazal/deploy_challenges:latest \
git@github.com:kevin-cazal/shell-1-challenges.git \
--url https://YOUR_CTFD_HOST/ctfd/default \
--token ctfd_YOUR_ADMIN_TOKEN \
--force
```
使用 **ssh-agent** 代替挂载密钥:
```
docker run --rm \
-e GPG_PASSPHRASE \
-v "$SSH_AUTH_SOCK:/ssh-agent" \
-e SSH_AUTH_SOCK=/ssh-agent \
ghcr.io/kevin-cazal/deploy_challenges:latest \
git@github.com:kevin-cazal/shell-1-challenges.git \
--url https://YOUR_CTFD_HOST/ctfd/default \
--token ctfd_YOUR_ADMIN_TOKEN \
--force
```
HTTPS 私有仓库同样适用 —— 在 URL 中嵌入 GitHub PAT:
`https://x-access-token:TOKEN@github.com/owner/repo.git`
### 本地挑战目录
```
docker run --rm \
-e GPG_PASSPHRASE \
-v "$PWD/challenges:/challenges:ro" \
--add-host=host.docker.internal:host-gateway \
ghcr.io/kevin-cazal/deploy_challenges:latest \
/challenges --no-clone \
--url http://host.docker.internal:9042/ctfd/default \
--token ctfd_YOUR_ADMIN_TOKEN
```
### 选项
| Flag | 描述 |
|------|-------------|
| `--url` | CTFd API base URL(必填) |
| `--token` | Admin API token(必填) |
| `--subdir` | 源仓库内的子目录 |
| `--no-clone` | 源路径为本地路径 |
| `--force` | 重新同步现有挑战 |
| `--wait` | 等待 CTFd 的秒数(默认 60) |
| `--no-sync-flags` | 跳过 GPG/API flag 同步 |
| `GPG_PASSPHRASE` | 解密 `private/flag.txt.gpg` 或 `flag.yml.gpg` |
| `SHELL1_FLAG_SECRET` | 用于 `type: dynamic` flag(插件)的 CTFd 环境变量 |
### CTFd 主页
如果挑战根目录包含 **`index.html`**(HTML 片段),部署时会更新路由为 **`index`** 的 CTFd 页面(创建或修补)。省略该文件则保持实例主页不变。
### 挑战描述中的图片
安装后,类似 `` 的 Markdown 会被重写为 CTFd 文件 URL(`/files/…`),使用的附件列在 `files:` 中。请将图片放在 `challenge.yml` 旁边,并在 `files:` 下列出(参见 [CHALLENGE_REPOSITORY.md](CHALLENGE_REPOSITORY.md))。
Flag 同步支持 **`private/flag.yml`**(`static`、`regex`、`dynamic`、`custom`)以及传统的 **`private/flag.txt`**。参见 [CHALLENGE_REPOSITORY.md](CHALLENGE_REPOSITORY.md)。
## 本地构建
```
docker build -t deploy-challenges .
docker run --rm deploy-challenges --help
```
## 不使用 Docker 运行
```
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
export GPG_PASSPHRASE='…'
.venv/bin/python deploy_challenges.py … --url … --token …
```
宿主机需要 **git**、**gpg** 和 **openssh-client**(用于 `git@…` URL)才能进行 clone 和处理加密的 flag。
## 许可证
参见仓库默认设置。
标签:CTFd, Docker, LNA, 安全防御评估, 特权提升, 自动化部署, 请求拦截, 逆向工具