25 noviembre, 2013

Descifrando msgstore.db.crypt de Whatsapp

En sus comienzos, Whatsapp guardaba los ficheros de bases de datos donde se almacenaban las conversaciones que tenemos con el resto de nuestros contactos, en formato SQLite sin cifrar. Es decir, que simplemente con cargarlo en SQLite se podría ver las conversaciones, teléfonos y de más, en texto plano. De modo que en caso de perdida o robo del terminal nos podrían ver las conversaciones de forma muy sencilla.

Hace ya casi año y medio que Whatsapp debido a la inseguridad en estos ficheros y por protección de privacidad para los usuarios; Whatsapp lanzó una actualización en la que corrige este "descuido" encriptando dichos ficheros, dificultando así la simple visualización en plaintext de las conversaciones realizadas.

Este cifrado dificulta la visualización a primera vista, pero no la impide. El cifrado (AES-192-ECB) que utiliza aplicación en los ficheros de backup siempre usa la misma key (346a23652a46392b4d73257c67317e352e3372482177652c), y es lo mismo para todos los dispositivos, es decir, que no se crea nada único por cada dispositivo que tenga instalado Whatsapp.

En el caso de los teléfonos IOS este fichero está en la ruta: [ID de App]/Documents/ChatStorage.sqlite.
En el caso de los teléfonos Android en: ../whatsapp/databases/msgstore.db.crypt.

msgstore.db.crypt (conversaciones actuales).
msgstore-YYYY-MM-DD.X.db.crypt (backups de conversaciones por fechas).

Para descifrar el fichero/s en cuestión de las conversaciones que queramos visualizar. Simplemente tendremos que aplicar el siguiente comando con son sus respectivos argumentos.

Para ello descargamos gratuitamente el binario (en mi caso) para Windows de OpenSSL, la cual es una herramienta que permite cifrar y descifrar ficheros mediante lineas de comandos.

Una vez los instalamos se nos instalará (por defecto) en la carpeta la raíz del sistema (C:\).
Copiamos ahora los ficheros de conversaciones que queramos del origen de Whatsapp a una carpeta cercana a la instalación de OpenSSL (da igual donde estén, aconsejo simplemente por comodidad a la hora de mapear el directorio en el comando).

[1] - Abrimos una consola y nos situamos en el directorio donde está el ejecutable OpenSSL.exe (C:\OpenSSL-Win32\bin).
openssl enc -d  -aes-192-ecb -in copias\msgstore-entrada.db.crypt -out copias\msgstore-salida.db.sqlite -K 346a23652a46392b4d73257c67317e352e3372482177652c
Paso a explicar los argumentos, aunque creo que son claros:
-d: [Decrypt] argumento para empezar a desencriptar.
-aes-192-ecb: El tipo de encriptación del fichero.
-in: [Input] Especificar el fichero de entrada a descifrar (en este caso).
-out: [Output] Especificar el fichero de salida ya descifrado (en este caso).
-k: [Key] es la clave necesaria utiliza por la aplicación.

En el caso de ejemplo que se muestra arriba en la linea de comando, tendríamos que referenciar el mapeado de nuestros ficheros tanto de entrada como de salida, en mi caso ambos estaban en una carpeta dentro de la ubicación de OpenSSL llamadas "copias".

[2] - Una vez tenemos descifrado el fichero, podremos abrirlo simplemente un gestor de SQLite, por ejemplo SQLite Administrator.

Figura 1: Fichero de conversaciones de Whatsapp (ya descifrado) cargado en SQLite (tabla messages)

En SQLite, podremos filtrar por los campos de la tabla messages e ir a un número de teléfono o a un contexto de conversación en concreto, eligiendo correctamente los campos de filtro adecuados.

Saludos!

Fuentes
https://www.os3.nl/_media/2011-2012/students/ssn_project_report.pdf
http://www.securitybydefault.com/2012/05/descifrando-el-fichero-msgstoredbcrypt.html
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
Entradas Relacionadas