martes, 5 de agosto de 2014

Visita a Black Hat USA 2014



Buenos días a todos desde Las Vegas! Después de un intenso viaje, no sin alguna complicación técnica gracias a las aduanas de EEUU que me hicieron perder la conexión con mi vuelo, ya estoy listo y con las demos funcionando al 100% para mañana Black Hat USA 2014.

Los que vayáis a asistir, estaré en el Arsenal de  12:45 p.m. a 3:15 p.m mostrando WhatsApp Privacy Guard, con las últimas modificaciones para que sea completamente funcional con el nuevo protocolo de autenticación WAUTH-2.

Además, de  2:15 p.m. a 2:45 p.m daré una charla sobre su funcionamiento, en la que hablaré también de todos los descubrimientos que hemos ido descubriendo Pablo y yo a lo largo del último año.

Ya iré contando... }:)

martes, 10 de junio de 2014

WhatsApp Authentication: profundizando en WAUTH-1 y WAUTH-2



En esta segunda entrada voy a profundizar en los mecanismos de autenticación de WhatsApp WAUTH-1 y WAUTH-2, ya que el mecanismo de MD5 se dejó de utilizar el 24 de diciembre de 2012.


EN QUÉ CONSISTE WAUTH-1
En WAUTH-1 en el momento de registrar el teléfono en el servicio, cuando recibimos un SMS con un código, se genera un password en los servidores de WhatsApp que será un secreto compartido entre el teléfono y los servidores.

Cuando el teléfono trata de logarse en WhatsApp para recibir o enviar mensajes, los servidores de WhatsApp le envían un challenge de 20 bytes, que junto con el password (secreto compartido) generarán las claves RC4 y HMAC  de la sesión. La forma de autenticarse es que el teléfono cifre con la clave de sesión su número de teléfono concatenado con el challenge enviado por el servidor y concatenado con el timestamp. Los servidores de WhatsApp descifraran el mensaje y verificaran que se compone del numero de telefono, el challenge enviado y un timestamp.

Las claves de sesión RC4 y HMAC son el resultado de usar PKDBF2, con el password (secreto compartido), utilizando el challenge del servidor como salt y SHA1 como función de hash. Se utilizan 16 iteraciones de este algoritmo y los 20 bytes mas significativos del resultado son empleados como clave RC4 (para cifrar la comunicación) y HMAC-SHA1 (para validar la integridad de los mensajes) durante la sesión establecida entre el teléfono y los servidores de WhatsApp.

Al usar la misma password para cifrar los mensajes enviados desde el teléfono hacia los servidores y desde los servidores hacia el teléfono se produce la vulnerabilidad que comentamos en NocOnName 2013, que permitiría revelar las conversaciones de WhatsApp. 

Cuando hicimos nuestra presentación en RootedCON 2014 se empezó a formar un gran revuelo en las redes sociales por que WhatsApp "obligaba" a los usuarios de Android a actualizarse a una nueva versión. En nuestra charla explicamos que es lo que creíamos que se perseguía con esa actualización, que no era otra cosa mas que finalizar el soporte de WAUTH-1 como autenticación y utilizar exclusivamente WAUTH-2 para todas las plataformas.


EN QUE CONSISTE WAUTH-2
WAUTH-2 sigue basándose en un secreto compartido entre el teléfono móvil y los servidores de WhatsApp, el cual se genera en el momento de registrar el teléfono en WhatsApp, pero la forma de generar las claves de sesion de RC4 y de HMAC varía para solventar el problema de usar la misma clave para cifrar las comunicaciones en el cliente y en el servidor. Se sigue utilizando PKBDF2, con el secreto compartido y el challenge enviado por el servidor como salt y también se sigue utilizando como resultado los 20 bytes más significativos. Hasta aquí las partes que continuan igual que el algoritmo anterior.

Lo que cambia es que se utiliza PKBDF2 cuatro veces en lugar de una vez, para generar 4 claves diferentes, se utilizan solo 2 iteraciones del algoritmo en lugar de las 16 anteriores. Cada vez que se llama a PKBDF2 se concatena al final un byte al challenge, la primera vez se concatena el byte 0x01, la segunda 0x02 y así sucesivamente hasta completar las 4 llamadas.

De esta forma se generan cuatro claves diferentes:
  • La primera clave se utiliza para cifrar y descifrar, mediante RC4, las conversaciones desde el teléfono hacia los servidores de WhatsApp.
  • La segunda clave se utiliza para validar la integridad de los mensajes enviados desde el teléfono hacia los servidores de WhatsApp mediante HMAC-SHA1.
  • La tercera clave se utiliza para cifrar y descifrar, mediante RC4, las conversaciones desde los servidores de WhatsApp hacia el teléfono.
  • La cuarta clave se utiliza para validad la integridad de los mensajes enviados desde los servidores de WhatsApp hacia el teléfono mediante HMAC-SHA1.

Otro punto que cambia es que a la hora de calcular el HMAC-SHA1 de los mensajes, se concatenan cuatro bytes al final del mensaje con el número de mensaje. Esto es si el mensaje que vamos a mandar es el tercero que intercambiamos se concatenan los bytes 0x00 0x00 0x00 0x03 al final del mensaje antes de calcular el HMAC-SHA1.

Pablo San Emeterio

martes, 3 de junio de 2014

WhatsApp Authentication: MD5 vs WAUTH-1 vs WAUTH-2



Este es mi primer artículo en el blog de mi compañero de conferencias y amigo Jaime Sánchez. Nos habéis visto participar conjuntamente en distintos congresos y ahora me sumo al blog de Seguridad Ofensiva. En este caso voy a hablar de los mecanismos de autenticación que ha utilizado WhatsApp, sus características y consecuencias.

La primera vez que empecé a trastear con WhatsApp fue a mediados de 2012, y desde entonces el username no ha cambiado hasta ahora. El nombre de usuario que se utiliza para logarse en WhatsApp es el número de teléfono del terminal. Esto tiene sus partes positivas y negativas. La parte positiva y creo que el motivo principal de esta decisión por parte de los desarrolladores de WhatsApp es que te aseguras que cada cuenta creada pertenece a un número de teléfono móvil. La parte negativa es que una vez conoces el número de teléfono móvil de una persona sabes cual es su username en WhatsApp.

El password en cambio ha sufrido tres modificaciones desde mediados de 2012, cuando el password era el resultado de una función hash, MD5 concretamente, sobre un elemento ligado al terminal. La dirección MAC en el caso de IOS y el IMEI para terminales Android, Windows Phone y Symbian.

Cuando esto fue público se publicaron varios ataques como el Espía WhatsApp y el Rompe-parejas que se podían realizar al juntar este tipo de autenticación con APIs como yowsup o WhatsAPI. Con un escaneo de una red Wifi se podía obtener resultados como los de la imagen inferior, con las direcciones MAC de los iPhone a los que los usuarios les suelen poner el nombre del propietario. 



WhatsApp decidió cambiar la forma de autenticarse y el 24 de Diciembre de 2012 dejó de dar soporte a la autenticación basada en MD5 y se forzó a todos los usuarios de WhatsApp a actualizar la aplicación y migrarse al nuevo sistema de autenticación. Esta autenticación la llamamos WAUTH-1, por que en la última actualización de WhatsApp se envía un texto que indica WAUTH-2 como se puede ver en la imagen inferior.

En ninguna parte hay documentación técnica a este respecto. Sin embargo en WAUTH-1 no hay ningún texto, como se puede ver en la siguiente imagen:

En WhatsApp se generan 4 claves. Dos son para la sesión del teléfono y otras dos para la sesión del servidor. Las dos claves son una la clave RC4 utilizada para cifrar los mensajes y la otra la clave empleada para generar un HMAC del mensaje a enviar.

En la próxima entrega entraremos más en detalle sobre el funcionamiento de WAUTH-1 y WAUTH-2. Mientras tanto si queréis conocer más detalles, os recomiendo echar un vistazo a nuestra presentación de RootedCON 2014, llamada WhatsApp: mentiras y cintas de vídeo.

Pablo San Emeterio