
BitCracker es la primera herramienta de código abierto para descifrar contraseñas de unidades de memoria cifradas con BitLocker
BitCracker es la primera herramienta de código abierto para descifrar contraseñas de dispositivos de almacenamiento (Disco Duro, Pendrive USB, tarjeta SD, etc...) cifrados con BitLocker, una función de cifrado disponible en Windows Vista, 7, 8.1 y 10 (ediciones Ultimate, Pro y Enterprise). BitLocker ofrece varios métodos de autenticación diferentes para cifrar un dispositivo de almacenamiento, como el Módulo de Plataforma Confiable (TPM), Tarjeta Inteligente, Contraseña de Recuperación, 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 correcta para descifrar el dispositivo de almacenamiento cifrado. Se ha implementado en CUDA y OpenCL.
Varias revistas retrasaron la publicación de nuestro artículo sobre BitCracker (casi 3 años, con rechazo final después de varias revisiones) que explica los detalles de nuestro ataque, el formato de volumen de Cifrado de Unidad BitLocker (BDE) y posibles debilidades en el procedimiento de cifrado/descifrado. Finalmente, publicamos el artículo aquí: https://arxiv.org/abs/1901.01337 . No dudes en comentar y compartir.
Para ejecutar BitCracker-CUDA, los requisitos mínimos son:
Para ejecutar BitCracker-OpenCL, los requisitos mínimos son cualquier GPU o CPU compatible con OpenCL (puedes encontrar ayuda aquí.
BitCracker requiere al menos 260 MB de memoria de dispositivo.
Recomendamos encarecidamente ejecutar el ataque en una GPU en lugar de una CPU por razones de rendimiento (consulta la sección Rendimiento).
Ejecutar el script build.sh genera 4 ejecutables dentro del directorio build: bitcracker_hash, bitcracker_rpgen, bitcracker_cuda, bitcracker_opencl.
Para compilar bitcracker_cuda de manera coherente con tu GPU NVIDIA y versión de CUDA, debes modificar el src_CUDA/Makefile eligiendo la versión SM correcta. Como referencia, puedes usar la siguiente tabla:
Debes crear la imagen de tu dispositivo de almacenamiento cifrado con BitLocker usando, por ejemplo, el comando dd:
sudo dd if=/dev/disk2 of=/path/to/imageEncrypted.img conv=noerror,sync
4030464+0 registros leídos
4030464+0 registros escritos
2063597568 bytes transferidos en 292.749849 segundos (7049013 bytes/seg)
Luego debes ejecutar el ejecutable bitcracker_hash en tu imageEncrypted.img para:
Si la ejecución se completa correctamente, bitcracker_hash produce 1 o 2 archivos de salida:
Los volúmenes cifrados con BDE pueden tener diferentes formatos para diferentes métodos de autenticación. Si bitcracker_hash no puede encontrar la Contraseña de Recuperación en tu imagen cifrada, por favor abre un issue o contáctame
Un ejemplo:
/build/bitcracker_hash -o test_hash -i ./Images/imgWin7
---------> BitCracker Hash Extractor <---------
Abriendo archivo ./Images/imgWin7
....
Firma encontrada en 0x02208000
Versión: 2 (Windows 7 o posterior)
Entrada VMK encontrada en 0x022080bc
¡VMK cifrada con contraseña de usuario encontrada!
VMK cifrada con AES-CCM
Entrada VMK encontrada en 0x0220819c
¡VMK cifrada con clave de recuperación encontrada!
VMK cifrada con AES-CCM
Hash de Contraseña de Usuario:
$bitlocker$0$16$89a5bad722db4a729d3c7b9ee8e76a29$1048576$12$304a4ac192a2cf0103000000$60$24de9a6128e8f8ffb97ac72d21de40f63dbc44acf101e68ac0f7e52ecb1be4a8ee30ca1e69fbe98400707ba3977d5f09b14e388c885f312edc5c85c2
Hash de Clave de Recuperación:
$bitlocker$2$16$8b7be4f7802275ffbdad3766c7f7fa4a$1048576$12$304a4ac192a2cf0106000000$60$6e72f6ef6ba688e72211b8cf8cc722affd308882965dc195f85614846f5eb7d9037d4d63bcc1d6e904f0030cf2e3a95b3e1067447b089b7467f86688
Archivo de salida para ataque de contraseña de usuario: "hash_user_pass.txt"
Archivo de salida para ataque de contraseña de recuperación: "hash_recv_pass.txt"
Puedes usar este tipo de ataque si el dispositivo de almacenamiento ha sido cifrado con una contraseña proporcionada por el usuario, como se muestra en la siguiente imagen.
BitCracker realiza un ataque de diccionario, por lo tanto debes proporcionar una lista de palabras con posibles contraseñas de usuario.
Para iniciar el ataque necesitas:
hash_user_pass.txtUn ejemplo de línea de comandos:
./build/bitcracker_cuda -f hash_user_pass.txt -d wordlist.txt -t 1 -b 1 -g 0 -u
Donde:
-f : ruta al archivo hash_user_pass.txt-d : ruta a tu lista de palabras-t : número de contraseñas procesadas por cada hilo CUDA-b : número de bloques CUDA-g : ID del dispositivo GPU NVIDIA-u : especifica que deseas un ataque de contraseña de usuarioPara todas las opciones disponibles, escribe ./build/bitcracker_cuda -h.
Para obtener el mejor rendimiento, consulta la tabla en la sección Rendimiento para configurar correctamente las opciones t y b según tu GPU NVIDIA.
Se pueden aplicar las mismas consideraciones para el ejecutable bitcracker_opencl.
Un ejemplo de salida:
====================================
Dispositivo seleccionado: GPU Tesla K80 (ID: 0)
====================================
....
Leyendo archivo hash "hash_user_pass.txt"
$bitlocker$0$16$0a8b9d0655d3900e9f67280adc27b5d7$1048576$12$b0599ad6c6a1cf0103000000$60$c16658f54140b3d90be6de9e03b1fe90033a2c7df7127bcd16cb013cf778c12072142c484c9c291a496fc0ebd8c21c33b595a9c1587acfc6d8bb9663
====================================
Ataque
====================================
Tipo de ataque: Contraseña de Usuario
Hilos CUDA: 1024
Bloques CUDA: 1
Contraseñas por hilo: 1
Máx. Contraseñas por kernel: 1024
Diccionario: wordlist.txt
Verificación estricta (-s): No
Comparación MAC (-m): No
Ejecución del kernel CUDA:
Stream 0
Número efectivo de contraseñas: 12
Rango de contraseñas:
abcdefshhf
.....
blablalbalbalbla12
Tiempo: 28.651947 seg
Contraseñas por segundo: 0.42 pw/sec
================================================
....
Contraseña encontrada: paperino
================================================
Actualmente BitCracker es capaz de procesar contraseñas de entrada con una longitud entre 8 y 55 caracteres.
Durante el cifrado de un dispositivo de almacenamiento (independientemente del método de autenticación), BitLocker pide al usuario que guarde en algún lugar una Contraseña de Recuperación que puede usarse para restaurar el acceso al dispositivo de almacenamiento cifrado en caso de que no pueda desbloquear la unidad normalmente. Por lo tanto, la Contraseña de Recuperación es una especie de passe-partout 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
Consulta documentos de Microsoft para más detalles.
Al igual que con la contraseña de 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. Ten en cuenta que actualmente solo podemos atacar la Contraseña de Recuperación si el dispositivo de almacenamiento no ha sido cifrado con TPM.
Para iniciar el ataque necesitas:
hash_recv_pass.txtGenerar y almacenar todas las contraseñas posibles es un problema difícil. Por esta razón, creamos un generador de Contraseñas de Recuperación llamado bitcracker_rpgen. Con esta herramienta puedes crear un conjunto de listas de palabras de Contraseñas de Recuperación para usar en tus 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 comenzando desde estaPuedes usar la configuración predeterminada ejecutándolo sin opciones:
./build/bitcracker_rpgen
************* BitCracker Recovery Password wordlists generator *************
Ejecutando con esta configuración:
### Crear 100 listas de palabras
### Contraseñas de Recuperación por lista de palabras=5000000
### Permitir duplicados=No
### Generar comenzando desde=000000-000011-000022-000033-000044-000055-000066-000077
Creando lista de palabras "bitcracker_wlrp_0.txt" con 5000000 contraseñas
Primera contraseña=000000-000011-000022-000033-000044-000055-000066-000077
Última contraseña= 000000-000011-000022-000033-000044-000055-000902-217822
...
Ten en cuenta que la opción -s puede usarse para reiniciar la generación desde tu última Contraseña de Recuperación generada (en lugar de reiniciar cada vez desde la inicial).
La opción -d habilita la posibilidad de tener duplicados en la misma Contraseña de Recuperación. Por ejemplo:
000000-000011-000055-000055-000044-000055-000902-217822
Para todas las opciones disponibles, escribe ./build/bitcracker_rpgen -h.
NOTA: Ten en cuenta que la cantidad de Contraseñas de Recuperación posibles es enorme:
contraseña de recuperación = 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536
Según nuestra investigación, la distribución de contraseñas es uniforme y no hay forma de encontrar números "más probables". Hasta ahora, no encontramos una regla para reducir la cantidad de posibles candidatos. Esto significa que el ataque de Contraseña de Recuperación podría durar para siempre (el ataque de Contraseña de Usuario es siempre el preferido). Pronto modificaremos la herramienta bitcracker_rpgen para generar Contraseñas de Recuperación de manera aleatoria en lugar de en secuencia ordenada.
Un ejemplo de línea de comandos:
./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 Contraseña de Usuario, pero en lugar de -u debes especificar -r. Un ejemplo de salida:
====================================
Dispositivo seleccionado: GPU Tesla K80 (ID: 0)
====================================
...
Leyendo archivo hash "hash_recv_pass.txt"
$bitlocker$2$16$432dd19f37dd413a88552225628c8ae5$1048576$12$a0da3fc75f6cd30106000000$60$3e57c68216ef3d2b8139fdb0ec74254bdf453e688401e89b41cae7c250739a8b36edd4fe86a597b5823cf3e0f41c98f623b528960a4bee00c42131ef
====================================
Ataque
====================================
Tipo de ataque: Contraseña de Recuperación
Hilos CUDA: 1024
Bloques CUDA: 1
Contraseñas por hilo: 8
Máx. Contraseñas por kernel: 8192
Diccionario: wordlist.txt
Verificación estricta (-s): No
Comparación MAC (-m): No
Ejecución del kernel CUDA:
Contraseñas efectivas: 6014
Rango de contraseñas:
390775-218680-136708-700645-433191-416240-153241-612216
.....
090134-625383-540826-613283-563497-710369-160182-661364
Tiempo: 193.358937 seg
Contraseñas por segundo: 31.10 pw/sec
================================================
Ataque CUDA completado
Contraseñas evaluadas: 6014
Contraseña encontrada: 111683-110022-683298-209352-468105-648483-571252-334455
================================================
Por defecto, BitCracker realiza un ataque rápido (tanto para el modo de Contraseña de Usuario como de Recuperación) que puede devolver algunos falsos positivos. En ese caso, puedes volver a ejecutar tu ataque con la opción -m que habilita la verificación MAC (solución más lenta).
Para probar BitCracker en tu sistema antes de iniciar el ataque real, proporcionamos varias imágenes de dispositivos de almacenamiento cifrados.
Puedes atacar esas imágenes con ambos modos de Contraseña de Usuario y Recuperación, usando las listas de palabras almacenadas en la carpeta Dictionary.
Aquí informamos los mejores rendimientos de BitCracker en caso de ataque rápido (predeterminado) a la Contraseña de Usuario (opción -u).
Rendimiento:
N.B. Cada contraseña requiere alrededor de 2.097.152 SHA-256
Lanzamos BitCracker como el formato OpenCL-BitLocker en John The Ripper (--format=bitlocker-opencl).
Los archivos hash generados por bitcracker_hash (consulta la sección Cómo hacerlo) son completamente compatibles con el formato de John.
En la GTV100, la tasa de contraseñas es de aproximadamente 3150p/s. El equipo de JtR desarrolló la versión para CPU de este ataque (--format=bitlocker); en una CPU Intel(R) Xeon(R) v4 2.20GHz, la tasa de contraseñas es de aproximadamente 78p/s.
Esto es un trabajo en progreso...
Nov 2021: Código actualizado para ejecutarse en GPU NVIDIA Ampere usando CUDA 11.x
¡Por favor comparte y prueba nuestro proyecto: necesitamos tu feedback!
Agradecimientos especiales al equipo de John The Ripper, y a los proyectos Dislocker y LibBDE.
Este es un proyecto de investigación en colaboración con el Consejo Nacional de Investigación de Italia publicado bajo licencia GPLv2.
Copyright (C) 2013-2021 Elena Ago (elena dot ago at gmail dot com) y Massimo Bernaschi (massimo dot bernaschi at gmail dot com)
Proporcionaremos información adicional sobre el ataque de BitCracker en un artículo futuro.
Aunque usamos la licencia GPLv2, estamos abiertos a colaboraciones. Para cualquier información adicional, colaboraciones o reporte de errores, por favor contáctenos o abra un issue.
| Arquitectura GPU | CUDA sugerido | 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 |
| Acrónimo GPU | GPU | Arch | CC | # SM | Reloj | 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 | - | - | - | - | - |
| Versión | GPU | -t | -b | Contraseñas por kernel | Contraseñas/seg | Hash/seg |
|---|
| 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 |