Hackear WhatsApp, parte 2: analizar el protocolo VOIP de Whatsapp
En este artículo, quiero contarles cómo descifré varias partes del protocolo VoIP de WhatsApp usando un dispositivo iOS con jailbreak y un conjunto de diferentes programas de análisis.
Recientemente, Whatsapp ha recibido mucha atención debido a las vulnerabilidades y oportunidades para los piratas informáticos.
Desde este punto de vista, es muy interesante para la investigación sobre su seguridad.
Todos los que también estén interesados en esto, bienvenidos debajo del gato.
Aunque las páginas oficiales de Whatsapp tienen una descripción de su cifrado, de hecho, no hay información detallada en ninguna parte sobre cómo funciona y cómo se implementa en el protocolo.
Por lo tanto, no hay base para un análisis de seguridad detallado en Whatsapp.
Mi investigación se basó en tres cosas:
1. Análisis de tráfico de red
2. Análisis de binarios
3. Análisis de comportamiento de aplicaciones en diferentes modos
Kit de herramientas
Para analizar el cliente Wahtsapp para iOS, utilicé las siguientes herramientas:
- Descriptor binario - bfdecrypt
- Desensamblador de archivos binarios - Desmontador Hopper y radare2
- Análisis de tráfico de red - Wireshark
- Análisis de acciones de aplicaciones - Frida
Cómo configuro el jailbreak en iOS está más allá del alcance de este artículo.
Analizando el tráfico de la red
En esta parte analizaremos el tráfico de la red del cliente de Whatsapp durante una llamada, que registraremos mediante Wireshark.
Para registrar dicho tráfico, creé una interfaz de red virtual remota.
El comando para Makos tiene este aspecto:
rvictl -s Aquí, el UUID del dispositivo debe reemplazarse con el UUID del dispositivo con el cliente watsap.
Wireshark detecta el uso de utilidades de recorrido de sesión para NAT (STUN).
STUN es un protocolo de señalización que se requiere para establecer conexiones peer-to-peer entre clientes.
Aquí el cliente de WhatsApp utiliza paquetes TCP para comunicarse con diferentes servidores Watzap.
Al mismo tiempo, los paquetes UDP se utilizan para el intercambio entre clientes.
Cientos de paquetes UDP pasan en un minuto.
Vatsap utiliza el Protocolo de tiempo real seguro (SRTP) y es obvio que estos paquetes UDP contienen datos SRTP sobre la llamada.
El protocolo SRTP proporciona cifrado, autenticación y protección contra ataques de reproducción en el tráfico RTP.
Echemos un vistazo más de cerca a los paquetes SRTP intercambiados entre los lados A y B.
Para hacer esto, conviértalos a hexadecimal:
Se puede ver que los campos contienen encabezados RTP específicos de SRTP.
Los primeros cuatro bytes (resaltados en rojo) son los 7 campos de encabezado RTP.
Considérelos con más detalle:
0x8078001e = 0b10_0_0_0000_0_111100_00000000000011110 = V = 10 | P = 0 | X = 0 | CC = 0000 | M = 0 | PT = 111100 | SEQ = 00000000000011110
Los primeros 2 bits contienen el número de versión (V), en nuestro caso es la segunda versión.
El tercer bit es un campo para información opcional, en nuestro caso está vacío.
El cuarto bit - el campo de extensión (X) indica que en este caso no hay otros encabezados después del encabezado del paquete RTP.
Bits 5 a 8: contiene el número de identificadores CSRC que siguen al encabezado permanente.
CSRC (fuente contribuyente) es la fuente del flujo de paquetes RTP que contribuye al flujo total generado por el mezclador RTP. El mezclador inserta una lista de identificadores SSRC que identifican fuentes parciales en el encabezado de los paquetes RTP. Esta lista se llama lista CSRC. Por ejemplo, una audioconferencia en la que el mezclador marca a todos los oradores cuya voz genera paquetes salientes. Esto permite que el lado receptor identifique al hablante, aunque todos los paquetes tienen el mismo ID SSRC.
8 bits es un marcador de bits (M). Usado a nivel de aplicación y determinado por el perfil. Si se establece este campo, los datos del paquete tienen un significado especial para la aplicación.
Los siguientes 6 bits son códigos de tipo de datos adicionales. Estos datos no están definidos en los estándares RTP y SRTP. El significado de estos bits es probablemente uno personalizado elegido por Whatsapp.
Los últimos 17 bits indican la fuente del reloj. El número se incrementa en orden en 1 cuando se envía el siguiente paquete de datos RTP, este código puede ser utilizado por el receptor para registrar pérdidas de paquetes y restaurar el verdadero orden de los fragmentos enviados. Según el estándar, el valor inicial del código es aleatorio, pero el watsap no cumple esta recomendación, porque como podemos ver en los datos de Wireshark, el valor inicial del watsap es siempre 0.Los
siguientes 4 bytes (resaltados en azul) son la marca de tiempo del paquete.
4 bytes a partir de entonces (verde) - campo SSRC. Identifica la fuente de tiempo. Este identificador se elige al azar para que no haya dos códigos SSRC iguales dentro de una sesión RTP. Todas las aplicaciones deben poder detectar cuándo los SSRC son iguales. Si el remitente cambia su dirección de transporte, también debe cambiar el identificador SSRC.
Entonces, descubrimos que Whatsapp usa SRTP para proteger las llamadas.
Esto lo confirma la estructura de los paquetes UDP intercambiados entre los clientes Watcap.
Además, Watzap utiliza el protocolo TCP para intercambiar datos entre el cliente y el servidor.
A continuación, veremos cómo se utiliza el protocolo Noise Pipes para cifrar esta parte. Análisis binario
El cliente de WhatsApp para iOS contiene 2 binarios principales: el binario de la aplicación WhatsApp y el marco principal de WhatsApp.
En esta parte, los veremos más de cerca con el desensamblador de tolva y radare2.
Estos binarios se cifran cuando se descargan de la tienda de aplicaciones.
Aquí engañamos a Apple para que hiciera jailbreak a un dispositivo iOS y obtuviera acceso a estos archivos.
También agregue que estos binarios de Whatsapp fueron descifrados con bfdecrypt.
A continuación, le mostraré cómo reuní información sobre los fundamentos del protocolo, los algoritmos y las bibliotecas de código abierto que usa Whatsapp.
Las bibliotecas de código abierto son especialmente interesantes porque se pueden analizar fácilmente.
libsignal-protocol-c
Watsap usa libsignal-protocol-c, una biblioteca de código abierto, que implementó en el Protocolo de señal.
El protocolo se basa en el algoritmo Double Ratchet, que cifra los mensajes watsap.
Esta biblioteca se encontró en los binarios de Whatsapp para las siguientes características:
Watcap también usa libsrtp para implementar su protocolo de tiempo real seguro.
Los nombres de los símbolos se han eliminado de los binarios de Whatsapp, pero a pesar de esto, los binarios contienen líneas que indican directamente su enlace a libsrtp:
0x100ee57eb hit1_1 .d para inicializar libsrtp:% sFailed to r.
0x100ee580a hit1_2 .led para registrar libsrtp deinit.Failed.
0x100ee5831 hit1_3. Para desinicializar libsrtp:% sAES_CM_128_.
0x100ee5883 hit1_4 .ck crypto Init libsrtp. crear grupo ..
0x100f07b80 hit1_5. paquete:% slibsrtpstat prueba% s: c.
Además, los binarios de watsap contienen cadenas que se utilizan en el código sin formato de libsrtp, por ejemplo, "secuencia de clonación (SSRC: 0x% 08x)":
Según informes oficiales, Watzap utiliza el marco de protocolo de ruido para comunicarse de forma segura entre clientes y servidores.
Noise Protocol Framework fue diseñado para crear protocolos criptográficos fáciles de usar utilizando un conjunto de bloques discretos.
Pero estrictamente hablando, Watzap solo usa el Noise Pipes Protocol, que fue tomado del más completo Noise Protocol Framework.
Estas líneas se encontraron en los archivos binarios de Watzap:
“Noise_XX_25519_AESGCM_SHA256”,
• “Noise_IK_25519_AESGCM_SHA256”,
• “Noise_XXfallback_25519_AESGCM_SHA256”.
Estas líneas contienen los patrones de protocolo de enlace implementados en los clientes de Watsap.
La primera línea pertenece a la clase WANoiseFullHandshake.
El segundo es WANoiseResumeHandshake y el último es WANoiseFallbackHandshak.
No consideraremos en detalle cómo funciona este protocolo en el marco de este artículo.
Análisis de tiempo de ejecución
En esta parte, exploraremos el comportamiento del cliente watsap usando Frida.
Frida es el llamado Dinamic Instrumentation Toolkit, que es un conjunto de herramientas que te permiten inyectar tu propio código en otras aplicaciones sobre la marcha.
Nos conectaremos a un proceso en la aplicación y cambiaremos su comportamiento usando una consola JS interactiva.
Transporte de claves
En esta parte, exploraremos los mecanismos clave de trabajo del protocolo watcap.
De acuerdo con la descripción oficial de Whatsapp que describe el cifrado de una llamada VOIP, el iniciador de la llamada genera un secreto maestro SRTP aleatorio de 32 bytes.
Luego, el mensaje encriptado se transmite al lado B con el contenido de este secreto maestro SRTP.
Esta información se usa luego para la reconstrucción del lado B.
Primero, hice un rastreo usando la palabra "secreto":
Me las arreglé para hacer una notificación falsa sobre una llamada perdida de A a B, aunque la llamada fue iniciada por Mallory ...
Esto fue posible después de reescribir el creador de llamadas y de los parámetros en el JID en el lado A.
Aunque el nombre de Mallory se muestra en la notificación.
Cuando el Partido B comienza a responder a un mensaje de este tipo, se llama al Partido A en lugar de a Mallory.
Este comportamiento será más interesante de analizar más adelante.
Resumamos los resultados intermedios: en watsap, el secreto maestro cifrado se empaqueta en un mensaje de señal, que se agrega a las cadenas XMPP.
Las cadenas XMPP también contienen el ID y JID de ambos lados.
Pasar el secreto maestro a la otra parte
Según la descripción oficial de Watsup, los clientes utilizan el protocolo Noise Pipes con Curve25519, AESGCM y SHA256 del Noise Protocol Framework.
Si usa rastreo que contiene palabras clave relacionadas con el marco de protocolo de ruido, puede ver que la clase WANoiseStreamCipher se usa para encriptar llamadas a servidores Vatsap.
La clase usa el método encryptPlaintext.
Una vez iniciada la llamada, el valor de texto sin formato es el mensaje XMPP descrito anteriormente.
A continuación, el mensaje se vuelve a cifrar utilizando la biblioteca TLS de mbed mbedtls_gcm_crypt_and_tag.
mbedtls_gcm_setkey tiene un tamaño de 256 bits, lo que significa que se utiliza AES-256-GCM.
La clave de cifrado se utiliza del Protocolo de canalizaciones de ruido, que no se trata en este artículo.
El texto plano cifrado pasa a través de TCP al servidor Watsap (esto se puede ver con Wireshark).
El servidor luego reenviará este mensaje a la parte llamada para iniciar la llamada.
Modelado de clave
En esta parte, veremos cómo funciona la Función de formación de clave (KDF) /
Los resultados se obtuvieron usando Frida mientras se rastreaba la clase WAHKDF y la biblioteca libcommonCrypto.
La clase WAHKDF se utilizó para extraer claves, sal y códigos de un solo uso al inicializar secuencias SRTP.
El método deriveSecretsFromInputKeyMaterial se llama 10 veces antes de que comience la llamada:
Además, los desarrolladores también deben eliminar las constantes de cadena que contienen información crítica o pueden ser útiles para identificar la funcionalidad.