17 marzo 2011

WhatsApp y su seguridad, ¿pwn3d?

La última moda en aplicaciones móviles se llama WhatsApp, una App que cada vez se hace más popular y está redefiniendo el sistema de mensajería SMS. ¿Que qué nos ofrece? Un servicio mucho más completo, mejor y de momento gratuito.

La "pega" es que necesitamos Internet para poder comunicarnos, y que tanto emisores como receptores deben tener la aplicación, la cual funciona por ahora en iPhone, Android, BlackBerry y Nokia Symbian. Por cierto, para los usuarios de iPod Touch hay opción de utilizarla, pero tendrán que descargarla desde sitios alternativos y tener el sistema con Jailbreak, ya que en la AppStore ha desaparecido para ellos.

Pero aquí vamos a hablar de lo que nos gusta de verdad, de seguridad y, en este caso, algo de privacidad. Todas las pruebas que vamos a hacer serán de la versión 2.6.2 (la última a día de hoy) sobre un iPod Touch, en un principio el resultado no debería diferir mucho (nada) aunque cambiemos de plataforma.

Si miramos el tráfico de la red generado por la aplicación lo primero que llama la atención es que el destino del servidor es el puerto 443 (HTTPS), pero todo viaja en claro.

WhatsApp utiliza el protocolo XMPP, una potente tecnología abierta para comunicación en tiempo real.

Como mecanismo de autenticación han optado por SASL DIGEST-MD5, el cual utiliza los siguientes valores para generar el challenge (MD5):

username, password, realm, nonce, cnonce, nc, digest-uri y qop.

Todos menos el nombre de usuario y password son generados por servidor o cliente y se envían en el challenge. El nombre de usuario lo proporciona el cliente y también es enviado, y por último el password también se utiliza para generar el MD5 pero no se envía, ya que es el valor que permite que la autenticación con el servidor sea segura.

Aquí tenemos un ejemplo de challenge ya formado que es enviado por el cliente para finalizar la autenticación:

username="34666666666",
realm="s.whatsapp.net",
nonce="1438536309",
cnonce="E0487DC6-6D1A-4A67-AV70-3299TD89O29A",
nc=00000001,
qop=auth,
digest-uri="xmpp/s.whatsapp.net",
response=b98d50c159a938723d8eb8f3039afab2,
charset=utf-8

Hasta aquí todo bien, pero hay un problema: No recuerdo haber introducido ninguna password para mi cuenta durante la instalación, simplemente vinculé mi teléfono móvil. Entonces, ¿qué se está usando como password en el challenge?

Existen varias posibilidades:

- Está "hardcodeada" en el código fuente, es decir, es la misma para todo el mundo.
- Se genera en base a algún valor único del dispositivo (¿número de serie?).
- Se genera en base al username, que por cierto, es nuestro número de teléfono.
- ...

Buscando en los ficheros de configuración no encontré nada referido a la password, por lo que finalmente decidí hacer mi propia implementación de SASL DIGEST-MD5 (mención especial a este magnífico artículo) y hacer fuerza bruta a la password de un challenge generado por la aplicación.

Probé con varios diccionarios relativamente grandes y con las strings del binario de WhatsApp de iOS. No hubo resultados.

Después de probar todo lo que se me ocurrió sin obtener resultados satisfactorios decidí enviar un email a los desarrolladores con un tono de curiosidad, preguntando por la password que se usaba en la autenticación XMPP. La respuesta fue tan precisa como breve, literalmente:

password is just "password"

Pero, ¿cómo es posible? Si ésa es la password, ¿por qué no ha salido durante la fuerza bruta?

Podemos llegar a dos conclusiones:

- Ésa no es la password, y se están cubriendo las espaldas.
- Su implementación no sigue el estándar y lo han modificado ligeramente por algún motivo.

Si finalmente la password es la misma para todos los usuarios, están siguiendo una filosofía de seguridad por oscuridad que puede ser rota cualquier día. Si alguien obtiene la password que se usa, o consigue implementar el algoritmo para generar el challenge teóricamente podría iniciar sesión en el servicio con la cuenta de cualquiera, sabiendo únicamente su número de teléfono. Sería algo parecido a tener todas las cuentas de usuario sin contraseña.

La solución a ésto pasaría por hacer que el usuario introduzca una contraseña durante la instalación, o utilizar algún valor único del teléfono móvil no predecible como contraseña.

Sólo nos queda esperar a que alguien dé con la llave mágica que lo abrirá todo (si no lo han hecho aún), o que la próxima actualización de WhatsApp introduzca en el modo de autenticación una password de verdad.

Por cierto, para terminar el artículo, ¿he dicho ya que todo el tráfico de la aplicación va en claro? Mensajes, nickname, números de teléfono ...

61 comments :

MR.LOL dijo...

password is just "password" xDDDDD me recuerda a red vs blue

mcklaw dijo...

No se si todas las implementaciones son iguales a nivel de protocolo, a nivel de apliación desde luego no (los usuarios de android tenemos iconitos mientras en iphone no están), pero la intuición dice que debería ser igual.

Aunque con password "password" cualquiera sabe... :P

seifreed.com dijo...

Buenas,

La veradad es que he empezado a usarlo hace poco, y me sorprendió lo de la autenticaión...

Buen artículo ;)

QaSaR dijo...

Cuando instalaste la aplicacion en el iTouch no te pidio un numero, o clave que te mandaron via mensaje? Pq a mi al instalarlo sobre el iPhone4 me mandaron un msg con una clave de 3 digitos, antes de poder usar la aplicacion te pide que introduzcas esa clave. A lo mejor genera algun tipo de "clave" a partir de ID del sistema, la envia al servidor y te devuelve una clave de validación, con ello conseguirian identificadores unicos para cada sistema (aunque crakeables al ser relativos al sistema donde se instala).
Es que me ha llamado la atencion el hecho de que no se use ni identificacion ni nada, lo que podriais probar es instalarlo sobre un Iphone/Android/Blackberry y ver qué contenido envia al servidor durante la instalación y qué proceso de validación ejecuta para la validacion del Código que te envian. Sin mas, muchas gracias por el articulo pues creo que es MUY interesante, ya que es una app largamente extendida.

Q.

Anónimo dijo...

Alucintante, la lista de contactos efectivamente sale en plano como los mensajes.

Me da que la agencia de proteccion de datos no va a dar palmas con las orejas cuando se entere :)

vierito5 dijo...

Muy buen artículo Alberto :)

David Arcos dijo...

Un par de cosas más:

- el username debería ser el número de teléfono, ¿no? En tal caso, los ataques por fuerza bruta son triviales (solo hay que probar del 600 000 000 al 699 999 999)

- se echa de manos que mencionéis la privacidad. ¡No hay ninguna! Basta con añadir un número a la agenda, y Whatsapp te permite ver su estado, aunque él no te tenga añadido.
Tengo una anécdota sobre una persona que se deshace de un número, la operadora se lo asigna a otra persona, y Whatsapp provocó una situación confusa.

Alberto Ortega dijo...

Gracias a todos por los comentarios!

@QaSaR
Vinculé mi teléfono móvil (real) con el iPod, y efectivamente llegó el mensaje con los digitos. También pensé que esa podría ser la password, pero ya no tenía el mensaje para probar.
Habría sido interesante capturar esa negociación con el servidor, quizás habría arrojado algo de luz.
Por cierto, recuerdo que la clave no era especialmente compleja, si esa fuera la password se podría programar un crackeador de esa clave en el challenge que lo sacara en muy poco tiempo. :)

@David Arcos
Si, en un principio no sé cual sería el objetivo, aunque se me ocurre hacerse con todas las cuentas existentes haciendo la fuerza bruta de números para probar cuales están dados de alta :)

Sursum Corda dijo...

Es impresionante!!! Hace algo más de un mes instalé la famosa aplicación en una BB, y me llamó la atención el tema de la pass. Incluso lo comenté con un compañero, pero no lo dí mayor importancia...

Algo curioso de WhatsUp también es que quedas perpetuamente registrado...

Un saludo.

QaSaR dijo...

@Alberto Ortega

No, no, yo aun guardo el msg, y la verdad es una clave de 3 numeros... una cosa de miedo de complicada jajajajaja y yo como idea, totalmente propia y descabellada imagino que:
instalas
recoje info del dispositivo, IDs, numero, etc... lo manda al servidor, este manda el codigo al numero y espera la autentificacion desde la aplicacion con ese codigo cutre para validar la clave coincide con la aplicacion/equipo instalado. Asi el servidor obtiene los valores de la maquina hace lo que sea (tan simple como hasharlo X numero de veces) y obtiene la clave. La aplicacion hace lo mismo por su cuenta y ya tienes la clave/pass para que por detras ella se autentifique... pero mientras escribo me doy cuenta que eso requiere que CADA VEZ la este negociando con el server (ya sea para chatear, como al conectarse en cada sesion) y creo que eso no lo hace... asi k yo mismo me desmonto jajajajajajaja no se... es que sino no entiendo para que sirve ese codigo de 3 numeros que SOLO usas al instalar la aplicacion (en diferentes dispositivos, misma sesion/usuario si reinstalas y pones el mismo codigo)

Q.

Pablo dijo...

Increible! SMS spoofing al alcance de todos.

rusty73 dijo...

A ver, yo estuve haciendo muchas pruebas a whatsapp y sometiendole a diversas putaditas, todo lo hice sobre un telefono android. El resultado de mi analisis es el siguiente.

- Cuando te registras, se manda un codigo en sms que se debe utilizar para "algo" dentro del protocolo interno.

- NO TODO EL TRAFICO ESTÁ EN CLARO. En el primer empiece o cuando se refrescan los numeros de telefono, toda la agenda se manda, sí, pero cifrada (creo recordar por ssl)

- No soporta muy bien que digamos el reenvio de tramas IP. Entre el telefono y el servidor siempre hay una conexion activa que va a un determinado puerto, si se le putea mucho (reenvio de tramas TCP para ver si podiamos enviar mensajes, cambiar estados o cosas así) se queda durante unos minutos agilipollao el movil y al cabo de un rato se vuelve a reconectar a otra ip diferente.

- El cabroncete no funciona si se le configura un proxie al movil (por lo menos antes)

- Si se decompila el codigo... es un poco un jaleo pero algo se puede sacar.

Recomendación. Solo usalo en 3G, ya que en wifi pueden ver tu num de telefono y con el que estas hablando sin mas que un simple snifeo de red.

QaSaR dijo...

Gracias rusty! interesante aporte, que confirma un poco lo que ya me sospechaba... A mi en determinadas WiFis no me funciona (supongo que tema de puertos) pero no hice la prueba de snifearlo en ksa.
Lo que me preocupa es haber descubierto que los mensajes salen en claro... omfg =)

dudux dijo...

Creo recordar que la verificacion de la cuenta con el numero de movil ,era un pin de 4 digitos numericos y no 3 como dicen anteriormente......

Muy interesante,voy a probar analizar el trafico a ver que sale.

rusty73 dijo...

en android, el codigo no he contado cuantos numeros son, pero te aseguro que son mas de 10

PpWicho dijo...

Yo coincido con lo del pass de 3 digitos que te mandan, pues si lo instalas en otro dispositivo, el servicio deja de funcionar en el anterior.

antonio1475 dijo...

Pues en Android es un número de 19 dígitos. Pero al recibirlo se hace sólo y te dice que lo borres, no como en iOS que tienes que mirarlo y escribirlo.

¿Sistemas de autentificacion diferentes, al menos al principio?

Alberto Ortega dijo...

Por los comentarios parece que, efectivamente, el método de autenticación puede ser diferente.

Ya no tengo el código de verificación, pero recuerdo que el de iOS no pasaba de 5 caracteres.

Skye dijo...

Hola!

Hace tiempo le eché un ojo y me llamo la atención una cosa( y no sé si seguira así, lo mire el año pasado)

El servidor, al comienzo, le dice al cliente que soporta digest md5 y plain y es el cliente el que se decanta por digest md5. Se me ocurrió entonces que si hacemos MITM se puede modificar al vuelo el banner del server para que el cliente reciba solo "plain" como único metodo permitido. Sí todo cuela y el cliente puede usar plain...pues se debería sacar la pass.

No sé, nunca lo probé. ¿Alguno de vosotros lo ha hecho?

Un saludo.

Alejandro dijo...

Lo que te está diciendo es que la password es exactamente una 'password', algo secreto, una palabra que no te van a revelar. Tiene toda la pinta de estar hardcodeada.

Omar dijo...

Yo recuerdo que en las Blackberrys cuando lo instalabas por primera vez se mandaba un SMS y te regresaban uno con una serie de 3 o 4 números, supongo que el sistema toma esos como clave... En iPhone no recuerdo que haga eso, pero en Blackberry si.
Saludos

gallir dijo...

Al menos en Android, cuando te registras envía un SMS con una clave de 19 dígitos. Lo debe leer y usar eso como password.

Esto es el que recibí yo (cambié los 15 dígitos centrales por la x).

WhatsApp 32xxxxxxxxxxxxxxx71 WhatsApp internal use - safe to discard

Javier Ortega Conde (Malkavian) dijo...

Madre mía, tras leer este post no tengo 17 sino 20 razones por las que whatsapp es una alternativa peor a Google-talk, chat de Facebook o correo push. Aunque tendré que revisar alguna...

Javier Ortega Conde (Malkavian dijo...

Madre mía, tras leer este post no tengo 17 sino 20 razones por las que whatsapp es una alternativa peor a Google-talk, chat de Facebook o correo push. Aunque tendré que revisar alguna...

Skye dijo...

Hola!

Hace tiempo le eché un ojo y me llamo la atención una cosa( y no sé si seguira así, lo mire el año pasado)

El servidor, al comienzo, le dice al cliente que soporta digest md5 y plain y es el cliente el que se decanta por digest md5. Se me ocurrió entonces que si hacemos MITM se puede modificar al vuelo el banner del server para que el cliente reciba solo "plain" como único metodo permitido. Sí todo cuela y el cliente puede usar plain...pues se debería sacar la pass.

No sé, nunca lo probé. ¿Alguno de vosotros lo ha hecho?

Un saludo.

antonio1475 dijo...

Pues en Android es un número de 19 dígitos. Pero al recibirlo se hace sólo y te dice que lo borres, no como en iOS que tienes que mirarlo y escribirlo.

¿Sistemas de autentificacion diferentes, al menos al principio?

Ezequiel_delfranco dijo...

hola buen dia cuando voy a instalar el whatsapp me pide un codigo llamo y me lo dice es de 3 digitos y cuando lo pongo en mi telefono me dice q no es valido

Edmond2040 dijo...

perdonad, intento instalar esta aplicacion en la blackberry pero me pide username y password...y no se donde mirarlos o como obtenerlos. me podeis ayudar por favor?

Jorge Duarte dijo...

Seguramente usen como password el propio SMS que envían al usuario para confirmar su identidad, ¿no sería eso lógico?

Invitado dijo...

Me interesa saber que has sniffeado el trafico, "Paros"?

Gracias

J J Padron dijo...

 Buenas chicos/as, saliendonos un poco de esto y hablando de la seguridad en el telefono, dentro de la carpeta Databases estan todas las conversaciones en .db (android), las borradas inclusive

Como lo ven??

ANONIMO dijo...

Lo cierto es que no existe seguridad.
por lo visto alguien se ha encargado de SNIFAR mi whatsapp, y tengo pruebas fehacientes de ello.
Lo se porque detalles que solo salen de mi movil dirijido a  un nickname de mi lista de usuarios whatsapp, me los acaban de decir al detalle, Hora, mensaje, y hasta el nickname.
Por supuesto que me mosquea  y creo que trerminaré en los juzgados.
Pero a saber quien coño es!!!!
Lo que no estoy seguero si lo hacen solo cuando estoy conectado via wifi   o en todo momento

Gmandu dijo...

Cuando instalas la aplicación te pide el no de teléfono y manda un SMS con una cadena de caractéres aparentemente generada aleatoriamente, despues de recibir la cadena la aplicación comienza a funcionar, probablemente es la contraseña que estas buscando. Saludos. 

Granlatigo dijo...

 Justo iba a decir que la clave del "password" seguramente reside en un código aleatorio que el programa envía via datos, y confirma vía mensaje a tu número, pero ya estaba dicho..

mozart dijo...

el segundo punto ha sido lo que me acaba de pasar :)

PhoBos dijo...

Pues ten cuidado donde te conectas, tienes los sintomas de haberte conectado en una zona wifi en abierto tipo centro comercial.

Sdfsdf dijo...

vaya lammers los de security by default

Isabelí dijo...

Holaa... tengo el BB8350i, instalé el Whatsapp y resulta que me pide un código de voz, marco y me dan el código en inglés; anoto el código y me dice que es incorrecto, lo he intentado varias veces y sé que sólo deben ser tres códigos... y no quiere... ¿qué puedo hacer? Gracias!

Barak Ben-Hamu dijo...

Hola, seguro ya se te ocurrio pero porque no decompilas la aplicación y le echas un ojo?

Invitado dijo...

El password es o bien el UDID del dispositivo o el MD5 del UDID. No tengo un iPhone con Whatsapp para verificar cuál de los dos.

Chanchinator dijo...

como puedo ver los mensajes borrados, en el sqlite manager salen los borrados?¿?, me interesa mucho estoy, llevo varios dias persiguiendo esta informacion, si sabes algo por favor ponte en contacto conmigo, chanchinator@hotmail.com. Gracias.

invitado dijo...

y como se accede a ellas?
lo sabes?
Gracias

invitado dijo...

por cierto, sé q alguien está mirando mis mensajes.
Como podría detenerlo? es decir hay alguna forma de q no los vea?

invitado dijo...

alguien sabe como puedo impedir q alguien q está leyendo mis mensajes, deje de hacerlo? es decir con algún código o algo parecido.

invitado dijo...

Has averiguado como lo hacen. A mi me está pasando eso y quiero q no puedan meterse más en mis mensajes.
Sabes como se hace?

Basimualdave dijo...

no se puede poner una contra al whatsapp?

Esenia81 dijo...

Hola , necesito vuestra ayuda !!! me robaron el telefono hace 3 semanas y estan utilizando mi whastaap , les mandan mensajes a todos mis contactos , de k forma lo podria blokear? ,os explico:
Yo me hecho de nuevo mi duplicado de tarjeta , porlotanto ellos no pueden llamar ni escribir sms , pero si utilizar el whatsaap , a dia de hoy sigo manteniendo el mismo Nº de telf pero no tengo ningun movil con internet , cuando vuelta a tener un movil con conexion podre bajarme sin problemas esta ampliacion? o como ya esta asignada a mi numero y esta bajada en el movil k me robaron ya no podre de nuevo? en finnnn k estoy hecha un lio y k no entiendo como pueden utilizar mis contactos ....... ayudarme please yo pa esto soy muy nulaaaaaa

pepe dijo...

Me gustaria saber como poder saber las conversaciones de otro movil que no es el mio desde el ordenador. con el SQLliteManager se puede? como se hace? gracias por vuestra ayuda

Alex dijo...

Hola, gracias por la aportación. Si bajo el código fuente puedo ejecutar el programa bajo GNU/Linux?, en caso afirmativo, cómo?

Nanuwifi dijo...

hola a tod@s me pide el numero de tarjeta correspondiente gracias

Moises48dr dijo...

DIOS LES BENDIGA: CONSIDERO SUMAMENTE INTERESANTE.

Marichuy_600 dijo...

me llego un codigo a mi cel y la verdad nose para que sirve

david dijo...

ola tngo 1 duda mi celular dice que el numero ya se a estado intentado varias veces y no puedo dar de alta whatsapp

Javier Ortega Conde dijo...

Esta mierda de noticia reciente (en la cual veréis un comentario mío) está
saliendo en muchos medios (vía nota de prensa de EuropaPress): 
http://www.cincodias.com/articulo/tecnologia/fallo-seguridad-hace-publicas-conversaciones-whatsapp/20120511cdscdstec_1/

sycho dijo...

Creo haber leido que la contraseña es el imei al revés

Security By Default dijo...

Si. Ahora ya es bien sabida

El 22/08/2012, a las 20:30, Disqus escribió:
[image: DISQUS]

ARQUI dijo...

Tengo un problema...me estan chantajeando con unas conversaciones privadas que he tenido con un contacto wasap, a la otra persona tambien la chantajean, de hecho nos han asegurado que las tienen impresas...¿que podemos hacer? ¿podria entablar acciones legales?¿como puedo obtener pruebas?¿Es tan facil violar tu intimidad en wasap? ¿como puedo ponerme en contacto con los creadores del programa? ¿podrian ayudarme?

Javier Ortega Conde dijo...

¿Acciones legales por un chantaje? Supongo que sí, lo mejor es que consultes a un abogado o a la policía a ver que te dicen. ¿Obtener pruebas? ¿Como intenta chantajearte? Si es por teléfono hay programas que graban el audio. Si está escrito por SMS desde su móvil supongo que puede ser válido. La seguridad de whatsapp es una mierda, claro que es fácil violar tu intimidad, ya sea copiando archivos de tu móvil o si escribes los mensajes a través de un wifi público. En la web de whatsapp hay alguna forma de contacto creo. Suerte.

ARQUI dijo...

yo nunca uso redes wifi, siempre 3g. ya he consultado a un abogado y me pide pruebas, el chantajista es un exnovio de mi chica y el chantaje fue inesperado y cara a cara con lo que no pude grabar nada, pero para nosotros y las familias puede ser un grave problema si sale a la luz. Lo que me gustaria es saber si lo ha podido hacer o no, si es un farol o hay que darle importancia.

Javier Ortega Conde (Malkavian) dijo...

@ARQUI Las posibilidades son:

1- Que os haya cogido el móvil a alguno de los dos y así haya obtenido si quiere todas vuestras conversaciones con whatsapp (incluídas las que has borrado y no te salen, que realmente no se borran).

2- Se me olvidaba que también alguien puede acceder como otra persona (si tiene su nº de teléfono y el IMEI de su móvil y un cliente de whatsapp que permita meter los datos manualmente) o registrarse como otra persona cosa que puede hacerse con sólo el número y un sistema que le permita enviar SMSs simulando que vienen de ese número. Estas dos opciones no permiten recuperar conversaciones antiguas sino hablar nuevas haciéndose pasar por otra persona.

dulce dijo...

tengo un móvil austero osea lo único que puedo hacer es llamar y mjs sms con ese num puedo bajar whatapp a mi pc?