05 febrero 2013


En Septiembre de 2012, Alejandro Ramos publicaba un interesante post en el que exponía qué tipos de ataque se podían realizar contra una cuenta o número de cuentas de WhatsApp, en el caso de conocer la contraseña de acceso a las mismas.

Para ello, Alejandro mostraba la implementación que había realizado la aplicación WhatsApp en Android y Iphone para la generación de las contraseñas en dichos dispositivos.

Meses más tarde, el siempre genial Pablo San Emeterio publicó otro post aquí en SBD, mostrando su propia implementación de dichos ataques, incluyendo otro nuevo. Espía Whatsapp.

Estos y otros artículos, unidos al eco que se generó en las numerosas Webs más generalistas, obligó a Whatsapp a sacar una actualización de su software, seguido de una actualización en la API de autenticación y registro.

A partir de la versión 2.8.6, la contraseña se genera desde el lado del Servidor y no desde el cliente, tal y como se puede ver en la siguiente imagen:


Imagen 1.- Proceso de autenticación y registro en WhatsApp. API V2

El proceso de registro aparenta ser similar que en la versión 1 de la API, salvo que ya no se envía la dirección MAC (Iphone) en el campo ID de la petición. En ésta, el dato que se envía como parámetro, se utiliza para la negociación de una clave que vendrá como respuesta a la petición, tal y como se puede comprobar en la siguiente imagen:


Imagen 2.- Password generada desde el lado del servidor y enviada al dispositivo

El proceso de registro y autenticación, lo repetí varias veces, para comprobar que en el campo ID se enviaba siempre el mismo identificador, y se devolvía una contraseña diferente.

Una vez enviada la petición de registro, el proceso de respuesta corresponde con un fichero en formato JSON, el cual lleva una serie de campos en el que se incluye el número de teléfono y la contraseña asociada a ese número. Esta contraseña es la que se utilizará a partir de ese momento para poder autenticarse en el sistema.

De momento, Whatsapp mantenía cierta compatibilidad hacia atrás con aplicaciones antiguas, pero después de hablar con Pablo San Emeterio y realizar algunas pruebas con aplicaciones antiguas, todo parece indicar que Whatsapp está obligando a todos sus usuarios a actualizar a la versión 2 de la API.

¿Quiere decir esto que ya no se podrán realizar los ataques anteriores?

La respuesta es NO queridos lectores de SBD. Siempre nos quedará el análisis forense!

En sistemas IOS, la contraseña generada por el servidor se almacena en un fichero cifrado llamado PW.DAT, el cual se encuentra ubicado en la ruta /Library/pw.dat. 

Dejando a un lado la cuestión de por qué Whatsapp no cifra la base de datos ChatStorage.sqlite o la base de datos Contacts.sqlite en Iphone, y después de meditar largo y tendido la inquietante cuestión de que la empresa Whatsapp Inc, con más de 8 millones de dólares de inyección de capital no cuente entre sus filas con personal dedicado exclusivamente a la seguridad,  me topé con un fichero un tanto curioso y que en más de un análisis forense me ha dado unos resultados excepcionales. Una inocente base de datos llamada cache.db.

Así que analizando la base de datos cache.db, la cual se encuentra ubicada en el directorio /Library/Caches/net.whatsapp.WhatsApp/Cache.db me encuentro con que ésta, almacena datos sensibles.

Datos tan curiosos como la descarga de ficheros de audio, vídeo y fotografías que un usuario ha descargado, así como su TimeStamp.



Imagen 3.- Ficheros descargados a través de la aplicación WhatsApp

Pero los datos que más me han llamado la atención se encuentran en una tabla llamada cfurl_cache_receiver_data. Uno de estos datos es la contraseña que se genera cuando se registra la cuenta de usuario en el servicio de WhatsApp, y sí. Se almacena en claro. Estos datos se pueden visualizar en la siguiente imagen:


Imagen 4.- Fichero de respuesta JSON almacenado en claro en base de datos cache.db

Gracias a este dato, unido a que hace relativamente poco tiempo que se ha actualizado la API no oficial de Whatsapp llamada YOWSUP, se hace posible de nuevo todos los ataques anteriores, pero con la versión 2 de la API oficial.

Estos ataques son todavía posibles, debido a que aunque dos identificadores no pueden estar conectados al unísono, sí que se pueden realizar envíos de mensajes desde ubicaciones distintas mientras un usuario se encuentre autenticado en el sistema. 



Imagen 5.- Suplantación realizada a través de YOWSUP



Imagen 6.- Recepción de mensajes suplantados


Salu2 a tod@s!

MVP Enterprise Security

19 comments :

asdasd dijo...

Hay un teléfono no censurado en la última imagen

Eduard Blasi dijo...

¡Buen estudio! Por lo que respecta al número de teléfono de la última imagen, mencionar que un número de teléfono móvil sin más, no es considerado un dato de carácter personal.

Vid Informe Jurídico de la AEPD 0575/2008

"(...) el número de teléfono móvil por si mismo, esto es, sin el concurso de otros datos que contribuyan a identificar a su propietario, no tiene el carácter de dato personal, en consecuencia, la aplicación de las prescripciones contenidas en la LOPD vendrá determinada por la asociación de dicho número con otros datos que permitan establecer la identidad de su titular"


Saludos

Calario dijo...

Un número de teléfono es un dato público (por eso se llama "numeración pública"). Es como escribir "Calle Mayor 13 de Pamplona" o "José Pérez García". El problema están en la vinculación entre esos datos: "José Pérez García vive en la calle Mayor 13 de Pamplona y su teléfono es el 611736143".

mkk dijo...

entonces para robarte el whatsapp, solo hay que coger tu numero que esta en la imagen 6 y usar la pass de la imagen 2 ¿no?

silverhack dijo...

#mkk

Exacto mkk. Veo que te has leído enterito el post.
Espero que lo intentes e intentes robarme la cuenta :P

jose dijo...

ya pero ahora no es posible espiar en directo, dos dispositivos no pueden conectarse a la vez, o estoy equivocado

silverhack dijo...

Jose, así es.
En mi caso, las pruebas que he realizado me han dado negativo en la parte de mantener dos dispositivos conectados a la vez

jose dijo...

Tambien estoy viendo que cada vez que estas autenticado desde el pc te modifica la contraseña cuando te conectas desde el movil no siendo posible volver a entrar desde el pc pasado un periodo de tiempo..

Enjutilo dijo...

Saludos, soy pardillo en el tema pero sigo tu blog (y algo pillo). No es sobre este tema pero te agradecería que, si puedes, dediques un post sobre como controlar los puertos en windows (tengo el jurasico-vista) y evitar todas las castañas en tema de seguridad que estamos recibiendo los usurios normales. ESTO ES HORRIBLE, infección tras infecció. Solo encuentro consejos y nada de software sencillo para auditoriar mi PC. GRACIAS ANTICIPADAS.

wiredrat dijo...

O como decir que "Juan Garrido tiene de numero +34 611 XX XX XX"?

jose dijo...

Aparte es bastante mas seguro porque ahora la manera de acceder a la contraseña es bastante mas complicada, ya que tienes que acceder conectando el movil al ordenador, la unica manera no fisica seria un virus que te copiara la contraseña.

silverhack dijo...

Exacto, pero si envías mensajes SÓLO con el PC, no te modifica la password. La password sólo la modifica en el momento en que quieras PERMANECER conectado. Ahí sí que Whatsapp genera una especie de asociación, des-asociando tu teléfono.

Alejandro Amo dijo...

toma castaña!
cuantos golpes le hemos dado ya a whatsapp?
esperemos que reaccionen

cos dijo...

donde bajo el codigo de la api 2 para probar ya que la api 1 de alejandro nunca me funciono

Ha3 dijo...

se te ve el número de móvil en la captura 6 :P

Felipe Jarenau dijo...

Enhorabuena por la investigación, es muy interesante, Juan :-)

De todas formas IMHO, creo que la criticidad de este tema es muchísimo menor que con las versiones anteriores a la API 2.0. Es decir, considero muy rebuscado que se pueda hacer una suplantación de identidad de cualquier víctima a pie de calle. No voy dejando a desconocidos que me conecten mi móvil a su ordenador y ejecuten programas de forense así cada día.

En comparación con el uso del IMEI o la MAC como contraseña de autenticación es bastante más complicado este vector de ataque. Con lo anterior siempre podías poner tu AP en cualquier sitio público con tu portal cautivo y dar Internet a los paseantes a cambio de su nº de teléfono e IMEI o pedirle a alguien su teléfono e IMEI a cambio de la promesa de liberarle el móvil remótamente (http://www.google.com/#q=libero+movil+por+imei).

De todas formas, siempre es muy bueno conocer estos vectores.
Gran post.

Alejandro dijo...

A eso venía yo, a indicar que ese número está al público. A ver si pasa como a la Paula Vazquez :P

s0kkk dijo...

buenas!!! no soy capaz de sacar el pw ni desde la tabla cfurl_cache_receiver_data ni en el momento de registro con un web proxy
A ver si alguna alma caritativa me puede guiar.....

ALEXA dijo...

por favor alguien puede ayudarme, no se nada de esto, pero la ultima linea telefonica que utilicé y que estaba asociada a whatsapp ya no la tengo, no era mia y su propietario me permitió utilizarla durante un buen tiempo, en este momento le he devuelto la linea telefonica (es decir, le devolví su sim card) sin antes eliminar esa cuenta, el tema es que nuestras relaciones en este momento se encuentran rotas, como puedo entonces eliminar esa linea de whatsapp si no tengo el sim card??? Necesito con premura me indiquen la forma, ya he enviado mensajes desde mi nueva linea a mis contactos pidiendo me borren de su lista de contactos, pero hay personas que por flojera no lo hacen y mi amigo ahora utiliza esa linea y en su foto de perfil coloca fotos mias, lo cual hace que mis contactos se confundan y escriban alli. QUISIERA DESAFILIAR ESA LINEA DEL SERVIDOR WHATS APP O COMO QUIERA QUE SE LE DIGA... AGRADECERIA MUCHISIMO UNA RESPUESTA CLARA, PORQUE COMO VERÁN SOY BASICA EN ESTO DE WHATS APP.