
Casser les challenges/réponses MSCHAPv2 rapidement en utilisant une base de données de hachages NT
Craquez rapidement des défis/réponses MSCHAPv2/NTLMv1 en utilisant une base de données de hachages NT
Assless CHAPs est un moyen efficace de récupérer le hachage NT utilisé dans un échange MSCHAPv2/NTLMv1 si vous disposez du défi et de la réponse (par exemple, à partir d'une attaque WPE WiFi EAP).
Il nécessite une base de données de hachages NT ; des instructions sur la façon de les créer à partir de listes existantes ou en utilisant hashcat avec des listes de mots et des règles sont disponibles ci-dessous. J'ai inclus un exemple de base de données provenant de SecLists. Vous devrez le décompresser avec bunzip.
Un échange MSCHAPv2 ne nécessite pas que le mot de passe en texte clair soit « craqué », il suffit simplement d'obtenir le NThash utilisé.
MSCHAPv2 divise le NThash en trois parties et utilise chaque partie comme clés différentes pour chiffrer par DES le même défi (dérivé des défis du pair et de l'authentificateur). Le NThash est divisé en deux clés de 7 octets et une clé de 2 octets. Cela signifie que la dernière clé est complétée par des NULL pour former une clé de la longueur requise. Celle-ci peut être rapidement forcée par brute force en raison de l'efficacité de l'opération DES et d'un espace de clés de 65 535. Une fois que nous avons ces deux octets, nous pouvons rechercher tous les NThash dans notre base de données qui se terminent par ces deux octets. Cela fournit un ensemble beaucoup plus restreint de hachages possibles à vérifier.
Il s'agit d'une forme de compromis espace/temps, similaire à une table arc-en-ciel. C'est aussi une forme de shucking de hachage.
Cela a été présenté pour la première fois au RF Hacking Village de Defcon 29. Les diapositives sont incluses dans ce dépôt.
Voici la comparaison pour trois échantillons de défi/réponse et trois listes de mots différentes : une petite liste privée, rockyou et la liste Have I Been Pwned. Les tests ont été effectués sur mon Macbook Pro 2016. Hashcat utilise ce noyau de shucking de hachage et les deux GPU intégrés, ainsi qu'un noyau pur plutôt qu'optimisé (car ce dernier n'existe pas encore). Hash3 n'est pas dans les listes pour simuler le pire des cas. Je n'inclus pas le temps que prend hashcat pour construire le cache du dictionnaire lors de la première exécution.
Hash1
Petite liste de hachages :
hashcat 0.50s user 0.27s system 55% cpu 1.405 total (8597.8 kH/s)
assless 0.05s user 0.00s system 294% cpu 0.018 total
Liste rockyou :
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
Liste HIBP :
hashcat 59.97s user 11.72s system 136% cpu 52.603 total (5620.6 kH/s)
assless 0.05s user 0.00s system 292% cpu 0.018 total
Hash 2
Petite liste de hachages :
hashcat 0.51s user 0.27s system 55% cpu 1.409 total (8704.7 kH/s)
assless 0.03s user 0.00s system 248% cpu 0.012 total
Liste rockyou :
hashcat 2.20s user 0.46s system 110% cpu 2.409 total (5798.4 kH/s)
assless 0.03s user 0.00s system 231% cpu 0.015 total
Liste HIBP :
hashcat 65.37s user 12.74s system 135% cpu 57.712 total (5768.7 kH/s)
assless 0.03s user 0.00s system 249% cpu 0.013 total
Hash 3
Hash 3 n'existe dans aucune des listes de hachages pour simuler le pire des cas de performance de recherche.
Petite liste de hachages :
hashcat 0.67s user 0.34s system 66% cpu 1.526 total (7550.1 kH/s)
assless 0.02s user 0.00s system 211% cpu 0.012 total
Liste rockyou :
hashcat 2.71s user 0.52s system 94% cpu 3.415 total (5685.4 kH/s)
assless 0.02s user 0.01s system 181% cpu 0.014 total
Liste HIBP :
hashcat 125.19s user 27.62s system 139% cpu 1:49.75 total (5634.9 kH/s)
assless 0.06s user 0.03s system 115% cpu 0.075 total
La version Rust nécessite SQLite 3.6.8 ou plus récent.
La version Python nécessite python3, sqlite3 et pycryptodome.
L'utilitaire de création de base de données nécessite python3 et l'interface en ligne de commande sqlite3.
Cela ne s'applique qu'à la version Rust. Vous aurez besoin de cargo.
Une fois cargo installé, il suffit de se rendre dans le répertoire assless-chaps-rs et de le construire avec :
cargo build --release
Le binaire résultant se trouvera dans le répertoire target/release/.
Assless nécessite le défi, la réponse et la base de données de NThash. En option, la version Python peut utiliser le fichier de recherche optimisé sur deux octets fourni. L'utilisation la plus simple ressemble à ceci :
./assless-chaps <Challenge> <Response> <hashes.db>
Par exemple :
./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db
La sortie devrait ressembler à :
[-] Aucun fichier de recherche sur deux octets fourni, passage en brute force à la place.
[+] Trouvé en 22636 essais : 586c
[-] 222 hachages trouvés se terminant par 586c
[+] Hachage trouvé : 8846f7eaee8fb1
[-] Trouvé après 186 hachages.
[+] Hachage trouvé : 17ad06bdd830b7
[+] Hachage complet : 8846f7eaee8fb117ad06bdd830b7586c
Le hachage complet final 8846f7eaee8fb117ad06bdd830b7586c est le hachage NT de password.
J'ai passé du temps à construire une liste de toutes les 65 535 valeurs possibles sur deux octets triées par prévalence dans un vaste corpus de mots de passe. Ce fichier est inclus sous le nom twobytes. Vous pouvez simplement le passer comme quatrième argument à assless.
Cela permet généralement d'économiser quelques tours de DES, mais ne fait pas une grande différence de vitesse. Cela pourrait en faire si vous traitez de nombreux hachages.
python3 assless-chaps.py 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db twobytes
[+] Trouvé en 65533 essais : 586c
[-] 222 hachages trouvés se terminant par 586c
[+] Hachage trouvé : 8846f7eaee8fb1
[-] Trouvé après 186 hachages.
[+] Hachage trouvé : 17ad06bdd830b7
[+] Hachage complet : 8846f7eaee8fb117ad06bdd830b7586c
Le fichier mksqlitedb.py vous aidera à transformer un fichier CSV de hachages en base de données.
python3 mksqlitedb.py <nom de la base> <fichier csv>
Le fichier CSV nécessite trois colonnes :
Par exemple, le hachage 8846f7eaee8fb117ad06bdd830b7586c deviendra :
586c,8846f7eaee8fb1,17ad06bdd830b7
Une transformation regexp exemple pour cela serait :
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
Vous pouvez soit prendre une liste existante de hachages (comme les listes Have I Been Pwned) soit générer les vôtres à partir de hashcat et de vos combinaisons préférées de listes de mots et de règles.
Les listes de mots de passe HIBP sont déjà téléchargeables sous forme de hachages NT ; il suffit de supprimer le comptage du fichier et de les convertir au format CSV pour les importer dans la base de données.
Cela peut être fait avec l'utilitaire Unix standard sed comme ceci :
sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/" pwned-passwords-ntlm-ordered-by-hash.txt > hibp.csv
Ensuite, on peut l'importer avec mksqlitedb.py hibp.db hibp.csv.
Pour convertir une liste de mots brute en liste de hachages nthash, vous pouvez utiliser nthasher qui peut traiter rapidement de grandes listes de mots. Les hachages obtenus devront être convertis au format CSV requis comme décrit ci-dessus.
Un nthasher beaucoup plus lent qui produit les hachages directement au format CSV requis est inclus dans ce dépôt, et s'exécute simplement avec :
python3 nthash-from-clear.py <wordlist> > hashlist.csv
Si vous souhaitez étendre la liste de mots avec des règles, consultez la section suivante sur l'utilisation de hashcat.
Vous devrez apporter une petite modification au module OpenCL du mode 1000 pour qu'il crache tous les hachages, plutôt que seulement ceux correspondant à votre candidat de craquage. Par défaut, il générera le hachage au bon format CSV requis.
OpenCL de hashcat : cd hashcat/OpenCLpatch < m01000_a0-pure.cl.patchecho 11111111111111111111111111111111 > impossible_hashhashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csvpython3 mksqlitedb.py rockyou.db rockyou.csvLa base de données SQLite est généralement 61 % plus grande que le fichier CSV utilisé pour la créer. La création de la base de données peut également prendre du temps en fonction de la taille des fichiers. Préparez vos besoins en espace disque en conséquence.
Voici un exemple utilisant le dictionnaire rockyou :
Vous pourriez économiser de l'espace en convertissant et insérant chaque hachage dynamiquement, évitant ainsi le besoin du fichier CSV intermédiaire.
NTLMv1 fonctionnera exactement de la même manière, sauf s'il utilise SSP. Vous saurez que SSP est utilisé si vous obtenez une réponse LM qui se termine par une série de zéros. Vous pouvez utiliser le script inclus ntlm-ssp.py pour produire le défi serveur dont assless aura besoin.
Exécutez-le comme ceci :
python3 ntlm-ssp.py <réponse lm> <défi>
Par exemple, si nous utilisons l'exemple de défi-réponse NTLMv1-SSP provenant des exemples de hachages hashcat :
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
Vous passeriez le LM et le défi comme ceci :
python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c
Et obtiendriez la réponse suivante :
Le défi serveur est : 724edf24aea0d68b
Qui peut ensuite être craqué avec assless-chaps comme d'habitude :
./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db