17 septiembre 2012

WhatsApp: Spam, inundación y robo de cuentas

En Marzo del 2011, en este mismo blog, Alberto Ortega explicaba como funcionaba la autenticación de los clientes de WhatsApp con sus servidores y se preguntaba cuál sería la contraseña para el acceso. Hoy y desde hace meses, ya se conoce como se genera. 

En esta entrada vamos a explicar qué riesgo implica este dato y como en otras ocasiones, esperamos ayudar a convencer a WhatsApp de sacar una nueva actualización.

En febrero se publicó el método de generación de la contraseña, cuando alguien escribió en el foro hak5 un comentario con su investigación sobre la aplicación del sistema Symbian, acompañándolo con las funciones en java que hacían esta tarea.

Generación de la contraseña MD5 en cliente de Symbian
Al final no era mucho más complicado que hacer un MD5 del IMEI del teléfono móvil invertido, al menos en este caso y en el de los teléfonos Android.

Este descubrimiento se ha hecho popular hace unas semanas (el día 5 de septiembre) a raíz de una entrada de Sam Granger, pero realmente era algo bien conocido desde febrero.

A partir de aquí decenas de usuarios empiezan a crear los primeros clientes no oficiales y es que la comunidad no tiene límites. Uno hecho en java para los móviles n900 (que además y sin que se hiciera demasiado eco funciona en PC), Yaparri  y Wazzap! para N9. Todo un lujo para los usuarios de estos móviles.

En mayo se creó una API (no oficial), tanto en php como en python, que usa este mismo sistema y permite a desarrolladores hacer sus propias aplicaciones.

Una noticia más de esta semana y que ha hecho saltar la alarma a los blogs más generalistas ha sido el reciente descubrimiento de como genera la  contraseña el cliente móvil de la plataforma IOS, que es tan sencillo como aplicar un MD5 a la MAC de la tarjeta wireless duplicada: md5(MACMAC).

Generación del hash MD5 en IOS (Fuente:  http://www.ezioamodio.it/?p=29 )
El problema de este método de generación es obvio. Tan solo hace falta conocer la MAC del móvil para suplantar su identidad y con ello mandar mensajes a su nombre y además recibirlos (aunque el móvil suplantado no los recibiría). La MAC, a diferencia del IMEI, es un dato que se puede obtener sencillamente sin acceso físico a el.

Este hallazgo explica el motivo por el que en ocasiones tanto la API como otros clientes fallaban al acceder a los servicios de WhatsAPP, ya que si te registras por primera vez con un iPhone, tu contraseña no estará creada en base al IMEI y por lo tanto fallará. Ocurre lo mismo si el proceso es inverso.

Los riesgos que implican este comportamiento son varios, entre ellos el spam, la inundación y el robo de la cuenta.

SPAM

Seguro que todos habéis usado alguna vez alguno de estos servicios: Messenger, Gtalk, Facebook o Tuenti. Y seguro que no os sorprende que para que alguien pueda interactuar con vosotros se sigue un proceso muy sencillo: primero se manda una solicitud para conectar y a continuación la otra persona  ha de aceptar. Una vez hecho, se establece un vínculo y queda vía libre para la comunicación.

Este proceso no es igual en WhatsApp. Aquí un usuario puede mandar mensajes a quien quiera (al igual que ocurre con los SMS), tan solo conociendo su teléfono. Teniendo en cuenta que el envío no tiene coste y se puede automatizar sencillamente es previsible que empecemos a sufrirlo a corto plazo.  Este mismo problema ocurre en Twitter donde tampoco se aceptan los followers salvo se configure en modo privado. ¿Alguno tiene la cuenta de twitter pública y ha recibido mensajes de mujeres increíblemente guapas que ponen direcciones de páginas web? Si, es SPAM, y entonces ya sabéis a lo que me refiero.

Tal vez alguien malo se haya leído mi anterior post donde contaba el número de móviles con whatsapp instalado y usando el mismo proceso sea capaz de generar una lista con los teléfonos dados de alta y por lo tanto "objetivo".

Solo espero que si alguien se aprovecha, acabe teniendo que dar explicaciones legales. Bueno, eso y que WhatsApp me permita configurar mi "usuario" como privado.

Ejemplo de envío masivo de publicidad de SbD vía WhatsApp

Inundación

Por lo explicado anteriormente, el mismo ataque se puede replicar mandando miles de mensajes automáticamente al mismo teléfono, dejándolo KO hasta que elimine la aplicación, desactive los datos o alguna otra medida similar.

Denegación de servicio con mensajes masivos de WhatsApp

Robo de cuenta

Lo que al final todo el mundo quiere hacer. Leer los mensajes de whatsapp de la novia de la que tanto se fían. Lo que cuento aquí no tiene ningún misterio y ya es público, pero sed responsables, ya que un gran poder conlleva una gran responsabilidad. Y acabar explicándoselo a un Juez, no debería ser una opción.

Dependiendo del móvil que se usó para registrarse la última vez, la contraseña estará basada en IMEI (Android/Symbian) o en la MAC de la Wifi (iPhone).
  • Si es IMEI la única opción es acceder físicamente al móvil y verlo al quitar la batería o en la configuración del terminal. La configuración es distinta por cada móvil, pero en muchos de ellos se muestra directamente al pulsar el código:  *#06#
  • Si es la MAC, se puede sacar de distintas formas:
    • En Ajustes->General->Información->"Dirección WIFI"
    • Si está en la misma red que tú, como por ejemplo en casa compartiendo ADSL. Dentro de la configuración del router aparecerá un apartado con los clientes conectados o un listado con la asignación DHCP, relacionando direcciones IP con MACs
    • Usando un sniffer como kismet que es capaz de localizar los dispositivos wireless (como el iphone en cuestión) cada vez que tratan de conectar a alguno de los puntos de acceso que tienen configurados, independientemente de que estén disponibles o no.
    • Por otro fallo de IOS, cuando configuras un punto de acceso este queda almacenado para siempre y si detecta otro con el mismo nombre, se conectará directamente sin preguntar.  Por lo que otra opción es crear un punto de acceso falso (fakeap), con nombres de redes conocidas y que seguramente ya estén almacenadas en el móvil. Como por ejemplo: "McDonalds", "Starbucks", "Hotel NH", etc.

Kismet mostrando clientes conectados y sus MAC (Fuente:  http://www.kismetwireless.net/screenshot.shtml)

Configuración de router Belkin mostrando clientes Wireless (Fuente:  http://www.techspot.com/guides/442-check-if-someone-uses-your-wi-fi/)

Una vez dispones de los datos necesarios, descarga PHP y WhatsAPI, Edita el código de ejemplo "whatsapp.php" añadiendo el nombre, teléfono (sin el 00 ni el +, pero si con el código de país) y luego el IMEI o MAC.


A continuación hay que modificar el php.ini para que cargue la librería de sockets y openssl, además de modificar la clase whatsprot.class.php para eliminar el timeout del socket y por último, cambiar las rutas de Unix a Windows en los require (las barras, vaya)

Para evitaros hacer esos esos cambios, he dejado en el repositorio todas las modificaciones hechas, junto a todo lo necesario, para que solo tengáis que descargar el archivo en C:\php y editar el whatsapp.php con el nickname, sender e IMEI.

Desde un cmd, se ejecuta con una sintaxis sencilla.

  • El primer comando, sin argumentos, muestra la ayuda: php whatsapp.php
  • El segundo manda un mensaje de prueba: con -s y el teléfono (country code, sin 00 ni +)
  • Con la opción -l permanece a la escucha para la recepción. Ojo que si es de otro usuario, el legítimo no los recibirá.



Actualización: 18/09/2012

Otra opción más sencilla tanto para Windows como Linux es descargar ThatsaPC, en el que desde entorno gráfico, ofrece la misma funcionalidad. Tan solo hay que añadir el código de país (34 para España), el IMEI o MAC (en mayusculas) y el número de teléfono.

Una vez se conecta, se añaden los contactos manualmente desde el menú de contactos.




74 comments :

Aarón D. dijo...

Lo probé y realmente tiene peligro si conoces los datos necesarios.

nogracias dijo...

Sigo viendo un problema el conseguir los datos # de tlf + IMEI / MAC sin acceso físico al teléfono. La MAC es posible, pero el tlf ... a menos que sea alguien conocido...


Otro de los problemas a los que te enfrentas es que los mensajes solo se reciben una vez. Los puedes recibir en el cliente original o en el cliente falso, por lo que al "espiar" una cuenta ésta no recibirá los mensajes. (Además, solo un cliente puede estar conectado a la vez, por lo que al conectarse el cliente original el falso se desconectaría y viceversa. Indicios que darían pistas de que hay alguien "escuchando".


Una solución, podría ser la de que Whatsapp detectase un cambio de red (ip pública desde la que se conectase el móvil) Y avisase (como hace GMail por ejemplo).


Alguno de los usos "legítimos" que podría tener sería la tarea de automatizar las felicitaciones de cumpleaños/navidad/fiestas de tus contactos, algún servicio a lo Wozniak de "broma diaria", o por qué no, un bot para los :foreveralone:

Anonimo123 dijo...

Pone que para conseguir el IMEI hay que acceder fisicamente al movil si o si, esto no es asi, hay malwares que al instalarlos te cogen el imei y lo envian a un servidor. Por lo que mucho ojo con las apps de android que instalais

Alejandro Ramos dijo...

Efectivamente, pero si acceden a tu IMEI por un malware, el menor de tus problemas es que te roben la cuenta del whatsapp con este método, ya que podrían acceder al sqlite directamente sin ninguna otra necesidad...

Cherry dijo...

Gracias por el articulo, ¿ En el caso de Blacberry ?, ¿ También seria por IMEI ?

Kamy dijo...

Menudo post, con el trabajo que tiene detrás, a ver si por lo menos sacan una actualización!! Porque vuestro SPAM son chicas guapas que os pasan urls...pero también hay spam de pesados/desconocidos que estaría bien que alguien nos preguntase si queremos recibir.

Sr.X dijo...

Windows phone sera con el imei? a mi no me rula! ni con el imei normal, ni alreves ni con la mac...

elPerroVerde dijo...

[Fuera de tema]
Creo que nunca habeis hablado de Squere verdad? Lo pregunto porque mi hermano acaba de llegar de los USA y viene flipado de este método de pago que parece que por esas tierrase está muy extendido.

Que podeis decir de esto? es seguro de verdad?

Un saludo.
Gracias.

Alejandro Ramos dijo...

Ni idea, pero habrá que pegarle un vistazo!! :)

2012/9/17 Disqus

Anonymous dijo...

He hecho una prueba con mi teléfono, y al ejecutar el comando -s me da el error "Wrong password", el IMEI en el .php lo hay que poner bien o ya con el md5 e inverso? Cuando envías un mensaje hay que poner el código del país al final o al principio?
Saludos y muy buen post. Queda demostrada una vez más la seguridad del Whatsapp.

K dijo...

En mi caso el IMEI lo tenia en hexadecimal y en decimal, use el decimal y funciono, el codigo del pais va antes del numero.

Alejandro Ramos dijo...

Imei normal sin md5
Código de país al principio.

Por ej: 34676984521

El 17/09/2012, a las 21:29, Disqus escribió:
[image: DISQUS]

Duber dijo...

Amazing, gran trabajo señores.

jona dijo...

he probado con varios whatsapps que tengo, en los dos da un error, así que he cambiado las primeras lineas donde ponía: "/src/php/whatsprot.class.php" por "\src\php\whatsprot.class.php". Al hacer eso y escribir en consola "php whatsapp.php" ya no da error.


Pero al poner alguno de los parametros (-l -i -s) me devuelve el error de wrong password y que https no está activado. Acto seguido he editado los archivos "php.ini-development" y "php.ini-production" quitando el punto y coma de la linea donde pone: ";extension=php_openssl.dll", aún así sigue dando el error, y he pensado,que ya que php no corre como servicio, instalar el openssl para que así estuviese todo registrado.. y ni así, sinceramente, ya no se que hacer más :-(

Alejandro Ramos dijo...

Bájate el php que ya he dejado yo el link en el post, con esos y otros cambios hechos...


2012/9/18 Disqus

jona dijo...

Uis, si, me he bajado los originales, perdon! :-D y yo mirando codigo cuando ya estaba todo hecho! jaja. Pero bueno, así se aprende!


Me he bajado el que has hecho tu, y ya no da los errores de https pero sigue dando wrong password.


He introducido el imei tanto en orden normal como invertido y sale lo siguiente:


[] Logging in as 'user' (numerodetelefono introducido en whatsapp.php)
Wrong password


aqui algo falla...

jona dijo...

listo, todo funcionando OK! al final (como siempre pasa en estos casos) era una tontería con el IMEI... la verdad que es increible como funciona!

Blackberry dijo...

No funciona, siempre bota "Wrong Password".

Alejandro Ramos dijo...

Es un teléfono android?

Enviado desde mi iPhone

El 18/09/2012, a las 01:40, Disqus escribió:
[image: DISQUS]

jona wrote, in response to Alejandro Ramos:
Uis, si, me he bajado los originales, perdon! :-D y yo mirando codigo cuando ya estaba todo hecho! jaja. Pero bueno, así se aprende!


Me he bajado el que has hecho tu, y ya no da los errores de https pero sigue dando wrong password.


He introducido el imei tanto en orden normal como invertido y sale lo siguiente:


[] Logging in as 'user' (numerodetelefono introducido en whatsapp.php) Wrong password


aqui algo falla...

Link to comment
IP address: 81.184.15.203

BinaryStained dijo...

IMPRESIONANTE!!!, Felicidades por el artículo Alejandro.

Joselu dijo...

La API en python no funciona? estoy probando simplemente a enviar un mensaje con:
whatsapi.start(sender,password)
whatsapi.sendMessage("-1","34666112233","prueba")

Y no se llega a enviar el mensaje.
Ya se que el de PHP si funciona, pero me gustaria probarlo en python.

masticover dijo...

Simplemente genial. Enhorabuena Alejandro!!!

Alejandro Ramos dijo...

Muchas gracias ! :)

Alex dijo...

ME encantaría descubrir estas cosas por mi mismo. Cómo os envídio! (Pero envidia de la buena ;-) ). Tendré que seguir investigando y aprendiendo el arte del hacking. Buen post! enhorabuena.

Erick dijo...

Yo obtengo

rx rx rx


Esto en ubuntu

Albert López dijo...

Joselu, parece que la API de python está obsoleta. Yo dejé un mensaje en issues pero nada de nada...


En fin :S


P.D.: Vaya jodienda que ya no dejéis comentar 'Anonimamente'. Mal paso, creo yo...

erick dijo...

Ya logré que funcione el code de php. Yo soy de México y ponía los números empezando con 52 (código de área de mx) y debía de ser 521. No sé por qué. así funcionó perfectamente.

Baku dijo...

El post impresionante como siempre que tratais whatsapp. Una sola duda, alguien se a animado a investigar que pasasi el registro inicial fue en un movil del grupo BlackBerry??

Carlos Fernández dijo...

Genial el artículo. Enhorabuena Alex :)

Miguel Angel Parra dijo...

Solo un detalle. Como en el resto del artículo, ¿no sería conveniente tapar el MSISDN en los últimos pantallazos? Porque ocultarlo varias veces para luego dejarlo en claro...

Alejandro Ramos dijo...

Gracias!

Alejandro Ramos dijo...

¡Que susto!, me he pasado buscando un rato, pero no pasa nada. Es un número al azar que puse de ejemplo,

Daniel dijo...

Hola, disculpa no he logrado que me jale el codigo, podrias hechame la mano? tengo un error de undefined property: whatsorit::$challengeArray.
solo modificaste el whatsapp.php y el testprotocol.php?

Daniel dijo...

por cierto tmn soy del ares mx

elholo™ dijo...

¿Alguien ha podido usar la aplicación detrás de proxy? ¿existe en la aplicación manera de configurar con los valores de un proxy server?
Gracias!

Paco Meralgl dijo...

a mi no me paran de spamear en whatsapp una web porno salasxxx.com , empieza el mensaje hola cariño y guarradas, ya no se que hacer la verdad

Elbuenedd dijo...

Orale!!!! me impresiono este programa la verdad!!!!

Elbuenedd dijo...

Bueno al principio me impresiono.. pero no he podido mandar ningun mansaje porque sera!???

Elbuenedd dijo...

El api esta funcionando al 100% Gracias!!!

Saludos.

Elbuenedd dijo...

una consulta... se puede crear un ciclo de inundacion con esta api? y como se haria...GRACIAS POR TODO AQUI SE APRENDE MUCHO GRACIAS!!!

Camaron dijo...

Gran post si señor, pero ¿sigue funcionando? lo acabo de probar y me da wrong password. He comprobado que el imei este bien, y el nº de telefono....

Elbuenedd dijo...

si funciona aun... Saludos.

Watafack dijo...

Alejandro, excelente entrada. Te queria consultar, cuando ejecuto C:\php\php whatsapp.php -s NUMERO "TEXTO" | findstr "Send" el prompt me devuelve el sig error:

"PHP Warning: socket_read(): unable to read from socket [10057]: No se ha permitido una petici¾n para enviar o recibir datos ya que el socket no estß conectado y no se ha proporcionado ninguna direcci¾n, al realizar el envÝo en un socket de datagramas por medio de una llamada sendto.
in C:\php\src\php\whatsprot.class.php on line 140

Me baje el comprimido que subiste al repositorio.

Elbuenedd dijo...

Listo!!! ya tengo la forma de mandar la inundacion!!! tan solo poner un ciclo al codigo y wala !!! whatsapp muerto jejejejejeje

Oscar dijo...

[root@pbx tests]# php whatsapp.php -s 569XXXXXXXX "Esto es un demo" | grep "Send"

PHP Warning: Missing argument 2 for WhatsProt::RequestLastSeen(), called in /var/www/html/api/tests/whatsapp.php on line 103 and defined in /var/www/html/api/src/php/whatsprot.class.php on line 349
PHP Notice: Undefined variable: to in /var/www/html/api/src/php/whatsprot.class.php on line 359
[] Send message to 569XXXXXXXX: Esto es un demo

Elbuenedd dijo...

Los archivos no estan en la direccion correcta. SAludos.

Oscar dijo...

No puede ser eso ambos archivos estan en la misma ruta

require "whatsprot.class.php";

Oscar dijo...

Cual es la forma que estas utilizando para hacer el envio... yo con la aplicacion para windows puedo enviar pero integrando el script no ha sido posible

Elbuenedd dijo...

con el thatsap no puedo mandar mensajes, solo puedo con el php.

Elbuenedd dijo...

<?php
require "src\php\whatsprot.class.php";

en esta direccion debe estar ese archivo.

Elbuenedd dijo...

<?php
require "src\php\whatsprot.class.php";

ahi debe estar ese archivo

Elbuenedd dijo...

<?php
require "src\php\whatsprot.class.php";

Miguel dijo...

Alejandro, cuando ejecuto C:\php\php whatsapp.php -s NUMERO "TEXTO" | findstr "Send" el terminal me devuelve el siguiente error varias veces:

in C:\php\src\php\whatsprot.class.php on line 140
PHP Warning: socket_read(): unable to read from socket [10057]: No se permiti¾ una solicitud para enviar o recibir datos ya que el socket no estß conectado y no se ha proporcionado ninguna direcci¾n, al realizar el envÝo en un socket de datagramas por medio de una llamada sendto.

¿Por qué puede pasar esto y cómo puedo arreglarlo?
Muchas gracias

eakc dijo...

error...
PHP Notice: Undefined property: WhatsProt::$challengeArray
whatsprot.class.php on line 119


que sera

Marcelo dijo...

el de php ya no funciona tira el siguiente error

PHP Notice: Undefined property: WhatsProt::$challengeArray in C:\phpwhatsapi\ph

p\src\php\whatsprot.class.php on line 119

Eakc dijo...

lo pudiste arreglar amigo!? al parecer ya no funciona.... ni modos... Saludos

John3d dijo...

Parece ser por algunos cambios en whatsapp

https://github.com/venomous0x/WhatsAPI/issues/126

Robe! dijo...

Para los que preguntan por la contraseña en Windows Phone:
http://blog-robefernandez.blogspot.com.es/2012/11/conoce-tu-contrasena-de-whatsapp-en.html

eakc dijo...

Ya esta la solucion!!! en la web... descargarla y hecharla a andar funciona... ya no probe

Manuel dijo...

despues de instalar whatsapp en un movil y posteriormente al mes perderlo en el movil nuevo q me compre no me deja abrirlo. Me da error al meter mi numero de tlf el q lo encontro tiene la aplicacion abierta q puedo hacer para volver a disfrutar de el ayudarme por favor gracias

Santiago dijo...

Amigo esto funciona?

Connect();
$w->Login();
$w->Message(time()."-1", "00NUMERODESTINO","TEST");

?>

Maxi dijo...

Hola.. he probado las api de whatsapp y en ningún caso funciona!! lo uso en ubuntu, he usado esta api y la de venomous0x y no envía sms, me loguea pero no envía!!!

eakc dijo...

hay que editarlo... comenta esta parte

//$wa->RequestLastSeen($dst);


y empezara a funcionar,... saludos.

lalala dijo...

Y esto puede servir tambien para cotillear los historiales de conversaciones de otros whatsapps?

Albert dijo...

im post currect informations only!







Please? Solution

juan dijo...

saludos, cual era la tonteria yo ya tengo el imei de mi telefono android y nada que funciona sigue saliendo Wrong password

Juani dijo...

Buenas, hay alguna forma de obtener el nombre de perfil que el usuario de Whatsapp registra? No sé, quizás de alguna forma parecida a la de obtener el estado (https://sro.whatsapp.net/client/iphone/iq.php...)

cos dijo...

Alejandro Soy de Honduras y no se si me equivoco pero el sender que recive el numero de pais es de 2 digitos en mi caso es de 3 (504) sigue sin funcionarme y en la aplicacion de windows la descargo y la ejecuto y me sale el error no es una aplicacion para windows

cos dijo...

Hola alejandro no se si aun funciona ese metodo pero soy de Honduras estaba viendo que en tu codido de pais en php solo tomas dos digitos no se si estoy mal pero el de mi pais es 504 me tome la libertad de cambiear que solo tomara dos digitos en el codigo a que tomara 3 pero aun asi no me funciona me dice Wrong password y el de windows no me corre queria consultarlte si aun este metodo funciona o si conoces otro metodo para mandar sms a whatsapp por codigo te agredesco de antemano

jorge dijo...

Solucionaste el error?

jorge dijo...

a mi tamb me sale lo as solucionado?

x) dijo...

@Alejandro Ramos sigue funcionando? Me descargo el repositorio edito tal y como pone, introduzco el comando -s como dice y sale "Wrong Password". tengo android. gracias de antemano :)

Robert dijo...

No será de casualidad Square ?? Que es un sistema de pago vía telefoneo, vamos, como si se tratase de una tarjeta de credito.

inquietorres dijo...

Alejandro.. a mi me sale el mismo error... "Wrong Password" ¿ Ya pudiste solucionarlo ?