Ayuda en la conexion del WhatsApp

Iniciado por rodarima, 18 Agosto 2011, 02:12 AM

0 Miembros y 2 Visitantes están viendo este tema.

rodarima

Veamos, soy bastante novato aquí, a si que disculpen si he colocado mal el post, o si es indebido.

Resulta que tras mucho pensar, no doy descubierto cual es la manera de autenticar el whats app, para que se conecte.

El whats utiliza el protocolo xmpp, pero cambiado, de forma que a todas las palabras clave se les asigna un número hexadecimal, y luego, se transforma como si fuese un diccionario.

La tabla: http://pastebin.com/EGmkazRj

El proceso de autentificacion es el mismo que xmpp con digest md5.
Primero se envia una peticion con los bytes:
0x57, 0x41, 0x01, 0x00 que son (W A 0x01 0x00)

A continuación, se envía otro paquete con los datos del telefono, y los métodos de autentificacion disponibles (DIGEST-MD5-1)

0000   00 19 f8 05 01 a0 8a 84 fc 11 69 50 68 6f 6e 65  ..........iPhone
0010   2d 32 2e 36 2e 34 2d 35 32 32 32 00 08 f8 02 96  -2.6.4-5222.....
0020   f8 01 f8 01 7e 00 07 f8 05 0f 5a 2a bd a7        ....~.....Z*..


Despues de esto, recibimos 3 paquetes.

El primero:

0000   00 05 f8 03 01 38 8a                             .....8.

El segundo:

0000   00 08 f8 02 96 f8 01 f8 01 7e                    .........~

El tercero:

0000   00 5b f8 04 1a bd a7 fc 54 62 6d 39 75 59 32 55  .[......Tbm9uY2U
0010   39 49 6a 4d 34 4d 44 63 78 4d 54 45 79 4d 44 45  9IjM4MDcxMTEyMDE
0020   69 4c 48 46 76 63 44 30 69 59 58 56 30 61 43 49  iLHFvcD0iYXV0aCI
0030   73 59 32 68 68 63 6e 4e 6c 64 44 31 31 64 47 59  sY2hhcnNldD11dGY
0040   74 4f 43 78 68 62 47 64 76 63 6d 6c 30 61 47 30  tOCxhbGdvcml0aG0
0050   39 62 57 51 31 4c 58 4e 6c 63 33 4d 3d           9bWQ1LXNlc3M=


En el ultimo paquete hay una cadena codificada en base64, que contiene los siguientes datos:

nonce="3807111201",qop="auth",charset=utf-8,algorithm=md5-sess

A partir de aquí, una función se encarga de elaborar una cadena de texto, que sera la que realice la autentificación. El proceso es muy similar al descrito aqui:
http://www.cyberhades.com/2011/07/20/solucion-al-reto-zeropwn-wgsbd2/
Pero hay un pequeño problema, que no encuentro la contraseña por ningún sitio. Aqui la función que se encarga de ello, en el whats:
http://pastebin.com/nKxX3vzc

Llama a la variable password en Lwhatsapp/FunXMPP$Connection; Sin embargo, en esa clase, no se define por ninguna parte.

http://ifile.it/ifn396p
http://www.gigasize.com/get/2vn56xdffsc

Las clases de encuentran en la carpeta classes/Whatsapp

La funcion de la página de cyberhades, que interesa es:

def sasl_md5_chall(uname, pass, realm, nonce, cnonce, nc, digest_uri, qop)

    hA1data = Digest::MD5.digest("#{uname}:#{realm}:#{pass}")
    hA1data = hA1data + ":#{nonce}:#{cnonce}".force_encoding("UTF-8")
    hA1 = Digest::MD5.hexdigest(hA1data)
    hA2 = Digest::MD5.hexdigest("AUTHENTICATE:#{digest_uri}")
    hash = Digest::MD5.hexdigest("#{hA1}:#{nonce}:#{nc}:#{cnonce}:#{qop}:#{hA2}")

    return hash

end



A continuacion se forma el paquete donde va el response, que es el dato que me falta por generar, y que va cifrado en base64:

dXNlcm5hbWU9IlhYWFhYWFhYWFhYIixyZWFsbT0icy53aGF0c2FwcC5uZXQiLG5vbmNlPSIzODA3MTExMjAxIixjbm9uY2U9IjVBNzU4OUI4LTk0MkItNDlBRi1CMDJCLTdCREZBNjEzMjA0OSIsbmM9MDAwMDAwMDEscW9wPWF1dGgsZGlnZXN0LXVyaT0ieG1wcC9zLndoYXRzYXBwLm5ldCIscmVzcG9uc2U9NjhiMGYwMTQ2MjZhODBlYjcxN2FkYzE0M2I1NTdlMDksY2hhcnNldD11dGYtOA==

que si se descifra es:

username="XXXXXXXXXXX",realm="s.whatsapp.net",nonce="3807111201",cnonce="5A7589B8-942B-49AF-B02B-7BDFA6132049",nc=00000001,qop=auth,digest-uri="xmpp/s.whatsapp.net",response=68b0f014626a80eb717adc143b557e09,charset=utf-8

Donde obviamente en vez de XXXXXX pone tu número de teléfono.

Mi intención es hacer un programa que me permita enviar un mensaje a un móvil determinado usando el whatsapp.
Si alguien me puede ayudar en esto se lo agradecería


el-brujo

#1
Recientemente analizaron la seguridad de WhatsApp en SecurityByDefault, pero creo que han hecho bastantes cambios, mira a ver si te sirve de todas maneras:

¿Penosa seguridad en WhatsApp?
http://foro.elhacker.net/seguridad/iquestpenosa_seguridad_en_whatsapp-t328951.0.html

rodarima

#2
Si, ya he estado leyendo ese post antes, pero todo lo que llega a decir del whatsapp ya lo había leido. Lo único que me falta saber es como se genera la contraseña en el paquete response. En ese post dice que le preguntaron a whatsapp pero que les dijeron que la contraseña era simplemente "password". Yo he probado con esa y algunas más, pero no soy capaz e generar el mismo md5.

Teniendo el código fuente decompilado no se si resultará más sencillo, pero el caso es que cuando trato de buscar la definicion de la cadena password, no la encuentro por ningún fichero. Simplemente se llama a password y eso devuelve un valor, pero la definición de password es simplemente del tipo:

String password;

En el buscador de windows 7, que busca en el texto de los archivos también busqué password, y hay una clase de apache, que esta en otra carpeta que si mal no recuerdo se llama NTCredentials, pero ahí no encontré nada que asignara un valor a password, simplemente usa el valor de password.

Por otra parte el cnonce, supongo que será un valor long aleatorio de 16 bytes, que se pasa a hexadecimal, sin embargo, tampoco me explico como en vez de aparecer como:

12345678123412341234123456789012

Aparece como:

12345678-1234-1234-1234-123456789012

Quizas en el código original hay una máscara en la funcion toString que al decompilarse no se muestra correctamente.

Sin embargo si es un número aleatorio, supongo que no importará que use el mismo cnonce en todas las conexiones.

A ver si hay alguien que me pueda ayudar en esto. Muchas gracias por adelantado.  :rolleyes:

lamaruja

Una pregunta sobre android whatsapp:
Se podría usar whatsapp desde pc con algun emulador de android o algun programa compatible, y asi poder mandar mensajes a moviles con whatsapp?

Gracias

lag

Buenas,

Llevo unos días con esto y veo que hace más de un par de meses que lo intentaste tú; ¿Descubriste algo más?

Dejando de lado el misterio de la password: ¿por que crees que la función del ejemplo del wargame es correcta? Yo he mirado en la wikipedia y para hacer el MD5 digest nos hace otra cosa muy diferente y, he econtrado otros post que trabajan sobre la misma prueba de el mismo wargame y también nos hacen otras cosas diferentes para generar el MD5 correcto del response.

http://en.wikipedia.org/wiki/Digest_access_authentication

http://fulapol.wordpress.com/2011/07/23/write-up-wgsbd2-zeropwn/

¿Avanzaste algo más desde entonces? Me estoy volviendo loco y será una pena tener que rendirse con esto.

Por cierto, también he valorado que "password" pueda ser el código de activación con el que el whatsapp te hace autentificar tu número, esto tendría sentido también en el aspecto de no permitir que todos entraran en tu buzón y suplantaran tu "telefono" no obstante es un código de 3 cifras así que si de eso se trata como mucho en 999 intentos lo tendríamos de todos...

lag

Ah, por cierto, he hecho algunas pruebas que han dado resultados muy interesantes montando un "servidor" de whatsapp generando yo el base64 para esperar la respuesta y ver en función de qué varía el response.

Comentame un poco donde te has quedado y vemos de poner en común si te parece.

rodarima

#6
He descubierto algo mas tambien. Resulta que al modificar el uuid del iphone, el whats app deja de funcionar. No se conecta. De modo que el uuid tiene que formar parte de la autentificación.
Lo que necesitaba era alguien que tuviera bastante conocimiento de java, y que me ayudase a decompilar el codigo fuente de la aplicacion para android. Yo lo he mirado por encima y parece que esta ofuscado.

La autentificacion esta sacada literalmente del codigo de la aplicacion. Supongo que seguira siendo asi.

Un saludo!  :D

kilburn

#7
Buenas,

No se si todavía estáis con este temilla, pero a mi también me interesa.

He encontrado este post mientras hacia la "googleada" inicial para descubrir que había ya hecho y no perder más tiempo del necesario, así que de momento tampoco puedo aportar mucho.

Aun así, creo que sí que puedo contestar a esta parte:
CitarPor otra parte el cnonce, supongo que será un valor long aleatorio de 16 bytes, que se pasa a hexadecimal, sin embargo, tampoco me explico como en vez de aparecer como:

Código:

12345678123412341234123456789012

Aparece como:

Código:

12345678-1234-1234-1234-123456789012


Quizas en el código original hay una máscara en la funcion toString que al decompilarse no se muestra correctamente.

Sin embargo si es un número aleatorio, supongo que no importará que use el mismo cnonce en todas las conexiones.

Por el formato en que aparece, cnonce corresponde a un UUID random. Se trata de 16 bytes de los cuales 1,25 son fijos (para indicar que es UUID random) y el resto generados aleatoriamente.

La forma de mostrarlo es esa porque es el estándard de visualización de todos los UUIDs. De hecho, no creo que el darle ese formato sea cosa de WhatsApp sino de la librería que sea que utilizan para tratar con ellos.

Si descubrís algo más postead por aquí por favor!

rodarima

Ya consegui conectarme al servidor del whatsapp. Hace falta el imei del telefono para generar el hash de la contraseña que se usa en el digest.
Saludos

kilburn

Hay alguna posibilidad de que compartas el código q tienes? :P