
BitCracker est le premier outil open source de craquage de mots de passe pour les unités de stockage chiffrées avec BitLocker.
BitCracker est le premier outil open source de cassage de mots de passe pour les dispositifs de stockage (disque dur, clé USB, carte SD, etc.) chiffrés avec BitLocker, une fonctionnalité de chiffrement disponible sur Windows Vista, 7, 8.1 et 10 (éditions Ultimate, Pro et Entreprise). BitLocker propose plusieurs méthodes d'authentification différentes pour chiffrer un périphérique de stockage, comme Trusted Platform Module (TPM), la carte à puce, le mot de passe de récupération, ou le mot de passe fourni par l'utilisateur.
Au moyen d'une attaque par dictionnaire, BitCracker tente de trouver le mot de passe utilisateur correct ou le mot de passe de récupération pour déchiffrer le périphérique de stockage chiffré. Il a été implémenté en CUDA et OpenCL.
Plusieurs revues ont retardé la publication de notre article BitCracker (près de 3 ans, avec un rejet final après plusieurs révisions) qui explique les détails de notre attaque, le format de volume BitLocker Drive Encryption (BDE) et les faiblesses possibles dans la procédure de chiffrement/déchiffrement. Finalement, nous avons publié l'article ici : https://arxiv.org/abs/1901.01337 . N'hésitez pas à commenter et à partager.
Pour exécuter BitCracker-CUDA, les exigences minimales sont :
Pour exécuter BitCracker-OpenCL, les exigences minimales sont n'importe quel GPU ou CPU prenant en charge OpenCL (vous pouvez trouver de l'aide ici.
BitCracker nécessite au moins 260 Mo de mémoire de périphérique.
Nous recommandons vivement d'exécuter votre attaque sur un GPU plutôt que sur un CPU pour des raisons de performance (voir section Performance).
L'exécution du script build.sh génère 4 exécutables dans le répertoire build : bitcracker_hash, bitcracker_rpgen, bitcracker_cuda, bitcracker_opencl.
Pour compiler bitcracker_cuda de manière cohérente avec votre GPU NVIDIA et votre version de CUDA, vous devez modifier le fichier src_CUDA/Makefile en choisissant la bonne version SM. À titre de référence, vous pouvez utiliser le tableau suivant :
Vous devez créer l'image de votre périphérique de stockage chiffré avec BitLocker en utilisant, par exemple, la commande dd :
sudo dd if=/dev/disk2 of=/chemin/vers/imageChiffree.img conv=noerror,sync
4030464+0 records in
4030464+0 records out
2063597568 bytes transferred in 292.749849 secs (7049013 bytes/sec)
Ensuite, vous devez exécuter le binaire bitcracker_hash sur votre imageChiffree.img afin de :
Si l'exécution se termine correctement, bitcracker_hash produit 1 ou 2 fichiers de sortie :
Les volumes chiffrés BDE peuvent avoir différents formats selon les différentes méthodes d'authentification. Si bitcracker_hash ne parvient pas à trouver le mot de passe de récupération sur votre image chiffrée, veuillez ouvrir un problème ou me contacter.
Un exemple :
/build/bitcracker_hash -o test_hash -i ./Images/imgWin7
---------> BitCracker Hash Extractor <---------
Ouverture du fichier ./Images/imgWin7
....
Signature trouvée à 0x02208000
Version : 2 (Windows 7 ou ultérieur)
Entrée VMK trouvée à 0x022080bc
VMK chiffré avec mot de passe utilisateur trouvé !
VMK chiffré avec AES-CCM
Entrée VMK trouvée à 0x0220819c
VMK chiffré avec clé de récupération trouvé !
VMK chiffré avec AES-CCM
Hachage du mot de passe utilisateur :
$bitlocker$0$16$89a5bad722db4a729d3c7b9ee8e76a29$1048576$12$304a4ac192a2cf0103000000$60$24de9a6128e8f8ffb97ac72d21de40f63dbc44acf101e68ac0f7e52ecb1be4a8ee30ca1e69fbe98400707ba3977d5f09b14e388c885f312edc5c85c2
Hachage de la clé de récupération :
$bitlocker$2$16$8b7be4f7802275ffbdad3766c7f7fa4a$1048576$12$304a4ac192a2cf0106000000$60$6e72f6ef6ba688e72211b8cf8cc722affd308882965dc195f85614846f5eb7d9037d4d63bcc1d6e904f0030cf2e3a95b3e1067447b089b7467f86688
Fichier de sortie pour l'attaque par mot de passe utilisateur : "hash_user_pass.txt"
Fichier de sortie pour l'attaque par mot de passe de récupération : "hash_recv_pass.txt"
Vous pouvez utiliser ce type d'attaque si le périphérique de stockage a été chiffré avec un mot de passe fourni par l'utilisateur, comme illustré dans l'image suivante.
BitCracker effectue une attaque par dictionnaire, vous devez donc fournir une liste de mots de passe utilisateur possibles.
Pour lancer l'attaque, vous avez besoin de :
hash_user_pass.txtUn exemple de ligne de commande :
./build/bitcracker_cuda -f hash_user_pass.txt -d wordlist.txt -t 1 -b 1 -g 0 -u
Où :
-f : chemin vers le fichier hash_user_pass.txt-d : chemin vers votre liste de mots de passe-t : nombre de mots de passe traités par chaque thread CUDA-b : nombre de blocs CUDA-g : ID du périphérique GPU NVIDIA-u : spécifie que vous voulez une attaque par mot de passe utilisateurPour toutes les options disponibles, tapez ./build/bitcracker_cuda -h.
Pour obtenir les meilleures performances, veuillez vous référer au tableau dans la section Performance pour définir correctement les options t et b en fonction de votre GPU NVIDIA.
Les mêmes considérations s'appliquent pour l'exécutable bitcracker_opencl.
Un exemple de sortie :
====================================
Périphérique sélectionné : GPU Tesla K80 (ID : 0)
====================================
....
Lecture du fichier de hachage "hash_user_pass.txt"
$bitlocker$0$16$0a8b9d0655d3900e9f67280adc27b5d7$1048576$12$b0599ad6c6a1cf0103000000$60$c16658f54140b3d90be6de9e03b1fe90033a2c7df7127bcd16cb013cf778c12072142c484c9c291a496fc0ebd8c21c33b595a9c1587acfc6d8bb9663
====================================
Attaque
====================================
Type d'attaque : Mot de passe utilisateur
Threads CUDA : 1024
Blocs CUDA : 1
Mots de passe par thread : 1
Max mots de passe par noyau : 1024
Dictionnaire : wordlist.txt
Vérification stricte (-s) : Non
Comparaison MAC (-m) : Non
Exécution du noyau CUDA :
Flux 0
Nombre effectif de mots de passe : 12
Plage de mots de passe :
abcdefshhf
.....
blablalbalbalbla12
Temps : 28.651947 sec
Mots de passe par seconde : 0.42 pw/sec
================================================
....
Mot de passe trouvé : paperino
================================================
Actuellement, BitCracker est capable de traiter des mots de passe d'entrée d'une longueur comprise entre 8 et 55 caractères.
Lors du chiffrement d'un périphérique de stockage (quelle que soit la méthode d'authentification), BitLocker demande à l'utilisateur de stocker quelque part un mot de passe de récupération qui peut être utilisé pour restaurer l'accès au périphérique de stockage chiffré au cas où il/elle ne pourrait pas déverrouiller le lecteur normalement. Ainsi, le mot de passe de récupération est une sorte de passe-partout pour toutes les méthodes d'authentification et il consiste en une clé de 48 chiffres comme celle-ci :
236808-089419-192665-495704-618299-073414-538373-542366
Voir Documentation Microsoft pour plus de détails.
Comme pour le mot de passe utilisateur, BitCracker est capable d'effectuer une attaque par dictionnaire pour trouver le mot de passe de récupération correct généré par BitLocker pour chiffrer le périphérique de stockage. Veuillez noter qu'actuellement nous ne pouvons attaquer le mot de passe de récupération que si le périphérique de stockage n'a pas été chiffré avec le TPM.
Pour lancer l'attaque, vous avez besoin de :
hash_recv_pass.txtGénérer et stocker tous les mots de passe possibles est un problème difficile. Pour cette raison, nous avons créé un générateur de mots de passe de récupération nommé bitcracker_rpgen. Avec cet outil, vous pouvez créer un ensemble de listes de mots de passe de récupération à utiliser pour vos attaques. Par exemple :
./build/bitcracker_rpgen -n 300 -p 10000000 -s 000000-000011-000022-000033-000044-000055-008459-015180
Cela génère :
-n : nombre de listes de mots de passe-p : nombre de mots de passe de récupération par liste-s : générer les mots de passe de récupération en commençant par celui-ciVous pouvez utiliser la configuration par défaut en l'exécutant sans options :
./build/bitcracker_rpgen
************* BitCracker Recovery Password wordlists generator *************
Exécution avec cette configuration :
### Créer 100 listes de mots de passe
### Mots de passe de récupération par liste = 5000000
### Autoriser les doublons = Non
### Générer à partir de = 000000-000011-000022-000033-000044-000055-000066-000077
Création de la liste "bitcracker_wlrp_0.txt" avec 5000000 mots de passe
Premier mot de passe = 000000-000011-000022-000033-000044-000055-000066-000077
Dernier mot de passe = 000000-000011-000022-000033-000044-000055-000902-217822
...
Notez que l'option -s peut être utilisée pour redémarrer la génération à partir du dernier mot de passe de récupération généré (au lieu de redémarrer à chaque fois depuis le début).
L'option -d active la possibilité d'avoir des doublons dans le même mot de passe de récupération. Par exemple :
000000-000011-000055-000055-000044-000055-000902-217822
Pour toutes les options disponibles, tapez ./build/bitcracker_rpgen -h.
REMARQUE : Veuillez noter que le nombre de mots de passe de récupération possibles est énorme :
recovery password = 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536
Selon nos recherches, la distribution des mots de passe est uniforme et il n'y a aucun moyen de trouver des nombres « plus probables ». Jusqu'à présent, nous n'avons pas trouvé de règle pour réduire le nombre de candidats possibles. Cela signifie que l'attaque par mot de passe de récupération pourrait prendre une éternité (l'attaque par mot de passe utilisateur est toujours la préférée). Bientôt, nous modifierons l'outil bitcracker_rpgen pour générer les mots de passe de récupération de manière aléatoire plutôt qu'en séquence ordonnée.
Un exemple de ligne de commande :
./build/bitcracker_cuda -f hash_recv_pass.txt -d bitcracker_wlrp_0.txt -t 1 -b 1 -g 0 -r
Où les options sont les mêmes que dans le cas du mot de passe utilisateur mais au lieu de -u, vous devez spécifier -r. Un exemple de sortie :
====================================
Périphérique sélectionné : GPU Tesla K80 (ID : 0)
====================================
...
Lecture du fichier de hachage "hash_recv_pass.txt"
$bitlocker$2$16$432dd19f37dd413a88552225628c8ae5$1048576$12$a0da3fc75f6cd30106000000$60$3e57c68216ef3d2b8139fdb0ec74254bdf453e688401e89b41cae7c250739a8b36edd4fe86a597b5823cf3e0f41c98f623b528960a4bee00c42131ef
====================================
Attaque
====================================
Type d'attaque : Mot de passe de récupération
Threads CUDA : 1024
Blocs CUDA : 1
Mots de passe par thread : 8
Max mots de passe par noyau : 8192
Dictionnaire : wordlist.txt
Vérification stricte (-s) : Non
Comparaison MAC (-m) : Non
Exécution du noyau CUDA :
Mots de passe effectifs : 6014
Plage de mots de passe :
390775-218680-136708-700645-433191-416240-153241-612216
.....
090134-625383-540826-613283-563497-710369-160182-661364
Temps : 193.358937 sec
Mots de passe par seconde : 31.10 pw/sec
================================================
Attaque CUDA terminée
Mots de passe évalués : 6014
Mot de passe trouvé : 111683-110022-683298-209352-468105-648483-571252-334455
================================================
Par défaut, BitCracker effectue une attaque rapide (pour les modes mot de passe utilisateur et de récupération) qui peut renvoyer quelques faux positifs. Dans ce cas, vous pouvez relancer votre attaque avec l'option -m qui active la vérification MAC (solution plus lente).
Pour tester BitCracker sur votre système avant de commencer l'attaque réelle, nous avons fourni plusieurs images de périphériques de stockage chiffrés.
Vous pouvez attaquer ces images avec les modes mot de passe utilisateur et de récupération, en utilisant les listes de mots de passe stockées dans le dossier Dictionary.
Nous présentons ici les meilleures performances de BitCracker dans le cas d'une attaque rapide (par défaut) sur le mot de passe utilisateur (option -u).
Performances :
N.B. Chaque mot de passe nécessite environ 2.097.152 SHA-256
Nous avons publié BitCracker en tant que format OpenCL-BitLocker dans John The Ripper (--format=bitlocker-opencl).
Les fichiers de hachage générés par bitcracker_hash (voir section How To) sont entièrement compatibles avec le format John.
Sur le GTV100, le taux de mots de passe est d'environ 3150 p/s. L'équipe JtR a développé la version CPU de cette attaque (--format=bitlocker); sur un CPU Intel(R) Xeon(R) v4 2.20GHz, le taux de mots de passe est d'environ 78 p/s.
Ce travail est en cours...
Nov 2021 : Code mis à jour pour fonctionner sur GPU NVIDIA Ampere avec CUDA 11.x
Partagez et testez notre projet : nous avons besoin de vos retours !
Un grand merci à l'équipe John The Ripper, aux projets Dislocker et LibBDE.
Ceci est un projet de recherche en collaboration avec le Conseil national de la recherche d'Italie, publié sous licence GPLv2.
Copyright (C) 2013-2021 Elena Ago (elena dot ago at gmail dot com) et Massimo Bernaschi (massimo dot bernaschi at gmail dot com)
Nous fournirons des informations supplémentaires sur l'attaque de BitCracker dans un futur article.
Bien que nous utilisions la licence GPLv2, nous sommes ouverts aux collaborations. Pour toute information supplémentaire, collaboration ou rapport de bogue, veuillez nous contacter ou ouvrir un problème.
| Architecture GPU | CUDA suggérée | Makefile |
|---|
| Kepler | CUDA 7.5 | arch=compute_35,code=sm_35 |
| Maxwell | CUDA 8.0 | arch=compute_52,code=sm_52 |
| Pascal | CUDA 9.0 | arch=compute_60,code=sm_60 |
| Volta | CUDA 9.0 | arch=compute_70,code=sm_70 |
| Acronyme GPU | GPU | Arch. | CC | # SM | Fréquence | CUDA |
|---|
| GFT | GeForce Titan | Kepler | 3.5 | 14 | 835 | 7.0 |
| GTK80 | Tesla K80 | Kepler | 3.5 | 13 | 875 | 7.5 |
| GFTX | GeForce Titan X | Maxwell | 5.2 | 24 | 1001 | 7.5 |
| GTP100 | Tesla P100 | Pascal | 6.1 | 56 | 1328 | 8.0 |
| GTV100 | Tesla V100 | Volta | 7.0 | 80 | 1290 | 9.0 |
| AMDM | Radeon Malta | - | - | - | - | - |
| Version | GPU | -t | -b | Mots de passe par noyau | Mots de passe/s | Hachages/s |
|---|
| CUDA | GFT | 8 | 13 | 106.496 | 303 | 635 MH/s |
| CUDA | GTK80 | 8 | 14 | 114.688 | 370 | 775 MH/s |
| CUDA | GFTX | 8 | 24 | 106.608 | 933 | 1.957 MH/s |
| CUDA | GTP100 | 1 | 56 | 57.344 | 1.418 | 2.973 MH/s |
| CUDA | GTV100 | 1 | 80 | 81.920 | 3.252 | 6.820 MH/s |
| OpenCL | AMDM | 32 | 64 | 524.288 | 241 | 505 MH/s |
| OpenCL | GFTX | 8 | 24 | 196.608 | 884 | 1.853 MH/s |