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/ (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 (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://ifile.it/ifn396p)
http://www.gigasize.com/get/2vn56xdffsc (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
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
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:
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
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...
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.
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
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 (http://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29). 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!
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
Hay alguna posibilidad de que compartas el código q tienes? :P
Hola,
Yo también estoy interesado en este asunto.
Hay un hilo en xda-developers donde alguien dice tener un api:
http://forum.xda-developers.com/showthread.php?t=1344114
Yo personalmente al pasar muchas horas delante del pc echo en falta poder utilizar whatsapp desde el pc, ya sea de forma propia o sincronizada con el móvil.
Creo que lo más sencillo en este aspecto sería elaborar un plugin para libpurple (pidgin, ...) modificando los disponibles para xmpp. El problema sería si se quisiera que esas conversaciones también quedaran registradas en la aplicación móvil.
En el hilo de xda-developers están interesados también en portar la aplicación para webos y otros.
Yo estaría dispuesto a colaborar de alguna forma en algún desarrollo, preferiblemente de código abierto. Tengo conocimientos de Android y principalmente Java y entornos web, aunque no tendría problema en ponerme con cualquier otra cosa al ser ingeniero informático, por ejemplo con un plugin para libpurple.
Saludos
Cita de: rodarima en 2 Enero 2012, 17:06 PM
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
Podrias explicar que algoritmo usa para generar el password?????
Graciass!!
Si alguien quiere colaborar para crear un chat para el whats app para ordenador me lo comunique por privado. Entonces comento mas detalles. Por ahora ya he creado un pequeño chat que permite tener una conversacion con una persona sabiendo su nº. Saludos!
Aqui teneis un analisis de un mensaje al telefono 666666666 con el texto "Da":
00[packet length]f8085da0fafc0b[cc][phone]8aa21b43fc[timestamp lenght][timestamp]2d[messaje index]f802f804babd4ff801f8018cf80216fc[body lenght][body]
list binary 8
| id
| length:11 |
list binary 24 | | | list binary 8 index (7)
| | | cc: phone: | | |
| 8 items | | +34 666666666 | | length:12 "-" |
| | | | ____________^_________ | | | | |
0037 f8 08 5d a0 fa fc 0b 3334363636363636363636 8a a2 1b 43 fc 0c 31333235313235383239 2d 37
| | | | | | | ----------v---------
| | | jid-pair | | chat timestamp:1325125820
| | | | | Thu Dec 29 2011 03:30:20
length:55 | to | type
| |
messaje s.whatsapp.net
4 items server
| |
| x | list binary 24
| | xmlns | |
| | | | | items:2
| | | jabber:x:event | | |
| | | | | | | body message:
| | | | 1 item | | | | "Da"
| | | | | | | | | _^__
f8 02 f8 04 ba bd 4f f8 01 f8 01 8c f8 02 16 fc 02 4461
| | | | | | | |
| | list binary 24 | | list binary 24 | |
| | | | | |
| 2 items | 1 item | lenght:2
| | |
list binary 24 list binary 24 list binary 8
te he dejado un mensaje privado y un email.
Buen trabajo
Algo de informacion sobre los indices de los nodos. Al parecer la cabecera del mensaje siempre comienza con exactamente 2 bytes, que es la longitud de todo el paquete.
Luego estan las etiquetas F8 que es el comienzo de una lista binaria. Justo después hay un índice de exactamente 1 byte, que indica la longitud. Para longitudes mayores de listas binarias se usa F9.
Tambien se aplica a FC y FD, ambos para cadenas, con 1 y 3 bytes respectivamente.
F8: 1 byte, lista binaria corta
F9: 2 bytes, lista binaria larga
FC: 1 byte, cadena corta
FD: 3 bytes, cadena larga
F4: Es el indice del JID, y solo ocupa 1 byte.
Saludos!
Cita de: rodarima en 2 Enero 2012, 17:06 PM
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
okn entonces podrias resumir en algo puntual, digamos
jid: 999999920@whatsapp.net
pass: IMei
server: s.whatsup.net:443
me gustaria pudueras puntualizar esto, x favor
Offtopic: ¿Cómo obtengo los historiales completos del whatsapp? Me salen de unas pocas líneas solo..
Gracias..