LosFuzzys/LosTemplates
GitHub: LosFuzzys/LosTemplates
一套轻量级 CTF 挑战模板框架,为出题、部署、测试和分发提供统一的 Makefile 驱动接口与多种容器化部署方案。
Stars: 9 | Forks: 3
# LosTemplates - CTF 挑赛模板
预配置的 CTF 挑战模板,具有合理的默认设置和同质化的接口。支持实例化 web、实例化 qemu+ssh、受限环境 pwn、sagemath 等等。
没有繁重的依赖,没有预编译的二进制文件,没有可疑的镜像仓库。只需 coreutils、containers、shells 和 makefiles。无论是出题人还是参赛者,都能轻松进行审计、验证和扩展。
通过 registry (kubernetes)、compose (docker) 或 systemd services (quadlets) 自动处理部署。生成分发文件、本地选手部署文件和 CTFd 元数据 yaml 文件,无需额外操作。
为所有挑战提供统一的接口。运行 `make` 启动,运行 `make solve` 解题,以及其它目标:`dist`、`test`、`lint`、`deploy` 等。可通过参数配置:`make PORT=8080`、`make solve HOST=chall.losfuzzys.net` 等等。
需要不同的部署方式?`source .env-release`。保持简单。
提供多种备选方案,快速执行操作。Kubernetes 集群宕机了?触发了云服务的速率限制?快速 ssh 登录到 VPS 并运行 `make deploy-docker`。遇到问题?运行 `make HOST=0.0.0.0`。您的基础设施团队在修复 Kubernetes 时会轻松得多。
由 [LosFuzzys](https://losfuzzys.net) 提供支持。
## 版本
以下是每个模板的最新版本。使用 `make version` 检查您挑战的模板版本。
| 名称 | 版本 |
| :----------------------------- | :-----: |
| bash-jail-ubuntu24.04 | 1.0.1 |
| bash-nojail-ubuntu24.04 | 1.0.1 |
| flask-instanced-alpine3.21 | 1.0.1 |
| flask-nojail-alpine3.21 | 1.0.1 |
| offline | 1.0.1 |
| php-instanced-ubuntu24.04 | 1.0.1 |
| php-nojail-ubuntu24.04 | 1.0.1 |
| phpxss-nojail-ubuntu24.04 | 1.0.1 |
| pwn-jail-alpine3.21 | 1.0.1 |
| pwn-jail-debian12.11 | 1.0.1 |
| pwn-jail-ubuntu24.04 | 1.0.1 |
| pwn-nojail-alpine3.21 | 1.0.1 |
| pwn-nojail-ubuntu24.04 | 1.0.1 |
| pwn-qemu-kernel | 1.0.1 |
| python3.12-jail-alpine3.21 | 1.0.1 |
| python3.12-jail-ubuntu24.04 | 1.0.1 |
| python3.12-nojail-alpine3.21 | 1.0.1 |
| python3.12-nojail-ubuntu24.04 | 1.0.1 |
| rust-nojail-alpine3.21 | 1.0.1 |
| rust-nojail-ubuntu24.04 | 1.0.1 |
| sagemath-nojail-ubuntu22.04 | 1.0.1 |
| solidity-nojail-debian11 | 0.0.1 |
您可以在[这里](https://raw.githubusercontent.com/LosFuzzys/LosTemplates/refs/heads/main/.versions)通过脚本查看最新版本。
## 依赖项
### 挑战作者
安装 `docker`、`bash`、`make`、GNU `envsubst`、GNU/BSD `tar`、GNU `coreutils` 和 `parallel`。
**Ubuntu**:
```
# Ubuntu 24.04
sudo apt install bash make gettext tar coreutils parallel
# 根据你的选择安装 podman 或 docker
sudo apt install podman podman-docker
```
**Fedora**:
```
# Fedora 42
sudo dnf install bash make gettext-envsubst tar coreutils parallel
# 根据你的选择安装 podman 或 docker
sudo dnf install podman podman-docker
```
**Arch**:
```
sudo pacman -S bash make gettext tar coreutils parallel
# 根据你的选择安装 podman 或 docker
sudo pacman -S docker
# 如果你倾向于使用无 root 的 docker,请从 AUR 安装它
# 但请在 wiki 中查看配置说明
yay docker-rootless-extras
```
**Nix**:
```
nix-shell .
```
### 参赛者
对于 Linux:`docker`。
对于 Windows:`docker`(WSL2 后端)和 `tar` 支持。
## 指南
所有模板逻辑都在每个模板文件夹根目录的 `Makefile` 中实现。此 `Makefile` 包含作者可以更改的元数据配置。挑战的名称(默认情况下)将是包含 `Makefile` 的文件夹名称。
`challenge/` 中的文件包含主要的挑战逻辑。`challenge/flag.txt` 包含 flag。`challenge/Dockerfile` 运行挑战容器,`challenge/entrypoint.sh` 包含容器的 entrypoint。对于具有构建步骤的挑战,将运行 `challenge/Makefile` 来构建挑战。
`dist/` 中的文件将被打包为 `.tar.gz` 分发文件。如果文件应保持不变,请使用符号链接;如果您需要修改或编辑文件部分内容,请制作副本。例如,请参阅 `dist/flag.txt` 为何不是符号链接。符号链接将在打包之前被解析。
`solution/` 中的文件包含挑战的解题脚本和 writeup。`solution/exploit` 的依赖项可以通过 `uv` 添加在 `solution/requirements.txt` 中,或通过 `apt install` 添加在 `solution/Dockerfile` 中。
`deployment/` 中的文件包含用于部署挑战的辅助文件。组织者可以在此处放置文件,并从 `Makefile` 中调用它们进行部署。例如:共享的测试 VPS SSH 私钥。
**目标**
| 目标 | 描述 |
|--------------------|-------------------------------------------------------------------------------------------------------------------|
| `all (默认)` | 在本地运行挑战。封装了 `build` + `run`。 |
| `build` | 构建挑战容器。 |
| `run` | 运行挑战容器。 |
| `solve` | 解答挑战(通过 netcat)。支持 `HOST=remote.com` `PORT=9999` |
| `solve-sequential` | 顺序解答挑战 `TIMES` 次。通过 `$?` 返回失败状态 |
| `solve-parallel` | 使用 `JOBS` 个并行线程解答挑战 `TIMES` 次。 |
| `dist` | 生成挑战的分发文件。上传到 CTFd 和/或上游。 |
| `distrun` | 解压分发文件并运行挑战包。 |
| `test` | 检查挑战是否正常工作。执行部署+解题以及部署挑战包+解题。 |
| `lint` | 检查常见错误(解析符号链接、缺失文件、相同 flag 等。)º |
| `kill` | 终止与此挑战相关的所有容器 |
| `clean` | 清理挑战分发文件和编译后的二进制文件 |
| `deploy` | 通过默认部署方式(docker、quadlet 等)部署挑战 |
| `deploy-docker` | 为 docker-compose 部署生成 `docker-compose.yml` 文件 |
| `deploy-quadlet` | 为 systemd services 部署生成 systemd quadlet 单元 |
| `deploy-registry` | 将挑战容器推送到 `REGISTRY` 指定的 OCI registry |
| `deploy-yml` | 生成用于挑战元数据的 CTFd yaml 文件 |
| `shell` | 在正在运行的挑战容器中打开 shell(在受限环境挑战中 chroot 进入受限根目录) |
| `version` | 打印当前模板版本 |
**参数**
| 参数 | 描述 |
|---------------------|----------------------------------------------------------------------------------------------|
| `RUNTIME` | 选择容器运行时,例如:`docker`、`podman`、`sudo docker` 等。 |
| `RUNTIME_DIST` | 为选手分发文件选择容器运行时,例如:`docker`。 |
| `HOST` | 对于部署,为要监听的 IP。对于解题,为挑战的 IP 或域名(本地或远程)。 |
| `PORT` | 对于部署,为要监听的端口。对于解题,为要连接的挑战端口。 |
| `TIMEOUT` | 对于部署,为挑战终止的超时时间。对于解题,为解题的最长时间。 |
| `TIMES` | 在 `solve-sequential` 和 `solve-parallel` 中解答挑战的次数。 |
| `JOBS` | 在 `solve-parallel` 中的并行线程数。 |
| `PULL_POLICY_RUN` | `docker run` 的拉取策略。 |
| `PULL_POLICY_BUILD` | `docker build` 的拉取策略。 |
参数的使用方式如下:
```
$ make PORT=8080
$ make solve HOST=challenges.ssdvps.com PORT=8080
$ make deploy-docker PORT=10001
$ make solve-parallel TIMES=100 JOBS=10
$ make RUNTIME='sudo docker'
```
### 开发建议
**修改 Makefile:**
作者和组织者可以编辑挑战的顶级 `Makefile`,以便为其 CTF 添加所需的功能。在这种情况下,我们建议更改版本标签,例如 `-GLACIERCTF25`。这样,您就可以在自动化测试脚本中将其进行对比,以防由于对 `Makefile` 所做的更改而需要非标准处理。
**pwn 的缓冲:**
对于 C 程序,我们不建议在 `entrypoint.sh` 中禁用缓冲,它通常会对二进制文件使用 `LD_PRELOAD` 并导致意外的内存分配,这很可能会破坏在本地开发的堆利用。请务必在程序 `main` 或 init 函数中使用 `man 3 setvbuf` 来禁用它。
**创建可写路径:**
对于受限环境的应用程序,您可以使用 `nsjail` 创建可写路径,请参阅 `*-jail-*/challenge/Dockerfile`:
```
# 在 nsjail args 中的 --cwd 之前添加 "-m none:/DESTPATH:tmpfs:size=N",以获得一个大小为 N 字节的、由 tmpfs 支持的可写 DESTPATH
# 请记住,/DESTPATH 不能包含任何来自 /jail 的文件(因为它是一个 mount)。如果你想要
# 在 /DESTPATH 中有预先创建/复制的文件,你应该在 entrypoint.sh 中手动复制它们
# 注意:/DESTPATH 不应包含 /jail 作为前缀
```
### 部署建议
**默认部署:**
将默认部署目标调整为发布时的预期目标。您也可以将其更改为部署到测试实例,并将身份验证凭据放置在 `deployment/` 中(在团队受信任的情况下)。
**Flag:**
更改 `challenge/flag.txt`、`dist/flag.txt` 和 `solution/exploit` 中的 flag 格式。如果您想频繁地从上游拉取更改,您可以编写一个 sed 脚本来完成此操作。
## 常见问题
**为什么不使用 nsjail 配置文件:**
这样我们可以在需要时轻松地通过环境变量来控制它,而且对于不在乎这些的参赛者来说,`challenge/` 中与基础设施相关的文件越少越好。您需要修改有关“运行时”系统的内容?必须在 `challenge/Dockerfile` 中修改!需要修改 entrypoint?必须在 `challenge/entrypoint.sh` 中修改!这使得不了解 `nsjail` 的作者更容易上手。
## 安全性
在模板中发现了配置错误/漏洞并希望私下报告?发送电子邮件至 `team@losfuzzys.net`
标签:Docker, Makefile, NIDS, 子域名突变, 安全竞赛, 安全防御评估, 容器化, 应用安全, 特权提升, 自动化部署, 请求拦截, 身份验证强制, 项目模板