Aller au contenu principal

John the Ripper : casser des mots de passe avec un vrai outil

Un script maison suffisait sur un MD5 non salé. Voyons ce qu'il faut de plus face à un hash salé, avec l'outil que les professionnels utilisent réellement.

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 à la CNIL et au RGPD :

  1. que signifie le sigle CNIL ?
  2. que signifie le sigle RGPD, et depuis quelle année est-il applicable ?
  3. citer un droit reconnu à toute personne sur ses données personnelles par le RGPD.
📌 Réponse attendue

TP pour réfléchir et résoudre des problèmes​

Votre défi pour aujourd'hui consiste à auditer, avec un vrai outil professionnel, des mots de passe désormais stockés de façon plus réaliste

info

La médiathèque Jules Verne, ses comptes et ses mots de passe restent fictifs, construits pour l'exercice.

attention

N'utilisez jamais, dans un exercice comme celui-ci, un mot de passe que vous employez réellement ailleurs. N'exécutez jamais un outil comme celui-ci contre des empreintes qui ne vous appartiennent pas.

Étape 1 — Générer des empreintes salées à auditer​

Depuis la migration évoquée lors de la séance précédente sur le craquage de mot de passe, le nouvel intranet de la médiathèque ne stocke plus de simples empreintes MD5 : il sale chaque mot de passe avant de le hacher. Générez vous-même les 2 empreintes à auditer, avec les mêmes mots de passe que la séance précédente :

mkdir ~/tp-john && cd ~/tp-john
openssl passwd -6 'Mediatheque2024'
openssl passwd -6 'Tr4ctopelle-Figuier91!'

-6 indique l'algorithme SHA-512 crypt. Chaque exécution affiche une empreinte de la forme $6$<sel>$<hash> : le sel (une valeur aléatoire) change à chaque fois, donc votre résultat diffère de celui de votre voisin, même pour le même mot de passe.

Reportez vos 2 résultats dans comptes_mediatheque.txt :

amelie:$6$VOTRE_SEL_ICI$VOTRE_HASH_ICI
direction:$6$VOTRE_SEL_ICI$VOTRE_HASH_ICI
  1. Relancez deux fois openssl passwd -6 'Mediatheque2024'. Obtenez-vous la même empreinte les deux fois ?
  2. À votre avis, pourquoi ?
📌 Réponse attendue

Étape 2 — Constater que le script de la séance précédente ne convient plus​

Avant de continuer, relisez rapidement craquage.py de la séance précédente.

Question : ce script, tel quel, peut-il traiter comptes_mediatheque.txt ? Pourquoi ?

📌 Réponse attendue

Étape 3 — Installer et lancer John the Ripper​

sudo apt update && sudo apt install john -y

Réutilisez la liste de mots de passe courants de la séance précédente (ou recréez-la) :

mots_de_passe_courants.txt :

123456
password
azerty
Password1
mediatheque
Mediatheque
soleil2024
Mediatheque2024
bonjour123
motdepasse
qwerty123
bibliotheque

Lancez l'attaque :

john --wordlist=mots_de_passe_courants.txt comptes_mediatheque.txt

Puis affichez les mots de passe cassés :

john --show comptes_mediatheque.txt
  1. Quel compte a été cassé ? Lequel résiste ?
  2. John a-t-il eu besoin que vous lui précisiez qu'il s'agissait de SHA-512 crypt ?
📌 Réponse attendue

Étape 4 — Comparer la vitesse avec la séance précédente​

time john --wordlist=mots_de_passe_courants.txt comptes_mediatheque.txt

Question : la séance précédente annonçait un temps de calcul de quelques millièmes de seconde pour 12 mots de passe en MD5. Qu'observez-vous ici, et pourquoi ?

📌 Réponse attendue

Étape 5 — Réagir à un cas pratique​

Le responsable informatique de la médiathèque propose : « maintenant que nos mots de passe sont salés, un mot de passe court redevient sûr, puisque le sel change tout ». Que lui répondez-vous ?


Restitution orale​

Un étudiant (ou un binôme) vient présenter au tableau le résultat obtenu à l'étape 3, l'explication de la différence de vitesse de l'étape 4, et sa réponse au responsable informatique 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 quel compte a été cassé et lequel a résisté ;
    • expliquer ce que le salage change, et ce qu'il ne change pas ;
    • 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 d'un script jetable à un véritable outil d'audit de mots de passe. Comprenons ce qui a changé, et pourquoi.

Pourquoi un outil dédié plutôt qu'un script maison ?​

craquage.py fonctionnait, mais seulement pour un format très précis (MD5 brut, non salé). John the Ripper reconnaît, lui, des dizaines de formats de hash différents, les détecte automatiquement, et propose en plus :

  • des règles de mutation (--rules), qui dérivent automatiquement des variantes d'un mot de dictionnaire (motdepasse devient aussi Motdepasse1, motdepasse!...) ;
  • la reprise d'une session interrompue (--restore), utile pour une attaque qui dure des heures ;
  • des performances bien supérieures à un script écrit pour l'occasion.
info

C'est pour cela qu'un professionnel de la sécurité n'écrit presque jamais son propre script de craquage : il utilise un outil déjà conçu, testé et optimisé pour cette tâche précise.

Le salage : ce qu'il protège, et ce qu'il ne protège pas​

Un sel est une valeur aléatoire, différente pour chaque mot de passe, ajoutée avant le calcul de l'empreinte. Deux comptes avec le même mot de passe obtiennent alors des empreintes différentes.

MD5 non salé (séance précédente)SHA-512 crypt salé (ce TP)
Rainbow table (table précalculée)PossibleInefficace : il faut un calcul par sel
Vitesse de calcul d'une empreinteTrès rapideVolontairement plus lente (nombreuses itérations)
Mot de passe faible testé par dictionnaireCasséCassé quand même
Mot de passe long et imprévisibleRésisteRésiste
attention

Le tableau ci-dessus résume l'essentiel : le salage et la lenteur ralentissent une attaque, mais ne remplacent jamais un mot de passe long et imprévisible. amelie a été cassée dans les deux séances, avec ou sans sel.

En pratique, avec quoi hacher un mot de passe ?​

Ni openssl passwd -6, ni MD5, ne sont le bon choix pour une vraie application.

Des algorithmes comme bcrypt ou argon2 sont spécifiquement conçus pour les mots de passe : salés automatiquement, et réglables pour rester volontairement lents, même si la puissance de calcul disponible augmente avec le temps.

En PHP, il est conseillé d'utiliser la fonction password_hash().

La fonction PHP password_hash()

password_hash() génère un sel aléatoire en interne à chaque appel, puis l’intègre au résultat.

Vous n’avez donc pas à créer ni à stocker le sel séparément.

Par exemple, 2 appels avec le même mot de passe produisent généralement des chaînes différentes :

$a = password_hash('secret', PASSWORD_DEFAULT);
$b = password_hash('secret', PASSWORD_DEFAULT);

C’est possible parce que la chaîne renvoyée contient non seulement le hachage, mais aussi les informations nécessaires pour le vérifier : l’algorithme, ses paramètres et le sel.

À la connexion, password_verify() lit ces informations dans la chaîne et refait le calcul avec le sel correspondant :

password_verify('secret', $a); // true

Le sel n’est pas un secret, mais le rôle de password_hash() est de :

  • empêcher que 2 mots de passe identiques donnent le même hachage
  • rendre ainsi les rainbow tables inutilisables.

Test de mémorisation/compréhension​


Que fait John the Ripper, principalement ?


Qu'est-ce qu'un sel, dans le hachage d'un mot de passe ?


D'après le TP, pourquoi craquage.py (la séance précédente) ne peut-il pas traiter comptes_mediatheque.txt tel quel ?


D'après le TP, comment John the Ripper sait-il quel algorithme utiliser pour comptes_mediatheque.txt ?


Pourquoi le calcul d'une empreinte SHA-512 crypt est-il plus lent que celui d'un MD5 simple ?


Contre quelle attaque le salage protège-t-il efficacement ?


D'après le TP, pourquoi amelie reste-t-elle vulnérable malgré le salage de son mot de passe ?


Quels sont les 2 leviers qui protègent réellement un mot de passe, d'après ce TP ?



Bonnes pratiques​

  • Stocker les mots de passe avec un algorithme salé et lent (bcrypt, argon2, password_hash() en PHP), jamais MD5 ni SHA brut, même salé artisanalement.
  • Choisir un mot de passe long et imprévisible, quel que soit l'algorithme utilisé côté serveur : le salage ne dispense jamais de ce réflexe.
  • Utiliser un outil d'audit reconnu (John the Ripper, Hashcat) plutôt qu'un script maison, pour bénéficier de la détection de format et des règles de mutation déjà écrites.
  • Ne jamais tester un hash qui ne vous appartient pas, même avec un outil légitime.
  • Limiter le nombre de tentatives en ligne, en complément du hachage côté serveur.
La fonction PHP password_hash()

password_hash() génère un sel aléatoire en interne à chaque appel, puis l’intègre au résultat.

Vous n’avez donc pas à créer ni à stocker le sel séparément.

Par exemple, 2 appels avec le même mot de passe produisent généralement des chaînes différentes :

$a = password_hash('secret', PASSWORD_DEFAULT);
$b = password_hash('secret', PASSWORD_DEFAULT);

C’est possible parce que la chaîne renvoyée contient non seulement le hachage, mais aussi les informations nécessaires pour le vérifier : l’algorithme, ses paramètres et le sel.

À la connexion, password_verify() lit ces informations dans la chaîne et refait le calcul avec le sel correspondant :

password_verify('secret', $a); // true

Le sel n’est pas un secret, mais le rôle de password_hash() est de :

  • empêcher que 2 mots de passe identiques donnent le même hachage
  • rendre ainsi les rainbow tables inutilisables.