L'objectif de ce dépot est de rassembler l'ensemble des ressources utilisées pour déployer les infrastructures CTFd de PolyCyber (PolyPwn, ainsi que CTFd interne à PolyCyber) afin de partager une méthode de déploiement de services fonctionnelle et simplifiée.
Script Bash qui automatise l'installation et la configuration d'un serveur CTFd utilisant le plugin Zync et son instancer dédié Galvanize.
Script Bash avancé pour la construction, l'ingestion et la synchronisation des challenges CTF avec support des conteneurs Docker et Docker compose.
- Systèmes d'exploitation : Testé et vérifié sous :
- Ubuntu Server 24
- Ubuntu Server 25
- Debian 12
- Privilèges : Le script doit être exécuté en tant que root (utilise sudo automatiquement si nécessaire)
- Docker : Installé et fonctionnel
- curl, jq, yq : Pour les appels API et le traitement YAML/JSON (vérifiés automatiquement)
- Dépôt de challenges : Structure de dossiers avec fichiers
challenge.yml
-
Clonez ce dépôt :
git clone https://github.com/polycyber/infra cd infra chmod +x setup.sh challenges_management.sh -
Exécutez le script d'installation et suivez les instructions :
./setup.sh --ctfd-url <votre-domaine.com>
-
Rendez-vous sur l'URL du serveur configurée
- Effectuez la configuration de l'événement CTF
- Dirigez-vous vers le panneau de configuration administrateur
Admin Panel-->Plugins-->Zync Config - Entrez l'URL de votre instancer Galvanize et le secret JWT généré par le script d'installation
| Option | Description | Obligatoire |
|---|---|---|
--ctfd-url URL/IP |
URL/domaine de votre serveur CTFd | ✅ Oui |
--working-folder DIR |
Répertoire de travail (défaut: /home/$USER) |
❌ Non |
--theme DIR/URL |
Active l'utilisation d'un thème personnalisé | ❌ Non |
--backup-schedule TYPE |
Fréquence de sauvegarde de la base de données (daily (défaut), hourly, 10min) |
❌ Non |
--no-https |
Déploiement sans HTTPS | ❌ Non |
--help |
Affiche l'aide | ❌ Non |
# Installation basique avec domaine
./setup.sh --ctfd-url exemple.com
# Installation basique avec IP - utilise l'option --no-https automatiquement
./setup.sh --ctfd-url 192.168.12.34
# Installation avec répertoire personnalisé
./setup.sh --ctfd-url exemple.com --working-folder /opt/ctfd
# Installation avec thème personnalisé activé
./setup.sh --ctfd-url exemple.com --theme /home/user/my-custom-theme
# Installation avec thème personnalisé activé en téléchargeant un thème depuis github directement
./setup.sh --ctfd-url exemple.com --theme https://github.com/user/theme.git
# Sauvegarde toutes les heures
./setup.sh --ctfd-url exemple.com --backup-schedule hourly
# Sauvegarde toutes les 10 minutes
./setup.sh --ctfd-url exemple.com --backup-schedule 10min
# Afficher l'aide
./setup.sh --helpSi vous utilisez l'option --theme, le script activera automatiquement le montage du thème personnalisé dans le docker-compose.yml.
| Action | Description |
|---|---|
all |
Construction + ingestion (défaut) |
build |
Construction des images Docker uniquement |
ingest |
Ingestion des challenges dans CTFd |
sync |
Synchronisation des challenges existants |
status |
Affichage du statut et statistiques |
cleanup |
Nettoyage des images Docker |
| Option | Description | Obligatoire |
|---|---|---|
--ctf-repo REPO |
Nom du dépôt de challenges présent dans le répertoire de travail | ✅ Oui |
--action ACTION |
Action à effectuer (all, build, ingest, sync, status, cleanup) | ❌ Non |
--working-folder DIR |
Répertoire de travail (défaut: /home/$USER) |
❌ Non |
--config FILE |
Charger la configuration depuis un fichier | ❌ Non |
| Option | Description |
|---|---|
--categories LIST |
Liste des catégories à traiter (séparées par virgules) |
--challenges LIST |
Liste des challenges spécifiques à traiter (séparés par virgules) |
| Option | Description |
|---|---|
--dry-run |
Mode simulation (affiche les actions sans les exécuter) |
--force |
Force les opérations (reconstruction, écrasement) |
--parallel-builds N |
Nombre de constructions parallèles (défaut: 4) |
| Option | Description |
|---|---|
--debug |
Active la sortie de debug |
--skip-docker-check |
Ignore la vérification du daemon Docker |
--help |
Affiche l'aide |
--version |
Affiche les informations de version |
# Configuration complète (construction + ingestion)
./challenges_management.sh --ctf-repo PolyPwnCTF-2025-challenges
# Construction uniquement pour certaines catégories
./challenges_management.sh --action build --ctf-repo PolyPwnCTF-2025-challenges --categories "web,crypto"
# Synchronisation avec mise à jour forcée
./challenges_management.sh --action sync --ctf-repo PolyPwnCTF-2025-challenges --force
# Mode simulation pour voir les actions prévues
./challenges_management.sh --ctf-repo PolyPwnCTF-2025-challenges --dry-run
# Traitement de challenges spécifiques
./challenges_management.sh --action build --ctf-repo PolyPwnCTF-2025-challenges --challenges "web-challenge-1,crypto-rsa"
# Construction parallèle avec 8 threads
./challenges_management.sh --action build --ctf-repo PolyPwnCTF-2025-challenges --parallel-builds 8
# Affichage du statut
./challenges_management.sh --action status --ctf-repo PolyPwnCTF-2025-challenges
# Nettoyage des images Docker
./challenges_management.sh --action cleanup --ctf-repo PolyPwnCTF-2025-challengesCréez un fichier .env avec des paires CLE=VALEUR :
CTF_REPO=PolyPwnCTF-2025-challenges
WORKING_DIR=/opt/ctf
PARALLEL_BUILDS=8
FORCE=true
DEBUG=falseUtilisation :
./challenges_management.sh --config .env- Mise à jour des paquets système
- Installation des dépendances
- Ajout du dépôt officiel Docker
- Installation de Docker CE, Docker Compose...
- Configuration des groupes utilisateurs
Si l'option --theme est utilisée :
- Active le montage du dossier
theme/custom/dans le conteneur CTFd - Permet l'utilisation de thèmes personnalisés
- Vérification de la disponibilité de Docker et du daemon
- Contrôle de la présence des outils système requis (curl, jq, yq)
- Analyse de la structure du dépôt de challenges
- Identification des challenges Docker et statiques
- Construction séquentielle ou parallèle des images
- Support du mode
--forcepour reconstruction complète - Gestion des erreurs avec rapports détaillés
- Installation via l'API CTFd dans l'instance CTFd
- Mise à jour des challenges existants
- Option de sauvegarde avant synchronisation
- Support du mode
--forcepour écrasement
- Suppression des images Docker associées aux challenges
- Mode dry-run disponible
repo-challenges/
├── challenges/ # (optionnel, détecté automatiquement)
│ ├── web/
│ │ ├── challenge-1/
│ │ │ ├── challenge.yml # Configuration du challenge
│ │ │ ├── Dockerfile # Image Docker (pour type: docker)
│ │ │ ├── src/ # Code source
│ │ │ └── files/ # Fichiers du challenge
│ │ └── challenge-2/
│ ├── crypto/
│ └── pwn/
Warning
Le script d'ingestion de challenges fonctionne par ordre alphabétique de catégories et de challenges. Si un challenge a des prérequis, il est donc nécessaire d'ingest les prérequis en amont
name: "MonChallenge"
author: Auteur_du_chall
category: AI
description: |-
## Description (français)
Petite description en français
## Description (english)
Small English description
flags:
- polycyber{flag_a_tr0uv3r}
tags:
- AI
- A:Auteur_du_chall
requirements:
- "Règles"
# If files needed
files:
- "files/hello_world.txt"
# If hints needed, choose the cost
hints:
- Hint intéressant
value: 500
type: docker # ou type: dynamic
extra:
docker_image: "monchallenge:latest" # requis pour type; docker
dynamic: True # requis pour type; docker
initial: 500
decay: 10
minimum: 50Le script génère automatiquement :
- Clé secrète CTFd (32 caractères)
- Mot de passe base de données (16 caractères)
- Mot de passe root base de données (16 caractères)
Ces scripts sont développés par l'équipe PolyCyber pour l'installation automatisée et la gestion de serveurs CTFd.