CTFd/ctfcli

GitHub: CTFd/ctfcli

CTFd 官方出品的命令行工具,用于批量管理 CTF 赛事题目,支持模板生成、Git 版本控制、API 同步和自动化部署。

Stars: 207 | Forks: 91

# ctfcli *ctfcli 是一个用于管理 Capture The Flag (CTF) 赛事和题目的工具。* `ctfcli` 提供了题目规范和模板,以便更轻松地生成不同类别的题目。它还通过与 [CTFd](https://github.com/CTFd/CTFd/) REST API 的集成,支持通过命令行上传题目,并能与 CI/CD 构建系统集成。 `ctfcli` 支持 Tab 键补全、REPL 界面(感谢 [Python-Fire](https://github.com/google/python-fire))以及用于自定义命令的插件支持。 *开发中:ctfcli 目前处于 Alpha 阶段,后续可能会有变动。更新时请务必锁定版本并阅读 CHANGELOG。* # 安装与使用 可以使用 [`pipx`](https://github.com/pypa/pipx) 将 ctfcli 作为可执行命令安装: `pipx install ctfcli` 或者,您也可以随时使用 `pip` 将其作为 Python 模块安装: `pip install ctfcli` 要直接从仓库安装 ctfcli 的开发版本,您可以使用: `pip install git+https://github.com/CTFd/ctfcli.git` ## 1. 创建赛事 Ctfcli 会将当前文件夹转换为一个 CTF 赛事 git 仓库。 它会询问您正在使用的 CTFd 实例的基础 URL 以及访问令牌(access token)。 ``` ❯ ctf init Please enter CTFd instance URL: https://demo.ctfd.io Please enter CTFd Admin Access Token: d41d8cd98f00b204e9800998ecf8427e Do you want to continue with https://demo.ctfd.io and d41d8cd98f00b204e9800998ecf8427e [Y/n]: y Initialized empty Git repository in /Users/user/Downloads/event/.git/ ``` 这将创建 `.ctf` 文件夹,其中包含 `config` 文件,该文件将指定 URL、访问令牌,并记录 该赛事的所有题目。 ## 2. 添加题目 赛事由题目组成。 题目可以从子目录创建,也可以从其他仓库拉取。 启用 GIT 的题目会被拉取到赛事仓库中,并在 `.ctf/config` 文件中保留引用记录。 ``` ❯ ctf challenge add [REPO | FOLDER] ``` ##### 本地文件夹: ``` ❯ ctf challenge add crypto/stuff ``` ##### GIT 仓库: ``` ❯ ctf challenge add https://github.com/challenge.git Cloning into 'challenge'... [...] ``` ##### GIT 仓库到特定子文件夹: ``` ❯ ctf challenge add https://github.com/challenge.git crypto Cloning into 'crypto/challenge'... [...] ``` ## 3. 安装题目 安装题目将通过 API 在您的 CTFd 实例中创建该题目。 ``` ❯ ctf challenge install [challenge] ``` ``` ❯ ctf challenge install buffer_overflow Found buffer_overflow/challenge.yml Loaded buffer_overflow Installing buffer_overflow Success! ``` ## 4. 同步题目 同步题目将通过 API 更新您 CTFd 实例中的题目。 在 `challenge.yml` 文件中所做的任何更改都会反映到您的实例中。 ``` ❯ ctf challenge sync [challenge] ``` ``` ❯ ctf challenge sync buffer_overflow Found buffer_overflow/challenge.yml Loaded buffer_overflow Syncing buffer_overflow Success! ``` ## 5. 部署服务 部署题目将自动创建题目服务(默认情况下在您的 CTFd 实例中)。 您也可以使用不同的部署处理程序 (handler),通过 SSH 将服务部署到您自己的服务器, 或部署到单独的 Docker registry。 题目也将自动安装或同步。 获取到的连接信息将被添加到您的 `challenge.yml` 文件中。 ``` ❯ ctf challenge deploy [challenge] ``` ``` ❯ ctf challenge deploy web-1 Deploying challenge service 'web-1' (web-1/challenge.yml) with CloudDeploymentHandler ... Challenge service deployed at: https://web-1-example-instance.chals.io Updating challenge 'web-1' Success! ``` ## 6. 验证题目 验证题目将检查题目的本地版本是否与安装在您 CTFd 实例中的版本一致。 ``` ❯ ctf challenge verify [challenge] ``` ``` ❯ ctf challenge verify buffer_overflow Verifying challenges [------------------------------------] 0% Verifying challenges [####################################] 100% Success! All challenges verified! Challenges in sync: - buffer_overflow ``` ## 7. 镜像更改 镜像题目是同步的逆向操作。 它将使用安装在您 CTFd 实例中的题目详情来更新题目的本地版本。 如果您有任何未被本地跟踪的远程题目,它也会发出警告。 ``` ❯ ctf challenge mirror [challenge] ``` ``` ❯ ctf challenge verify buffer_overflow Mirorring challenges [------------------------------------] 0% Mirorring challenges [####################################] 100% Success! All challenges mirrored! ``` ## 对所有题目执行操作 您只需省略题目参数,即可对配置中定义的所有题目执行操作。 - `ctf challenge install` - `ctf challenge sync` - `ctf challenge deploy` - `ctf challenge verify` - `ctf challenge mirror` # 题目模板 `ctfcli` 包含预制的题目模板,以便通过安全的默认设置更快地创建 CTF 题目。 ``` ctf challenge new ├── binary ├── crypto ├── programming └── web ``` ``` ❯ ctf challenge new binary /Users/user/.virtualenvs/ctfcli/lib/python3.7/site-packages/ctfcli-0.0.1-py3.7.egg/ctfcli/templates/binary/default name [Hello]: buffer_overflow ❯ ls -1 buffer_overflow Makefile README.md WRITEUP.md challenge.yml dist/ src/ ``` **欢迎贡献改进题目模板,让 CTF 题型对每个人都更加友好!** # 题目规范 `ctfcli` 提供了一个[题目规范](ctfcli/spec/challenge-example.yml)(`challenge.yml`),概述了题目的主要细节。 每个由 `ctfcli` 生成或处理的题目都应包含一个 `challenge.yml` 文件。 该规范格式已在 CTFd 的生产环境赛事中经过测试和使用,但也欢迎对 `challenge.yml` 的格式提出评论、建议和 PR。 # 插件 `ctfcli` 插件本质上是通过动态类修改来扩展命令行界面。请参阅[插件文档页面](docs/plugins.md)获取简单示例。 *`ctfcli` 是一个 Alpha 项目!插件接口可能会发生变更!* # 作为 Sub-Tree 替代方案的 Sub-Repos `ctfcli` 使用内置的 git `subtree` 机制来管理基于 git 的题目。虽然它在大多数情况下都能正常工作,但已证实它存在缺点,并且容易产生问题和合并冲突。 作为替代方案,我们目前正在试验 git [`git subrepo`](https://github.com/ingydotnet/git-subrepo) 扩展。 可以通过在 ctfcli 项目配置的 `[config]` 部分添加 `use_subrepo = True` 属性来启用此功能。 Subrepo 必须单独安装,并且不向后兼容默认的 `subtree`。 一旦使用其中一种方法添加了题目,如果您更改方法,它们将无法正常工作,您必须重新添加题目。
标签:Capture The Flag, ctfcli, CTFd, DevSecOps, Python, REPL, REST API, 上游代理, 二进制发布, 开源工具, 挑战管理, 无后门, 网络安全, 网络安全研究, 网络调试, 自动化, 请求拦截, 调试插件, 赛事管理, 逆向工具, 隐私保护