Mis posts parecen mi lista de reproducción de Spotify, donde igual tengo “la pasión según San Mateo” de Bach, como la siguiente canción en sonar es una de los Guns N’ Roses. Pero así es mi día a día. Y te preguntarás, ¿Por qué en esta ocasión me está contando como descifrar una contraseña de un dispositivo Android? Resulta que desde hace una semana me he apuntado a una página (cuyo nombre no me está permitido decir) donde realizo desafíos de seguridad, y uno de estos retos es este.
No puedo decir el nombre de la plataforma, porque una de sus reglas es:
La publicación en Internet de la solución a los retos de la plataforma no está permitida.
Por lo que voy a variar los datos originales que se proporcionan en el reto. Eso sí, todo lo que explico es a modo de aprendizaje y no me responsabilizo de tus acciones.
Tabla de contenido
Obtener PIN
Si has llegado hasta aquí, no creo que haga falta explicar que es un hash y un salt, aunque aquí puedes encontrar información.
Lo primero que nos indica el reto es que el hash de nuestro PIN se almacena en el fichero /data/system/password.key del teléfono Android, el cual es:
AB7A0B6D0679F6137743B7A6FF7C5BF5E1069A50269A85C29CBA9DEDA133B3168F33027F
Si estás familiarizado en el mundo del HASH, te habrás dado cuenta que es muy largo, 72 caracteres. Pero esto es porque hay dos HASHES, uno SHA1 y un MD5 concatenados.
Ahora nos hará falta encontrar el SALT, que se encuentra en una base de datos, que según la versión de Android puede estar en una u otra ubicación:
Versión de Android | Ubicación |
Cupcake, Donut, Éclair, Froyo, Gingerbread, Ice Cream Sandwich | /data/data/com.android.providers.settings/databases/ settings.db |
Jelly Bean, Kit Kat, Lollipop | /data/system/ locksettings.db |
Sea cual sea la ubicación anterior, con el siguiente comando podemos obtener el salt de la base de datos:
SELECT value FROM locksettings WHERE name=’lockscreen.password_salt’
El cual para este ejemplo tendremos el siguiente Salt:
3682477098377895419
Con todo esto, y con la referencia a esta página de github, ya es todo pan comido, porque Androidlockcracker es un script de python capaz de descifrar y generar los hashes de bloqueo predeterminados de Android para bloqueos de pantalla de PIN, contraseña y gestos.
Si ejecutamos –help, podemos ver la sintaxis para su uso:

Como nota al Script de Python de Androidlockcracker, indicar que al ejecutar con la versión de Python que tenía me salía el siguiente error:
Traceback (most recent call last):
File "/usr/src/myscript/androidlockcracker.py", line 323, in
main()
^^^^^^
File "/usr/src/myscript/androidlockcracker.py", line 313, in main
options.salt = struct.pack('>q', long(args[3])).encode("hex")
^^^^
NameError: name 'long' is not defined
Y gracias a mi compañero Nacho, me hizo ver que long en Python 3 se ha cambiado por int. Por lo tanto, debía ejecutar el Script con Python 2.X.
Te cuento dos alternativas para ejecutar el Script: Instalando Python en Windows o con Docker directamente.
Instalando Python en Windows
Instalamos Python 2.7 (https://www.python.org/download/releases/2.7/) y una vez instalado descargamos el script de Androidlockcracker.
Para ejecutarlo con Windows, al principio tuve problemas, pero leí la siguiente página https://geekflare.com/es/how-to-run-python-scripts/ de modo que me hice un .bat en el mismo directorio donde estaba el Script de Androidlockcracker con el siguiente contenido:
C:\Users\XXXXX\Downloads\androidlockcracker-master\androidlockcracker-master\androidlockcracker.py crack pin AB7A0B6D0679F6137743B7A6FF7C5BF5E1069A50269A85C29CBA9DEDA133B3168F33027F 3682477098377895419 %*
@pause
Si lo ejecutamos desde Powershell, obtenemos el PIN buscado 1234

Docker
Esta opción también me la enseñó mi compañero Nacho que es un máster de Docker.
Nota: Estos comandos funcionan si ya tienes instalado Docker
Primero descargamos la imagen de Python con el siguiente comando:
docker pull python:2.7-slim

Una vez descargada la imagen, ejecutamos:
docker run -it --rm --name my-running-script -w /usr/src/myscript/ -v c:/androidlockcracker-master:/usr/src/myscript python:2.7-slim python /usr/src/myscript/androidlockcracker.py crack pin AB7A0B6D0679F6137743B7A6FF7C5BF5E1069A50269A85C29CBA9DEDA133B3168F33027F 3682477098377895419

Y gualá: 1234
Hay que tener en cuenta que en el argumento -v hay que poner la ruta donde tentamos descargado androidlockcracker, en mi caso c:\androidlockcracker-master.
Patrón de desbloqueo
Al igual que se almacena el hash del PIN, se almacena el SHA1 del patrón de desbloqueo en:
/data/system/gesture.key
Ejecutando cualquiera de las alternativas anteriormente mencionadas conseguiríamos el patrón de desbloqueo con la siguiente sintaxis:

Conclusiones
Evidentemente, este post sirve más como ejercicio teórico que como práctico, ya que para tener acceso a la base de datos con los Hashes y el SALT se da por hecho que ya tienes acceso completo al teléfono salvo que estos datos los consigamos de algún backup.
Pero es interesante plantearnos una cuestión muy importante. Si alguien consiguiese tener acceso a nuestro teléfono y se hiciese con el HASH y el SALT para descifrar nuestro PIN: ¿Este es el mismo que utilizamos en nuestras tarjetas de crédito? ¿Es el mismo que utilizamos para sistemas de alarma domésticos? Pero si con estas dos preguntas no lo estáis pillando…
¿Estamos REutilizando el mismo PIN para TODO?
5 respuestas a “Descifrar contraseña en dispositivo Android”
[…] con los retos de la página de desafíos que ya comentaba en un post anterior, me encontré con examinar un fichero adjunto de un correo en formato EML (el que te guardar de […]
Como estoy en un «Club de la Lucha», no conozco la página de la que hablas, pero me ha parecido muy interesante el post, por cómo has tenido que ir solucionando cada problema y porque has enseñado a pescar, en vez de dar peces 😉
Muy interesante tu sitio.
¡Gracias por tomarte el tiempo de leer y comentar en mi publicación, realmente lo aprecio!
bueno el tutorial, una pregunta donde ejecutar el
SELECT value FROM locksettings WHERE name=’lockscreen.password_salt’
Hola, deberías cargar el fichero de base de datos en sqlite.