Aller au contenu principal

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 :

  1. sous quel délai une organisation doit-elle notifier une violation de données à risque à la CNIL ?
  2. dans quel cas doit-elle en plus informer individuellement chaque personne concernée ?
  3. 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

info

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.

attention

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.
astuce

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 copieSur le chemin réel de la communication
Action possibleLireLire, modifier, rediriger
Détectable par les partiesNon, rien ne change pour ellesNon plus, si l'attaque est bien menée
remarque

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.

attention

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.

astuce

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​


Quelle est la principale différence entre le sniffing et une attaque de l'homme du milieu (MITM) ?


D'après le TP, qu'est-ce qui prouve que proxy.py est un intermédiaire actif, et non un simple témoin ?


D'après le TP, que se passe-t-il concrètement à l'étape 3 ?


Qu'est-ce que l'ARP spoofing, cité dans ce TP ?


D'après le TP, pourquoi un attaquant MITM ne peut-il pas simplement lire une connexion HTTPS, même en étant sur le chemin ?


Que faire face à un avertissement de certificat affiché par le navigateur, d'après ce TP ?


Pourquoi un réseau Wi-Fi public est-il particulièrement propice à une attaque MITM par ARP spoofing ?


Dans ce TP, à quoi correspond, en miniature, le rôle joué par proxy.py ?



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.