domingo, 12 de enero de 2014

Descubriendo nuevas vulnerabilidades en Snapchat



Como todos sabéis, antes de que finalizara el año 2013 el grupo Gibson Security publico un informe extenso sobre el funcionamiento de Snapchat, que comenté en el post del blog Entendiendo el protocolo de Snapchat y sus Vulnerabilidades.

Como sabéis, este Sábado estaremos en Washington DC para dar una charla en la conferencia Shmoocon, llamada Malicious Threats, Vulnerabilities and Defenses in WhatsApp and Mobile Instant Messaging Platforms. En ella hemos incluído un par de vulnerabilidades interesantes que hemos encontrado en Snapchat.

Ambas tienen que ver con la gestión y el envío de snaps (o imágenes) a otros usuarios a través de la aplicación. Según podemos ver en el informe publicado por Gibson, la petición se realiza primer llamando a la función /ph/upload:
{
    username: "youraccount",
    timestamp: 1373207221,
    req_token: create_token(auth_token, 1373207221)
    media_id: "YOURACCOUNT~9c0b0193-de58-4b8d-9a09-60039648ba7f",
    type: 0,
    data: ENCRYPTED_SNAP_DATA
}

Después se invoca a /ph/send con el identificador único para el fichero multimedia y la lista de usuarios a los que se envía:
{
    username: "youraccount",
    timestamp: 1373207221,
    req_token: create_token(auth_token, 1373207221),
    media_id: "YOURACCOUNT~9c0b0193-de58-4b8d-9a09-60039648ba7f",
    recipient: "teamsnapchat,someguy",
    time: 5,
    zipped: "0"
}

Hasta aquí parece que es todo normal, salvo cuando comenzamos a realizar pruebas. Estas dos funciones pueden ser sustituídas por otra única cuando hay un error al subir y enviar el fichero. En este caso se utiliza /pg/retry:
{
    username: "youraccount",
    timestamp: 1373207221,
    req_token: create_token(auth_token, 1373207221),
    media_id: "YOURACCOUNT~9c0b0193-de58-4b8d-9a09-60039648ba7f"
    type: 0,
    data: ENCRYPTED_SNAP_DATA,
    zipped: "0",
    recipient: "teamsnapchat,someguy",
    time: 5
}

En principio debería funcionar todo exactamente igual. Es necesario proporcionar un token válido y nuestro nombre de usuario. Pero, ¿qué ocurre si interceptamos la petición en tiempo real y sustituímos el nombre de usuario original?

En principio necesitaríamos un token nuevo correspondiente a ese usuario. ¿Y si eliminamos el token de la petición?. Pues os vais a sorprender, pero resulta que la petición SIGUE FUNCIONANDO!!!! Resulta que podemos enviar mensajes como si fuéramos cualquier otro usuario!

Ahora queda resolver el último problema, ya que por defecto, las cuentas están configuradas para recibir únicamente snaps de usuarios que hayamos añadido como amigos. Bueno, eso no es 100% real, ya que hay una cuenta que todos los usuarios tienen como amigo en común, y no es otra que la oficial teamsnapchat.

Las posibilidades que nos da este error en la API de Snapchat son múltiples. Podríamos coger el leak de 4 millones de usuarios publicados y hacer un script que automáticamente enviara un snap a cada uno de ellos haciendose pasar por la cuenta oficial, podríamos enviar spam a una cuenta determinada o floodear a un usuarios sin que pudiera impedirlo.

Lamentablemente, ésta vulnerabilidad fue subsanada por el equipo de Snapchat la noche de Reyes, por lo que a día de hoy no funciona:

Como es lógico, ahora es necesario que el token sea válido y corresponda con el usuario que está realizando el envío. Pero debido a que ese token no es de un solo uso, podeis igualmente enviar spam a un usuario que tengáis en vuestra lista de amigos o que acepte snaps de cualquiera. Os dejo un vídeo como prueba de concepto. No os perdáis el final!


Publicaremos mucha más información interesante en breve :)