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, 上游代理, 二进制发布, 开源工具, 挑战管理, 无后门, 网络安全, 网络安全研究, 网络调试, 自动化, 请求拦截, 调试插件, 赛事管理, 逆向工具, 隐私保护