TP1re année8 livrables
Opération Message Secret
Votre réseau de salle est monté, vous savez qui est dessus. Question du jour : qu'arrive-t-il aux données qui y circulent ? On va envoyer de vrais messages entre postes… et découvrir que tout se lit en clair — sauf si on le chiffre, et qu'on verrouille l'accès.
Par Josselyn C., prof de BTS SIO. Publié le , mis à jour le .
- Outil
- PowerShell (déjà sur chaque poste) · 0 installation · réseau GSB `192.168.100.0/24`
- En binôme
- chacun monte son service, chiffre ses messages et verrouille son pare-feu
- Livrables
- 8 flags (A→H) · un secret qui arrive lisible chez le bon, illisible pour les autres
- Pour qui
- SLAM et SISR, 1re année
- Durée
- 5 h
- Prérequis
- Un réseau de labo monté où les postes se joignent, et l'adresse IP de ton poste.
- Matériel
- Deux postes Windows sur un même réseau isolé, avec PowerShell (déjà installé).
Compétences : C3.1 Protéger les données à caractère personnel, C3.3 Sécuriser les équipements et les usages des utilisateurs, C3.5 Assurer la cybersécurité d'une solution applicative
Ce qu'on fait aujourd'hui
Hier, vous avez monté le réseau de la salle et appris à voir qui est connecté (le scan). Aujourd'hui, étape du dessus : on s'intéresse aux données qui voyagent sur ce réseau. On va faire tourner de vrais petits serveurs sur vos postes, s'envoyer des messages pour de bon, et répondre à LA question de sécurité : est-ce que quelqu'un peut lire ce que j'envoie ?
Le scénario GSB
GSB doit faire circuler des informations sensibles entre ses postes (un identifiant, un mot de passe, un numéro). La direction demande : « Prouvez-moi que vos échanges internes ne peuvent pas être lus par le premier venu sur le réseau. » À la fin de la séance, votre binôme sait répondre : le secret arrive lisible chez le bon destinataire, et illisible pour tout serveur ou poste qui le voit passer.
Le projet : protéger un échange, des deux côtés
Sécuriser un échange, c'est deux choses — et dans ce TP, vous faites les deux :
1 · Protéger le contenu
Le chiffrement : rendre le message illisible pour qui le voit passer. Même capté, il ne révèle rien sans la clé.
2 · Protéger l'accès
Le pare-feu : décider qui a le droit de se connecter à ton service. Tout le reste est refusé.
Vous travaillez à deux sur le même projet : chacun monte son serveur, chiffre ses messages et règle son pare-feu, et vous vous servez mutuellement de destinataire pour tester. Les deux volets ensemble = un échange vraiment protégé.
Comment avancer en autonomie
- Tout est à copier-coller dans une fenêtre PowerShell. Chaque bloc est expliqué juste en dessous, et on te montre ce que tu dois voir à l'écran.
- Tu travailles en binôme sur le même projet : vous faites les mêmes étapes et vous vous servez mutuellement de destinataire pour tester.
- Rends tes flags au fur et à mesure :
FLAG-X-<valeur>, recopiée ou capturée dans ton compte-rendu. - Bloqué ? Regarde la boîte « Erreur courante » du chapitre, puis la checklist « Tu es bloqué ? » en fin de doc, puis appelle le prof.
Les 5 parties
| # | Partie | Flags |
|---|---|---|
| 0 | Mise en route — ouvrir PowerShell, ouvrir le port, test sur soi-même | A |
| 1 | Le choc — s'envoyer un message : le serveur lit tout en clair | B |
| 2 | Camoufler ne suffit pas — base64 n'est pas du chiffrement | C |
| 3 | Chiffrer pour de vrai — une clé, du charabia pour les autres | D · G |
| 4 | Verrouiller l'accès — pare-feu : seul le binôme entre | E |
| 5 | Le défi final — le secret sous le nez du serveur central | F · H |
Vocabulaire de départ
| Mot | En clair |
|---|---|
| Serveur | Un programme qui attend des connexions et répond. Ici, un mini-programme PowerShell qui écoute sur un port et note ce qu'il reçoit. |
| Client | Le programme qui se connecte à un serveur pour lui envoyer/demander quelque chose. |
| Port | Une « porte » numérotée d'une machine. On utilisera le 9000 pour notre service GSB. |
| En clair | Un message envoyé tel quel, lisible par n'importe qui le voit passer. |
| Chiffrer | Transformer un message avec une clé pour le rendre illisible sans cette clé. (≠ « encoder », on verra la différence.) |
| PowerShell | La console moderne de Windows (fond bleu). Déjà installée partout. On y colle nos commandes. |
Partie 0 — Mise en route
Ouvrir le terrain (et tester sur soi-même d'abord)
Avant de viser les autres, on prépare son poste et on vérifie que ça marche sur soi. Cette prudence, c'est le métier : on teste en petit avant de déployer.
C'est quoi PowerShell, et comment l'ouvrir ?
PowerShell est la console de commandes moderne de Windows. On va y coller des blocs de code (pas les taper). Ouvre-le en administrateur (il en faut pour régler le pare-feu) :
- Touche
Windows, tapepowershell. - Clic droit sur « Windows PowerShell » → Exécuter en tant qu'administrateur → Oui.
- Une fenêtre (souvent bleue) s'ouvre. C'est là qu'on colle le code (clic droit = coller).
Connaître son IP
ipconfig
Ouvrir le port 9000 au pare-feu
Un serveur qui écoute ne sert à rien si le pare-feu de Windows refuse les connexions entrantes. Première étape : autoriser le port 9000. Colle (fenêtre admin) :
New-NetFirewallRule -DisplayName "GSB-9000" -Direction Inbound -Protocol TCP -LocalPort 9000 -Action Allow
Name : {xxxxxxxx-....}
DisplayName : GSB-9000
Enabled : True
Direction : Inbound
Action : Allow
Lancer ton serveur (fenêtre « serveur »)
Voici le mini-serveur GSB : il écoute sur le 9000 et écrit tout ce qu'il reçoit à l'écran et dans un journal sur le Bureau. Colle ce bloc entier :
$port = 9000
$log = "$env:USERPROFILE\Desktop\journal-serveur.txt"
$listener = New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Any, $port)
$listener.Start()
Write-Host "Serveur GSB en ecoute sur le port $port (Ctrl+C pour arreter)" -ForegroundColor Green
while ($true) {
$client = $listener.AcceptTcpClient()
$reader = New-Object System.IO.StreamReader($client.GetStream())
$recu = $reader.ReadLine()
$de = $client.Client.RemoteEndPoint.Address.ToString()
$ligne = "$(Get-Date -Format HH:mm:ss) ; de $de ; recu : $recu"
Write-Host $ligne -ForegroundColor Yellow
Add-Content -Path $log -Value $ligne
$reader.Close(); $client.Close()
}
Serveur GSB en ecoute sur le port 9000 (Ctrl+C pour arreter)
La fenêtre reste « bloquée » sur cette ligne : c'est bon signe, le serveur attend. Ne la ferme pas. Pour envoyer des messages, on ouvre une deuxième fenêtre PowerShell.
Test sur soi-même (le pré-vol personnel)
Avant de viser un camarade, envoie-toi un message à toi-même. Dans la fenêtre 2, colle (c'est le client) :
$ip = "127.0.0.1"
$msg = "test depuis mon poste"
$c = New-Object System.Net.Sockets.TcpClient($ip, 9000)
$w = New-Object System.IO.StreamWriter($c.GetStream())
$w.WriteLine($msg); $w.Flush(); $c.Close()
Write-Host "Envoye a $ip : $msg" -ForegroundColor Cyan
# fenetre 2 (client)
Envoye a 127.0.0.1 : test depuis mon poste
# fenetre 1 (serveur)
14:03:11 ; de 127.0.0.1 ; recu : test depuis mon poste
FLAG-A · Type A
Checkpoint (mise en route)
Ton serveur tourne et a reçu ton test en local. Rends la ligne exacte apparue dans la fenêtre serveur (avec l'heure) + ton IP de salle :
FLAG-A-<ton IPv4>-<ligne du journal>
Ajoute aussi la preuve que la règle GSB-9000 existe (Get-NetFirewallRule -DisplayName "GSB-9000").
Partie 1 — Le choc
S'envoyer un message… et tout lire
Maintenant, pour de vrai, entre deux postes. Échangez vos IP avec votre binôme (ou un autre îlot désigné). L'un garde son serveur ouvert (fenêtre 1), l'autre envoie depuis sa fenêtre 2.
Envoyer un « identifiant GSB » à ton binôme
Dans ta fenêtre 2 (client), remplace l'IP par celle du serveur de ton binôme, et envoie un faux identifiant (n'utilise jamais un vrai mot de passe) :
$ip = "192.168.100.XX"
$msg = "login=marc; mdp=GSB2026!"
$c = New-Object System.Net.Sockets.TcpClient($ip, 9000)
$w = New-Object System.IO.StreamWriter($c.GetStream())
$w.WriteLine($msg); $w.Flush(); $c.Close()
Write-Host "Envoye a $ip : $msg" -ForegroundColor Cyan
FLAG-B · Type B
Production (le choc, documenté)
Faites l'échange dans les deux sens. Celui qui tient le serveur capture la ligne reçue en clair. Rends cette ligne (celle qui contient le mdp= lisible) :
FLAG-B-<ligne du journal avec le mot de passe en clair>
- une phrase : « Celui qui tient le serveur (ou tout intermédiaire) peut lire … ce que j'envoie, parce que … »
Partie 2 — Camoufler ne suffit pas
Le piège du base64
Premier réflexe naïf : « je vais transformer le message pour qu'il ne soit plus lisible ». On essaie avec le base64, un encodage très courant… et on va voir pourquoi ça ne protège rien.
Encoder en base64 avant d'envoyer
Dans ta fenêtre 2 (client), transforme le message puis envoie le résultat :
$clair = "login=marc; mdp=GSB2026!"
$b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($clair))
$b64
bG9naW49bWFyYzsgbWRwPUdTQjIwMjYh
Envoie cette chaîne au serveur du binôme (remplace $msg par $b64 dans le bloc d'envoi). Sur le serveur, la ligne reçue ressemble à du charabia… en apparence.
La douche froide : n'importe qui le redécode
Celui qui tient le serveur colle ceci avec la chaîne reçue :
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("bG9naW49bWFyYzsgbWRwPUdTQjIwMjYh"))
login=marc; mdp=GSB2026!
FLAG-C · Type B
Production
Envoie ton identifiant en base64 au binôme ; le binôme le redécode sans aucune clé. Rends les deux : la chaîne base64 envoyée et le texte redécodé.
FLAG-C-<base64 envoyé>-<texte redécodé> + une phrase : « Le base64 ne protège rien parce que … »
Partie 3 — Chiffrer pour de vrai
Une clé, et le serveur ne voit plus rien
Pour vraiment protéger, il faut un secret partagé entre l'expéditeur et le destinataire : une clé. Sans la clé, impossible de relire. On va chiffrer avec un procédé simple (le XOR) : à comprendre, pas à réinventer.
Les deux fonctions (expéditeur ET destinataire les collent)
function Chiffre($msg,$cle){
$b=[Text.Encoding]::UTF8.GetBytes($msg)
$k=[Text.Encoding]::UTF8.GetBytes($cle)
for($i=0;$i -lt $b.Length;$i++){ $b[$i]=$b[$i] -bxor $k[$i % $k.Length] }
[Convert]::ToBase64String($b)
}
function Dechiffre($b64,$cle){
$b=[Convert]::FromBase64String($b64)
$k=[Text.Encoding]::UTF8.GetBytes($cle)
for($i=0;$i -lt $b.Length;$i++){ $b[$i]=$b[$i] -bxor $k[$i % $k.Length] }
[Text.Encoding]::UTF8.GetString($b)
}
Se mettre d'accord sur une clé, puis envoyer
Le binôme choisit une clé commune (ex. cle-gsb-2026). L'expéditeur chiffre :
$secret = Chiffre "login=marc; mdp=GSB2026!" "cle-gsb-2026"
$secret
Dw8CRAlODwIeBhZH... (du charabia : c'est ca qu'on envoie)
Envoie $secret au serveur du binôme. Sur le serveur, la ligne reçue est illisible :
14:21:07 ; de 192.168.100.XX ; recu : Dw8CRAlODwIeBhZH...
Le destinataire, lui, a la clé. Il déchiffre :
Dechiffre "Dw8CRAlODwIeBhZH..." "cle-gsb-2026"
login=marc; mdp=GSB2026!
FLAG-D · Type B
Production
Envoie un secret chiffré à ton binôme. Le serveur ne doit voir que du charabia ; le binôme le déchiffre avec la clé. Rends : la ligne charabia vue par le serveur + le texte déchiffré par le destinataire.
FLAG-D-<charabia reçu par le serveur>-<texte déchiffré>
FLAG-G · Type D
Investigation
Cherche et réponds (2-3 lignes) : (1) Quelle est la différence entre encoder (base64) et chiffrer (avec clé) ? (2) Quand ton navigateur affiche le cadenas « https », qu'est-ce qu'il fait exactement à tes données entre ton poste et le site ? (3) Pourquoi le XOR « maison » n'est pas suffisant en vrai (cite un chiffrement sérieux : AES).
FLAG-G-<tes 3 réponses>
Partie 4 — Verrouiller l'accès
Le pare-feu : seul le binôme entre
Chiffrer protège le contenu. Mais on veut aussi contrôler qui a le droit de se connecter au service : c'est le rôle du pare-feu. On va n'autoriser que l'IP du binôme, et prouver qu'un troisième poste est refusé.
Remplacer l'autorisation large par une autorisation ciblée
Colle (fenêtre admin), en mettant l'IP de ton binôme :
Remove-NetFirewallRule -DisplayName "GSB-9000" -ErrorAction SilentlyContinue
New-NetFirewallRule -DisplayName "GSB-9000-binome" -Direction Inbound -Protocol TCP -LocalPort 9000 -RemoteAddress 192.168.100.XX -Action Allow
Prouver le verrou
Demande à un troisième poste (pas ton binôme) de tester l'accès à ton serveur :
Test-NetConnection 192.168.100.<toi> -Port 9000
# depuis le binome autorise :
TcpTestSucceeded : True
# depuis un poste tiers :
TcpTestSucceeded : False
FLAG-E · Type B
Production
Avec ta règle ciblée en place : le binôme obtient True, un poste tiers obtient False. Rends les deux résultats Test-NetConnection (capture) :
FLAG-E-<résultat binôme>-<résultat poste tiers> + une phrase sur ce que ça protège (et ce que ça ne protège pas : le contenu, lui, a besoin du chiffrement de la partie 3).
Partie 5 — Le défi final
Le secret sous le nez du serveur central
On assemble tout. Le prof (ou un élève volontaire par îlot) lance un « serveur central GSB » par lequel passent les messages de l'îlot — il logue tout, comme un intermédiaire réel (un proxy, un fournisseur d'accès…). Votre mission de binôme :
Autrement dit : l'intermédiaire voit passer votre message, mais ne doit rien comprendre. C'est très exactement ce que fait HTTPS sur Internet : vos données traversent des dizaines d'intermédiaires qui ne voient que du chiffré.
Le serveur central voit passer le message mais ne lit que du charabia. Seuls l'expéditeur et le destinataire, qui partagent la clé, comprennent.
FLAG-F · Type B
Production (en binôme)
Réussissez le passage : secret déchiffré correctement chez le destinataire, charabia dans le journal du serveur central. Rends les trois :
- la ligne charabia telle que le serveur central l'a vue (preuve qu'il n'a rien lu) ;
- le texte clair obtenu par le destinataire (preuve qu'il est arrivé) ;
- comment vous vous êtes organisés à deux (qui tenait le serveur, qui a chiffré, qui a envoyé).
FLAG-F-<charabia serveur central>-<clair destinataire>
Défi bonus
FLAG-H · Type E
Extension (au choix)
- Clé trop courte = clé faible. Chiffre un message avec une clé d'un seul caractère. Un attaquant n'a que 256 clés possibles à essayer. Écris une boucle qui teste toutes les clés d'un caractère sur un charabia et retrouve le clair. Conclusion : pourquoi la longueur de la clé compte.
- ou Segmentation (rappel d'hier). Montre qu'en passant ton poste en masque /27, un poste d'un autre îlot ne peut même plus atteindre ton service (
Test-NetConnection→ False). Défense en profondeur : chiffrement + accès + cloisonnement réseau. (Remets ton masque après.)
FLAG-H-<ta démonstration>
Remise en état — OBLIGATOIRE
Vérifie-toi (auto-correction)
- Quand tu envoies un message « en clair » à un serveur, qui peut le lire ?
- Pourquoi le base64 ne protège-t-il pas un secret ?
- Qu'est-ce qu'il faut partager entre expéditeur et destinataire pour chiffrer/déchiffrer ?
- Comment n'autoriser qu'une seule machine à se connecter à ton service ?
- Dans le défi final, pourquoi le serveur central « voit passer » le message sans le comprendre ?
Tu es bloqué ? La checklist
| Symptôme | À vérifier dans l'ordre |
|---|---|
| Le serveur ne démarre pas (erreur rouge au collage) | Tu as collé le bloc entier ? La fenêtre est en admin pour la règle pare-feu ? Un serveur tourne déjà sur 9000 (ferme l'autre fenêtre) ? |
Aucune connexion n'a pu être établie | Serveur du binôme lancé ? Bonne IP (ipconfig) ? Règle GSB-9000 créée ? Test-NetConnection IP -Port 9000 = True ? |
| La fenêtre serveur « ne fait rien » | Normal : elle attend une connexion. Envoie depuis la 2e fenêtre. |
l'exécution de scripts est désactivée | Tu as double-cliqué un .ps1 : colle plutôt le code dans la fenêtre. |
Dechiffre renvoie du charabia | Mauvaise clé, ou tu as oublié de coller les deux fonctions, ou la chaîne base64 reçue est incomplète (recopie-la en entier). |
| Le poste tiers passe quand même (partie 4) | Une ancienne règle Allow trop large traîne → liste et retire-la (voir l'encadré « Et si… »). |
Glossaire
| Terme | Définition |
|---|---|
| Serveur / Client | Le serveur attend et répond ; le client se connecte et demande. |
| Port | Numéro d'une « porte » de service sur une machine (ici 9000). |
| TCP | Le protocole de connexion fiable utilisé pour nos échanges. |
| En clair / chiffré | En clair = lisible tel quel ; chiffré = illisible sans la clé. |
| Encoder (base64) | Changer la forme d'une donnée pour la transporter. Réversible sans clé → ne protège pas. |
| Chiffrer | Rendre illisible avec une clé. Déchiffrer = refaire l'opération avec la même clé (chiffrement symétrique). |
| Clé | Le secret partagé qui permet de chiffrer et déchiffrer. |
| XOR | Opération qui, appliquée deux fois avec la même clé, redonne l'original. Base du chiffrement symétrique (version « maison » ici). |
| AES / TLS / HTTPS | Le vrai chiffrement du quotidien : HTTPS (cadenas) chiffre vos données entre le navigateur et le site avec des algorithmes robustes (AES). |
| Pare-feu | Filtre qui autorise/bloque les connexions selon des règles (ici : n'autoriser qu'une IP). |
| Règle par défaut | Comportement du pare-feu quand aucune règle ne correspond ; en entrant, Windows bloque par défaut. |
Synthèse — ce que tu sais faire
| Notion | Ce que tu sais faire |
|---|---|
| Client-serveur réseau | Monter un petit service, s'y connecter, échanger un message entre postes. |
| Confidentialité | Montrer qu'un message en clair est lisible par le serveur/un intermédiaire. |
| Encoder ≠ chiffrer | Expliquer pourquoi le base64 ne protège rien ; distinguer encodage et chiffrement. |
| Chiffrement | Chiffrer/déchiffrer avec une clé ; comprendre le rôle de la clé et sa longueur. |
| Contrôle d'accès | Restreindre l'accès à un service par pare-feu ; vérifier l'efficacité (True/False). |
| Vision « pro » | Relier la manip à HTTPS/TLS : chiffrer de bout en bout face aux intermédiaires. |
Compétences mobilisées (référentiel BTS SIO)
Bloc 3 · Cybersécurité des services informatiques
| Compétence | Sous-compétences explicitement travaillées |
|---|---|
| C3.1 — Protéger les données à caractère personnel | Identifier les risques liés à la diffusion ; appliquer le chiffrement (en transit) pour protéger une donnée sensible. |
| C3.5 — Assurer la cybersécurité d'une solution applicative et de son développement | Prendre en compte la sécurité dans le développement (chiffrement des échanges) ; prévenir les attaques. |
| C3.3 — Sécuriser les équipements et les usages | Gérer les accès et privilèges (pare-feu) ; vérifier l'efficacité de la protection. |
Prolongement : introduit la notion de chiffrement de bout en bout, socle de l'E7 (confidentialité, TLS) et du futur module web 2A (HTTPS, sécurisation d'une API).