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, 子域名突变, 安全竞赛, 安全防御评估, 容器化, 应用安全, 特权提升, 自动化部署, 请求拦截, 身份验证强制, 项目模板