Hoy explicaremos cómo realizar una evaluación básica de seguridad en una aplicación iOS usando Mac. Para esta evaluación es obligatorio que tu dispositivo iOS esté liberado. Asumo que tienes algo de experiencia con BurpSuite. En este artículo, realizaremos algunas pruebas básicas en iGoat. Esta es una aplicación vulnerable de iOS para pentesters de aplicaciones móviles.
Configuración de tu dispositivo iOS
Para instalar iGoat, es posible que necesites instalar AppCake. Inicia Cydia y agrega el repositorio de AppCake yendo a Gestionar -> Fuentes -> Editar -> Agregar e ingresa https://cydia.iphonecake.com/.
Ahora agrega el repositorio de frida, para eso repite los pasos anteriores e ingresa https://build.frida.re. Ahora deberías poder encontrar e instalar el paquete Frida que permite a Frida inyectar JavaScript en aplicaciones que se ejecutan en tu dispositivo iOS. Esto ocurre a través de USB, por lo que necesitarás tener tu cable USB a mano, aunque no es necesario conectarlo todavía.
Para la inyección de código, instalaremos cycript desde Cydia. Cycript permite explorar y modificar aplicaciones en ejecución en iOS utilizando un híbrido de sintaxis de Objective-C++ y JavaScript a través de una consola interactiva que cuenta con resaltado de sintaxis y autocompletado de pestañas. Para ejecutar Cycript, podemos instalar Cyrun, así que añade http://www.tateu.net/repo/ como hiciste con los otros repositorios e instala cyrun y cycript.
Ahora puedes descargar iGoat. Una vez descargado, ve a Archivos, selecciona la opción Compartir en el archivo “iGoat” -> Copiar a AppCake y en unos segundos estará firmado y listo para instalar en la sección de descargas de AppCake.
Configurando tu OSX
Frida es un conjunto de herramientas de instrumentación dinámica para desarrolladores, ingenieros de reversa e investigadores de seguridad. Puedes inyectar tus propios scripts en procesos de caja negra. Engancha cualquier función, espía en APIs de criptografía o rastrea el código privado de aplicaciones, sin necesidad de código fuente. Edita, guarda y ve los resultados instantáneamente. Todo sin pasos de compilación ni reinicios de programas.
Instalaremos las herramientas de frida para interactuar con el teléfono:
sudo pip3 install frida-tools
Ahora puedes ejecutar frida:
Joses-MacBook-Pro:~ jpalanco$ frida-ps -U
Esperando que aparezca el dispositivo USB…
Frida esperará hasta que conectes el USB, una vez que lo conectes, obtendrás una lista de todos los procesos en ejecución:
PID Nombre
---- --------------------------------------------------------
907 App Store
947 Netflix
975 Spotify
894 Spotlight
983 Telegram
984 Work Chat
901 YouTube
910 iMessageAppsViewService
526 ACCHWComponentAuthService
847 AppPredictionWidget
887 AppSSODaemon
515 AppleCredentialManagerDaemon
613 AssetCacheLocatorService
987 BTLEServer
549 BlueTool
905 CAReportingService
606 CMFSyncAgent
938 CacheDeleteAppContainerCaches
897 CategoriesService
...
Está bien, frida está en funcionamiento.
Objection es un kit de herramientas de exploración en tiempo de ejecución impulsado por Frida, dirigido a plataformas móviles. Solo para iOS, por ahora, objection tiene como objetivo permitirte realizar varias tareas relacionadas con la seguridad en aplicaciones iOS no cifradas, en tiempo de ejecución, en dispositivos iOS que no están liberados de fábrica.
Bien, instalemos objection:
sudo pip3 install objection
Bien, ahora tenemos el shell. Analicemos iGoat:
Joses-MacBook-Pro:~ jpalanco$ objection -g iGoat explore
Usando el dispositivo USB \`iPad 4\`
Agente inyectado y responde correctamente!
\_ \_ \_ \_
\_\_\_| |\_|\_|\_\_\_ \_\_\_| |\_|\_|\_\_\_ \_\_\_
| . | . | | -\_| \_| \_| | . | |
|\_\_\_|\_\_\_| |\_\_\_|\_\_\_|\_| |\_|\_\_\_|\_|\_|
|\_\_\_|(object)inject(ion) v1.9.0
Exploración Móvil en Tiempo de Ejecución
por: @leonjza de @sensepost
\[tab\] para sugerencias de comandos
com.swaroop.iGoat en (iPad: 13.1.2) \[usb\] #
Usaremos "pwd print" para mostrar la ruta actual:
com.swaroop.iGoat en (iPad: 13.1.2) \[usb\] # pwd print
Directorio actual: /private/var/containers/Bundle/Application/D5D3778B-71CC-4305-9D19-175140564E81/iGoat.app
Para mostrar las variables de entorno, simplemente escriba “env”:
com.swaroop.iGoat en (iPad: 13.1.2) \[usb\] # env
Nombre Ruta
----------------- -------------------------------------------------------------------------------------------
BundlePath /private/var/containers/Bundle/Application/D5D3778B-71CC-4305-9D19-175140564E81/iGoat.app
CachesDirectory /var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library/Caches
DocumentDirectory /var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Documents
LibraryDirectory /var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library
Podemos usar “cd” para cambiar a diferentes directorios y “ls” para listar los archivos:
com.swaroop.iGoat en (iPad: 13.1.2) \[usb\] # cd /var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library
/var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library
com.swaroop.iGoat en (iPad: 13.1.2) \[usb\] # ls NSFileType Perms NSFileProtection Read Write Owner Group Size Creation Name
------------ ------- ------------------ ------ ------- ------------ ------------ ------ ------------------------- -----------------------
Directory 493 n/a True True mobile (501) mobile (501) 96.0 B 2020-04-06 13:39:53 +0000 Caches
Directory 493 n/a True True mobile (501) mobile (501) 96.0 B 2020-04-06 13:40:03 +0000 Saved Application State
Directory 493 n/a True True mobile (501) mobile (501) 96.0 B 2020-04-06 13:40:05 +0000 SplashBoard
Directory 493 n/a True True mobile (501) mobile (501) 96.0 B 2020-04-06 13:39:53 +0000 Preferences
Readable: True Writable: True
com.swaroop.iGoat en (iPad: 13.1.2) \[usb\] # cd Preferences
/var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library/Preferences
com.swaroop.iGoat en (iPad: 13.1.2) \[usb\] # ls
NSFileType Perms NSFileProtection Read Write Owner Group Size Creation Name
------------ ------- ------------------------------------ ------ ------- ------------ ------------ ------- ------------------------- -----------------------
Regular 384 CompleteUntilFirstUserAuthentication True True mobile (501) mobile (501) 405.0 B 2020-04-06 13:40:03 +0000 com.swaroop.iGoat.plist
Si encontramos un archivo plist, podemos mostrarlo fácilmente con “ios plist cat file.plist”
com.swaroop.iGoat en (iPad: 13.1.2) [usb] # ios plist cat com.swaroop.iGoat.plist
{
WebDatabaseDirectory = “/var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library/Caches”;
WebKitLocalStorageDatabasePathPreferenceKey = “/var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library/Caches”;
WebKitOfflineWebApplicationCacheEnabled = 1;
WebKitShrinksStandaloneImagesToFit = 1;
}
También podemos descargar o subir archivos usando "file download file" y "file upload file". Es un hallazgo muy interesante para archivos sqlite, inspeccionarlos, modificarlos y subirlos de nuevo.
com.swaroop.iGoat en (iPad: 13.1.2) [usb] # file download com.swaroop.iGoat.plist
Descargando /var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library/Preferences/com.swaroop.iGoat.plist a com.swaroop.iGoat.plist
Transmitiendo archivo desde el dispositivo…
Escribiendo bytes al destino…
Descargado exitosamente /var/mobile/Containers/Data/Application/3F622664-0B3C-438F-A0EC-EA734AAA8BD1/Library/Preferences/com.swaroop.iGoat.plist a com.swaroop.iGoat.plist
### Inyectando código
Nos conectaremos al dispositivo usando ssh. Ahora intentaremos inyectar algo de código en la aplicación iGoat:
Jose-Ramons-iPad:/tmp root# cyrun -n iGoat -e applicationName: iGoat está ejecutándose (3397) executableName: iGoat bundleIdentifier: com.swaroop.iGoat Cycript está activo: com.apple.springboard El dispositivo no está bloqueado con código de acceso Modo Tweak ADVERTENCIA - Cycript está activo pero parece que el bundleIdentifier para el que estás intentando habilitarlo no coincide! No puedes habilitar Cycript en un nuevo proceso mientras todavía está ejecutándose en uno antiguo ¿Quieres conectarte al proceso actual (y o n)? y Éxito, ahora puedes ejecutar cycript -r 127.0.0.1:8556 cy# var message = [[UIAlertView alloc] init]; #“<UIAlertView: 0x1437c3c60; frame = (0 0; 0 0); layer = <CALayer: 0x281a7a700>>” cy# message.title = “jpalanco”; “jpalanco” cy# message.message = “Este es un alerta inyectada”; “Este es un alerta inyectada” cy# [message addButtonWithTitle:@“Dismiss”]; 0 cy# [message show]; cy#

### Analizando comunicaciones
Para esto, usaremos [BurpSuite](https://portswigger.net/burp).
En Burp, ve a la pestaña "Proxy" y luego a la pestaña "Opciones".
En la sección "Proxy Listeners", haz clic en el botón "Agregar".

En la pestaña "Binding", en el cuadro "Bind to port:", ingresa un número de puerto que no esté actualmente en uso, por ejemplo, "8082".
Luego selecciona la opción "Todas las interfaces" y haz clic en "OK".
**Nota:** Podrías alternativamente editar el oyente de proxy predeterminado existente para escuchar en todas las interfaces. Sin embargo, usar diferentes oyentes para dispositivos de escritorio y móviles te permite filtrarlos en la vista de historial de Proxy.

El oyente de Proxy ahora debería estar configurado y funcionando.

En tu dispositivo iOS, ve al menú "Configuración".

Toca la opción "Wi-Fi" del menú "Configuración".
Si tu dispositivo no está ya conectado a la red inalámbrica que estás utilizando, entonces activa el botón de "Wi-Fi", encuentra tu red en la lista y tócala para conectarte. Ingresa la contraseña de tu red si se te solicita.

Toca la opción "i" (información) junto al nombre de tu red.

Bajo el título "HTTP PROXY", toca la pestaña "Manual".
En el campo "Servidor", ingresa la dirección IP del ordenador que está ejecutando Burp.
En el campo "Puerto", ingresa el número de puerto configurado en la sección "Proxy Listeners" anteriormente, en este ejemplo "8082".

Ahora, abre Safari en tu dispositivo IOS y ve a http://burp/ y haz clic en "Certificado CA"

Se te mostrará un mensaje en la ventana "Instalar perfil". Toca "Instalar".

Luego se te mostrará un mensaje de advertencia. Nuevamente, toca "Instalar".

Aparecerá otro mensaje titulado "Instalar perfil". Nuevamente, toca "Instalar".

El certificado CA de Burp debería estar ahora instalado en tu dispositivo iOS. Toca "Hecho".

En algunas versiones de iOS, es posible que necesites ir a "Habilitar confianza total para el CA de PortSwigger".
Puedes configurar esta opción en Configuración -> General -> Acerca de -> Configuración de confianza de certificados.
El pinning de certificados no se aplica en iGoat, pero en aplicaciones del mundo real, puede que no veamos tráfico porque a la aplicación no le gusta tu certificado de BurpSuite. Podemos eludir el pinning de certificados con objection:
com.swaroop.iGoat en (iPad: 13.1.2) [usb] # ios sslpinning disable (agent) Enganchando métodos comunes de framework (agent) Se encontraron clases basadas en NSURLSession. Enganchando métodos de pinning conocidos. (agent) Enganchando métodos SSL de nivel inferior (agent) Enganchando métodos TLS de nivel inferior (agent) Enganchando métodos de BoringSSL (agent) Registrando trabajo tvo5kvfkhs. Tipo: ios-sslpinning-disable
### Volcando un IPA descifrado
Incluso podemos volcar archivos usando objection, este método es más conveniente. Podemos extraer el IPA a nuestra computadora para realizar un análisis local. Necesitaremos instalar algunos requisitos:
$ brew install usbmuxd
Necesitaremos crear una clave pública para acceder [ssh sin contraseña.](https://help.dreamhost.com/hc/en-us/articles/216499537-How-to-configure-passwordless-login-in-Mac-OS-X-and-Linux)
Ahora clonemos frida-ios-dump:
$ git clone https://github.com/AloneMonkey/frida-ios-dump.git
En otra terminal, escribe:
$ iproxy 2222 22
Regresa a la terminal principal y lanza:
Joses-MacBook-Pro:frida-ios-dump jpalanco$ ./dump.py iGoat
[Errno None] Unable to connect to port 2222 on 127.0.0.1 or ::1
Try specifying -H/—hostname and/or -p/—port
Joses-MacBook-Pro:frida-ios-dump jpalanco$ ./dump.py iGoat
Start the target app iGoat
Dumping iGoat to /var/folders/x6/tdpf6b4s1zx6dhyx837d01yr0000gn/T
[frida-ios-dump]: Load Realm.framework success.
start dump /private/var/containers/Bundle/Application/D5D3778B-71CC-4305-9D19-175140564E81/iGoat.app/iGoat
iGoat.fid: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3.36M/3.36M [00:00<00:00, 13.2MB/s]
start dump /private/var/containers/Bundle/Application/D5D3778B-71CC-4305-9D19-175140564E81/iGoat.app/Frameworks/Realm.framework/Realm
Realm.fid: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6.01M/6.01M [00:00<00:00, 22.6MB/s]
ServerCommunicationExerciseController_iPhone.nib: 33.4MB [00:01, 20.0MB/s]
0.00B [00:00, ?B/s]Generating “iGoat.ipa”
0.00B [00:00, ?B/s]
En unos segundos, tendremos el archivo ipa descifrado en nuestra computadora. Para analizar el contenido, descomprimiremos:

Luego Mostrar Contenido del Paquete:

Y tendremos acceso a los archivos:

### Descompilando las clases
Podemos usar class-dump para descompilar las clases. Puedes descargarlo desde http://stevenygard.com/projects/class-dump/
Joses-MacBook-Pro:~ jpalanco$ /Volumes/class-dump-3.5/class-dump /Users/jpalanco/Projects/frida-ios-dump/Payload/iGoat.app/iGoat | head -n 30 2020-04-07 12:47:55.586 class-dump[5552:270907] Advertencia: Falló el análisis del tipo de variable de instancia, inUse // // Generado por class-dump 3.5 (64 bit). // // class-dump es Copyright (C) 1997-1998, 2000-2001, 2004-2013 por Steve Nygard. //
#pragma mark Punteros de Función y Bloques
typedef void (*CDUnknownFunctionPointerType)(void); // el tipo de retorno y los parámetros son desconocidos
typedef void (^CDUnknownBlockType)(void); // el tipo de retorno y los parámetros son desconocidos
#pragma mark Estructuras Nombradas
struct CBLBlobKey {
unsigned char bytes[20];
};
struct CBLChangesOptions {
unsigned int _field1;
_Bool _field2;
_Bool _field3;
_Bool _field4;
_Bool _field5;
};
struct CBLGeoPoint {
double x;
double y;
};
Revirtiendo la aplicación
En este punto, instalaremos ghidra:
$ brew cask install ghidra
Lanzar ghidra:
$ ghidraRun
Crearemos un proyecto e importaremos el archivo mach-o de iGoat. Después de unos minutos, Ghidra terminará los análisis:
¡Feliz hacking!