Florian Amette

Florian Amette

October 16, 2026

Créer ses propres challenges CTF pour les étudiants : types, niveaux et déploiement

CTFchallengescybersécuritépédagogieCTFdDockerweb security
Créer ses propres challenges CTF pour les étudiants : types, niveaux et déploiement

Créer ses propres challenges CTF pour les étudiants : types, niveaux et déploiement

Organiser un CTF pédagogique est une chose. Créer les challenges qui le composent en est une autre. La plupart des enseignants commencent par réutiliser des épreuves existantes — c'est logique pour démarrer. Mais les challenges maison offrent une dimension pédagogique que les plateformes tierces ne peuvent pas reproduire : l'alignement parfait avec votre cours, l'impossibilité de trouver le write-up en ligne, et la possibilité d'adapter précisément la difficulté à votre groupe.

Ce guide vous accompagne de l'idée initiale au déploiement, avec des exemples concrets pour les types de challenges les plus utilisés en contexte académique.

Pourquoi créer ses propres challenges plutôt qu'utiliser une plateforme tierce

Les avantages du challenge maison

Alignement pédagogique parfait. Un challenge que vous créez reflète exactement ce que vous avez enseigné. Si votre cours de sécurité web porte sur les injections IDOR (Insecure Direct Object Reference) ce semestre, vous pouvez créer un challenge qui force l'étudiant à exploiter précisément cette vulnérabilité, ni plus ni moins.

Zéro write-up disponible. Sur des plateformes comme HackTheBox ou PicoCTF, un étudiant peut chercher "challenge X write-up" sur Google et trouver la solution en trente secondes. Avec vos propres challenges, aucune solution n'existe en ligne.

Contrôle de la difficulté. Vous calibrez exactement le niveau de difficulté pour votre groupe, en ajustant le nombre d'indices, la complexité de l'exploit et la profondeur de la reconnaissance nécessaire.

Adaptabilité au scénario du cours. Vous pouvez intégrer le nom fictif de l'entreprise du scénario de cours, les outils spécifiques que vous avez enseignés, et le vocabulaire du module.

Les inconvénients à anticiper

Créer des challenges de qualité demande du temps. Voici des estimations réalistes par type d'épreuve :

Type de challengeTemps de création et testCompétence requise
Stéganographie basique30 à 45 minManipulation d'images, connaissances outils
Injection SQL simple1h30 à 2hPHP/Python + SQL + Docker
Analyse de fichier pcap1h à 1h30Wireshark, protocoles réseau
Reverse engineering ELF3h à 5hAssembleur, GDB, Ghidra
Forensic mémoire2h à 3hVolatility, analyse d'artefacts

Un CTF de dix challenges pour une promo de cinquante étudiants représente facilement vingt heures de préparation. Cela vaut l'investissement si la compétition devient un rendez-vous annuel réutilisable (avec mise à jour des challenges clés chaque année).

Anatomie d'un bon challenge CTF pédagogique

Les éléments fondamentaux

Le flag. Un identifiant unique que l'étudiant soumet pour valider le challenge. Format standard : FLAG{texte_lisible_mais_unique}. Évitez les flags trop courts (devinables) ou trop longs (peu pratiques à copier). Une longueur de 20 à 40 caractères est idéale.

Le scénario. Une phrase de contexte qui donne du sens à l'épreuve. "Une entreprise de e-commerce a été compromise. Le fichier suivant a été récupéré sur leur serveur. Analysez-le et trouvez le flag." Ce scénario n'est pas obligatoire techniquement, mais il améliore l'engagement et prépare les étudiants à raisonner en contexte professionnel.

L'objectif technique non-ambiguë. L'étudiant doit comprendre ce qu'il cherche à faire, même s'il ne sait pas encore comment le faire. "Exploitez la vulnérabilité d'authentification pour accéder au panneau d'administration" est clair. "Faites quelque chose avec ce serveur web" ne l'est pas.

Les indices progressifs. Prévoyez au moins deux indices dans CTFd. Le premier oriente vers la bonne catégorie de technique ("regardez les headers HTTP de la réponse"). Le second donne une piste plus directe ("cherchez une fuite d'information dans les cookies"). Le troisième, optionnel, peut donner la méthode exacte pour les groupes bloqués.

Les erreurs classiques à éviter

Les chemins de résolution non intentionnels. Le challenge est résolu d'une façon que vous n'avez pas prévue (fuzzing brutal, erreur dans votre configuration qui expose directement le flag). Testez avec des étudiants variés avant le jour J.

Les images Docker qui plantent sous charge. Un challenge qui fonctionne seul mais crashe avec vingt connexions simultanées transforme votre CTF en session de debug. Testez la charge.

L'objectif ambigu. Si plusieurs étudiants vous posent la même question sur ce qu'ils cherchent, l'énoncé est à retravailler.

La difficulté mismatch. Un challenge "débutant" qui nécessite en réalité des connaissances de troisième année. Testez sur un étudiant représentatif du niveau cible.

Check-list qualité avant publication

  • Le flag est unique et non devinable
  • L'énoncé est clair sans révéler la solution
  • L'environnement Docker/serveur est stable sous charge
  • Au moins deux indices progressifs sont prévus
  • Un testeur externe a validé la résolution
  • Aucun write-up ne traite d'un challenge identique en ligne
  • Les dépendances de l'image Docker sont à jour

Les types d'épreuves adaptés par niveau et spécialité

Le tableau suivant liste les types d'épreuves les plus utilisés en contexte académique, avec recommandations par niveau :

TypeDifficultéOutils côté étudiantObjectif pédagogiqueDurée estimée
Web – SQLi basiqueDébutantNavigateur, sqlmapComprendre l'injection SQL15 à 30 min
Web – XSS réfléchieDébutantNavigateur, DevToolsComprendre le XSS et ses impacts15 à 30 min
Crypto – Vigenère / XORDébutantCyberChef, PythonAnalyse de fréquences, chiffrement symétrique20 à 45 min
OSINT – MétadonnéesDébutantExifTool, navigateurFuite d'information involontaire10 à 20 min
Forensic – StéganographieIntermédiaireSteghide, Stegsolve, zstegDissimulation de données20 à 45 min
Web – IDORIntermédiaireBurp Suite, navigateurContrôle d'accès insuffisant30 à 60 min
Forensic – Analyse pcapIntermédiaireWireshark, tsharkProtocoles réseau, artefacts réseau30 à 60 min
Forensic – MémoireAvancéVolatilityArtefacts système, persistance60 à 90 min
Reverse – ELF simpleAvancéGhidra, GDB, stringsAssembleur, analyse de binaire45 à 90 min
Web – SQLi blindAvancéBurp Suite, sqlmapTechniques d'exploitation avancées45 à 90 min

En début de semestre, concentrez-vous sur la première moitié du tableau. Les challenges de reverse engineering et de forensic mémoire sont à réserver aux promos avec un module spécifique sur ces sujets.

Créer un challenge web en 4 étapes (exemple concret)

Objectif : une injection SQL basique sur formulaire de connexion

Voici comment créer de A à Z un challenge qui teste la compréhension de l'injection SQL.

Étape 1 : définir l'objectif pédagogique précis. L'étudiant doit contourner un formulaire de connexion sans connaître le mot de passe en utilisant une injection SQL dans le champ username. Il ne s'agit pas d'extraire la base de données (SQLi avancé), juste de contourner l'authentification.

Étape 2 : écrire l'application vulnérable. Une application PHP minimaliste avec une requête non paramétrée :

<?php
$user = $_POST['username'];
$pass = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
// Si le résultat n'est pas vide, connexion réussie
?>

L'injection admin' -- dans le champ username suffit à contourner la vérification du mot de passe. Placez le flag dans le tableau de bord affiché après connexion réussie.

Étape 3 : dockeriser. Un Dockerfile simple :

FROM php:8.2-apache
RUN apt-get update && apt-get install -y libsqlite3-dev \
    && docker-php-ext-install pdo_sqlite
COPY ./app /var/www/html
EXPOSE 80

Le docker-compose.yml associé expose le port 80 du conteneur sur un port de votre serveur CTF. Testez que le conteneur redémarre automatiquement si nécessaire (restart: always).

Étape 4 : ajouter les indices et tester. Indice 1 : "Regardez comment la requête est construite côté serveur. Y a-t-il une validation des entrées ?" Indice 2 : "Essayez de modifier la logique de la requête SQL avec un commentaire." Testez le challenge sur un étudiant de niveau moyen avant de le publier. Il doit réussir en moins de trente minutes avec les indices.

Créer un challenge forensic en 4 étapes

Option A : stéganographie dans une image

Étape 1 : choisir une image de couverture. Une photo banale de paysage au format PNG. Évitez le JPEG : la compression modifie les données et peut corrompre la stéganographie basique.

Étape 2 : cacher le flag. Avec steghide :

steghide embed -cf paysage.png -sf flag.txt -p motdepasse123

Le flag est FLAG{steg_c_est_cool_2026} et le mot de passe motdepasse123 peut être fourni comme indice progressif (ou trouvé via stegseek si vous voulez rendre le challenge plus difficile).

Étape 3 : créer le fichier de challenge. L'image seule, sans méta-information sur la méthode. L'énoncé : "Ce fichier image semble anodin. Regardez-y de plus près."

Étape 4 : valider. Commandes que l'étudiant utilisera : file image.png, strings image.png, stegsolve ou steghide extract. Si l'étudiant moyen y arrive en vingt à trente minutes avec l'indice "des données sont peut-être cachées dans le fichier lui-même", le niveau est bon.

Option B : analyse de pcap (niveau intermédiaire)

Capturez une session réseau fictive avec Wireshark contenant un flag transmis en clair dans une requête HTTP. Enregistrez le .pcap. Énoncé : "Une communication réseau suspecte a été capturée sur le réseau de l'entreprise. Trouvez le flag transmis en clair." Durée estimée : vingt à quarante minutes avec Wireshark.

Déployer avec CTFd : de l'installation au scoreboard

Installation en 5 minutes avec Docker

version: '3'
services:
  ctfd:
    image: ctfd/ctfd:latest
    restart: always
    ports:
      - "8000:8000"
    environment:
      - UPLOAD_FOLDER=/var/uploads
      - SECRET_KEY=changez_ce_secret_en_production
    volumes:
      - ctfd_data:/var/data
      - ctfd_uploads:/var/uploads
volumes:
  ctfd_data:
  ctfd_uploads:

docker compose up -d lance CTFd sur le port 8000. L'interface d'administration est accessible à /admin/setup pour la configuration initiale : nom de la compétition, dates de début et fin, mode équipes ou individuel.

Ajouter un challenge dans CTFd

  1. Admin > Challenges > + New Challenge
  2. Remplissez : nom, catégorie (Web, Forensic, Crypto...), valeur en points, description (l'énoncé), flag.
  3. Pour un challenge dynamique (avec Docker), cochez "Dynamic" et renseignez l'image Docker.
  4. Ajoutez les hints avec leur coût en points (un hint qui coûte 10 points sur un challenge à 100 points est raisonnable).

Considérations de charge

Pour trente étudiants en simultané avec des challenges dynamiques (chaque étudiant a son instance Docker), prévoyez un serveur avec au moins 8 Go de RAM et 4 cœurs. Les challenges statiques (fichiers à télécharger) sont beaucoup moins exigeants. Si votre infrastructure est limitée, privilégiez les challenges basés sur des fichiers plutôt que sur des services web dynamiques.

Tester et valider avant le jour J

Le testeur externe est non-négociable

Faites tester chaque challenge par au moins un étudiant ou collègue qui n'a pas participé à sa création. Cette personne trouvera inévitablement ce que vous n'avez pas prévu :

  • Les chemins de résolution non intentionnels
  • Les formulations ambiguës de l'énoncé
  • Les indices trop directs (qui évitent tout raisonnement) ou trop vagues (qui n'aident pas)
  • Les bugs d'infrastructure sous charge modeste

La check-list pré-lancement

À faire la veille du CTF :

  • Chaque challenge est résolu par le chemin attendu
  • Les conteneurs Docker sont démarrés et stables depuis 12h
  • Les hints sont configurés dans CTFd avec les bons coûts en points
  • Le scoreboard est configuré en mode caché pendant les X premières minutes (réduit la pression sociale)
  • Un canal de support (chat, email) est ouvert pour les questions techniques
  • Vous avez les flags de tous les challenges sous la main (pour valider manuellement en cas de doute)

Gérer les solutions non intentionnelles

Si un étudiant résout un challenge par un chemin que vous n'aviez pas prévu, adoptez cette règle : si la solution est valide techniquement, elle est valide pédagogiquement. Acceptez le flag, notez le chemin alternatif, et corrigez le challenge pour les prochaines éditions.

C'est même une excellente opportunité d'apprentissage collectif : lors du débrief post-CTF, demandez à cet étudiant d'expliquer sa méthode. Les red teamers en entreprise pensent exactement comme ça.

Pour davantage de conseils sur la logistique d'un CTF complet, consultez notre guide sur organiser une compétition CTF étudiante.

Ce qu'il faut retenir

  • Les challenges maison offrent un alignement pédagogique irremplaçable : pas de write-up online, difficulté calibrée, contexte de cours intégré.
  • Estimez réalistement le temps : un challenge web de qualité prend deux heures incluant le test, un challenge de reverse engineering cinq heures. Priorisez les types qui servent directement vos objectifs de cours.
  • CTFd est la plateforme de référence : déploiement Docker simple, gestion des hints et du scoreboard, idéale pour vingt à deux cents étudiants.
  • Le test externe est obligatoire : jamais de challenge non testé le jour J. Les bugs d'infrastructure en direct sabotent la dynamique de compétition.
  • Créez une bibliothèque réutilisable : un challenge testé cette année, légèrement modifié l'an prochain, vaut deux fois son temps d'investissement initial.

Vous cherchez des intervenants capables de concevoir et d'animer des sessions CTF pour vos étudiants ? Retrouvez les profils spécialisés sur Cyber Teachers et transformez vos labs en expériences mémorables.

Tous les articles →

Transformez vos formations cybersécurité avec des experts

Expert qualifié en 24h • Formation sur-mesure • Consultation gratuite

Cyber Teachers