Sp00kySkelet0n/SkylineCTF-Challenges
GitHub: Sp00kySkelet0n/SkylineCTF-Challenges
基于GitOps与Kubernetes Operator的CTF赛题全生命周期管理框架,实现从出题加密提交到自动部署的一体化工作流。
Stars: 1 | Forks: 4
# SkylineCTF - 贡献指南 🏰

欢迎来到 SkylineCTF 的挑战仓库!本指南将向您介绍如何在平台上创建、保护和发布您的挑战。
## 🚀 如何添加挑战?
按照以下 4 个简单的步骤,让您的挑战上线。
### 1. 准备工作 🛠️
克隆此仓库。
```
git clone https://github.com/Sp00kySkelet0n/SkylineCTF-Challenges.git
cd SkylineCTF-Challenges
```
### 2. 创建挑战 📝
为您的挑战创建一个文件夹(例如 `Mon-Challenge`)。
它必须包含:
* `Challenge.yaml`:挑战的定义。
* `Dockerfile`(如果已 Docker 化)。
* `uploads/`(可选):提供给玩家的挑战相关文件。
* `src/`(可选):源代码(由向导加密)。
## 📂 Challenge.yaml 结构
如果您希望手动创建 `Challenge.yaml`,请遵循以下结构:
### 类型 1:Docker 挑战 (Web, Pwn...) 🐳
使用 Docker 镜像和端口。分数动态调整。
```
apiVersion: skyline.local/v1 # Ne jamais modifier
kind: CTFChallenge # Ne jamais modifier
metadata:
name: mon-challenge-unique # Doit correspondre au nom du dossier (lowercase, sans espaces)
namespace: ctfd # Ne jamais modifier
spec:
# Infos Générales
name: "Titre du Challenge"
description: "Trouvez le flag !"
category: "Web" # Web, Pwn, Crypto, Reverse...
# Points Dynamiques (Recommandé)
type: "dynamic"
initial: 500 # Points de départ
decay: 10 # Nombre de solutions pour baisse max
minimum: 50 # Points minimum
# Déploiement
image: "ghcr.io/sp00kyskelet0n/skylinectf-challenges/chall:latest"
port: 1337 # Port interne du conteneur
instance: true # Détermine si le challenge peut être déployé à la demande
# Fichiers (si besoin de fournir un binaire/source)
upload_files: true # Upload tout le dossier 'uploads/' vers CTFd
flag: "SKL{...}" # À chiffrer avec le wizard !
```
### 类型 2:静态挑战 (Forensic, Reverse) 📁
无需 Docker,仅提供下载文件。
```
apiVersion: skyline.local/v1
kind: CTFChallenge
metadata:
name: mon-challenge-forensic # Doit correspondre au nom du dossier (lowercase, sans espaces)
namespace: ctfd
spec:
name: "Analyse Mystère"
description: "Analysez ce fichier PCAP..."
category: "Forensic"
type: "standard" # Ou dynamic
points: 100
upload_files: true # Indispensable pour Forensic/Reverse !
# Placez vos fichiers (PCAP, binaire...) (dans la limite de 50mb) dans le dossier 'uploads/' du challenge.
flag: "SKL{...}" # À chiffrer avec le wizard !
```
**关于连接的说明:**
操作器会根据类别和端口自动检测协议(`http://` 或 `tcp://`)。您可以通过 `connection_info: "..."` 进行强制指定。
### 3. 保护(加密) 🔐
**这是最重要的一步!** 使用我们的助手保护您的 flags 和源代码。
**在 Linux / Mac 上:**
```
./wizard.sh
```
**在 Windows 上:**
```
wizard.bat
```
向导为您提供两个选项:
#### 选项 1:📝 创建 Challenge.yaml
向导将逐步引导您生成文件:
1. **选择文件夹** — 选择您的挑战文件夹(必须事先存在)。
2. **显示名称** — 在 CTFd 上可见的标题(例如:`Mon Super Challenge`)。
3. **描述** — 挑战的描述(支持多行,以空行结束)。
4. **类别** — Web, Pwn, Crypto, Forensic, Reverse, Misc...
5. **自动检测类型** — 向导会检测是否存在 `Dockerfile` 和/或 `uploads/` 文件夹,以配置 `instance` 和 `upload_files`。
6. **评分** — 动态(initial/decay/minimum)或静态(固定分数)。
7. **端口** — 容器的内部端口(仅在 Docker 化挑战时需要)。
8. **Flag** — 挑战的 flag(例如:`SKL{...}`)。
9. **创建者** — 您的姓名/昵称。
最后,向导会提议直接继续进行加密和提交。
#### 选项 2:🔐 保护现有挑战
对于已经存在 `Challenge.yaml` 的挑战:
1. **加密 `Challenge.yaml`** — 敏感字段(flag 等)使用 SOPS 加密。
2. **加密 `WALKTHROUGH.md`** — 解题报告使用 GPG 加密(如果存在)。
3. **加密 `src/`** — 源代码打包并使用 GPG 加密(可选)。
4. **通过 Pull Request 提交** — 自动 Fork,上传文件,并创建 PR。
**完成!** 您的文件已准备就绪并已提交。
### 4. 发布 ✈️
保护您的文件后:
1. 添加您的文件(加密版本!):
git add Mon-Challenge/Challenge.yaml
git add Mon-Challenge/src.zip.gpg
git add Mon-Challenge/Dockerfile
2. 提交并推送:
git commit -m "feat: Ajout du challenge Mon-Super-Challenge"
git push origin ma-branche
3. 打开一个 Pull Request。一旦合并通过,Flux 会自动将您的挑战部署到集群中! 🚀
## ℹ️ 技术工作原理
### 基础设施即代码
SkylineCTF 采用 GitOps 方法。`main` 分支上的所有内容都是集群的绝对真理。
### 自动部署
1. **Flux** 检测到更改。
2. **SkylineOperator** 读取您的 `Challenge.yaml`。
3. 挑战在 **CTFd** 中创建并部署到 Kubernetes 集群上。
### 架构

*对于按需实例(Pods/VMs):*

标签:Cutter, DNS解析, Docker, OPA, Pwn, Web安全, YAML配置, 云资产清单, 动态积分, 夺旗赛, 子域名突变, 安全教育, 安全防御评估, 实战演练, 容器化部署, 密码学, 开源项目, 手动系统调用, 挑战赛开发, 网络安全, 蓝队分析, 请求拦截, 逆向工程, 隐私保护, 靶场