jueves, 19 de enero de 2017

Login Open Redirect en Facebook a traves de Youtube

Ya hemos hablado de esto antes en el blog. Primero fue con Google y recientemente con Facebook. A la fecha ambos fallos están parchados. Hoy le va a tocar nuevamente a Facebook }:) Vaya por delante que este Open Redirect ha sido reportado a Facebook pero no fue aceptado en su programa de Bug Bounty por considerarlo de poco riesgo.



El sistema Link Shim de Facebook

Es un mecanismo para redirecciones seguras que mitiga en gran medida los ataques de Open Redirect. Uno de los filtros que tiene es una lista negra de sitios maliciosos los cuales simplemente bloquea y deniega la redirección. Otra protección es el uso de "tokens" o "hashes" por usuario. Esto es, el mismo link de redirección dependiendo del usuario usa un hash de validación diferente. Luego un atacante no puede generar un link de redirección para otro usuario, porque el link solo funcionará para el atacante.

La estructura de los links es como se muestra a continuación. El parámetro "u" tiene el link de destino y el parámetro "h" el token o hash de validación.

https://www.facebook.com/l.php?u=http://example.com&h=xxxxxxxxx

Más info: http://www.facebook.com/notes/facebook-security/link-shim-protecting-the-people-who-use-facebook-from-malicious-urls/10150492832835766


Del Login al Link Shim

El login de Facebook emplea el parámetro "next" para hacer una redirección inmediatamente después de iniciar sesión. La URL es:

https://www.facebook.com/login.php?next=[PATH]

Sin embargo, este parámetro "next" no acepta URLs, solo rutas relativas. Para redirigir a un sitio externo tendremos que pasar por el sistema Link Shim. Así:

https://www.facebook.com/login.php?next=l.php/?u=[URL]%26h=[HASH]

Observe que uso "l.php/?u=..." en lugar de "l.php?u=...". Esta última forma simplemente no funciona ¿Será alguna validación?

Por ejemplo:

https://www.facebook.com/login.php?next=l.php/?u=http://example.com/%26h=xxxxxxxxx

Como ves, aún nos falta evadir las protecciones del Link Shim.


Los dominios especiales

Existen dominios especiales para los cuales no se valida el hash en el Link Shim. Es decir, con cualquier hash funciona la redirección. Eso sí, el hash debe tener exactamente nueve caracteres. Los dominios especiales que conozco son "youtube.com", "wikipedia.org" y por supuesto "facebook.com".

Por ejemplo:

https://www.facebook.com/l.php?u=http://www.youtube.com/&h=myownhash

https://www.facebook.com/l.php?u=http://www.wikipedia.org/&h=fooooobar

Con esto, un Open Redirect en Youtube (o en La Wikipedia) nos permitiría encadenar redirecciones desde el login de Facebook hasta un sitio web bajo nuestro control }:) Pero primero... hay que encontrar ese Open Redirect en Youtube.


Buscando Open Redirects en Youtube

Con una búsqueda en Google salieron una infinidad de sitios web que reciben redirecciones desde Youtube.

Dork: site:youtube.com inurl:redirect

Por ejemplo:

https://www.youtube.com/redirect?q=http://www.utoledo.edu/menu/colleges.html&usg=K_jatwPKxW8t5xvBaY-osMeHvP4=

En este caso el parámetro "q" tiene la URL destino y el parámetro "usg" un token para validar integridad. Si modifico un solo caracter de la URL destino, Youtube notificará el intento de redirección. Adiós técnicas de bypass.

También pensé en hacer que Youtube genere uno de esos links de redirección hacia un sitio web bajo mi control. Sin embargo, aún no averiguo como hacerlo. Supongo que Youtube los genera automáticamente por alguna razón.

Por último está la no muy glamurosa opción de vulnerar cualquiera de los sitios web que aparecen en los resultados de búsqueda. Pero no sería ético, no lo podría reportar, ni comentar por aquí. Aunque a un atacante real eso le da igual y siempre va a optar por el camino de menor resistencia.

Buscando otras formas de redirección encontré esta URL:

https://accounts.youtube.com/accounts/logout?continue=http://www.blogger.com/logout-redirect.g?blogID=[BLOGID]


Esta URL cierra la sesión en Youtube y redirige al "logout" de Blogger. Luego de cerrar la sesión en Blogger redirige al blog indicado por el parámetro "blogID" ¡Ya lo tenemos! una redirección a un blog arbitrario. Por ejemplo:

https://accounts.youtube.com/accounts/logout?continue=https://www.blogger.com/logout-redirect.g?blogID=1132667815779484473

Luego podemos editar el template del blog para poner una redirección a otro sitio donde esté la página de phishing o porqué no levantar el phishing en el mismísimo Blogger :)


Encadenando redirecciones

En resumen, esta será la cadena de redirecciones:

https://www.facebook.com/login?next=l.php%2F%3Fu%3Dhttps%253A%252f%252faccounts.youtube.com%252f%252561ccounts%252fLogout2%253Fservice%253Dblogger%2526continue%253Dhttp%25253A%25252f%25252fwww.blogger.com%25252flogout-redirect.g%25253FblogID%25253D2682627948163945313%26h%3Dxxxxxxxxx

La PoC anterior es la que originalmente reporté a Facebook. A la fecha, esta prueba de concepto ya no funciona. Sin embargo creo que aún es posible burlar el LinkShim para ejecutar la redirección. En cualquier caso, pueden verlo en este vídeo:




Un saludo.

2 comentarios: