PS> python client.py → VM Debian → Docker

GUIDE WINDOWS VIRTUALBOX & DEBIAN

Cette méthode permet d’exécuter les conteneurs Docker dans une machine virtuelle Debian, tout en développant et en lançant les scripts Python directement sous Windows.

// PRINCIPE DE FONCTIONNEMENT

WINDOWS Écriture et exécution du script client.py

│ connexion TCP

▼

VIRTUALBOX VM Debian accessible par son adresse IP

│ port Docker publié

▼

DOCKER Serveur TCP du challenge

│ réponses correctes

▼

FLAG{mission_reussie}

Dans cette configuration, le script Python exécuté sous Windows ne doit pas utiliser localhost. Le serveur Docker fonctionne dans la VM Debian : il faut utiliser l’adresse IP de cette VM.

// LES DEUX CARTES RÉSEAU DE LA VM

CARTE 1

Accès par NAT

Cette carte permet à la VM Debian d’accéder à Internet et de télécharger les images Docker depuis le registre GitHub.

CARTE 2

Réseau privé hôte

Cette carte crée un réseau privé entre Windows et la VM Debian. Le script Python Windows peut ainsi joindre les conteneurs.

WINDOWS

Client Python

Le programme Python reste sous Windows et utilise l’adresse IP de la carte réseau privée de Debian.

DEBIAN

Serveurs Docker

Les fichiers Compose sont exécutés dans Debian. Chaque mission démarre son propre serveur TCP dans un conteneur.

// 1 — CONFIGURER VIRTUALBOX

La machine virtuelle Debian doit être arrêtée avant de modifier sa configuration réseau.

Configuration → Réseau → Carte 1

Activez la carte et sélectionnez le mode Accès par NAT.

Configuration → Réseau → Carte 2

Activez la carte et sélectionnez Réseau privé hôte.

Conseil pour une VM distribuée aux élèves

La VM peut être préparée à l’avance avec Docker, SSH et les deux cartes réseau déjà configurées. Tous les élèves peuvent utiliser la même adresse IP privée, car chaque réseau VirtualBox reste local au poste Windows.

// 2 — DÉMARRER LA VM DEBIAN

Lancez VirtualBox, démarrez la VM Debian puis ouvrez une session avec les identifiants fournis.

Vérifiez que Docker est disponible :

docker --version
docker compose version

Vérifiez également que Debian accède à Internet :

ping -c 4 github.com

// 3 — RELEVER L’ADRESSE IP DE DEBIAN

Dans le terminal Debian, exécutez :

ip -br address

Plusieurs interfaces peuvent apparaître. Recherchez celle qui correspond au réseau privé hôte VirtualBox.

lo        UNKNOWN   127.0.0.1/8
enp0s3    UP        10.0.2.15/24
enp0s8    UP        192.168.56.10/24
Dans cet exemple

10.0.2.15 correspond à la carte NAT.

192.168.56.10 correspond au réseau privé entre Windows et Debian. C’est cette adresse qu’il faudra utiliser dans le script Python.

// 4 — TESTER LA COMMUNICATION WINDOWS → DEBIAN

Ouvrez PowerShell sous Windows puis testez la communication avec l’adresse IP de la VM :

ping 192.168.56.10

Remplacez cette adresse par celle réellement affichée dans Debian.

Si le ping ne fonctionne pas, vérifiez que la deuxième carte VirtualBox est activée, configurée en réseau privé hôte et que l’option « câble branché » est cochée.

// 5 — TÉLÉCHARGER LE FICHIER COMPOSE

Depuis Windows, ouvrez le challenge dans CTFd puis téléchargez le fichier :

📄 compose.yml

Créez un dossier différent pour chaque mission.

📁 C:\CTF\PYTHON_00\
└── compose.yml

// 6 — TRANSFÉRER LE FICHIER DANS DEBIAN

Le fichier téléchargé sous Windows doit être accessible depuis la VM Debian. Plusieurs méthodes sont possibles.

MÉTHODE 1

Dossier partagé

C’est la méthode la plus simple lorsque la VM a été préparée avec les additions invité VirtualBox.

MÉTHODE 2

Commande SCP

Le fichier est envoyé depuis PowerShell vers Debian grâce au serveur SSH de la VM.

MÉTHODE 3

WinSCP

Une interface graphique permet de transférer les fichiers par glisser-déposer entre Windows et Debian.

MÉTHODE 4

Téléchargement direct

Il est également possible d’ouvrir CTFd depuis un navigateur installé dans la VM Debian.

// MÉTHODE CONSEILLÉE — DOSSIER PARTAGÉ

Dans VirtualBox, ouvrez la configuration de la VM puis ajoutez un dossier partagé.

Chemin du dossier

Sélectionnez par exemple le dossier Windows C:\CTF.

Nom du dossier

Utilisez un nom simple comme CTF.

Montage automatique

Activez cette option afin que Debian monte automatiquement le dossier au démarrage.

Configuration permanente

Activez cette option pour conserver le partage après le redémarrage de la VM.

Dans Debian, le dossier partagé peut apparaître à cet emplacement :

/media/sf_CTF

Copiez ensuite le fichier Compose dans le dossier de travail :

mkdir -p ~/ctf/python00
cp /media/sf_CTF/PYTHON_00/compose.yml ~/ctf/python00/
Si l’accès au dossier partagé est refusé, l’utilisateur Debian doit appartenir au groupe vboxsf. Cette configuration peut être réalisée à l’avance dans la VM distribuée par l’enseignant.

// AUTRE MÉTHODE — TRANSFERT PAR SCP

Depuis PowerShell, créez d’abord le dossier distant :

ssh eleve@192.168.56.10 "mkdir -p ~/ctf/python00"

Envoyez ensuite le fichier :

scp .\compose.yml eleve@192.168.56.10:/home/eleve/ctf/python00/
Remplacez eleve par le nom d’utilisateur Debian et 192.168.56.10 par l’adresse IP réelle de la VM.

// 7 — DÉMARRER LE CHALLENGE DANS DEBIAN

Dans la VM Debian, placez-vous dans le dossier qui contient le fichier YAML :

cd ~/ctf/python00
ls

Le fichier compose.yml doit apparaître.

Démarrez ensuite le challenge :

docker compose up -d

Vérifiez son état :

docker compose ps
Premier démarrage

Docker télécharge automatiquement l’image du challenge depuis le registre GitHub. Le premier lancement peut donc être plus long que les suivants.

// 8 — IDENTIFIER LE PORT DU CHALLENGE

Le numéro du port est indiqué dans la description de la mission. Il est également visible dans le fichier compose.yml.

ports:
  - "10000:10000"

10000 Port accessible sur la VM Debian.

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

Dans cet exemple, le serveur est accessible depuis Windows avec :

Adresse : 192.168.56.10
Port : 10000
Protocole : TCP

// 9 — TESTER LE PORT DEPUIS WINDOWS

Dans PowerShell, utilisez la commande suivante :

Test-NetConnection 192.168.56.10 -Port 10000

Le résultat attendu est :

TcpTestSucceeded : True
Si le résultat est False, vérifiez l’adresse IP, le numéro de port et l’état du conteneur avec docker compose ps.

// 10 — CONFIGURER LE SCRIPT PYTHON WINDOWS

Le script est créé et exécuté directement sous Windows.

import socket

SERVEUR = "192.168.56.10"
PORT = 10000

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

client.connect((SERVEUR, PORT))

message = client.recv(1024).decode().strip()
print("Serveur :", message)

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

resultat = client.recv(1024).decode().strip()
print("Serveur :", resultat)

client.close()
Adresse à utiliser

Remplacez 192.168.56.10 par l’adresse IP de votre VM Debian.

Le port change selon la mission.

// 11 — LANCER LE SCRIPT SOUS WINDOWS

Ouvrez PowerShell dans le dossier qui contient votre script :

cd C:\CTF\PYTHON_00
python client.py

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

py client.py

Le script Windows communique maintenant avec le serveur Docker exécuté dans la VM Debian.

// 12 — RÉCUPÉRER LE FLAG

FLAG{exemple_de_flag}

Lorsque toutes les réponses sont correctes, le serveur transmet le flag. Copiez-le entièrement dans la zone de validation CTFd.

Respectez les majuscules, les minuscules, les accolades et les caractères spéciaux.

// 13 — ARRÊTER LE CHALLENGE

Dans Debian, depuis le dossier de la mission :

docker compose down

Cette commande arrête et supprime le conteneur. Le fichier compose.yml et le script Python restent conservés.

// COMMANDES UTILES

docker compose up -d

Démarrer le challenge.

docker compose ps

Vérifier l’état du conteneur.

docker compose logs

Afficher les messages du serveur.

docker compose restart

Redémarrer le challenge.

docker compose down

Arrêter et supprimer le conteneur.

ip -br address

Afficher les adresses IP de Debian.

Test-NetConnection

Tester le port depuis Windows.

Ctrl + C

Interrompre un script Python bloqué.

// EN CAS DE PROBLÈME

Windows ne communique pas avec Debian

Vérifiez la deuxième carte réseau VirtualBox, son mode « Réseau privé hôte » et l’adresse affichée par ip -br address.

Debian n’accède pas à Internet

Vérifiez que la première carte réseau est activée en mode NAT. Testez ensuite avec ping -c 4 github.com.

Docker refuse la commande

Vérifiez que Docker est installé et que votre utilisateur possède les droits nécessaires. Essayez temporairement sudo docker compose ps.

Le dossier partagé est inaccessible

Vérifiez les additions invité VirtualBox et l’appartenance de l’utilisateur Debian au groupe vboxsf.

Le port TCP est inaccessible

Vérifiez que le conteneur est actif avec docker compose ps, puis testez le port depuis PowerShell avec Test-NetConnection.

Le port est déjà utilisé

Un ancien challenge est probablement encore actif. Affichez les conteneurs avec docker ps puis arrêtez celui qui utilise le port.

Le script Python reste bloqué

Interrompez-le avec Ctrl + C puis affichez précisément les données reçues avec print(repr(message)).

// ADRESSE À UTILISER SELON LA CONFIGURATION

DOCKER WINDOWS

Docker fonctionne sous Windows

Utilisez localhost comme adresse du serveur.

VM DEBIAN

Docker fonctionne dans VirtualBox

Utilisez l’adresse IP privée de Debian, par exemple 192.168.56.10.

PORT

Numéro de mission

Le port change selon le challenge et reste indiqué dans sa description.

CTFd

Validation

Le flag obtenu est toujours validé sur la plateforme CTFd.

// RÈGLES D’UTILISATION

01 Utiliser un dossier différent par mission.

02 Vérifier l’adresse IP avant de lancer le script.

03 Ne pas transmettre les flags aux autres élèves.

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

05 Conserver ses scripts Python.

06 Être capable d’expliquer son programme.