Analizando el impacto de las vulnerabilidades FakesApp y descifrando el tráfico de WhatsApp Web con “Whatsapp Decoder” (Parte 1/2)

jueves, 17 de enero de 2019


Según los investigadores de CheckPoint, las vulnerabilidades descubiertas permitían interceptar y manipular los mensajes que se enviaban, tanto en conversaciones privadas como en grupos. Esto abría la puerta a diferentes tipos de ataques orientados a intentar distribuir fakes news o información falsa utilizando este popular sistema de mensajería. En el post original donde exponían su trabajo, describían tres posibles escenarios de ataque que mostraban cómo combinando las vulnerabilidades descubiertas y la ingeniería social se puede engañar a los usuarios y hacerles llegar contenido falso.

Los mensajes que se podían manipula eran los que se recibían en una sesión WhatsApp Web, al ser transferidos del móvil al navegador. En este momento, el atacante podría interceptar los mensajes que recibía para modificar el contenido enviado por el remitente en su propia sesión de WhatsApp Web. La vulnerabilidad estaba en que, si el atacante respondía al remitente tras haber modificado su mensaje y utilizaba la función de “quote” (la de citar el mensaje en la respuesta), al recibir dicha respuesta el remitente vería en la cita el texto modificado por el atacante, en lugar del que él envió. En esencia, el atacante conseguiría poner palabras en boca del remitente que jamás pronunció. Esto podría generar confusión y algún quebradero de cabeza, aunque el remitente fuera consciente de que él jamás envió el mensaje que aparece como suyo en la cita de la respuesta.


Vídeo explicativo del procedimiento anterior:




El tema se complica un poco más a la hora de tratarse de grupos. En este caso, utilizando la misma técnica el atacante podría, modificando la cita de cualquier remitente en una respuesta, crear confusión entre el resto de miembros del grupo. Aunque estos pudieran ver el mensaje original repasando el histórico de la conversación, al leer los últimos mensajes como usualmente se suele hacer, verían en la cita el texto modificado por el atacante. Además de esto, podría suplantar la identidad del remitente por la de un miembro inexistente en el grupo, modificando la cadena de texto que lo identifica. Existe otra variante más de explotación de esta vulnerabilidad en la que se puede enviar un mensaje en privado a un miembro del grupo para que éste crea que se manda a todo el grupo en conjunto, de manera que cuando este responda a dicho mensaje, este último será visible para todos los participantes en la conversación.

Lo que es necesario señalar es que el atacante en ningún momento puede modificar el mensaje original en la base de datos de WhatsApp, puesto que los mensajes se reciben en el dispositivo móvil primero y luego en la sesión de WhatsApp Web. De hecho, para poder realizar estos ataques, a la hora de manipular los mensajes, no sólo habrá que modificar el texto en cuestión, sino también el identificador del mensaje por uno que no exista en la base de datos.

En el post original, los investigadores de Check Point afirmaban que llegaron a sus hallazgos a raíz de analizar con detalle el cifrado punto a punto de WhatsApp. Al tratar de hacer ingeniería inversa del algoritmo de WhatsApp para descifrar los datos, llegaron a la conclusión de que se utilizaban los “Protocol buffers”.

Convirtiendo los datos de protobuf2 a Json eran capaces de visualizar los parámetros que se enviaban y manipularlos para poder comprobar la seguridad de WhatsApp. A raíz de esto los investigadores desarrollaron una extensión llamada “WhatsApp Decoder” para el conocido proxy Burp que permitiese a cualquiera poder realizar el mismo proceso.

Extensión “Whatsapp Decoder” para Burp imagen
Extensión “Whatsapp Decoder” para Burp

Para realizar este ataque se debe instalar la extensión desarrollada por los investigadores, obtener las claves de sesión y algún otro parámetro, interceptar el tráfico en tiempo real, descifrarlo, decodificarlo, modificarlo, volverlo a codificar, cifrar y enviarlo de nuevo, además en tiempo real. Por ello, he considerado interesante replicar el proceso para entender cómo se cifran y descifran los paquetes, identificar los diferentes parámetros y profundizar en el conocimiento del protocolo de comunicación.

Instalando y configurando la extensión
El primer paso es descargar la extensión del repositorio y seguir las instrucciones de instalación respecto a dependencias. Como la extensión ha sido desarrollada en Python, es necesario instalar previamente Jython siguiendo las instrucciones de la documentación oficial de Burp. Una vez hecho esto estaremos en disposición de añadir la extensión a nuestro proxy.

A continuación, es necesario obtener las claves pública y privada de la comunicación con WhatsApp Web. Esto hay que realizarlo previamente a la generación del código QR que nos muestra la versión web de WhatsApp. Para ello, hay que utilizar el depurador del navegador e introducir un breakpoint en un punto específico.

Obteniendo clave pública y privada previa a generación del código QR imagen
Obteniendo clave pública y privada previa a generación del código QR

Además de las claves pública y privada, es necesario obtener el parámetro “secret” que se transfiere al establecerse la comunicación entre nuestro dispositivo móvil y la sesión de WhatsApp Web. Para acometer este paso, es necesario configurar previamente el navegador para redirigir todo el tráfico HTTP y HTTPS a través del proxy Burp.

Posteriormente, procedemos a escanear el código QR con el dispositivo móvil y una vez que la sesión web se haya iniciado correctamente, en la pestaña de Burp correspondiente a los websockets podremos encontrar la información que necesitamos.

Captura del objeto “ref” con el parámetro “secret” al establecer la sesión imagen
Captura del objeto “ref” con el parámetro “secret” al establecer la sesión

El parámetro “secret” se transfiere en el objeto “ref”. Además de este, podemos encontrar otros parámetros relevantes como los tokens de cliente, servidor y navegador, así como visualizar el número de teléfono del usuario que se transmite en el parámetro “wid”, la versión de WhatsApp que utiliza, el porcentaje de batería del que dispone, la marca y modelo de dispositivo o el nombre con el que se muestra a sus contactos.

En este punto, ya disponemos de la información necesaria para poder configurar la extensión de Burp y descifrar el tráfico de WhatsApp. Debemos de copiar el objeto “ref” en el primer cuadro de texto asegurándonos de que contiene el parámetro “secret”, así como las claves pública y privada recabadas en el paso anterior en los cuadros de texto restantes.

Configurando la extensión de Burp para descifrar el tráfico de WhatsApp imagen
Configurando la extensión de Burp para descifrar el tráfico de WhatsApp

El siguiente paso es arrancar el script “parser.py” que se incluye en la carpeta “helper” al descargar el código de la extensión del repositorio de GitHub. Una vez arrancado el script y configurada correctamente la extensión, toca pulsar el botón “Connect” y comprobar que se visualiza el mensaje “Ok” en verde.

Arrancando el script “parser.py” y conectando la extensión imagen
Arrancando el script “parser.py” y conectando la extensión

A partir de aquí, si todo ha ido bien y hemos seguido correctamente los pasos, ya estamos en disposición de descifrar correctamente el tráfico de WhatsApp, tanto el entrante como el saliente. Veamos cómo funciona.

Descifrando el tráfico de WhatsApp
Para poder descifrar y manipular el tráfico de WhatsApp, es necesario ir a la pestaña del Proxy en Burp y activar la opción “Intercept” de cara a capturar los paquetes. Se transmiten diferentes tipos de paquetes. Algunos van sin cifrar y hacen referencia a diferentes aspectos de la sesión de WhatsApp (comentaremos algún ejemplo más adelante). Nos centraremos ahora en los que corresponden a mensajes de conversaciones, que evidentemente acaparan más interés y son los que abren la puerta a los ataques comentados anteriormente. Cuando recibimos un mensaje entrante, podremos identificarlo porque además de estar cifrado es ininteligible.

 Capturando un mensaje cifrado entrante en Whatsapp Web imagen
Capturando un mensaje cifrado entrante en Whatsapp Web

Para poder descifrar el mensaje mediante la extensión, previamente hay que convertir el contenido a base64 seleccionándolo en la ventana y presionando la combinación de teclas “Ctrl-B”.

Convirtiendo el contenido del mensaje cifrado a base64 imagen
Convirtiendo el contenido del mensaje cifrado a base64

Una vez convertido a base64 basta con copiar esta cadena de texto en la extensión, y presionar el botón “Decrypt” tras haber habilitado previamente el botón “Incoming” para especificar que estamos analizando tráfico entrante.

Descifrando un mensaje entrante en Whatsapp Web imagen
Descifrando un mensaje entrante en Whatsapp Web

Como se puede ver, una vez se descifra el mensaje es posible ver en claro todos los parámetros:
  • El valor del parámetro “conversation” corresponde al contenido en sí del mensaje, que en este caso es “jajajaja”.
  • El parámetro “fromMe” indica si el mensaje ha sido enviado por el usuario. En este caso está false porque se trata de un mensaje entrante
  • El “remotejid” es el parámetro que contiene la información del usuario emisor. En este caso incluye el número de teléfono del contacto que envía el mensaje.
  • El “id” corresponde al identificador único del mensaje que coincide con el que se almacena en la base de datos del dispositivo móvil.
En este caso, hemos descifrado un mensaje de un chat individual. En el caso de tratarse de un chat de grupo, aparecería además el parámetro “participant” que indicaría el miembro del grupo que ha enviado el mensaje. En la siguiente entrega veremos cómo utilizar la extensión “Whatsapp Decoder” para replicar el ataque de FakesApp y ver lo que sucede en diferentes escenarios.


También te puede interesar: 
 » Analizando el impacto de las vulnerabilidades FakesApp y descifrando el tráfico de WhatsApp Web con “Whatsapp Decoder” (Parte 2/2)


Deepak Daswani
Chief Security Ambassador de ElevenPaths

No hay comentarios:

Publicar un comentario