Fuerza bruta al cifrado de VirtualBox – vboxDieCracker-py

Buenas a todos!! Hoy vengo a traeros un script en el que hace tiempo estuvimos trabajando nuestro compañero Marcos en una investigación conjunta (y con conjunta quiero decir que intenté seguirle el ritmo!!). Se trata de un script que nos servirá para realizar un ataque de fuerza bruta contra una máquina de Virtual Box  que esté cifrada mediante el mecanismo estándar del mismo.

Lo primero, por supuesto, es dar reconocimiento a quien realizó la primera versión (original) del script en PHP, el equipo de Seguridad Informática Colombiana (sinfocol). Aquí tenéis la entrada original donde publican el script allá por 2015, y aquí el repositorio de su proyecto.

Sin embargo, tanto Marcos como yo pensamos que tener una versión de Python, tanto por velocidad como por comodidad y facilidad de comprensión (es un lenguaje más extendido entre pentesters e investigadores de ciberseguridad). Y nos pusimos a ello, no sin cierta dificultad, ¡¡que la cripto tiene lo suyo!!

Tenemos publicada la herramienta en mi GitHub: https://github.com/hartek/vboxDieCracker-py

Un vistacillo al fichero .vbox

Con cada máquina virtual de Virtual Box, en el directorio que se encuentra, tenemos un fichero .vbox con los datos y propiedades de la máquina en formato XML. Cuando una máquina está cifrada, aparece unas propiedades dentro del elemento HardDisk llamadas CRYPT/KeyId, que indica que está cifrado, y CRYPT/KeyStore, que contiene una estructura de datos con todo lo necesario para verificar la contraseña introducida por el usuario en el descifrado.

Como dato, estos discos duros virtuales se cifran mediante el algoritmo AES-XTS, que suele utilizarse de manera extendida a la hora de realizar cifrado de soportes de disco. Las contraseñas se derivan y protegen mediante PBKDF2.

Estos datos están organizados en campos de cierta longitud formando la estructura de datos, que posteriormente se pasa directamente de binario a Base64 para poder guardarse de forma legible en el fichero .vbox. Los datos de la estructura pueden verse en la siguiente tabla, que podemos encontrar en la entrada original de sinfocol:

Esta estructura de datos será imprescindible a la hora de atacar por fuerza bruta el cifrado, dado que debemos conocer sus características antes de poder empezar siquiera a intentar el ataque.

¿Qué hace el script?

No soy muy fan de meterme a explicar directamente el código, pero sí de indicar algunas directrices de lo que hace:

  • Primero, pedirá entrada al usuario acerca del fichero .vbox a atacar y el diccionario o wordlist a utilizar para el ataque.
  • Seguidamente, leerá el fichero .vbox extrayendo el Base64 de la configuración del cifrado (si es que lo está). Procesará el campo CRYPT.KeyStore para crear una estructura de datos con estos valores binarios y los muestra.
  • Una vez conseguidas las características del cifrado, lo atacará mediante un fuerza bruta por diccionario (clásico bucle de intentos y comparación con la clave hasheada).
  • Por último, imprime los resultados en pantalla (en caso de haberlos).

Al lío: ejecutando el script

Como ejemplo, hemos creado un par de máquinas virtuales, una de ellas un Xubuntu y otra un Windows 7. Solamente tenemos que tener los ficheros .vbox y que el disco duro de la máquina se haya cifrado (no necesitamos el fichero del disco en sí). De hecho, hemos visto ya más arriba la parte interesante del XML de la primera máquina.

Ejecutaremos el script con la siguiente sintaxis (en el ejemplo utilizo Windows como sistema host, pero puede utilizarse en Linux) contra el fichero de Windows 7:

python vboxdie-cracker.py .\Windows7x64.vbox .\dict.txt

Donde dict.txt puede ser cualquier diccionario. En nuestro caso, lo hemos «cocinado» para hacer una prueba rápida.

Vemos que ha sacado con éxito la contraseña en un tiempo de más o menos 2 segundos y medio. Para que os hagáis una idea, la contraseña estaba en la posición 11 del diccionario. ¿Por qué tan lento? (Os garantizo que va bastante más rápido que en PHP, eso sí).

La razón principal es que se utiliza el algoritmo de derivación de claves PBKDF2, que está diseñado precisamente para ser lento y evitar ataques de fuerza bruta. Qué mal, ¿no? Al menos desde el punto de vista del malo.

Podemos hacer una prueba similar sobre la máquina virtual Xubuntu colocando la contraseña verdadera en la posición 100 del diccionario:

Tarda unos 22 segundos en terminar el ataque. Dependiendo del tiempo que tengamos y de las posibilidades que queramos intentar, puede ser un tiempo asequible o no (por ejemplo si tenemos candidatos concretos fernte a un fuerza bruta puro). O incluso podríamos paralelizar el proceso dividiendo el diccionario, o incluso mediante hil, pero eso da para otra entrada 🙂

Espero que hayáis disfrutado de la entrada de hoy y que le echéis un vistazo al script. Como siempre agradecemos comentarios y sugerencias a nuestros pequeños desarrollos 🙂 Un saludo!!