
BitCracker è il primo strumento di cracking delle password open source per unità di memoria crittografate con BitLocker
BitCracker è il primo strumento open source per il cracking delle password per dispositivi di archiviazione (Hard Disk, Pendrive USB, scheda SD, ecc...) cifrati con BitLocker, una funzionalità di crittografia disponibile su Windows Vista, 7, 8.1 e 10 (edizioni Ultimate, Pro e Enterprise). BitLocker offre diversi metodi di autenticazione per cifrare un dispositivo di archiviazione, come Trusted Platform Module (TPM), Smart Card, Password di ripristino, Password fornita dall'utente.
Tramite un attacco a dizionario, BitCracker cerca di trovare la corretta Password Utente o Password di Ripristino per decifrare il dispositivo di archiviazione cifrato. È stato implementato in CUDA e OpenCL.
Diverse riviste hanno ritardato la pubblicazione del nostro articolo su BitCracker (quasi 3 anni, con rifiuto finale dopo diverse revisioni), che spiega i dettagli del nostro attacco, il formato del volume BitLocker Drive Encryption (BDE) e le possibili debolezze nella procedura di crittografia/decifratura. Alla fine, abbiamo pubblicato l'articolo qui: https://arxiv.org/abs/1901.01337 . Sentitevi liberi di commentare e condividere.
Per eseguire BitCracker-CUDA, i requisiti minimi sono:
Per eseguire BitCracker-OpenCL, i requisiti minimi sono qualsiasi GPU o CPU che supporti OpenCL (puoi trovare aiuto qui.
BitCracker richiede almeno 260 MB di memoria del dispositivo.
Consigliamo vivamente di eseguire l'attacco su una GPU piuttosto che su una CPU per motivi di prestazioni (vedi sezione Prestazioni).
Eseguendo lo script build.sh vengono generati 4 eseguibili nella directory build: bitcracker_hash, bitcracker_rpgen, bitcracker_cuda, bitcracker_opencl.
Per compilare bitcracker_cuda in modo coerente con la tua GPU NVIDIA e la versione CUDA, devi modificare il file src_CUDA/Makefile scegliendo la corretta versione SM. Come riferimento, puoi usare la seguente tabella:
Devi creare l'immagine del tuo dispositivo di archiviazione cifrato con BitLocker usando, ad esempio, il comando dd:
sudo dd if=/dev/disk2 of=/path/to/imageEncrypted.img conv=noerror,sync
4030464+0 record in
4030464+0 record out
2063597568 byte trasferiti in 292.749849 sec (7049013 byte/sec)
Poi devi eseguire l'eseguibile bitcracker_hash sulla tua imageEncrypted.img per:
Se l'esecuzione viene completata correttamente, bitcracker_hash produce 1 o 2 file di output:
I volumi cifrati BDE possono avere formati diversi a seconda dei diversi metodi di autenticazione. Se bitcracker_hash non riesce a trovare la Password di Ripristino sulla tua immagine cifrata, apri un issue o contattami
Un esempio:
/build/bitcracker_hash -o test_hash -i ./Images/imgWin7
---------> BitCracker Hash Extractor <---------
Apertura file ./Images/imgWin7
....
Firma trovata a 0x02208000
Versione: 2 (Windows 7 o successivo)
Voce VMK trovata a 0x022080bc
VMK cifrato con password utente trovato!
VMK cifrato con AES-CCM
Voce VMK trovata a 0x0220819c
VMK cifrato con chiave di ripristino trovato!
VMK cifrato con AES-CCM
Hash password utente:
$bitlocker$0$16$89a5bad722db4a729d3c7b9ee8e76a29$1048576$12$304a4ac192a2cf0103000000$60$24de9a6128e8f8ffb97ac72d21de40f63dbc44acf101e68ac0f7e52ecb1be4a8ee30ca1e69fbe98400707ba3977d5f09b14e388c885f312edc5c85c2
Hash chiave di ripristino:
$bitlocker$2$16$8b7be4f7802275ffbdad3766c7f7fa4a$1048576$12$304a4ac192a2cf0106000000$60$6e72f6ef6ba688e72211b8cf8cc722affd308882965dc195f85614846f5eb7d9037d4d63bcc1d6e904f0030cf2e3a95b3e1067447b089b7467f86688
File di output per attacco password utente: "hash_user_pass.txt"
File di output per attacco password di ripristino: "hash_recv_pass.txt"
Puoi usare questo tipo di attacco se il dispositivo di archiviazione è stato cifrato con una password fornita dall'utente come mostrato nell'immagine seguente.
BitCracker esegue un attacco a dizionario, quindi devi fornire una wordlist di possibili password utente.
Per avviare l'attacco hai bisogno:
hash_user_pass.txtUn esempio da riga di comando:
./build/bitcracker_cuda -f hash_user_pass.txt -d wordlist.txt -t 1 -b 1 -g 0 -u
Dove:
-f : percorso del file hash_user_pass.txt-d : percorso della tua wordlist-t : numero di password processate da ogni thread CUDA-b : numero di blocchi CUDA-g : ID del dispositivo GPU NVIDIA-u : specifica che vuoi un attacco password utentePer tutte le opzioni disponibili, digita ./build/bitcracker_cuda -h.
Per ottenere le migliori prestazioni, fai riferimento alla tabella nella sezione Prestazioni per impostare correttamente le opzioni t e b in base alla tua GPU NVIDIA.
Le stesse considerazioni valgono per l'eseguibile bitcracker_opencl.
Un esempio di output:
====================================
Dispositivo selezionato: GPU Tesla K80 (ID: 0)
====================================
....
Lettura file hash "hash_user_pass.txt"
$bitlocker$0$16$0a8b9d0655d3900e9f67280adc27b5d7$1048576$12$b0599ad6c6a1cf0103000000$60$c16658f54140b3d90be6de9e03b1fe90033a2c7df7127bcd16cb013cf778c12072142c484c9c291a496fc0ebd8c21c33b595a9c1587acfc6d8bb9663
====================================
Attacco
====================================
Tipo di attacco: Password Utente
Thread CUDA: 1024
Blocchi CUDA: 1
Password per thread: 1
Max Password per kernel: 1024
Dizionario: wordlist.txt
Controllo rigoroso (-s): No
Confronto MAC (-m): No
Esecuzione kernel CUDA:
Stream 0
Numero effettivo di password: 12
Intervallo password:
abcdefshhf
.....
blablalbalbalbla12
Tempo: 28.651947 sec
Password al secondo: 0.42 pw/sec
================================================
....
Password trovata: paperino
================================================
Attualmente BitCracker è in grado di elaborare password in input con una lunghezza compresa tra 8 e 55 caratteri.
Durante la crittografia di un dispositivo di archiviazione (indipendentemente dal metodo di autenticazione), BitLocker chiede all'utente di memorizzare da qualche parte una Password di Ripristino che può essere utilizzata per ripristinare l'accesso al dispositivo di archiviazione cifrato nel caso in cui non sia possibile sbloccare l'unità normalmente. Pertanto la Password di Ripristino è una sorta di passe-partout per tutti i metodi di autenticazione ed è composta da una chiave di 48 cifre come questa:
236808-089419-192665-495704-618299-073414-538373-542366
Vedi documentazione Microsoft per ulteriori dettagli.
Come per la password utente, BitCracker è in grado di eseguire un attacco a dizionario per trovare la corretta Password di Ripristino generata da BitLocker per crittografare il dispositivo di archiviazione. Si prega di notare che attualmente siamo in grado di attaccare la Password di Ripristino solo se il dispositivo di archiviazione non è stato crittografato con il TPM.
Per avviare l'attacco hai bisogno:
hash_recv_pass.txtGenerare e memorizzare tutte le possibili password è un problema difficile. Per questo motivo, abbiamo creato un generatore di Password di Ripristino chiamato bitcracker_rpgen. Con questo strumento puoi creare un insieme di wordlist di Password di Ripristino da utilizzare per i tuoi attacchi. Ad esempio:
./build/bitcracker_rpgen -n 300 -p 10000000 -s 000000-000011-000022-000033-000044-000055-008459-015180
Questo genera:
-n : numero di wordlist-p : numero di Password di Ripristino per wordlist-s : genera Password di Ripristino a partire da questaPuoi usare la configurazione predefinita eseguendo senza opzioni:
./build/bitcracker_rpgen
************* BitCracker Recovery Password wordlists generator *************
Esecuzione con questa configurazione:
### Crea 100 wordlist
### Password di ripristino per wordlist=5000000
### Consenti duplicati=No
### Genera a partire da=000000-000011-000022-000033-000044-000055-000066-000077
Creazione wordlist "bitcracker_wlrp_0.txt" con 5000000 password
Prima password=000000-000011-000022-000033-000044-000055-000066-000077
Ultima password= 000000-000011-000022-000033-000044-000055-000902-217822
...
Nota che l'opzione -s può essere utilizzata per riavviare la generazione dall'ultima Password di Ripristino generata (invece di ricominciare sempre da quella iniziale).
L'opzione -d abilita la possibilità di avere duplicati nella stessa Password di Ripristino. Ad esempio:
000000-000011-000055-000055-000044-000055-000902-217822
Per tutte le opzioni disponibili, digita ./build/bitcracker_rpgen -h.
NOTA: Si prega di notare che la quantità di possibili Password di Ripristino è enorme:
recovery password = 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536
Secondo la nostra ricerca, la distribuzione delle password è uniforme e non c'è modo di trovare numeri "più probabili". Finora non abbiamo trovato una regola per ridurre la quantità di possibili candidati. Ciò significa che l'attacco alla Password di Ripristino potrebbe durare per sempre (l'attacco alla Password Utente è sempre preferito). Presto modificheremo lo strumento bitcracker_rpgen per generare Password di Ripristino in modo casuale piuttosto che in sequenza ordinata.
Un esempio da riga di comando:
./build/bitcracker_cuda -f hash_recv_pass.txt -d bitcracker_wlrp_0.txt -t 1 -b 1 -g 0 -r
Dove le opzioni sono le stesse del caso Password Utente ma invece di -u devi specificare -r. Un esempio di output:
====================================
Dispositivo selezionato: GPU Tesla K80 (ID: 0)
====================================
...
Lettura file hash "hash_recv_pass.txt"
$bitlocker$2$16$432dd19f37dd413a88552225628c8ae5$1048576$12$a0da3fc75f6cd30106000000$60$3e57c68216ef3d2b8139fdb0ec74254bdf453e688401e89b41cae7c250739a8b36edd4fe86a597b5823cf3e0f41c98f623b528960a4bee00c42131ef
====================================
Attacco
====================================
Tipo di attacco: Password di Ripristino
Thread CUDA: 1024
Blocchi CUDA: 1
Password per thread: 8
Max Password per kernel: 8192
Dizionario: wordlist.txt
Controllo rigoroso (-s): No
Confronto MAC (-m): No
Esecuzione kernel CUDA:
Password effettive: 6014
Intervallo password:
390775-218680-136708-700645-433191-416240-153241-612216
.....
090134-625383-540826-613283-563497-710369-160182-661364
Tempo: 193.358937 sec
Password al secondo: 31.10 pw/sec
================================================
Attacco CUDA completato
Password valutate: 6014
Password trovata: 111683-110022-683298-209352-468105-648483-571252-334455
================================================
Per impostazione predefinita, BitCracker esegue un attacco veloce (per entrambe le modalità Password Utente e di Ripristino) che potrebbe restituire alcuni falsi positivi. In questo caso puoi rieseguire l'attacco con l'opzione -m che abilita la verifica MAC (soluzione più lenta).
Per testare BitCracker sul tuo sistema prima di iniziare l'attacco reale, abbiamo fornito diverse immagini di dispositivi di archiviazione cifrati.
Puoi attaccare queste immagini con entrambe le modalità Password Utente e di Ripristino, utilizzando le wordlist memorizzate nella cartella Dictionary.
Qui riportiamo le migliori prestazioni di BitCracker in caso di attacco veloce (predefinito) alla Password Utente (opzione -u).
Prestazioni:
N.B. Ogni password richiede circa 2.097.152 SHA-256
Abbiamo rilasciato BitCracker come formato OpenCL-BitLocker in John The Ripper (--format=bitlocker-opencl).
I file hash generati da bitcracker_hash (vedi sezione Come fare) sono completamente compatibili con il formato John.
Sulla GTV100 il tasso di password è di circa 3150 p/s. Il team di JtR ha sviluppato la versione CPU di questo attacco (--format=bitlocker); su una CPU Intel(R) Xeon(R) v4 2.20GHz, il tasso di password è di circa 78 p/s.
Questo è un lavoro in corso...
Nov 2021: Codice aggiornato per funzionare su GPU NVIDIA Ampere utilizzando CUDA 11.x
Per favore condividete e testate il nostro progetto: abbiamo bisogno del vostro feedback!
Un ringraziamento speciale al team di John The Ripper, ai progetti Dislocker e LibBDE.
Questo è un progetto di ricerca in collaborazione con il Consiglio Nazionale delle Ricerche d'Italia rilasciato sotto licenza GPLv2.
Copyright (C) 2013-2021 Elena Ago (elena dot ago at gmail dot com) e Massimo Bernaschi (massimo dot bernaschi at gmail dot com)
Forniremo alcune informazioni aggiuntive sull'attacco di BitCracker in un futuro articolo.
Sebbene utilizziamo la licenza GPLv2, siamo aperti a collaborazioni. Per qualsiasi informazione aggiuntiva, collaborazioni o segnalazione di bug, contattateci o aprite un issue.
| Architettura GPU | CUDA suggerita | 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 |
| Acronimo GPU | GPU | Arch | CC | # SM | Clock | 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 | - | - | - | - | - |
| Versione | GPU | -t | -b | Password per kernel | Password/sec | Hash/sec |
|---|
| 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 |