PDA

Ver la versión completa : WhatsApp Account Hijacking



4v7n42
08-09-2011, 16:32
S21sec notificó dicha vulnerabilidad en su momento al equipo de desarrollo de WhatsApp y, según nos confirmaron, ha sido corregida en la versión actual.

La vulnerabilidad detectada tiene que ver con la manera en la que WhatsApp realiza la autenticación inicial para el registro. Cuando instalamos WhatsApp por primera vez en nuestro terminal éste nos solicita que le introduzcamos nuestro número de teléfono y, de alguna forma, él comprueba que el número es correcto y pasa a registrarnos como ese número. A partir de ese momento ya podemos hablar con nuestros contactos.

¿Cómo comprueba WhatsApp que somos realmente el número que decimos ser? Aquí viene el problema, ya que utiliza únicamente mecanismos en el propio terminal, los cuales podrían ser manipulados, como veremos a continuación.


http://www.youtube.com/watch?v=EuOyBXFCw9c&feature=player_embedded

En este video podemos ver en qué consistía el proceso de validación de WhatsApp antes de la corrección de la vulnerabilidad. Para comprobar si el número introducido es correcto, la aplicación de WhatsApp genera un token alfanumérico y construye un SMS de la forma "WhatsApp [Código] WhatsApp internal use - safe to discard" y lo envía al número que el usuario le ha introducido. Si efectivamente es el propio número, el SMS irá hasta el centro de mensajes del operador correspondiente y este volverá al terminal.

En ese momento la aplicación de WhatsApp recibe el SMS y comprueba que el Token recibido es el mismo que el enviado. Si esto es así, eso quiere decir que el número introducido por el usuario es el correcto, y por lo tanto, envía una conexión a WhatsApp registrando el usuario, asignándole una contraseña.

Ahora viene la pregunta: Dado que todo este proceso se realiza en el software instalado en nuestro terminal móvil, y como dueños de este tenemos total control sobre el software que instalamos... ¿podríamos modificar el software de WhatsApp para que simplemente aceptara cualquier número que le introduzcamos como válido?

La respuesta (al menos antes de la corrección de la vulnerabilidad) es SI.

Bucear por el código de WhatsApp resulta un poco complicado, ya que todo ha sido ofuscado para intentar evitar técnicas de Ingeniería Inversa, pero aún así, podemos encontrar ciertos puntos claves en el código, como las llamadas a ciertas APIs, por ejemplo la de envío de SMS.


http://1.bp.blogspot.com/-WsQxgMKto_8/TmTYC1PEWtI/AAAAAAAAAlI/Jer3MAZ1oNA/s640/WhatsApp01.png

Si observamos las llamadas que hay en el código a los objetos SmsMessage y SmsManager, veremos un par de zonas del código en las que se contruye un SMS con el número de origen que hemos introducido por teclado y otra donde se lee el número de origen del SMS recibido. Teniendo localizadas estas zonas del código ahora solo nos quedaria cambiar el código de tal forma que, pongamos el teléfono que pongamos al arrancar la aplicación, el SMS sea siempre enviado a nuestro número real, y que cuando este se compruebe, la aplicación crea que el origen es el correcto.


http://3.bp.blogspot.com/-3mDEK9Gt4RI/TmTYKbDCeMI/AAAAAAAAAlM/BbfCn_zmDOM/s640/WhatsApp02.png

Como podemos ver en la captura anterior, hemos mirado en la definición de la función sendDataMessage() en que parámetro está el número de destino y hemos visto que es el primer parámetro. En este tipo de definiciones, a la que vemos que se le pasa un vector de parámetros (v0 .. v6), el v0 es el puntero al propio objeto (self) y el v1 es el primer parámetro, es decir, el que buscamos, así que si buscamos hacia arriba donde se asigna el valor de la variable v1 vemos que sale de una variable del objeto VerifySms. Como nosotros queremos que envíe el SMS a nuestro propio teléfono independientemente del teléfono que introduzcamos en la aplicación, simplemente comentamos esta linea e introducimos una asignación estática de la variable v1 a nuestro número de teléfono real (marcado con XXXXX en la imagen).

Para la recepción del SMS hacemos el proceso análogo, pero esta vez con la función getDisplayOriginatingAddress() del objeto SmsMessage, en la que cada vez que es llamada, nosotros asignamos estáticamente el valor que queremos a continuación.


http://4.bp.blogspot.com/-4Tn8Xp7mNuo/TmTYSk32h4I/AAAAAAAAAlQ/kL2koC-PEiM/s640/WhatsApp03.png

Una vez hecho esto, volvemos a empaquetar la aplicación, la instalamos en el móvil y probamos a ver si somos capaces de suplantar la identidad de una persona en WhatsApp:


http://www.youtube.com/watch?v=MJHJKpZcHNs&feature=player_embedded

SI! Parece que esto funciona (o mejor dicho, funcionaba). Esta vulnerabilidad nos ha permitido el robo de cuentas de usuario de WhatsApp. Por suerte, el usuario cuya cuenta es robada vería un mensaje en su pantalla diciendo algo así como "no utilices WhatsApp en más de un teléfono móvil", con lo cual puede darse cuenta que alguien ha conseguido robarle la cuenta, pero aún así se trataba de una vulnerabilidad importante que debía ser corregida.

Para evitar este tipo de incidencias, es recomendable no dar por supuesta la seguridad en ningún tipo de software, aunque este sea un software ampliamente usado y conocido, y en el caso de que se pretenda utilizar un software para manejar información crítica o en un sistema que almacena o procesa este tipo de información, este debería ser auditado por personal debidamente cualificado. El que sea un software ampliamente usado no es en ningún caso una garantía de seguridad.

Fuente (http://blog.s21sec.com/2011/09/whatsapp-account-hijacking.html)