Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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

#PartieFlags
0Mise en route — ouvrir PowerShell, ouvrir le port, test sur soi-mêmeA
1Le choc — s'envoyer un message : le serveur lit tout en clairB
2Camoufler ne suffit pas — base64 n'est pas du chiffrementC
3Chiffrer pour de vrai — une clé, du charabia pour les autresD · G
4Verrouiller l'accès — pare-feu : seul le binôme entreE
5Le défi final — le secret sous le nez du serveur centralF · H

Vocabulaire de départ

MotEn clair
ServeurUn 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.
ClientLe programme qui se connecte à un serveur pour lui envoyer/demander quelque chose.
PortUne « porte » numérotée d'une machine. On utilisera le 9000 pour notre service GSB.
En clairUn message envoyé tel quel, lisible par n'importe qui le voit passer.
ChiffrerTransformer un message avec une clé pour le rendre illisible sans cette clé. (≠ « encoder », on verra la différence.)
PowerShellLa 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) :

  1. Touche Windows, tape powershell.
  2. Clic droit sur « Windows PowerShell » → Exécuter en tant qu'administrateur → Oui.
  3. Une fenêtre (souvent bleue) s'ouvre. C'est là qu'on colle le code (clic droit = coller).

Connaître son IP

powershell
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) :

powershell
New-NetFirewallRule -DisplayName "GSB-9000" -Direction Inbound -Protocol TCP -LocalPort 9000 -Action Allow
Ce que tu dois voir
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()
}
Ce que tu dois voir
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
Ce que tu dois voir
# 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").

0 sur 8 dans cette étape

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 … »
0 sur 8 dans cette étape

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
Ce que tu dois voir
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"))
Ce que tu dois voir
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 … »

0 sur 8 dans cette étape

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
Ce que tu dois voir
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 :

Ce que tu dois voir
14:21:07 ; de 192.168.100.XX ; recu : Dw8CRAlODwIeBhZH...

Le destinataire, lui, a la clé. Il déchiffre :

Dechiffre "Dw8CRAlODwIeBhZH..." "cle-gsb-2026"
Ce que tu dois voir
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é>

0 sur 8 dans cette étape

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>

0 sur 8 dans cette étape

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 :

powershell
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 :

powershell
Test-NetConnection 192.168.100.<toi> -Port 9000
Ce que tu dois voir
# 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).

0 sur 8 dans cette étape

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.

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>

0 sur 8 dans cette étape

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>

0 sur 8 dans cette étape

Remise en état — OBLIGATOIRE

Vérifie-toi (auto-correction)

  1. Quand tu envoies un message « en clair » à un serveur, qui peut le lire ?
  2. Pourquoi le base64 ne protège-t-il pas un secret ?
  3. Qu'est-ce qu'il faut partager entre expéditeur et destinataire pour chiffrer/déchiffrer ?
  4. Comment n'autoriser qu'une seule machine à se connecter à ton service ?
  5. 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 établieServeur 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éeTu as double-cliqué un .ps1 : colle plutôt le code dans la fenêtre.
Dechiffre renvoie du charabiaMauvaise 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

TermeDéfinition
Serveur / ClientLe serveur attend et répond ; le client se connecte et demande.
PortNuméro d'une « porte » de service sur une machine (ici 9000).
TCPLe 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.
ChiffrerRendre 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.
XOROpération qui, appliquée deux fois avec la même clé, redonne l'original. Base du chiffrement symétrique (version « maison » ici).
AES / TLS / HTTPSLe vrai chiffrement du quotidien : HTTPS (cadenas) chiffre vos données entre le navigateur et le site avec des algorithmes robustes (AES).
Pare-feuFiltre qui autorise/bloque les connexions selon des règles (ici : n'autoriser qu'une IP).
Règle par défautComportement du pare-feu quand aucune règle ne correspond ; en entrant, Windows bloque par défaut.

Synthèse — ce que tu sais faire

NotionCe que tu sais faire
Client-serveur réseauMonter 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 ≠ chiffrerExpliquer pourquoi le base64 ne protège rien ; distinguer encodage et chiffrement.
ChiffrementChiffrer/déchiffrer avec une clé ; comprendre le rôle de la clé et sa longueur.
Contrôle d'accèsRestreindre 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étenceSous-compétences explicitement travaillées
C3.1 — Protéger les données à caractère personnelIdentifier 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éveloppementPrendre en compte la sécurité dans le développement (chiffrement des échanges) ; prévenir les attaques.
C3.3 — Sécuriser les équipements et les usagesGé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).

TP terminé ?

Coche chaque livrable quand tu l'as : c'est la preuve que l'étape est acquise.

livrables
–
de série
–
Voir tous les TP