Extractor de contraseña e identidad de WhatsApp para iPhone

¡Hola a todos! Tras un tiempo sin publicar ninguna entrada, traigo algo muy interesante. Se trata de una utilidad que extrae la contraseña e identidad de WhatsApp para iPhone en texto plano y se pueden usar directamente en WhatsAPI, yowsup y WhatsApiNet.

También se extrae un archivo llamado ‘pw.dat’ en el cual va encriptada la contraseña (aunque ya la tendremos en texto plano :p ). Todavía estoy buscando un método para poder desencriptar este archivo, haciendo ingeniería inversa a la app y un montón de historias. Lo que sí puedo decir, es que estoy cerquita, y tengo información muy útil que más adelante compartiré con vosotros :)

Actualmente este método de extracción de los datos de WA, sólo se puede realizar al comienzo de uso de la app, con esto quiero decir, cuando que se usa por primera vez la app de WhatsApp y se hace la petición y registro, ya sea por SMS o por voz. Si tienes la app instalada, tendrás que borrarla y volver a instalarla para poder aplicar esta herramienta.

Muchos datos y peticiones quedan guardados en un base de datos con formato SQLite3 llamado ‘Cache.db’, es de este archivo del que extraeremos la información en texto plano :D

extractor

Nota: Para poder utilizar esta herramienta, el iPhone tiene que estar con jailbreak y tener instalado ‘OpenSSH’.

La utilidad, se conectará al dispositivo y buscará el directorio donde se encuentra WhatsApp instalado. Una vez encontrado el directorio, se descarga el archivo ‘Cache.db’ y el archivo ‘pw.dat’ por si el usuario quiere trastear con el… :p Del archivo ‘Cache.db’ se extraerán los datos.

Uso: python extractPW.py username host password Username por defecto es ‘root’ en iPhone, a menos que lo hayas cambiado previamente. Host, es la IP del dispositivo (iPhone), tiene que estar conectado por wifi.. Password, es la clave para conectarse via ssh, por defecto es ‘alpine’, a menos que la hayas cambiado previamente.

También es necesario tener instalado el módulo paramiko en python.

# -*- coding: utf-8 -*-
import sqlite3
import paramiko
import os, sys, time

def find_between( s, first, last ):
    try:
        start = s.index( first ) + len( first )
        end = s.index( last, start )
        return s[start:end]
    except ValueError:
        return ""


def getPath(username, host, password):
	dssh = paramiko.SSHClient()
	dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
	dssh.connect(host, username=username, password=password)
	cmd1 = "find /var/mobile/Applications -iname WhatsApp.app"
	print "> "+cmd1
	stdin, stdout, stderr = dssh.exec_command(cmd1)
	res = stdout.read()
	res = res.split("\n")
	print res[0]
	dssh.close()
	return res[0]

def getDB(WAPath, username, host, password):
	localPath = "Cache.db"
	remotePath = WAPath+"/Library/Caches/net.whatsapp.WhatsApp/Cache.db"
	pwFile = WAPath+"/Library/pw.dat"
	transport = paramiko.Transport((host, 22))
	transport.connect(username = username, password = password)
	sftp = paramiko.SFTPClient.from_transport(transport)
	sftp.get(remotePath, localPath)
	sftp.get(pwFile, 'pw.dat')
	sftp.close()
	transport.close()
	print "\n\n- Cache.db downloaded!"
	print "- pw.dat downloaded!"

def getData():
	conn = sqlite3.connect('Cache.db')

	cursor = conn.cursor()

	cursor.execute("SELECT request_key FROM cfurl_cache_response")
	request_key = cursor.fetchall()
	request_key = request_key[0]

	cc = find_between(request_key[0], "cc=", "&")
	pn = find_between(request_key[0], "in=", "&")
	id = find_between(request_key[0], "id=", "&")
	lg = find_between(request_key[0], "lg=", "&")
	lc = find_between(request_key[0]+".", "lc=", ".")

	print "cc: "+cc
	print "pn: "+pn
	print "id: "+id
	print "lg: "+lg
	print "lc: "+lc
	print "\nRequest url: "+request_key[0]

	cursor.execute("SELECT receiver_data FROM cfurl_cache_receiver_data")
	receiver_data = cursor.fetchall()
	receiver_data = receiver_data[0]
	status = find_between(str(receiver_data[0]), "status\":\"", "\"")
	login = find_between(str(receiver_data[0]), "login\":\"", "\"")
	pw = find_between(str(receiver_data[0]), "pw\":\"", "\"")
	type = find_between(str(receiver_data[0]), "type\":\"", "\"")
	expiration = find_between(str(receiver_data[0]), "expiration\":", ",")
	kind = find_between(str(receiver_data[0]), "kind\":\"", "\"")

	print "\nstatus: "+status
	print "login: "+login
	print "pw: "+pw
	print "type: "+type
	print "expiration: "+expiration
	print "kind: "+kind

print '''
###########################################
#                                         #
#    WA Password and Identity Extractor   #
#              for iPhone                 #
#                                         #
###########################################

Author: @_mgp25 - github.com/mgp25 - mgp25.com

'''
if len(sys.argv) < 4:
	sys.exit("Usage: python extractPW.py <username> <host> <password>\n")
time.sleep(2)
username = sys.argv[1]
host = sys.argv[2]
password = sys.argv[3]
WAPath = getPath(username, host, password)
WAPath = WAPath[0:61]
getDB(WAPath, username, host, password)
print "\n- Extracting data...\n"
getData()

Actualmente casi tengo el método para desencriptar el archivo ‘pw.dat’, ya os iré informado… Con tiempo xD

Un saludo y hasta la próxima :)

Updated: