$ docker compose up -d

GUIDE DES MISSIONS PYTHON TCP

Chaque mission met à disposition un serveur TCP exécuté dans un conteneur Docker sur votre propre ordinateur. Votre objectif est de développer un script Python capable de communiquer avec ce serveur afin de récupérer un flag.

// FONCTIONNEMENT GÉNÉRAL

01

Télécharger

Téléchargez le fichier YAML fourni dans le challenge puis enregistrez-le dans un nouveau dossier.

02

Démarrer Docker

Ouvrez un terminal dans ce dossier puis démarrez le conteneur avec Docker Compose.

03

Développer

Complétez votre client Python pour vous connecter au serveur local et répondre à ses demandes.

04

Valider

Lorsque le programme reçoit un flag, copiez-le dans la zone de validation de CTFd.

// ARCHITECTURE D’UNE MISSION

CTFd Téléchargement du fichier compose.yml

│

▼

DOCKER Création du conteneur sur le PC de l’élève

│ port publié sur localhost

▼

PYTHON Connexion vers localhost:PORT

│ échanges TCP

▼

FLAG{mission_reussie}

Pourquoi utiliser Docker ?

Docker permet de lancer sur votre ordinateur le serveur nécessaire au challenge sans avoir à installer ou à configurer manuellement son environnement.

Chaque mission possède son propre conteneur, son propre programme serveur et éventuellement son propre numéro de port.

// ÉTAPE 1 — PRÉPARER LE DOSSIER

Créez un dossier spécifique pour la mission. Évitez de mélanger les fichiers de plusieurs challenges.

📁 PYTHON_00/
├── compose.yml
└── client.py

Téléchargez le fichier YAML proposé dans la fenêtre du challenge puis placez-le dans ce dossier.

Le fichier peut s’appeler compose.yml, compose.yaml ou docker-compose.yml. Ne modifiez pas son contenu sauf indication contraire.

// ÉTAPE 2 — OUVRIR UN TERMINAL

Ouvrez un terminal directement dans le dossier qui contient le fichier YAML.

cd chemin/vers/PYTHON_00

Se déplacer dans le dossier de la mission.

dir

Vérifier sous Windows que le fichier YAML est présent.

ls

Vérifier sous Linux que le fichier YAML est présent.

docker --version

Vérifier que Docker est installé et accessible.

// ÉTAPE 3 — DÉMARRER LE CHALLENGE

docker compose up -d

Cette commande télécharge l’image nécessaire si elle n’est pas déjà présente, puis démarre le conteneur du challenge en arrière-plan.

docker compose up -d

Démarrer le challenge.

docker compose ps

Vérifier que le conteneur est actif.

docker compose logs

Afficher les messages produits par le conteneur.

docker compose restart

Redémarrer le challenge en cas de besoin.

Important

Docker Desktop doit être démarré avant d’utiliser la commande docker compose up -d.

// ÉTAPE 4 — IDENTIFIER LE PORT

Le numéro de port est indiqué dans la consigne du challenge ou dans le fichier YAML.

ports:
  - "30000:5000"

Dans cet exemple :

30000 Port utilisé par le script de l’élève.

5000 Port utilisé à l’intérieur du conteneur.

Le client Python doit utiliser le premier numéro : localhost:30000.

// ÉTAPE 5 — CRÉER LE CLIENT PYTHON

import socket

SERVEUR = "localhost"
PORT = 30000

client = socket.socket(
    socket.AF_INET,
    socket.SOCK_STREAM
)

client.connect((SERVEUR, PORT))

while True:
    message = client.recv(1024).decode().strip()

    if not message:
        break

    print("Serveur :", message)

    reponse = input("Réponse : ")
    client.sendall(reponse.encode())

client.close()
Pourquoi localhost ?

Le serveur TCP fonctionne dans un conteneur Docker lancé sur votre propre ordinateur. L’adresse localhost désigne donc votre machine.

Il ne faut pas mettre l’adresse du site CTFd dans la variable SERVEUR.

// ÉTAPE 6 — LANCER LE SCRIPT

python client.py

Selon l’installation de Python, la commande peut également être :

python3 client.py

Le programme doit afficher le premier message envoyé par le serveur. Vous pouvez ensuite adapter le script pour calculer et envoyer automatiquement les réponses.

// ÉTAPE 7 — RÉCUPÉRER LE FLAG

FLAG{exemple_de_flag}

Lorsque toutes les réponses sont correctes, le serveur envoie un flag. Copiez-le entièrement dans la zone de validation du challenge.

Respectez les majuscules, les minuscules, les accolades et les caractères spéciaux. N’ajoutez aucun espace.

// ÉTAPE 8 — ARRÊTER LE CHALLENGE

docker compose down

Cette commande arrête et supprime le conteneur créé pour la mission. Le fichier YAML et votre script Python restent présents dans votre dossier.

docker compose stop

Arrêter le conteneur sans le supprimer.

docker compose start

Redémarrer un conteneur précédemment arrêté.

docker compose down

Arrêter et supprimer le conteneur.

docker compose down -v

Réinitialiser complètement la mission et ses données.

// EN CAS DE PROBLÈME

Docker ne reconnaît pas la commande

Vérifiez que Docker Desktop est installé, démarré et que le terminal a été ouvert après son installation.

Le fichier YAML est introuvable

Vérifiez que le terminal est bien positionné dans le dossier contenant le fichier téléchargé.

La connexion Python est refusée

Vérifiez que le conteneur fonctionne avec docker compose ps et que le numéro de port du script correspond à celui du challenge.

Le port est déjà utilisé

Un ancien challenge fonctionne peut-être encore. Arrêtez-le avec docker compose down avant de relancer la nouvelle mission.

Le script reste bloqué

Utilisez Ctrl + C pour l’interrompre puis affichez précisément les données reçues avec print(repr(message)).

// RÈGLES D’UTILISATION

01 Conserver un dossier différent par mission.

02 Utiliser ses propres scripts Python.

03 Ne pas transmettre directement les flags.

04 Ne pas modifier les fichiers Docker sans consigne.

05 Arrêter le conteneur après la mission.

06 Être capable d’expliquer son programme.