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 页面(创建或修补)。省略该文件则保持实例主页不变。 ### 挑战描述中的图片 安装后,类似 `![alt](https://raw.githubusercontent.com/kevin-cazal/deploy_challenges/main/screenshot.png)` 的 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, 安全防御评估, 特权提升, 自动化部署, 请求拦截, 逆向工具