L'attaque de l'homme du milieu (Man in the Middle)
Observer un échange, c'est le sniffing. S'y insérer pour le modifier, c'est autre chose.
Petite vérification
Avant de commencer, vérifiez si vous savez encore répondre à ces 3 questions très simples, sur la séance précédente consacrée aux conséquences d'une fuite de données :
- sous quel délai une organisation doit-elle notifier une violation de données à risque à la CNIL ?
- dans quel cas doit-elle en plus informer individuellement chaque personne concernée ?
- jusqu'à quel montant la CNIL peut-elle prononcer une amende, en cas de manquement grave ?
📌 Réponse attendue
TP pour réfléchir et résoudre des problèmes
Votre défi pour aujourd'hui consiste à passer d'un simple témoin du réseau à un acteur capable d'altérer ce qui transite
Ce TP se déroule entièrement sur votre propre machine, en local, avec un serveur et un petit programme d'interception fournis pour l'exercice.
Intercepter ou modifier le trafic réseau de quelqu'un d'autre, sans son autorisation explicite, est interdit par la loi, quel que soit le réseau.
Étape 1 — Rappeler ce qu'un simple témoin peut faire
Relancez le dispositif de la séance consacrée au sniffing : serveur.py dans un terminal,
tcpdump -i lo -A -s 0 'tcp port 8000' dans un deuxième, puis dans un troisième :
curl -s -X POST -d "pseudo=amelie&mot_de_passe=Mediatheque2024" http://localhost:8000/connexion
Question : dans ce dispositif, l'observateur du deuxième terminal peut-il changer la moindre donnée avant qu'elle n'arrive au serveur ?
📌 Réponse attendue
Étape 2 — Se placer activement entre le client et le serveur
Arrêtez curl et tcpdump. Créez proxy.py, un petit relais qui se place entre le client
et le serveur, et qui retransmet chaque requête reçue :
from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib.request
class Relais(BaseHTTPRequestHandler):
def do_POST(self):
longueur = int(self.headers['Content-Length'])
corps = self.rfile.read(longueur)
requete = urllib.request.Request(
'http://localhost:8000/connexion', data=corps, method='POST'
)
with urllib.request.urlopen(requete) as reponse:
reponse.read()
self.send_response(200)
self.end_headers()
self.wfile.write(b"Connexion recue (via relais)")
HTTPServer(('localhost', 9000), Relais).serve_forever()
Dans un premier terminal, relancez serveur.py (port 8000). Dans un deuxième, lancez proxy.py
(port 9000). Dans un troisième, envoyez la requête au relais, pas directement au serveur :
curl -s -X POST -d "pseudo=amelie&mot_de_passe=Mediatheque2024" http://localhost:9000/connexion
Question : pourquoi dit-on que le relais est désormais « au milieu », alors que tcpdump à
l'étape 1 ne l'était pas ?
📌 Réponse attendue
Étape 3 — Altérer une donnée en transit
Modifiez proxy.py pour qu'il change le mot de passe reçu avant de le retransmettre, par
exemple en le remplaçant par une chaîne vide :
corps = corps.replace(b"Mediatheque2024", b"")
Relancez proxy.py, renvoyez la même requête curl qu'à l'étape 2, puis consultez ce que
serveur.py affiche avoir reçu (ajoutez temporairement un print(corps) dans do_POST de
serveur.py pour l'observer).
Question : le serveur reçoit-il la même donnée que celle envoyée par curl ?
📌 Réponse attendue
Étape 4 — Comprendre comment un attaquant se place « au milieu » en vrai
Dans ce TP, vous vous êtes mis au milieu vous-même, en changeant une adresse. Sur un vrai réseau local, un attaquant ne peut pas demander aux autres machines de passer par lui : il doit les y forcer. La technique la plus courante s'appelle l'ARP spoofing : elle consiste à falsifier les réponses ARP du réseau pour faire croire à deux machines que l'attaquant est leur interlocuteur légitime. Elle n'est pas mise en œuvre dans cette séance d'introduction (elle fait l'objet d'un cours dédié, avec plusieurs machines).
Question : HTTPS étant un simple chiffrement de la connexion, pourquoi empêche-t-il tout de même ce TP de fonctionner si le serveur l'utilisait ?
📌 Réponse attendue
Étape 5 — Réagir à un cas pratique
Sur le Wi-Fi public d'une gare, le navigateur affiche un avertissement : « ce site n'est pas sécurisé, son certificat est invalide ». Un passager clique sur « Continuer quand même » pour accéder plus vite à son compte. Que lui répondez-vous ?
Restitution orale
Un étudiant (ou un binôme) vient présenter au tableau la donnée falsifiée à l'étape 3 et sa réponse au passager de l'étape 5.
- Durée : 5 minutes de présentation + 2 à 3 minutes de questions.
- Qui passe : un(e) étudiant(e) (ou un binôme) désigné(e) par l'enseignant.
- Support : le travail réalisé pendant le TP, aucune préparation supplémentaire n'est nécessaire.
- Ce qui est attendu :
- rappeler la différence entre ce qui a été observé à l'étape 1 et ce qui a été fait à l'étape 3 ;
- expliquer pourquoi HTTPS aurait empêché cette manipulation ;
- répondre aux questions de la classe.
Cet exercice entraîne à l'oral technique court exigé par plusieurs épreuves du BTS (notamment E5 et E6) : clarté, structure, capacité à répondre à l'improviste.
📌 Une solution
Notions théoriques
Vous venez de passer du statut de simple témoin à celui d'intermédiaire actif. Reprenons la distinction amorcée lors de la séance consacrée au sniffing.
Sniffing passif contre MITM actif
| Sniffing (vu précédemment) | Man in the Middle (ce TP) | |
|---|---|---|
| Position | À côté de la communication, en copie | Sur le chemin réel de la communication |
| Action possible | Lire | Lire, modifier, rediriger |
| Détectable par les parties | Non, rien ne change pour elles | Non plus, si l'attaque est bien menée |
Le relais proxy.py de ce TP joue, en miniature et en local, exactement le rôle qu'un attaquant
cherche à occuper sur un vrai réseau : devenir le passage obligé entre deux parties qui pensent se
parler directement.
Comment un attaquant se place « au milieu », en pratique
Sur un réseau local, la technique la plus répandue est l'ARP spoofing (citée à l'étape 4, étudiée en détail dans un cours dédié) : l'attaquant falsifie les correspondances adresse IP/adresse MAC connues des machines du réseau, pour qu'elles lui envoient leur trafic sans le savoir. D'autres techniques existent : un faux point d'accès Wi-Fi portant le même nom qu'un réseau de confiance (Evil Twin), ou une redirection DNS falsifiée.
Ces techniques demandent, en général, d'être déjà sur le même réseau local que la victime : c'est pour cette raison qu'un réseau Wi-Fi public, partagé avec des inconnus, est particulièrement exposé.
HTTPS/TLS : la protection qui résiste même à un attaquant au milieu
Contrairement au sniffing, où chiffrer la connexion suffit à protéger le contenu, un attaquant MITM peut tenter de s'interposer même sur une connexion destinée à être chiffrée. HTTPS/TLS s'en protège par la vérification du certificat du serveur : sans la clé privée correspondante, impossible pour l'attaquant de se faire passer pour le vrai serveur sans déclencher une alerte visible dans le navigateur.
C'est pour cela qu'un avertissement de certificat ne doit jamais être ignoré : c'est, la plupart du temps, le seul signal visible d'une tentative de MITM en cours.
Test de mémorisation/compréhension
Bonnes pratiques
- Ne jamais ignorer un avertissement de certificat, c'est souvent le seul signe visible d'une attaque en cours.
- Toujours vérifier la présence de HTTPS avant de saisir une information sensible.
- Utiliser un VPN sur un réseau non maîtrisé (Wi-Fi public), pour chiffrer la connexion jusqu'à un point de confiance.
- Se méfier d'un réseau Wi-Fi public portant un nom familier : rien ne garantit qu'il s'agit du bon point d'accès.
- Garder ses logiciels à jour, pour bénéficier des dernières protections contre les techniques de détournement de trafic.