WhatsApp es criticada muchas veces por su seguridad y le tocará arrastrar mala fama como ha ocurrido con otras aplicaciones o sistemas operativos. Lógico, teniendo en cuenta la cantidad de métodos que existen para espiarlo.
Hace 3 años Yago publicaba en este mismo blog uno de los primeros estudios con fallos muy críticos. Desde entonces hasta ahora han ido apareciendo numerosas noticias y otros problemas sin parar. WhatsApp está de moda y por ello, también en el ojo del huracán.
Sin ir más lejos, esta misma semana muchos medios de comunicación se han hecho eco de la entrada de un blog que decía que se podían robar conversaciones mediante una aplicación falsa (?) que leyese la tarjeta de memoria SD y mandase los archivos por Internet. ¿Perdón? Esto es algo sabido desde hace años y usado por malware. Nada que no apareciese incluso por aquí. Además afecta a todo Android y no solo a este cliente de mensajería. Hasta mi propio LG tiene una aplicación que hace backup de todo el terminal en la memoria SD y también es susceptible de ser robado. Y eso significa TODOS los datos de mi móvil.
Pero muchos de los problemas de WhatsApp no son tan tremendos, no más que los que hay en otros protocolos como por ejemplo el del correo electrónico, que históricamente se ha transmitido en texto plano, que también permite falsificar al emisor y que no garantiza la integridad del mensaje. Claro, el correo-e no está de moda, ni sale ya en las noticias por ser parte de ventas y compras de miles de millones de euros.
Yo uso whatsapp y también uso el correo electrónico ¿y? Lo increíble de whatsapp no es su seguridad, ni la falta de ella. Lo realmente impresionante es como han conseguido escalar su arquitectura con unas decenas de empleados, con millones de usuarios más que otras redes sociales y sin apenas incidentes de disponibilidad. Eso sí que es hacking.
Volviendo al tema. Desde la última actualización (2.11.152), WhatsApp ha cambiado el algoritmo y la clave para cifrar las copias de seguridad en las SD. No es que la hayan mejorado sustancialmente, pero ha cambiado y el viejo método ha dejado de funcionar para los nuevos archivos con extensión "crypt5".
Esta vez el mérito de obtener las claves para descifrar este formato se lo ha llevado el autor de una aplicación de estadísticas: Chat Statitics for WhatsApp. y aunque no ha publicado los datos, si ha facilitado la tarea para que otros la obtengan de su propia herramienta.
Una vez comprada la aplicación y diseccionada, si observamos su contenido, rápidamente se ven los métodos para cifrar y descifrar las bases de datos de la copia de seguridad.
dex2jar, jd-gui, etc. |
[root@digitalsec aramosf]# readelf -a libaes.so | grep FUNC 1: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_finalize 2: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit 3: 00000000 0 FUNC GLOBAL DEFAULT UND __stack_chk_fail 4: 00000740 1225 FUNC GLOBAL DEFAULT 7 AES_decrypt 5: 00001470 574 FUNC GLOBAL DEFAULT 7 CRYPTO_cbc128_decrypt 7: 000016b0 1218 FUNC GLOBAL DEFAULT 7 private_AES_set_encrypt_k 8: 00001b80 605 FUNC GLOBAL DEFAULT 7 private_AES_set_decrypt_k 9: 00001de0 1249 FUNC GLOBAL DEFAULT 7 AES_encrypt 10: 000022d0 46 FUNC GLOBAL DEFAULT 7 MD5_Init 11: 00002300 258 FUNC GLOBAL DEFAULT 7 MD5_Update 12: 00000000 0 FUNC GLOBAL DEFAULT UND memcpy 13: 00002410 429 FUNC GLOBAL DEFAULT 7 MD5_Final 14: 00000000 0 FUNC GLOBAL DEFAULT UND memset 15: 000025c0 2570 FUNC GLOBAL DEFAULT 7 Java_de_tiflo_whatsapp_st 16: 00000000 0 FUNC GLOBAL DEFAULT UND strlen 17: 00000000 0 FUNC GLOBAL DEFAULT UND fopen 18: 00000000 0 FUNC GLOBAL DEFAULT UND malloc 19: 00000000 0 FUNC GLOBAL DEFAULT UND fseek 20: 00000000 0 FUNC GLOBAL DEFAULT UND ftell 21: 00000000 0 FUNC GLOBAL DEFAULT UND fwrite 22: 00000000 0 FUNC GLOBAL DEFAULT UND fread 23: 00000000 0 FUNC GLOBAL DEFAULT UND free 24: 00000000 0 FUNC GLOBAL DEFAULT UND fclose
Analizando más lentamente estas funciones se obtienen las claves necesarias. En esta parte he tenido la suerte de contar con la ayuda de Mario Ballano que le ha puesto luz a parte del código donde yo me perdía y en la que hace falta jugar con el md5.
Tras un rato hemos descubierto que la función "CRYPTO_cbc128_decrypt" parecía una trampa, ya que el algoritmo usado realmente es: aes-cbc-192. Al final de la mañana hemos terminado el proceso con un script para descifrarlas automáticamente.
No hemos puesto la bandera, ya que el autor de Chat Statitics ya conocía este método, pero por lo menos, si lo hemos liberado para que lo use todo el mundo con sus herramientas y como no, ya está implementado en la recuperación de mensajes eliminados de http://www.recovermessages.com.
El script en cuestión ya está en mi github y requiere que se conozca el nombre de la cuenta asociada al móvil, que se puede sacar de Ajustes->Cuentas y sincronización->Google
Para usarlo es tan sencillo como invocarlo así:
- python pwncrypt5.py msgstore.db.crypt5 grbnz0@gmail.com > msgstore.sdb
Y finalizo con el codiciado código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #!/usr/bin/python """ 48bits presents: 8===============================================D~~~ WhatsApp msgstore crypt5 decryptor by grbnz0 and nullsub 8===============================================D~~~ """ import sys import hashlib import StringIO from M2Crypto import EVP key = bytearray([141, 75, 21, 92, 201, 255, 129, 229, 203, 246, 250, 120, 25, 54, 106, 62, 198, 33, 166, 86, 65, 108, 215, 147]) iv = bytearray([0x1E,0x39,0xF3,0x69,0xE9,0xD,0xB3,0x3A,0xA7,0x3B,0x44, 0x2B,0xBB,0xB6,0xB0,0xB9]) def decrypt(db,acc): fh = file(db,'rb') edb = fh.read() fh.close() m = hashlib.md5() m.update(acc) md5 = bytearray(m.digest()) for i in xrange(24): key[i] ^= md5[i&0xF] cipher = EVP.Cipher('aes_192_cbc', key=key, iv=iv, op=0) sys.stdout.write(cipher.update(edb)) sys.stdout.write(cipher.final()) if __name__ == '__main__': if len(sys.argv) != 3: print 'usage %s <db> <accountname> > decrypted.db' % sys.argv[0] else: decrypt(sys.argv[1],sys.argv[2]) |
A todos los que tenéis problemas y lo quereis hacer de una forma más sencilla y rápida, os recomiendo que uséis directamente la página web: http://www.recovermessages.com que además de descifrar el fichero os mostrará los mensajes eliminados.
28 comments :
Anda que habéis tardado poco en buscarle las cosquillas! xD
Muy buen trabajo!
buenas, lo primero dar las gracias por la explicación pero probando el script, invoncandolo como comentáis, da un error de html en la linea 6.
Un saludo
Hablo siempre de descargando el archivo py y escribiendo la sentencia que comentais.
Gracias
Genial, como siempre. Y se agradece unas palabras a favor de Whatsapp, cuando la mayoría de críticas vienen simplemente por moda.
File "pwncrypt5.py", line 6
^
SyntaxError: invalid syntax
Te ha faltado meterte con un protocolo aun mas antiguo de mensajería que tambien funciona en texto plano: IRC.
Pero las cosas evolucionan, e igual que entonces se criticaron dichos protocolos y se intentaron mejorar, lo mismo se ha de hacer ahora con los mas modernos.
Que no te quito nada de razón, simplemente creo que en este caso, la comparación con tecnologías mas antiguas carece de valor. A mi juicio eh, que no soy el portador de la verdad.
Si es cierto que hay cierto "resquemon" por whatsapp, pero en parte es comprensible. Sus noticias se hacen mas eco debido a su gran numero de usuarios. Por no hablar de que molestó mucho, el que no solucionaran sus primeros problemas de seguridad hasta que no empezaron a salir aplicaciones similares intentado hacerle frente, dandose como publicidad se mas seguros.
No creo que la aplicación que te genera backups sea segura, pero tampoco me atrevería a decir insegura. Los moviles tienen una memoria interna limitada (la menos insegura que tiene) y en funcion de que tienes instalado puede caber o no en ella. Si hay un fallo es mas bien del usuario, por llevar un backup de un terminal, en ese terminal con conectividad a la red. Por no hablar de que Google ya está barajando la posibilidad de obligar que las aplicaciones trabajen siempre con la memoria interna para evitar este tipo de problemas.
Quitando estas asperezas genial el artículo.
Completamente de acuerdo contigo.
Que WhatsApp va absolutamente en texto plano es falso también. Otra cosa es que tenga fallos el cifrado. Pero también los ha tenido HTTPS.
Al final, añadirán una capa más de cifrado y cuatro cosas más y callarán todas las bocas de un día para otro. Sin más.
En cuanto a lo que comentas de Android, pues efectivamente, los motivos son claros, además de que las memorias son limitadas tener el backup en el mismo teléfono tampoco tiene mucho sentido, ya que si se formatea/brickea o lo que sea, perderás los datos. Si está en la SD no. El siguiente paso es la nube, tal y como hace Apple con iCloud.
Gracias y nos alegra que te haya gustado.
Hola. Me sale un error en la linea 32. Invalid syntax. Alguien sabe que pasa. Gracias y saludos. Cujo54.
soy un total inexperto en el tema, me gustaria aprender donde es que ejecuto ese script, para poder desencriptar una base de datos..disculpen mi ignorancia al respecto, pero estoy muy interesado en aprender..
Disculpa pero una vez realizado el proceso, al consultar la bd desde Sqlite Expert da un error "DATABASE DISK IMAGE MALFORMED"
¿Y si no hay cuenta de gmail asociada al dispositivo?
y para iphone?
Asumiendo que el código que aquí se comparte sea correcto, voy a asumir tambien que la clave que has usado para desencriptarla no es la correcta.
Me da error para ejecutar el Código :S No sé programar en python pero lo tengo instalado. Por qué me da syntax error al poner lo que dice el post? Quería comprobarlo con mi propia cuenta
como puedo desencriptarlo?? no tengo ni idea :( 644045679 whatsapp
Tal vez estás usando Python 3.X en vez de 2.X,
Usa Python 2.X en vez de 3.X
Me gustaria ver mis conversaciones en el ordenador, como solia hacer, pero no entiendo muy bien como se hace. ¿Alguien me lo puede explicar?
Como hago para recuperar una conversacion de WA que inicie en noviembre y fui borrando de a poco? Es muy importante, muchisimas gracias.
Chicos! Tremendo aporte, solo quería consultaros una correción en la invocación del comando.
"Para usarlo es tan sencillo como invocarlo así:
- python pwncrypt5.py grbnz0@gmail.com msgstore.db.crypt5 > msgstore.sdb"
Primero no iría el nombre del archivo encriptado, y luego ya la cuenta? Porque si no, si os fijáis en vuestro script, primero va la variable y luego ya la cuenta
Si lo invoco como habéis escrito, dará un error por pantalla de no such file or directory.
Os paso el sencillo script en bat que me he currado para vosotros cracks! :D
@ECHO OFF
set path=%~dp0;%pythonpath%;%path%
@ECHO ON
python pwncrypt5.py msgstore.db.crypt5 nombredetucuenta@gmail.com > msgstore.sdb
pause
Saludos!
Yo también tengo errores, estoy usando versión 2.7
seria:
python pwncrypt5.py msgstore.db.crypt5 correo > msgstore.sdb
Me ayudas a recuperar una conversacion muy importante? te dejo mi mail. Podrias decirme paso a paso como es? muchas gracias. mati_nico_cba2007@hotmail.com
kikorazon@hotmail.com es ees mi email alguien me puede ayudar a desencritpar??? gracias
Utiliza @gmail.com ou não? Quando rodo mostra M2Crypto.EVP.EVPERROR:bad decrypt. Alguém pode ajudar? E qual aplicativo utilizado para abrir o .sdb?
donde metéis ese código en Python? pero en donde exactamente porfa agradecería informacion
Hola
he intendado desencriptar mis conversaciones y me da un error en la linea 13
al dar el comando como indicais me da el siguiente error
Traceback :
File "pwncrypt5.py", line 13, in
from M2Crypto import EVP
ImportError: No module named M2Crypto
Alguien me puede hechar una mano.
Gracias por anticipado.
Un saludo a todos.
al invocar la linea para llamar el scrypt me sale sintax error, me podrias brindar ayuda para eso?
Publicar un comentario