Bitcracker: la primera herramienta opensource para crackear volúmenes cifrados con BitLocker

BitCracker es la primera herramienta open source para crackear dispositivos de almacenamiento (discos duros, pendrives USB, tarjetas SD, etc.) cifrados con BitLocker, ya sabéis, una función de cifrado disponible en Windows Vista, 7, 8.1 y 10 (Ultimate, Pro y Enterprise).

BitLocker ofrece varios métodos de autenticación diferentes para cifrar un dispositivo de almacenamiento como Trusted Platform Module (TPM), tarjeta inteligente, contraseña de recuperación o contraseña proporcionada por el usuario. Mediante un ataque de diccionario, BitCracker intenta encontrar la contraseña de usuario o la contraseña de recuperación correctas para descifrar el dispositivo de almacenamiento cifrado. Se ha implementado en CUDA y OpenCL.

Requisitos

Para ejecutar BitCracker-CUDA, los requisitos mínimos son:

- una GPU NVIDIA con CC 3.5 o posterior
- CUDA 7.5 o posterior

Para ejecutar BitCracker-OpenCL, los requisitos mínimos son cualquier GPU o CPU que admita OpenCL.

BitCracker requiere al menos 260 MB de memoria del dispositivo.

Se recomienda encarecidamente ejecutar su ataque en una GPU en lugar de CPU por razones de rendimiento.

Instalación

La ejecución del script build.sh genera 4 archivos ejecutables dentro del directorio build: bitcracker_hash, bitcracker_rpgen, bitcracker_cuda, bitcracker_opencl.

Para crear bitcracker_cuda de forma coherente con nuestra GPU NVIDIA y la versión de CUDA que tengamos debemos modificar src_CUDA/Makefile y elegir la versión SM correcta. Como referencia, se puede utilizar la siguiente tabla:

GPU Architecture Suggested CUDA 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

Preparando el ataque

Para probar podemos crear una imagen de un dispositivo de almacenamiento cifrado con BitLocker, por ejemplo con el comando dd:
sudo dd if=/dev/disk2 of=/path/to/imageEncrypted.img conv=noerror,sync
4030464+0 records in
4030464+0 records out
2063597568 bytes transferred in 292.749849 secs (7049013 bytes/sec)

Luego debemos ejecutar bitcracker_hash contra imageEncrypted.img para:

- comprobar si la imagen tiene un formato válido y puede ser atacada por BitCracker
- comprobar si el hash del dispositivo de almacenamiento original se ha cifrado con una contraseña de usuario o una contraseña de recuperación
- extraer el hash describiendo la imagen

Si la ejecución se completa correctamente, bitcracker_hash produce 1 o 2 archivos de salida:

- hash_user_pass.txt: si el dispositivo fue cifrado con una contraseña de usuario, este archivo contiene el hash que se necesita para iniciar el modo de ataque de contraseña de usuario.
- hash_recv_pass.txt: el hash que se necesita para iniciar el modo de ataque de Contraseña de recuperación

Un ejemplo:
/build/bitcracker_hash -o test_hash -i ./Images/imgWin7

---------> BitCracker Hash Extractor <---------
Opening file ./Images/imgWin7

....

Signature found at 0x02208000
Version: 2 (Windows 7 or later)

VMK entry found at 0x022080bc
VMK encrypted with user password found!
VMK encrypted with AES-CCM

VMK entry found at 0x0220819c
VMK encrypted with Recovery key found!
VMK encrypted with AES-CCM

User Password hash:
$bitlocker$0$16$89a5bad722db4a729d3c7b9ee8e76a29$1048576$12$304a4ac192a2cf0103000000$60$24de9a6128e8f8ffb97ac72d21de40f63dbc44acf101e68ac0f7e52ecb1be4a8ee30ca1e69fbe98400707ba3977d5f09b14e388c885f312edc5c85c2

Recovery Key hash:
$bitlocker$2$16$8b7be4f7802275ffbdad3766c7f7fa4a$1048576$12$304a4ac192a2cf0106000000$60$6e72f6ef6ba688e72211b8cf8cc722affd308882965dc195f85614846f5eb7d9037d4d63bcc1d6e904f0030cf2e3a95b3e1067447b089b7467f86688

Output file for user password attack: "hash_user_pass.txt"
Output file for recovery password attack: "hash_recv_pass.txt"

Ataque a la password de usuario

Se puede usar este tipo de ataque si el dispositivo de almacenamiento se ha cifrado con una contraseña proporcionada por el usuario, como se muestra en la siguiente imagen.


BitCracker realiza un ataque de diccionario, por lo que se debe proporcionar una lista de palabras de posibles contraseñas de usuario.

Para iniciar el ataque necesitamos:

- el archivo hash_user_pass.txt
. diccionario/lista de palabras de posibles contraseñas de usuario (debemos proporcionársela)

Un ejemplo del comando:

./build/bitcracker_cuda -f hash_user_pass.txt -d wordlist.txt -t 1 -b 1 -g 0 -u

Dónde:

-f: ruta al archivo hash_user_pass.txt
-d: ruta al diccionario
-t: número de contraseñas procesadas por cada hilo CUDA
-b: número de bloques CUDA
-g: ID de dispositivo NVIDIA GPU
-u: especifica que se desea un ataque de contraseña de usuario

Para ver todas las opciones disponibles, podemos ejecutar ./build/bitcracker_cuda -h. Para obtener el mejor rendimiento, consulta las siguientes tablas de rendimiento para configurar correctamente las opciones t y b de acuerdo con nuestra GPU NVIDIA:

GPU Acronim 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 - - - - -

Version GPU -t -b Passwords x kernel Passwords/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

Se pueden aplicar las mismas consideraciones para el ejecutable bitcracker_opencl.

Un ejemplo de salida:
====================================
Selected device: GPU Tesla K80 (ID: 0)
====================================
....
Reading hash file "hash_user_pass.txt"
$bitlocker$0$16$0a8b9d0655d3900e9f67280adc27b5d7$1048576$12$b0599ad6c6a1cf0103000000$60$c16658f54140b3d90be6de9e03b1fe90033a2c7df7127bcd16cb013cf778c12072142c484c9c291a496fc0ebd8c21c33b595a9c1587acfc6d8bb9663

====================================
Attack
====================================

Type of attack: User Password
CUDA Threads: 1024
CUDA Blocks: 1
Psw per thread: 1
Max Psw per kernel: 1024
Dictionary: wordlist.txt
Strict Check (-s): No
MAC Comparison (-m): No

CUDA Kernel execution:
    Stream 0
    Effective number psw: 12
    Passwords Range:
        abcdefshhf
        .....
        blablalbalbalbla12
    Time: 28.651947 sec
    Passwords x second:     0.42 pw/sec

================================================
....
Password found: paperino
================================================

Actualmente, BitCracker puede procesar contraseñas de entrada con una longitud de entre 8 y 55 caracteres.

Ataque contra la contraseña de recuperación

Durante el cifrado de un dispositivo de almacenamiento, (independientemente del método de autenticación), BitLocker le pide al usuario que guarde en algún lugar una Contraseña de recuperación que se pueda usar para restaurar el acceso al dispositivo de almacenamiento cifrado en caso de que no pueda desbloquear la unidad. Por lo tanto, la contraseña de recuperación es un tipo de bypass para todos los métodos de autenticación y consiste en una clave de 48 dígitos como esta:

236808-089419-192665-495704-618299-073414-538373-542366

Ver documentos de Microsoft para más detalle.

Al igual que con la contraseña del usuario, BitCracker puede realizar un ataque de diccionario para encontrar la contraseña de recuperación correcta generada por BitLocker para cifrar el dispositivo de almacenamiento. Tened en cuenta que actualmente solo podemos atacar la contraseña de recuperación si el dispositivo de almacenamiento no se ha cifrado con el TPM.

Para iniciar el ataque necesitamos:

- el archivo hash_recv_pass.txt
- diccionario/una lista de palabras de posibles contraseñas de recuperación

Generar y almacenar todas las contraseñas posibles es un problema difícil. Por esta razón, creamos un generador de contraseña de recuperación llamado bitcracker_rpgen. Con esta herramienta se pueden crear un montón de listas de palabras de contraseñas de recuperación que podemos usar para nuestros ataques. Como ejemplo:

./build/bitcracker_rpgen -n 300 -p 10000000 -s 000000-000011-000022-000033-000044-000055-008459-015180

Esto genera:

-n: número de listas de palabras
-p: número de contraseñas de recuperación por lista de palabras
-s: generar contraseñas de recuperación a partir de este

Puede utilizar la configuración predeterminada ejecutándose sin opciones:

./build/bitcracker_rpgen

************* BitCracker Recovery Password wordlists generator *************

Running with this configuration:
### Create 100 wordlists
### Recovery Passwords per wordlist=5000000
### Allow duplicates=No
### Generate starting from=000000-000011-000022-000033-000044-000055-000066-000077

Creating wordlist "bitcracker_wlrp_0.txt" with 5000000 passwords
First password=000000-000011-000022-000033-000044-000055-000066-000077
Last password= 000000-000011-000022-000033-000044-000055-000902-217822

Ten en cuenta que con la opción -s se puede reiniciar a partir de su última Contraseña de recuperación generada (en lugar de reiniciar cada vez que se inicia desde la primera). La opción -d permite la posibilidad de tener duplicados en la misma contraseña de recuperación. Por ejemplo: 000000-000011-000055-000055-000044-000055-000902-217822

Para ver todas las opciones disponibles ejecuta ./build/bitcracker_rpgen -h.

NOTA: ten en cuenta que la cantidad de posibles contraseñas de recuperación es enorme:

recovery password = 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536

Según a la investigación de los autores de la herramienta, la distribución de contraseñas es uniforme y no hay manera de encontrar números "más probables". Hasta ahora, no han encontrado una regla para reducir la cantidad de posibles candidatos. Esto significa que el ataque de Contraseña de recuperación podría durar una eternidad (el ataque de Usuario Passwod es siempre preferible). Pronto se modificará la herramienta bitcracker_rpgen para generar la contraseña de recuperación de una manera aleatoria en lugar de en una secuencia ordenada.

Un ejemplo del comando:

./build/bitcracker_cuda -f hash_recv_pass.txt -d bitcracker_wlrp_0.txt -t 1 -b 1 -g 0 -r

Donde las opciones son las mismas que en el caso de la Contraseña de usuario pero en lugar de -u, debe especificar -r. Un ejemplo de salida:
====================================
Selected device: GPU Tesla K80 (ID: 0)
====================================

...
Reading hash file "hash_recv_pass.txt"
$bitlocker$2$16$432dd19f37dd413a88552225628c8ae5$1048576$12$a0da3fc75f6cd30106000000$60$3e57c68216ef3d2b8139fdb0ec74254bdf453e688401e89b41cae7c250739a8b36edd4fe86a597b5823cf3e0f41c98f623b528960a4bee00c42131ef


====================================
Attack
====================================

Type of attack: Recovery Password
CUDA Threads: 1024
CUDA Blocks: 1
Psw per thread: 8
Max Psw per kernel: 8192
Dictionary: wordlist.txt
Strict Check (-s): No
MAC Comparison (-m): No

CUDA Kernel execution:
    Effective passwords: 6014
    Passwords Range:
        390775-218680-136708-700645-433191-416240-153241-612216
        .....
        090134-625383-540826-613283-563497-710369-160182-661364
    Time: 193.358937 sec
    Passwords x second:    31.10 pw/sec


================================================
CUDA attack completed
Passwords evaluated: 6014
Password found: 111683-110022-683298-209352-468105-648483-571252-334455
================================================

Falsos positivos

Por defecto BitCracker realiza un ataque rápido (para los modos de contraseña de Usuario y Recuperación) que puede devolver algún falso positivo. En este caso, se puede volver a ejecutar su ataque con la opción -m que habilita la verificación MAC (solución más lenta).

Ejemplos

Para probar BitCracker antes de iniciar el ataque real, en el repositorio github han subido varias imágenes de dispositivos de almacenamiento cifrados.

- imgWin7: BitLocker en un sistema operativo Windows 7 Enteprise edition
- imgWin8: BitLocker en un sistema operativo Windows 8 Enteprise edition
- imgWin10Compat.vhd: BitLocker (modo compatible) en un sistema operativo Windows 10 Pro edition
- imgWin10NotCompat.vhd: BitLocker (modo no compatible) en un sistema operativo Windows 10 Pro edition
- imgWin10NotCompatLongPsw.vhd: BitLocker (modo no compatible) en un sistema operativo Windows 10 Pro edition con una contraseña de usuario más larga

Podemos atacar esas imágenes con los modos de contraseña de Usuario y Recuperación, usando las listas de palabras almacenadas en la carpeta Dictionary.

John the Ripper

En John The Ripper ya podemos encontrar el formato OpenCL-BitLocker (--format = bitlocker-opencl). Los archivos hash generados por bitcracker_hash son totalmente compatibles con el formato de John.
La ratio de passwords en GTV100 es de aproximadamente 3150p/s, en una CPU Intel(R)Xeon(R)v4 2.20GHz, el ratio es de aproximadamente 78p/s. Se está trabajando también para que funcione con Hashcat.

Repositorio: https://github.com/e-ago/bitcracker

Comentarios