Casser les mots de passe de ses utilisateurs avec le plus gros dictionnaire français du monde

En tant que responsable de la sécurité des systèmes d’information de mon entreprise, j’ai plusieurs missions, dont celle de la sensibilisation à la sécurité informatique de mes utilisateurs. Pour cela, j’utilise plusieurs approches : les messages de sensibilisation (phishing, ransomware, etc.), les messages opportunistes lorsqu’une crise (chez les autres) est médiatisée, les vidéos de sensibilisation, les interventions dans les services, auprès du COMEX, etc.

Je fais intervenir des sociétés spécialisées dans les attaques éthiques, pour aller plus vite et pour avoir un regard externe, regard externe qui est souvent mieux perçu que celui du local de l’étape. Mais je mène parfois des audits internes moi-même. Voici un retour d’expérience que je partage avec vous, parce que cela illustre (pour les jeunes) l’un des aspects de la cybersécurité, et parce que cela peut peut-être aider un ou deux RSSI débutants qui passeraient par là, sait-on jamais.

Je précise que la méthode que je présente ici n’est qu’une des nombreuses méthodes existantes.

1ère étape : Récupérer la base de données des utilisateurs

Dans l’environnement de mon entreprise, comme c’est souvent le cas, les comptes des utilisateurs sont gérés par Microsoft Active Directory. Problème, il faut des droits particuliers pour pouvoir accéder à la base de données des utilisateurs. Or, le RSSI que je suis ne dispose pas de droits permettant cet accès…

Il m’a donc fallu contourner le problème : je suis passé par la console de gestion de mon antivirus++ que l’on appelle un EDR. En effet, la console de gestion de mon EDR me permet d’exécuter des commandes sur toutes les machines sur lesquelles cet EDR est installé.

Je me suis donc connecté sur un contrôleur de domaine secondaire pour y ouvrir un terminal particulier via la console EDR et j’ai exécuté la commande suivante :

ntdsutil "ac i ntds" "ifm" "create full c:\temp\SSI" quit quit

Cette commande crée une copie des fichiers NTDS.dit et SYSTEM qui contiennent toutes les informations utiles pour moi et les place dans le répertoire c:\temp\SSI du contrôleur de domaine. J’ai ensuite compressé ce répertoire dans une archive avec mot de passe. Puis j’ai supprimé tout le contenu de ce répertoire, par sécurité.

Problème : ma console EDR ne me permet pas de télécharger le fichier c:\temp\SSI.7z car il dépasse la taille autorisée… Il m’a donc fallu demander un peu d’aide : j’ai attendu 24h puis j’ai ouvert un ticket de demande de récupération du fichier SSI.ZIP au support informatique à partir des sauvegardes quotidiennes de cette machine. C’est passé crème.

Attention, le fait d’avoir mis les fichiers NTDS.dit et SYSTEM dans une archive avec mot de passe permet de garantir la confidentialité de ces données, surtout qu’elles se sont trouvées dans plusieurs sauvegardes, sur l’ordinateur de l’ingénieur qui a traité ma demande ET sur mon propre ordinateur…

2e étape : Constitution du plus gros dictionnaire de mots français du monde

J’ai déjà évoqué sur ce blog en détail comment j’ai eu l’idée d’utiliser tout le contenu du site Wikipédia français. Vous trouverez le résumé dans le billet intitulé « Dictionnaire français pour hashcat« , et le détail technique sur mon dépôt GitHub

Voici les commandes utilisées :

wget https://dumps.wikimedia.org/frwiki/latest/frwiki-latest-pages-articles-multistream.xml.bz2
bzcat frwiki-latest-pages-articles-multistream.xml.bz2 | tr "\040\041\042\043\044\045\046\047\050\051\052\053\054\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\133\134\135\136\137\140\173\174\175\176" "\n" > toto
cat toto | tr -s "\n" | awk '!x[$0]++' | sort > wikipedia.fr.txt

Voir aussi dans ce billet l’explication de la commande awk utilisée.

Le fichier wikipedia.fr.txt ainsi obtenu contient plus de 29 millions de mots, incluant tous les mots de la langue française, mais aussi les noms de lieux ou lieux dits, les prénoms, les noms de famille, les mots surannées, le jargon de toutes les professions, les mots d’argots ou de patois, les sigles, les marques, beaucoup de mots latins ou en grec ancien, et des mots en d’autres langues courantes (anglais, allemand…) ou moins courantes (breton, corse, leetspeak…).

Bref, vous voici avec un fichier quasi parfait pour une attaque par dictionnaire.

3e étape : Préparer une machine de calcul

Pour craquer des mots de passe par une attaque par dictionnaire, il est préférable d’utiliser une machine performante. Dans mon cas, mon entreprise ne me donne pas accès à une telle machine, mais mon radiateur oui.

Les lecteurs de ce blog savent que je me suis fabriqué un radiateur qui me chauffe l’hiver tout en minant des cryptomonnaies. Ceux qui veulent en savoir plus peuvent lire ce billet. L’hiver étant fini, j’ai une machine disponible avec plusieurs cartes GPU (anciennes). Mais une machine de gamer actuelle suffirait.

La machine est sous Windows, avec WSL, mais une machine GNU/Linux serait aussi bien quand on maîtrise bien l’installation des drivers des cartes graphiques.

J’ai ensuite installé hashcat par le cassage des mots de passe, VeraCrypt pour garder en sécurité à l’abri des regards tous les fichiers et mots de passe découverts et le packet Impacket pour utiliser le script Python secretsdump.py que j’installe dans WSL.

Enfin, je récupère la règle OneRuleToRuleThemAll que je place dans le répertoire « rules » de hashcat.

4e étape : A L’ATTAAAAQUE

Je décompresse mon fichier SSI.7z protégé par mot de passe, dans mon containeur sécurité VeraCrypt et récupère le fichier NTDS.dit et SYSTEM

J’exécute ensuite la commande suivante dans WSL sous Windows :

secretsdump.py LOCAL -ntds NTDS.dit -system SYSTEM -outputfile hash.txt

Le fichier hash.txt contient les mots de passe de mes utilisateurs, chiffrés sous forme de hashs. Je peux enfin lancer la commande suivante :

hashcat -m 1000 -a 0 -w 1 hash.txt wikipedia.fr.txt -r rules/OneRuleToRuleThemAll.rule

Je peux laisser la machine travailler, et quatre heures après, j’ai cassé environ 10% des mots de passe de mes utilisateurs.

Conclusions

Il y a beaucoup de choses à dire, et sans doute beaucoup de monde à son avis sur le sujet, mais voici les actions que j’ai menées suite à la découverte (en quelques heures) de 10% des mots de passe de mes utilisateurs :

  • Tous les utilisateurs sont protégés par une authentification multifactorielle. La faiblesse de leur mot de passe n’est pas en soit catastrophique. Je n’ai donc pas obligé les utilisateurs dont j’ai pu craquer le mot de passe à en changer, sauf pour les comptes de service et les utilisateurs à privilèges (admin, etc.) où les mots de passe peuvent être réellement aléatoires et gérés par des coffres forts de mots de passe.
  • J’ai communiqué auprès de l’ensemble des utilisateurs pour les prévenir qu’il ne faut pas utiliser des mots de passe du type « AbracaDabra@2025! » qui, bien que longs et complexes (17 signes mélangeant majuscules, minuscules, chiffres, caractères spéciaux), sont trouvés par une attaque par dictionnaire. Le message est difficile à entendre, donc merci le MFA.
  • J’ai fait modifier les vérifications lors du changement de mot de passe, pour diminuer la probabilité de succès d’une attaque par dictionnaire.

Si vous avez des réactions constructives à ce billet, n’hésitez pas à laisser un commentaire.

19 réflexions sur « Casser les mots de passe de ses utilisateurs avec le plus gros dictionnaire français du monde »

  1. > Dans l’environnement de mon entreprise, comme c’est souvent le cas, les comptes des utilisateurs sont gérés par Microsoft Active Directory. Problème, il faut des droits particuliers pour pouvoir accéder à la base de données des utilisateurs. Or, le RSSI que je suis ne dispose pas de droits permettant cet accès…
    > Il m’a donc fallu contourner le problème : je suis passé par la console de gestion de mon antivirus++ que l’on appelle un EDR. En effet, la console de gestion de mon EDR me permet d’exécuter des commandes sur toutes les machines sur lesquelles cet EDR est installé.

    Hum. J’espère que l’accès à la console de l’EDR est bien protégé; parce que ça a l’air d’être un chouette moyen de contourner les protections et sécurités mises en place.

    • La console de gestion de l’EDR permet d’isoler toutes les machines du reste du monde, et en particulier les serveurs, en cas de propagation d’un ransomware par exemple… Donc oui, un attaquant qui en prendrait le contrôle pourrait faire d’énormes dégâts. Par conséquent, elle est particulièrement protégée (et surveillée).

  2. perso sur un site marchand j’ai un mot de pass à 6 lettres depuis 20 ans et j’ai jamais eu de probleme , je l’ai toujours laissé pour voir ^^
    ….. fou non?

    • Ce qui serait fou, ce serait d’aller régulièrement sur ce compte pour y mettre à jour la carte bancaire qui y est enregistrée 😉

  3. Je ne suis pas RSSI, mais je me demande en toute bonne foi: le fait de « sortir » les mots de passe de l’entreprise pour les casser sur un PC/radiateur personnel n’est il pas un risque et une faute?

    • Toutes les actions concrètes de sécurité ont une part de risque : quand vous scannez un site en production à la recherche de vulnérabilités, il est possible de le faire tomber (oups), quand vous demandez la mise à jour d’un serveur, il peut ne pas redémarrer, etc.

      Pour chaque situation, vous devez faire une analyse de risque et garder en tête tout ce qui peut mal se passer, et prendre les précautions appropriées.

      Dans le cas présent, ce qui pourrait m’être reproché, ce serait justement de ne pas avoir pris les bonnes précautions : le fichier de la base de données des mots de passe est chiffré, il a été déchiffré sur mon ordinateur d’analyse qui lui même est chiffré, et tout le travail résultant a été placé dans un containeur VeraCrypt chiffré. De plus, je ne fournis jamais à un utilisateur son mot de passe (même oralement), je lui dis qu’il a été découvert dans le cadre d’un audit de sécurité et qu’il doit le changer (et améliorer sa complexité).

      J’ai pris une initiative sans demander la permission car dans ce cas précis, je préfère m’excuser de faire mon travail que de demander la permission.

      C’est une prise de risque, mais j’ai des arguments pour ma défense.

    • Merci pour votre réponse argumentée. Je comprends parfaitement l’initiative mais, travaillant aussi dans l’informatique, ce qui me gêne (ce n’est que mon avis et j’essaye de comprendre votre point de vue), c’est de « sortir » des données sensibles de l’entreprise sans avoir l’accord de celle-ci.

      Si un employé lambda sortait des données de l’entreprise sans autorisation, pour finir son travail chez lui le week-end, il y a de fortes chances que cela contrevienne à la charte informatique/au règlement de l’entreprise. N’est-ce pas exactement ce que vous faites?

      De mon point de vue, les risques sont pris en accord avec (la direction de) l’entreprise. Pour reprendre vos exemples, quelqu’un (ou une équipe, etc) est payé pour mettre à jour les serveurs, et s’assurer qu’ils ne sont pas vulnérables. Le risque que le serveur soit down ou ne redémarre plus est inhérent à la fonction de ces personnes.

      Là où je veux en venir, c’est que je pense le risque que vous prenez en sortant des données sensibles de l’entreprise n’est pas inhérent à votre fonction, et cela pourrait être problématique parce que votre employeur n’est pas conscient du risque que vous prenez pour lui. C’est dans ce sens que je pense qu’il s’agit d’une faute.

      En informatique, aucune sécurité n’est absolue. Vous l’avez déjà démontré dans de multiples articles vulgarisant votre ancien métier d’expert judiciaire. Et si votre radiateur était compromis? Et si un attaquant récupérait les résultats de votre attaque par dictionnaire avant que ceux-ci ne soient écrits sur disque et chiffrés? Et si, en procédant ainsi, vous permettez à un attaquant de s’infiltrer dans le réseau de votre entreprise à cause de votre matériel personnel? Considérez-vous que c’est un risque acceptable pour votre entreprise?

      Encore une fois, il ne s’agit que de mon avis sur la question, et je serai ravi de lire votre réponse et vos arguments.

    • Comme je l’indiquais dans ma réponse, tout est question de niveau de prise de risque et de son appréciation. Plus simplement, il n’y a pas de risque zéro. Comme quand un utilisateur fait une sauvegarde de son disque dur professionnel sur un disque externe personnel.

      Dans mon cas, je pense avoir pris un nombre suffisant de précautions pour minimiser le risque de fuite de données.

      Il faut savoir prendre des risques, y compris au nom de son entreprise, sinon on ne sort plus de chez soi car on risque de se faire écraser.

  4. « J’ai pris une initiative sans demander la permission car dans ce cas précis, je préfère m’excuser de faire mon travail que de demander la permission. »
    -> J’aime bien.

    Merci pour ce blog que je continue à lire régulièrement.

  5. Bonjour,

    Concernant la phrase « J’ai communiqué auprès de l’ensemble des utilisateurs pour les prévenir qu’il ne faut pas utiliser des mots de passe du type « AbracaDabra@2025! » qui, bien que longs et complexes (17 signes mélangeant majuscules, minuscules, chiffres, caractères spéciaux), sont trouvés par une attaque par dictionnaire. », je ne comprends pas comment « AbracaDabra@2025! » se retrouve dans votre dictionnaire. « Abracadabra », OK, y compris les variantes de casse, mais avez-vous pour chaque mot ajouté les variations avec toutes
    les années possibles + des caractères spéciaux ?

    Personnellement, j’utilise des mdp générés aléatoirement par KeePass, mais cela m’inquiète que AbracaDabra@2025! soit considéré comme faible…

    • C’est le principe même des règles associées à une attaque par dictionnaire : essayer les combinaisons les plus fréquemment trouvées dans la manière de former un mot de passe. Et depuis 60 ans, beaucoup d’idées ont été testées par les utilisateurs, donc ceux qui pensent qu’un mot du dictionnaire suivi d’un « @ », puis d’une année sur 4 chiffres et qui finit par « ! », est un bon mot de passe, se trompent. La règle « OneRuleToRuleThemAll.rule » regroupe beaucoup de manière de former un mot de passe.

      De même ceux qui pensent avoir une idée géniale d’écrire en LeetSpeak ou en phonétique, ou en inversant des syllabes ou en argot, ou en remplaçant les « a » par des « @ »…

      La meilleure méthode est la génération aléatoire d’un long mot de passe, ou la méthode des premières lettres (d’une chanson, d’un poème, etc.)

    • Une syllabe additionnelle permet-elle d’échapper à l’attaque par dictionnaire ? Par exemple AbracaCaDabra ? Ou bien doubler toutes les lettres sauf une : CCoouuCcoouu_Zyytthhoomm ? Ou bien en combinant, avec des caractères de substitution : A@bbrra@C@aKadda@bra@ ?

    • Je ne sais pas, il faudrait tester. Mais encore une fois, en 60 ans beaucoup d’idées de ce type ont été imaginées, et font l’objet de règles intégrées dans les attaques par dictionnaire.

  6. Bonjour,
    Je suis curieux quand a la manière dont les règles de changements de mots de passe ont été modifié afin d’éviter le succès d’une attaque par dictionnaire.
    Vous avez un outil tier ou tout est fait depuis l’AD (qui me parait simpliste parfois)
    Merci

  7. Bonjour,
    Dans le cadre de la sensibilisation de mes utilisateurs aux mots de passe, j’ai parlé de la puissance de calcul, de la nécessité de passer à des mots de passe toujours plus complexe et longs (genre dix ou douze caractères avec trois ou quatre types), d’éviter les codes évidents, le prénom, la date, 123456 ou azerty… Et j’ai proposé des trucs simples, les initiales d’une longue phrase ou même plusieurs mots accolés comme UnElephantIvreDansLeCaniveau (tout en gardant pour moi les attaques par dictionnaire pour ne pas compliquer le discours adressé à des Keskinoudilui?). Mais de mon côté je me suis demandé la valeur réelle de ce mot de passe : les attaques par dictionnaires sont elles significativement handicapées par plusieurs mots accolés ?
    Merci pour vos récits 🙂

    • Tout est question d’entropie, et c’est le dessin n°936 d’XKCD qui le décrit le mieux https://xkcd.com/936/
      Et si vous séparez les mots par un caractère spécial de votre choix, c’est jackpot 🙂

  8. Bonjour. Petite « plaisanterie » de sécurité. Une de mes banques, en l’occurrence La Nef, m’a envoyé un message pour participer à l’AG. Le titre du message  » La NEF via Eklesio ». Expéditeur: une adresse en eklesio.fr. Dedans, un bouton renvoyant vers le site eklesio.fr. Autrement dit 100% des caractéristiques d’une tentative de hammeçonnage. Et pourtant La NEF ne comprend pas où peut se trouver le problème. NO COMMENT!

    • Lol! Cas similaire:
      Il y a un an de ça ou plus, j’avais commandé un livre à une maison d’édition US, livré par la Poste. Je reçois un jour un sms m’invitant à payer mes droits de douane moins cher en cliquant sur un lien. Méfiant, je bazarde le sms. Il s’avère qu’il était légitime et m’aurait fait économiser 6€ (cf la poste: frais-droits-douane). Mais d’un autre coté, le sms ressemblait tellement à celui d’un arnaqueur que je me fiche des 6€ payés en plus.

  9. A propos du conseil de xkcd.com n°936 (Password Strength) et de l’usage de dictionnaire.
    En vieillissant j’ai réalisé que ma mémoire rouille et que mémoriser un mot de passe type sk’8260?df!a ou même a3d2e5q9d5a0 devient difficile.
    Le site de xkcd propose d’utiliser une suite de mots type « cheval correcte batterie agrafe », beaucoup plus facile à mémoriser. Mais est-ce efficace face à une attaque par dictionnaire?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *


Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.