Les formats de hash Windows

NTLM, Net-NTLM, LM … Sous Windows il existe plusieurs formats de hash qui sont plus ou moins intéressants du point de vue d’un attaquant. Dans cet article nous verrons quels sont ces formats de hash, comment ils sont créés et ce qu’on peut en faire au cours d’un pentest.

I/ Les hash LM

Les hash LM sont les anciens formats de hash utilisés dans un environnement Windows. Aujourd’hui il est clairement déconseillé d’utiliser ce format de hash car il est trop vulnérable et peut facilement être cassé.

Les hash LM ont une taille fixe de 14 octets. Peu importe que votre mot de passe fasse 10, 8, 2 ou 11 caractères puisqu’il sera paddé afin d’atteindre la taille de 14 octets.

Voici les étapes nécessaires pour générer un hash LM :

  1. On convertit tous les caractères en majuscule
  2. On ajoute des octets de padding afin que le mot de passe fasse bien 14 caractères
  3. On coupe le mot de passe en deux strings de 7 caractères chacune
  4. A partir de ces deux strings on crée deux clés DES
  5. On chiffre la chaîne de caractère « KGS!@#$% » avec les deux clés
  6. On concatène les résultats afin d’obtenir le hash LM

Pourquoi est ce qu’on utilise plus ces hashs aujourd’hui ? Eh bien pour plusieurs raisons. La première c’est que le mot de passe est automatiquement convertit en majuscule ce qui divise par deux le temps de crackage (vu que les caractères minuscules ne sont pas pris en compte).

Ensuite l’algorithme de chiffrement utilisé est l’algorithme DES qui n’est plus suffisamment robuste à l’heure actuelle.

Enfin, il n’y a pas de notions de sel lors de la phase de chiffrement ce qui implique que les hash LM sont vulnérables aux rainbow tables.

Pour craquer un hash LM on pourra utiliser ces commandes :

john --format=lm hash.txt
hashcat -m 3000 -a 3 hash.txt

II/ Les hash NTLM

Les hash NTLM sont les hash nouvelle génération de Windows. C’est avec ces hash là que nous allons pouvoir Pass the Hash.

Les hash NTLM sont générés via l’algorithme de chiffrement MD4 :

MD4(UTF-16-LE(password))

En python on pourra d’ailleurs générer un hash NTLM en trois lignes de cette manière :

import hashlib,binascii
hash = hashlib.new('md4', "mon_mot_de_passe".encode('utf-16le')).digest()
print binascii.hexlify(hash)

Même si l’algorithme est plus robuste, les hash NTLM restent toujours trop peu sécurisés puisqu’il n’y a toujours pas de notions de sel : les hash NTLM sont eux aussi vulnérables aux rainbow tables.

On pourra cracker des hash NTLM via ces commandes :

john --format=nt hash.txt
hashcat -m 1000 -a 3 hash.txt

III/ Les hash Net-NTLM v1/v2

Ces hash là, même s’il y a NTLM dans leurs nom, ne peuvent pas être utiliser dans une attaque de type Pass the Hash. En revanche ce sont ces hash qui sont utilisés afin d’authentifier des utilisateurs sur un réseau Active Directory et que l’on peut relayer via une attaque de type NTLM relay.

Pour les casser on pourra utiliser ces commandes pour les hash Net-NTLMv1:

john --format=netntlm hash.txt
hashcat -m 5500 -a 3 hash.txt

et ces commandes pour les hash Net-NTLMv2 :

john --format=netntlmv2 hash.txt
hashcat -m 5600 -a 3 hash.txt