Casser des condensats de mots de passe... sans violence

⚠️ Le blog a été déplacé vers le site Patrowl, vous serez redirigé automatiquement dans 3 secondes, sinon cliquez sur ce lien : https://patrowl.io/casser-des-condensats-de-mots-de-passe-sans-violence/
👍 Vous y retrouverez toutes les nouvelles publications

Comme certains le savent (ou pas), j’aime bien casser des condensats de mots de passe mais sans violence 😉.

Avant tout choses, je vous recommande la lecture de la présentation que j'avais faite à l'OSSIR en mai 2019 : https://www.ossir.org/paris/supports/2019/2019-05-14/2019_OSSIR_-_Casser_des_mots_de_passe_v1.0.pdf

Résumé de la présentation

Sans reprendre le contenu complet de la présentation, voici les principaux messages.

Casser des condensats, c’est utile

Casser des condensats c’est utile pour se protéger en identifiant les mots de passe les plus faibles. Depuis plusieurs mois, des cybercriminels attaquent massivement Office 365 à partir de deux principales attaques :

  • Du « password spraying » consistant à essayer quelques mots de passe prévisible (Entreprise2020, Password123…) sur un grand nombre de comptes, afin de ne pas atteindre le seuil de blocage du nombre de tentative erronée par compte (souvent à 5) ;
  • Du « password reuse » consistant à essayer les mots de passe trouvé dans des fuites de données publiques sur les comptes associés. Si Martin DUPONT de chez Entreprise avait un compte Linkedin avec le mot de passe « Maman007 », suite à la fuite de la base de Linkedin en 2012, il y’a fort à parier que des attaquant vont tenter de compromettre son compte Office 365 en essayant de s’y connecter avec le login martin.dupont@entreprise.com  et le mot de passe « Maman007 ».

Sébastien Mériot d’OVH avait fait une très bonne présentation sur le sujet à la conférence CORI&IN 2020 : Fuite de données & Credential Stuffing. Si vous n’avez pas pu la voir, en voici un rapide résumé : https://blog.xmco.fr/retour-sur-la-coriin-2020/

Casser des condensats peut également servir lors d’un test d’intrusion, par exemple en environnement Active Directory en récupérant des condensats de mots de passe grâce à l’outil responder ou en réalisant du Kerberoasting, ce qui marche plutôt très bien 😉 . Pour les détails sur le Kerberoasting, je vous recommande la lecture de cet excellent billet de blog en français de Pixis : https://beta.hackndo.com/kerberoasting/

Ça se fait bien pour pas trop cher

Pour un coût modique (à l’échelle d’une entreprise ou d’une organisation criminelle), il est possible de disposer de matériel permettant de tester des dizaines de milliards de mots de passe par seconde pour casser des condensats.

Les résultats obtenus sont toujours intéressants

En général, dans des entreprises n’ayant pas réalisé ce type d’opération et/ou n’ayant pas une sensibilisation forte à la sécurité, les résultats oscillent entre 60% et 80%.

Récemment, j’ai travaillé sur le sujet pour une entreprise et j’ai pu retrouver les mots de passe de 85%des 80 000 comptes actifs dont :

  • 1 900 mots de passe faisant parti des 10 pires mots de passe du monde (123456, azerty, password, 12345, 123123…), le fameux « The World’s Top 10 Worst Passwords » ;
  • 2 200 mots de passe contenant simplement le nom de l’entreprise ou avec l’année en suffixe ;
  • 3 140 mots de passe disponible dans des fuites de données publiques (« password reuse ») ;
  • 25 638 mots de passe provenant de dictionnaires publiques comme CrackStation.

Alors oui ce n’est pas bon, oui c’est désagréable à découvrir, oui cela peut faire peur, mais il est préférable de le découvrir en faisant ce type de vérification et lancer un plan de remédiation, plutôt que de fermer les yeux et laisser les cybercriminels exploiter ces faiblesses.

Solution(s)

Pour les conclusions, je vous renvoie vers ma présentation que je compléterai juste de : si vous utilisez Office 365 activez l’authentification forte à double facteur, c’est indispensable ; j’entends parler quasiment chaque jour de comptes compromis chez mes clients, contacts, prospects, copains…

Mon mode opératoire

Quand je récupère des condensats que je souhaites casser, je suis généralement le même mode opératoire, que j’améliore à chaque itération.

Tout ceci est bien entendu perfectible, critiquable…

1 – Recherche des condensats dans ma propre base

Je conserve une petite base associant des mots de passe et des condensats (NTLM et SHA1-160bits) provenants de publications comme celles du site hashes.org, de pastebin… Si les condensats à casser ne sont ni NTLM ni SHA1-160bits, je passe à la suite.

2 – Dictionnaire spécifique

Je construis un dictionnaire spécifique à ma cible, à partir:

  • Du Wikipedia de l’entreprise ciblée, dans la plupart des langues ;
  • Du site web de l’entreprise, de ses marques, de ses filiales, de sa maisons mère… avec l’outil CeWL (que je déteste car développé en Rubis) ou manuellement ;
  • D’articles de presse sur l’entreprise, ses marques… ;
  • Des comptes Facebook de l’entreprise, de ses marques… plutôt manuellement mais c’est assez rapide ;
  • Des Twitter de l’entreprise, de ses marques… avec l’outil twofi quand j’arrive à le faire marcher, sinon manuellement (quasi aussi rapide) ;

Je concatène toutes ces données brutes, construis quelques mots complexes ou expressions manuellement et cela me donne un premier dictionnaire.

Outil de cassage : hashcat avec ce dictionnaire et un ensemble de 3 millions de règles de dérivations que je maintiens dans le temps (celles fournies par défaut avec hashcat sont déjà très bien).

Durée : quelques minutes

3 – Tous les mots de passe de moins de 7 caractères

La technique est simple, il s’agit de tester tous les mots de passe possible d’une longueur de 1 à 7 caractères.

Outil : hashcat

Durée : dans les 15 minutes sur 2 cartes graphiques RTX 2080 pour des condensats NTLM

3 bis – Tous les mots de passe de moins de 8 caractères

Si j’ai le temps, je réalise la même chose que précédemment mais avec tous les mots de passe possible d’une longueur de 8 caractères.

Outil : hashcat

Durée : dans les 20 à 22h sur 2 cartes graphiques RTX 2080 pour des condensats NTLM

4 – Dictionnaire InsidePro

J’utilise le dictionnaire InsidePro de 31Mo (en ayant supprimé les doublons avec CrackStation, cf. la suite)

Outil : hashcat et mes 3 millions de règles de dérivations

Durée : quelques dizaines de minutes sur 2 cartes graphiques RTX 2080 pour des condensats NTLM

5 – Dictionnaire Crackstation

J’utilise le dictionnaire CrackStation (téléchargeable sur leur site) que j’ai précédemment nettoyé, trié et débarrassé de ses doublons (# sort -u | awk 'length($0) > 4 && length($0) < 41' )

Outil : hashcat et mes 3 millions de règles de dérivations

Durée : dans les 24h sur 2 cartes graphiques RTX 2080 pour des condensats NTLM

6 – Dictionnaire perso

Depuis un moment je construis un dictionnaire de mots de passe à partir de tous les fuites de données que je peux récupérer. A ce jour il faut 43Go. Il n’est pas exhaustif (je n’ai ni le temps ni les réseaux criminels pour tout récupéré 😊) mais il permet de compléter les dictionnaires précédents.

Outil : hashcat et mes 3 millions de règles de dérivations

Durée : entre 3 et 4 jours sur 2 cartes graphiques RTX 2080 pour des condensats NTLM

7 – Masques évidents

Je me suis créé une liste de masques représentant des mots de passe pouvant être considérés comme classiques comme par exemple tous les mots de 8 lettres, débutants par une majuscule et suivi des 4 chiffres.

Outil : hashcat

Durée : entre 4 et 6 heures sur 2 cartes graphiques RTX 2080 pour des condensats NTLM

8 – Masques personnalisés

Avec les mots de passe précédemment récupérés et une liste réduite de mots intéressants (nom de marque, de produit, de formule chimique…) je réaliser un dictionnaire à partir duquel je vais générer des masques pour hashcat. J’ai développé un petit outil en python pour cela, que je peux fournir uniquement sur demande car… il n’est pas d’une propreté absolue 😉.

Par exemple, je définis les 4 groupes suivants : « Entreprise », 4 chiffres, 2 caractères spéciaux et 2 chiffres. Puis à partir de ces 4 groupes, je génère toutes les combinaisons possibles en incrémentant la longueur des éléments, ce qui donnerait les masques suivants ( ?d = chiffre, ?s= caractère spécial) :

Entreprise ?d ?s ?d
Entreprise ?d ?s ?s ?d => ici c’est le nombre de caractères spéciaux qui a varié
Entreprise ?d ?s ?d ?d=> nous recommençons avec 2 chiffres au lieu d’un seul
Entreprise ?d ?s ?s ?d ?d => à nouveau 2 caractères spéciaux

Entreprise ?d ?d ?d ?d ?s ?s ?d ?d => Je finis cette combinaison par tous les groupes dans leur intégralités
?dEntreprise ?s ?d => ici c’est une nouvelle combinaison où je ne débute plus par le nom de l’entreprise par le second groupe de 1 à 4 chiffres

?d ?d ?d ?d Entreprise ?s ?s ?d ?d => fin de cette combinaison

Outil : hashcat

Durée : Je limite aux combinaisons aboutissant à des mots de passe de 10 à 12 caractères afin de ne pas dépasser une journée de calcul au total

9 – Masques d’imitation

Là encore, j’utilise les mots de passe précédemment récupérés mais pour générer des masques qui auraient permis de les retrouver. Cette méthode est particulièrement efficace 😍.

Si par exemple, j’ai le mot de passe « Coucou2020! », j’en déduits le masque suivant ( ?u = majuscule, ?l = minuscule, ?d = chiffre, ?s = caractère spécial) : ?u ?l ?l ?l ?l ?l ?d ?d ?d ?d ?s

J’ai développé un petit outil en python pour cela, que je peux fournir uniquement sur demande car… il n’est, là encore, pas d’une propreté absolue 😉.

Outil : hashcat

Durée : entre 12 et 24h mais mon script étant un peu plus évolué que le précédent, je limite ici la durée de cassage à 1 journée

10 – Mots de passe trouvés + règles de dérivations

Là encore, j’utilise les mots de passe précédemment récupérés et je les utilise tout simplement comme un nouveau dictionnaire.

Outil : hashcat et mes 3 millions de règles de dérivations

Durée : moins de 5 minutes sur 2 cartes graphiques RTX 2080 pour des condensats NTLM

Tout ceci peut être amélioré et je dois encore :

  • Connecter les scripts des phases 7, 8 et 9 afin d’éliminer les masques redondants ;
  • Rendre mes scripts plus pro et utilisables par une autre personne que moi-même 😃.

Si vous avez suivi, vous remarquerez que globalement, tout tourne autour des mêmes mots de passe et que je peux difficilement trouver un mot de passe qui n’aurait pas été déjà trouvé précédemment ou un mot de passe approchant. C’est vrai et c’est pour cela que je fais évoluer régulièrement mon propre dictionnaire avec de nouveaux mots de passe, réellement trouvés dans la nature.

Mais retrouver un mot de passe qui n’a jamais été utilisé nulle part avant, non basé sur un mot usuel et d’une bonne longueur… c’est très difficile, vous savez donc quoi faire 😉.