11 sept 2013

Login y ataques CSRF: Espiando a un usuario en Tuenti

Si alguien se pregunta para qué iba a querer usar un ataque CSRF para forzar a un usuario a loguearse en una cuenta de mi propiedad de la que ya poseo las credenciales, espero que este post pueda despejar sus dudas. El pasado mes de julio reporté esta vulnerabilidad a Tuenti (ya solucionada), por lo que fui incluido como agradecimiento en su Hall of Fame.
El ejemplo más sencillo de este tipo de ataques lo podíamos encontrar con Google, cuyo equipo hace tiempo que solucionó el problema en todos sus servicios de login. Entre las opciones de configuración del buscador se encuentra "Activar historial web" que se encarga de almacenar todas nuestras búsquedas cuando estamos dentro de una sesión. Imaginemos a un atacante cuya intención es trazar la personalidad, las aficiones, intereses, etc. de su víctima en base al uso que hace del buscador. Si el atacante es capaz de loguear a la víctima en una sesión cualquiera de Google que tenga esta opción activada, sólo tendrá que esperar a que el usuario realice sus búsquedas normalmente para luego entrar en la cuenta y espiar el historial generado.
Dependiendo de la naturaleza de la aplicación web, el ataque puede necesitar algún punto de apoyo y tener distintas consecuencias. En una red social como Tuenti, si nos lo curramos un poco, se pueden llegar a espiar mensajes privados, peticiones de amistad, publicaciones privadas, etc.Como no hay mejor explicación que una prueba de concepto, aquí van los pasos para reproducir el ataque con vídeo incluido (se distinguirá mejor si subís la calidad a "HD"):

1. El atacante modifica el perfil de una cuenta cualquiera (fakeaccount@gmail.com) imitando el perfil de la víctima. Este es el punto de apoyo del que hablábamos anteriormente. Se podría imitar superficialmente con el nombre, foto de perfil, etc., o con más detalle usando contactos falsos, álbumes, intereses, eventos... Todo depende del grado de interés del atacante.

2. El atacante crea una página web que fuerza automáticamente un logueo en Tuenti usando la cuenta falsa. Para ello, aprovecha que el sistema de login es vulnerable a CSRF y no incluye la validación habitual de un token aleatorio que evite una autenticación desde una página externa. Por otra parte, apunta el target del formulario hacia un iframe oculto para que el acceso se produzca de forma silenciosa:
<form name="evilForm" id="evilForm" method="POST" 
    action="https://secure.tuenti.com/?m=Login&func=do_login" target="hiddenIFrame">
    <input type="hidden" name="email" value="fakeaccount@gmail.com" />
    <input type="hidden" name="input_password" value="12341234" />
</form>

<iframe name="hiddenIFrame" src="" id="hiddenIFrame" width="0" height="0" style="visibility:hidden">
</iframe> 

<script>
    document.forms[0].submit();
</script>
3. El atacante convence a la víctima para visitar la página anterior y le sugiere realizar alguna acción en Tuenti.

4. La víctima visita la página, lo que fuerza un logueo silencioso en la cuenta falsa.

5. Posteriormente, la víctima visita Tuenti para realizar alguna acción. Al haber sido ya logueada en el paso anterior, no se le solicitarán sus credenciales.

6. Al cabo de un tiempo, el atacante entra en la cuenta falsa y espía las acciones que ha realizado la víctima.

Por supuesto, la víctima puede llegar a notar que echa de menos mensajes y demás recursos dependiendo de lo minucioso que haya sido el atacante al clonar el perfil y de la información que disponga de él. Sin embargo, os aseguro que lo habitual es que un usuario medio siga realizando acciones sin alarmarse demasiado, atribuyendo la falta a algún error puntual. Más aún si lo mantenemos entretenido en una conversación con algún contacto falso que hayamos añadido a la cuenta clonada.
Quiero dar mi enhorabuena al equipo de Tuenti, ya que después de recibir la notificación solucionó el problema en menos de 24 horas añadiendo la validación del token aleatorio en el formulario de acceso:
<input type="hidden" name="csfr" value="2a996033">
¡No marginéis a vuestros sistemas de login a la hora de protegerlos contra ataques CSRF!¡Saludos!
Contribución de José Rabal Sastre

2 comentarios:

  1. [...] Si alguien se pregunta para qué iba a querer usar un ataque CSRF para forzar a un usuario a loguearse en una cuenta de mi propiedad de la que ya poseo las credenciales, espero que este post pueda despejar sus dudas. El pasado mes de julio reporté esta vulnerabilidad a Tuenti (ya solucionada), por lo que fui incluido como agradecimiento en su Hall of Fame.  [...]

    ResponderEliminar