Ya estuve resolviendo los retos planteados en algunas de las aplicaciones android del OWASP MASTG. Así que ahora toca explotar algo de iOS.
Introducción
A diferencia de Android, iOS tiene ciertas particularidades que hacen que simplemente desplegar la aplicación sea un poco más dificil. Dado que un emulador no es exactamente igual, correremos la aplicacion en un dispositivo fisico. En este caso he utilizado un iPhone 8 plus con iOS 16.7.7, aunque deberia funcionar en iOS de 8-9 en adelante.
La version del repo oficial esta compilada para versiones anteriores de iOS. Por tanto, clone el repositorio y con ayuda de xCode (instalado en un Mac) compile e instale la aplicacion.
Cabe recalcar que para la conexion (y para instalar la aplicacion si no quieres utilizar xCode), ademas de para poder instalar las herramientas que utilizaremos para la explotacion, es conveniente aplicar Jailbreak al dispositivo. En mi caso utilice Checkra1n ya que es muy robusto, facil de usar y semi-thetered, es decir, que al reiniciar se deshace el jailbreak.
Al haber utilizado Checkra1n, el sistema de deteccion de Jailbreak no es capaz de detectarlo. Por tanto ya hemos superado el nivel de Jailbreak Detection.
Reconocimiento inicial
Previo a empezar conviene realizar un pequeño reconocimiento para extraer informacion como el identificador de la aplicacion:
frida-ps -U -a -i
PID Name Identifier
---- -------------------------------- ------------------------------------
[...]
- DVIA-v2 com.naibu3.DVIAswiftv2
[...]
Local Data Storage
La primera vulnerabilidad que vamos a explotar es el almacenamiento inseguro de datos. En cada sub-nivel deberemos generar datos para posteriormente tratar de leerlos externamente.
Plist
En este sub-nivel se nos ofrece la posibilidad de almacenar credenciales en un archivo plist o Property List. Estos archivos almacenan informacion en formato XML, y todas las aplicaciones tienen al menos un Info.plist
Podemos acceder a estos archivos en /var/mobile/Containers/Data/Application/<UUID>/Documents
:
juan-manuels-iPhone:/var/mobile/Containers/Data/Application/AC6069D0-4CA4-4856-8230-4500DCDD5FA3/Documents root# cat userInfo.plist
<?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>password</key>
<string>password</string>
<key>username</key>
<string>naibu3</string>
</dict>
</plist>
UserDefaults
En el segundo nivel, la informacion se almacena como NSUserDefaults.
En este caso, tambien se guarda como un plist pero bajo /var/mobile/Containers/Data/Application/<UUID>/Library/Preferences
:
juan-manuels-iPhone:/var/mobile/Containers/Data/Application/AC6069D0-4CA4-4856-8230-4500DCDD5FA3/Library/Preferences root# cat com.naibu3.DVIAswiftv2.plist
bplist00�YDemoValueoesto es un s�per secreto
Keychain
En este nivel, igual que en los anteriores se nos da la opción de introducir una cadena que se guardará en la keychain.
La keychain es un sistema de almacenamiento seguro que proporciona Apple y sirve para almacenar información sensible como contraseñas, tokens de autenticación, certificados y claves privadas.
TODO
Core Data
En este nivel los datos se almacenan en una base de datos del lado del cliente. En concreto podemos acceder a ella en /var/mobile/Containers/Data/Application/AC6069D0-4CA4-4856-8230-4500DCDD5FA3/Library/Application\ Support/Model.sqlite
.
Webkit Caching
TODO - Puede que no este funcionando correctamente
Realm
En /var/mobile/Containers/Data/Application/AC6069D0-4CA4-4856-8230-4500DCDD5FA3/Documents/default.realm
se debe estar guardando la informacion.
TODO
COuchbase Lite
En este cao la info se almacena en /var/mobile/Containers/Data/Application/AC6069D0-4CA4-4856-8230-4500DCDD5FA3/Library/Application Support/CouchbaseLite/dvcouchbasedb.cblite2/db.sqlite3
.
TODO
YapDatabase
De forma similar a la parte de Core Data, en este sub-nivel la informacion se almacena en una base de datos Yap. Este es un framework que facilita el almacenamiento de informacion en iOS.
Podemos acceder a la base de datos en /var/mobile/Containers/Data/Application/AC6069D0-4CA4-4856-8230-4500DCDD5FA3/Library/Application\ Support/YapDatabase.sqlite
.
Side Channel Data Leakage
En este nivel trataremos una vulnerabilidad que se da cuando se filtran datos sensibles accidentalmente por parte de la aplicacion.
Device Logs
TODO - Al rellenar el formulario crashea xdd
App Screenshots
Al pasar una aplicacion a segundo plano, se guarda automaticamente una captura de pantalla de la aplicacion para poder mostrarla en la previsualizacion. Si disponemos de un dispositivo rooteado podemos acceder a estas capturas y en ocasiones ver informacion privilegiada.
En este caso debemos introducir una cadena y mandar la aplicacion a segundo plano. Desde ssh (o desde Filza), podemos ver la captura en /var/mobile/Containers/Data/Application/AC6069D0-4CA4-4856-8230-4500DCDD5FA3/Library/SplashBoard/Snapshots
.
Pasteboard
Es muy peligroso guardar informacion sensible, como por ejemplo un CVV en la pasteboard. Por tanto no debemos dejar al usuario copiar dicha informacion. En este nivel debemos precisamente copiar dicha informacion.
Posteriormente, con un script de frida como el siguiente podemos extraer el contenido de la pasteboard:
const UIPasteboard = ObjC.classes.UIPasteboard;
const pb = UIPasteboard.generalPasteboard();
console.log("Pasteboard content: " + pb.string().toString());
frida -U -n DVIA-v2 -l paste.js
____
/ _ | Frida 17.2.11 - A world-class dynamic instrumentation toolkit
| (_| |
> _ | Commands:
/_/ |_| help -> Displays the help system
. . . . object? -> Display information about 'object'
. . . . exit/quit -> Exit
. . . .
. . . . More info at https://frida.re/docs/home/
. . . .
. . . . Connected to iOS Device (id=1af26da7a801875fe87f09d7eaccf75c650d0a8f)
Attaching...
Pasteboard content: 344
Keystroke logging
iOS por defecto almacena todas las pulsaciones que se hayan introducido en el dispositivo. El objetivo de este sub-nivel es introducir un nombre y capturar esas pulsaciones.
Los archivos deberían estar en /private/var/mobile/Library/Keyboard/
con extension .dat
.
Cookies
Muchas aplicaciones almacenan cookies de sesion en /private/var/mobile/Library/Cookies
. Si vamos a ese directorio encontraremos un archivo con las credenciales.
Network Layer Security
En esta seccion trataremos de capturar el trafico http que envia la aplicacion.
HTTP
Para la primera parte, deberemos configurar la red para que utilice nuestra maquina en el puerto 8080
como proxy para capturar con BurpSuite.
HTTPS
En el caso de HTTPs, si tratamos de capturar el trafico directamente, recibiremos un error. Esto se debe a que el certificado no es de confianza y al igual que hicimos con la version de Android, debemos añadir el certificado a los certificados de confianza.