Local Data Storage

Los ultimos 3 retos presentan problemas para realizar la visualización de la data.

Método Uso Principal Seguridad Datos Almacenados Ubicación Típica
Plist (.plist) Configuración y listas Baja Datos en XML o binario, sin cifrado /Library/Preferences/
UserDefaults Preferencias de usuario Baja Datos pequeños como configuración y flags /Library/Preferences/
Keychain Datos sensibles (credenciales) Alta Contraseñas, tokens, certificados Almacenamiento seguro de iOS
Core Data Datos estructurados y grandes volúmenes Media Tablas relacionales con consultas avanzadas /Library/Application Support/
WebKit Caching Caché de páginas web Baja Datos de sesiones, cookies, caché de navegador /Library/Caches/com.apple.WebKit/
Realm Base de datos NoSQL para apps móviles Media Datos estructurados con consultas rápidas /Documents/ o /Library/Application Support/
Couchbase Lite Base de datos NoSQL con sincronización Media Documentos JSON con replicación en la nube /Library/Application Support/
YapDatabase Base de datos basada en SQLite optimizada Media Datos estructurados con índices avanzados /Library/Application Support/

Plist

¿Qué son los archivos .plist en iOS?

Los archivos Property List (.plist) son archivos XML o binarios que contienen configuraciones de la aplicación. Estos pueden almacenar datos como:

✅ Preferencias del usuario

✅ Configuración de la aplicación

✅ Datos de sesión

✅ Información sensible (si la app está mal diseñada)

Estos archivos se encuentran en la sandbox de la aplicación y pueden ser leídos y modificados si el atacante tiene acceso al sistema de archivos del dispositivo.

Abrimos la herramienta Grapefruit que tenemos instalada en nuestro laboratorio, podemos verla en Herramientas, pero primero vamos a agregar la data para el reto, el reto nos dice

El reto dice: la entrada introducida aquí se guarda en un archivo plist. Su tarea es encontrar donde se almacena este valor en la aplicación sandox

{7AA17287-72BE-4A97-949E-0C077CDBB800}.png

conectamos el dispositivo y confirmamos con el comando frida-ls-devices

┌──(rootangussMoody)-[/mnt/angussMoody/iOS/Herramientas]
└─# frida-ls-devices
Id                                        Type    Name             OS
----------------------------------------  ------  ---------------  ---------------------
local                                     local   Local System     Kali GNU/Linux 2024.4
03565e409550be0e35e2a5f8704d573e3fc99565  usb     iOS Device       iPhone OS 13.3.1
barebone                                  remote  GDB Remote Stub
socket                                    remote  Local Socket

ahora si abrimos Grapefruit, con el comando igf

┌──(rootangussMoody)-[/mnt/angussMoody/iOS/Herramientas]
└─# igf
Grapefruit running on http://127.0.0.1:31337

y vamos al navegador en el link http://127.0.0.1:31337 y podemos ver el dispositivo

{24E2F74B-66D7-4B9E-9308-E8397E495328}.png

ingresamos a la aplicación DVIA-v2, podemos ver una información básiva de la aplicación, luego vamos a la pestaña Finder y luego vamos a la funcionalidad de Home

image.png

estándo en esta funcionalidad, vamos al directorio Documents y vemos un archivo llamado userinfo.plist

image.png

al dar clic en este archivo vemos la información en texto plano y así se cumple el primer reto de esta sesión

image.png

UserDefaults

¿Qué es UserDefaults?

UserDefaults es un mecanismo de almacenamiento de datos en iOS que permite a las aplicaciones guardar pequeñas cantidades de información, como configuraciones del usuario, preferencias y estados de la aplicación. Sin embargo, no está diseñado para almacenar información sensible, ya que los datos se guardan en texto plano dentro de un archivo .plist accesible en el sistema de archivos del dispositivo.

El reto dice: La entrada introducida aquí se guarda utilizando NSUserDefaults. Su tarea es encontrar dónde se almacena este valor en el sandbox de la App

{BB484EF5-570C-41E2-83F7-6988247C0997}.png

si vemos en la herramienta de Grapefruit vemos un módulo llamado NSUserDefaults

image.png

si vamos a ese módulo podemos ver un valor llamado DemoValue con el dato que ingresamos anteriormente

image.png

Keychain

¿Qué es el Keychain en iOS?

El Keychain es una base de datos encriptada administrada por iOS que permite a las aplicaciones almacenar y recuperar información de manera segura. Se usa comúnmente para:

Credenciales de usuario (usuario/contraseña)

Tokens de autenticación

Claves de encriptación

Cookies de sesión

El Keychain está diseñado para proteger los datos incluso si el dispositivo es comprometido, pero una mala implementación puede dejarlo expuesto a ataques.

El reto dice: la entrada introducida aquí se guarda en el keychain. tu tarea es volcar la información del keychain en tu dispositivo y encontrar este valor

{9AEA9AAC-E9F0-440E-96B0-3356FC4E314C}.png

con la herramienta Grapefruit, también podemos ver el valor del keychain, en este caso vamos al módulo KeyChain y descargamos el valor de cuenta keychainValue, una vez descargado abrimos el archivo y podemos ver el valor en texto claro.

image.png

Core Data

Características principales de Core Data:

Gestión de objetos: Permite almacenar, consultar y manipular datos como objetos sin escribir consultas SQL manualmente.

Almacenamiento flexible: Soporta almacenamiento en SQLite (por defecto), archivos binarios, XML e incluso en memoria.

Consultas eficientes: Usa NSFetchRequest para realizar búsquedas optimizadas de datos.

Soporte de relaciones: Permite definir relaciones entre entidades, similar a bases de datos relacionales.

Integración con iCloud: Puede sincronizar datos en la nube.

El reto dice: La entrada introducida aquí se guarda utilizando el marco de core data en el dispositivo. su tarea es encontrar esta información guardada en el dispositivo

{1981147A-96EF-4EB0-9B72-607F5C48F0B5}.png

si vamos al módulo de Finder y luego vamos a Home, podemos buscar la ruta Library / Application Support y ahí encontraremos un archivo llamado Model.sqlite

image.png

al abrir este archivo podemos ver varias tablas, entre ellas una llamada ZUSER, cuando se abre esta tabla se puede apreciar la información almacenada de los datos en texto plano

image.png

También se puede realizar este reto desde una terminal por medio de SSH, nos conectamos con la

┌──(rootangussMoody)-[/home/angussmoody]
└─# ssh root@192.168.1.1 -P 22
root@192.168.1.1's password: 
iPad-21:~ root# 

Vamos a la ruta /private/var/mobile/Containers/Data/Application/ y listamos los directorios.

iPad-21:~ root# cd /private/var/mobile/Containers/Data/Application/

iPad-21:/private/var/mobile/Containers/Data/Application root# ls
003A3014-DDAB-40CD-963C-AB4E7FCEB0DD/  4F090312-0107-4CD2-BB3B-5E63406C0A44/  8D3BBC0F-C2A5-48D4-9738-7C8F0E6103BC/  CA0C3724-151F-43B9-A90A-17DE32CE5BAB/
02E0CB25-FCE8-4894-BFDE-19D37E3037BC/  531BFEB7-EFD9-4F34-AD6C-8D215D209B18/  8E066F84-E7F9-4CB7-A8E1-02D7DF4747AD/  CE44B9D2-4328-4EB9-9437-6A5D79FF7F87/
05C4808F-B82B-4A5B-ACD8-C9FEF9414E92/  53575BF0-6BFC-4F41-B2AC-A0E8F46E0381/  90B19E63-3943-4B7A-8E3B-C7578F53961B/  D0A0172C-C60E-43B8-917D-D9D9C7DF1B50/
3971E8C5-34C1-43D7-92DC-4DC47473F9DC/  775550FC-144C-4D7B-8327-723C51AF52E7/  B6A1EAED-B80A-43C6-8E86-D7BE65806EB6/  F35D50AF-8BD1-467B-95ED-53605DDB6DC2/
3A289D41-F954-4956-9859-C2FF0E7F4F18/  7987B784-340D-4C92-BB3F-4654EDAE1AB6/  B92AAD28-4B05-45F4-8269-F862C6E6E656/  F444A313-22FA-4313-8539-A9D31279EE01/
4169B8A0-7046-4950-B1D8-3666978B9892/  79E0DE5F-3AFE-49F7-A688-6CF4BD0C2C09/  B96063CF-F84F-4C02-97F9-7FB45D5918D2/  F62FCEDA-1D89-4153-9BD7-51600AD8F198/
42FF9FD3-A3C9-4E4E-8D2A-BDF8088E8CE5/  7D21445B-278D-4C45-B93E-00B54F27D330/  BDE84DD1-D951-4E56-B55B-66CE0600E504/  F7D8FD3B-1988-4FCB-98B2-CE72DD18C526/
430E40DA-B6A9-4CCA-84C7-5075143D78BF/  807DC0A4-981B-48BC-9DF4-9A6F45ABCC50/  BDEB4270-398A-45CB-A36D-03AA33E3DE18/  F8A1E5BF-20CC-4CE9-80C8-BC224E08380F/
476E3723-39B5-4A1B-9BEF-45903D2C5779/  80D6E50F-5438-4E31-A52C-C09B8F90882E/  BE4FFAD7-8CB2-4D02-AC67-8E46BB13AD28/  F8DD20E9-3423-4330-9183-79AE9F8EA997/
47F8DEF0-CA55-4955-B191-EEA81D7439AA/  8484D75C-5E57-4031-A0A6-CC3A636600AE/  BE55F8ED-DF34-4958-A0ED-F6356CF98AFE/  FC645E5C-DF09-432D-8203-C77E28DE9D53/
49D12F98-7686-42B8-BB37-492AFDA4E9FE/  8A1C1150-2EA2-4A32-8B91-EB7AAF238BBA/  BEE229B1-ED7F-4EE9-9C0C-BA0883656BC8/  FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/
4C6667A4-AD5B-4032-96C7-9F76F83EDC13/  8B054D57-F125-4C57-8145-0ACC29D6C881/  BF72C172-1A7A-44BB-9E9D-32737F1DEEC5/  FF0285B3-4D52-4FA1-8B77-741F8F0732B5/
4E24FF3F-FF61-4E5A-84FA-A2FF5671D85F/  8C1626E2-1376-455D-AAE5-938ED6E3B341/  C2A82397-7D0E-45EF-8D18-5858FB7E31EC/
4EB6AF2D-820F-4A12-A748-D8D50E2562FA/  8C596367-2E2D-4B85-9614-D0D635EDF7E9/  C8B1B608-9AF4-4D4F-A3F6-81948468284E/
iPad-21:/private/var/mobile/Containers/Data/Application root# 

Buscamos con un nombre clave nuestra aplicación para este caso con la palabra DVIA con el comando

iPad-21:/private/var/mobile/Containers/Data/Application root# find ./ -name "*DVIA*"
./FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Caches/com.highaltitudehacks.DVIAswiftv2
./FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Caches/com.plausiblelabs.crashreporter.data/com.highaltitudehacks.DVIAswiftv2
./FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Preferences/com.highaltitudehacks.DVIAswiftv2.plist
./FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Saved Application State/com.highaltitudehacks.DVIAswiftv2.savedState
./FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/SplashBoard/Snapshots/com.highaltitudehacks.DVIAswiftv2 - {DEFAULT GROUP}
./FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/SplashBoard/Snapshots/sceneID:com.highaltitudehacks.DVIAswiftv2-default

Entramos a la ruta FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 que es la ruta de nuestra aplicación.

iPad-21:/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Application Support root# ls -la
total 28
drwxr-xr-x 5 mobile mobile   160 Mar  4 12:32 ./
drwxr-xr-x 8 mobile mobile   256 Feb 18 11:48 ../
drwxr-xr-x 8 mobile mobile   256 Mar  4 12:33 FlurryFiles/
-rw-r--r-- 1 mobile mobile   305 Mar  4 12:32 FlurryFilesFlurry.KV.storage
-rw-r--r-- 1 mobile mobile 24576 Mar  4 12:26 Model.sqlite

Vemos el archivo Model.sqlite y lo descargamos

┌──(rootangussMoody)-[/mnt/angussMoody/iOS]
└─# scp root@192.168.1.1:/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Application\ Support/Model.sqlite .
root@192.168.1.1's password: 
Model.sqlite 

ahora con la herramienta sqlite3 vemos el contenido de Model.sqlite, si listamos las tabla podemos ver una llamada ZUSER y si vemos el contenido podemos ver los datos en texto plano.

┌──(rootangussMoody)-[/mnt/angussMoody/iOS]
└─# sqlite3 Model.sqlite 
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite> .tables
ZUSER         Z_METADATA    Z_MODELCACHE  Z_PRIMARYKEY
sqlite> select * FROM ZUSER;
1|1|1|test@mail.com|joe|P@ssw0rd|3214560099
sqlite>

Webkit Caching

¿Qué es WebKit Caching?

WebKit Caching se refiere al mecanismo de almacenamiento en caché utilizado por WebKit, el motor de renderizado de Apple en Safari y WebView en iOS y macOS. Este sistema permite que las páginas web, imágenes, scripts y otros recursos sean almacenados temporalmente en el dispositivo para mejorar el rendimiento y reducir la carga en la red.

El reto dice: las aplicaciones que utilizan UIWebView para cargar páginas web a menudo utilizan la caché para acelerar el tiempo de respuesta. En algunos casos, podrían almacenar en caché una respuesta que contendrá información confidencial. Tu tarea es encontrar el lugar donde se almacenan la petición y las respuestas en el sanbox de la aplicación.

Pista: Los nombres de las tablas de la base de datos que almacenan los datos en caché empiezan por cf_url

{730F4C6A-AF58-4C55-9E91-AD9AB14F5E65}.png

con la herramienta Grapefruit, podemos ver el archivo Cache.db

image.png

podemos consultarlo y ver las tablas con las que cuenta y su información

image.png

Nos vamos a conectar por SSH para tener una shell en el dispositivo, para que podamos llegar a este archivo y descargarlo

┌──(rootangussMoody)-[/home/angussmoody]
└─# ssh root@192.168.1.1
root@192.168.1.1's password: 
iPad-21:~ root# 

ahora vamos a buscar el archivo Cache.db con el comando find /private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 -name "*Cache.db*"

iPad-21:/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 root# find /private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 -name "*Cache.db*"
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Caches/com.highaltitudehacks.DVIAswiftv2/Cache.db
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Caches/com.highaltitudehacks.DVIAswiftv2/Cache.db-shm
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Caches/com.highaltitudehacks.DVIAswiftv2/Cache.db-wal

ahora vamos a la ruta y listamos el directorio y vemos el archivo Cache.db

iPad-21:/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 root# cd /private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Caches/com.highaltitudehacks.DVIAswiftv2/
iPad-21:/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Caches/com.highaltitudehacks.DVIAswiftv2 root# ls -la
total 136
drwxr-xr-x 5 mobile mobile   160 Feb 18 11:48 ./
drwxr-xr-x 4 mobile mobile   128 Feb 18 11:48 ../
-rw-r--r-- 1 mobile mobile 61440 Mar  6 11:42 Cache.db
-rw-r--r-- 1 mobile mobile 32768 Mar  6 11:42 Cache.db-shm
-rw-r--r-- 1 mobile mobile 41232 Mar  6 11:42 Cache.db-wal

Descargamos este archivo

┌──(rootangussMoody)-[/mnt/angussMoody/iOs/cache]
└─# scp root@192.168.1.1:/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Caches/com.highaltitudehacks.DVIAswiftv2/Cache.db .
root@192.168.1.1's password: 
Cache.db

podemos verlo con la herramienta sqlite3 y vemos una respuesta con una URL

┌──(rootangussMoody)-[/mnt/angussMoody/iOs/cache]
└─# sqlite3 Cache.db 
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite> .tables
cfurl_cache_blob_data       cfurl_cache_response      
cfurl_cache_receiver_data   cfurl_cache_schema_version
sqlite> select * from cfurl_cache_response;
1|0|1869847597|0|https://data.flurry.com/v1/flr.do|2025-02-18 16:48:13|

Ahora con la herramienta strings podemos ver mucha información

┌──(rootangussMoody)-[/mnt/angussMoody/iOs/cache]
└─# strings Cache.db
SQLite format 3
indexreceiver_data_indexcfurl_cache_receiver_data
CREATE INDEX receiver_data_index ON cfurl_cache_receiver_data(entry_ID)t
indexproto_props_indexcfurl_cache_blob_data
CREATE INDEX proto_props_index ON cfurl_cache_blob_data(entry_ID)r	
indextime_stamp_indexcfurl_cache_response
CREATE INDEX time_stamp_index ON cfurl_cache_response(time_stamp)u
indexrequest_key_indexcfurl_cache_response
CREATE INDEX request_key_index ON cfurl_cache_response(request_key)
etablecfurl_cache_receiver_datacfurl_cache_receiver_data	CREATE TABLE cfurl_cache_receiver_data(entry_ID INTEGER PRIMARY KEY, isDataOnFS INTEGER, receiver_data BLOB)
1tablecfurl_cache_blob_datacfurl_cache_blob_data
CREATE TABLE cfurl_cache_blob_data(entry_ID INTEGER PRIMARY KEY, response_object BLOB, request_object BLOB, 			  proto_props BLOB, user_info BLOB)P
Ytablesqlite_sequencesqlite_sequence
CREATE TABLE sqlite_sequence(name,seq)
gtablecfurl_cache_responsecfurl_cache_response
CREATE TABLE cfurl_cache_response(entry_ID INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, 	 version INTEGER, hash_value INTEGER, storage_policy INTEGER, request_key TEXT UNIQUE, 	
 time_stamp NOT NULL DEFAULT CURRENT_TIMESTAMP, partition TEXT)G
indexsqlite_autoindex_cfurl_cache_response_2cfurl_cache_response
indexsqlite_autoindex_cfurl_cache_response_1cfurl_cache_response
tablecfurl_cache_schema_versioncfurl_cache_schema_version
CREATE TABLE cfurl_cache_schema_version(schema_version INTEGER)
-https://data.flurry.com/v1/flr.do2025-02-18 16:48:13
O	https://data.flurry.com/v1/flr.do
5	cfurl_cache_response
bplist00
WVersionUArray
_CFURLStringType\_CFURLString
!https://data.flurry.com/v1/flr.do#A
VServer\Content-TypeX__hhaa___
Strict-Transport-Security_
Content-LanguageTDate^Content-Length]Cache-ControlSATSYtext/html_
YnBsaXN0MDDXAQIDBAUGBwgKDA4QEhRWU2VydmVyXENvbnRlbnQtVHlwZV8QGVN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHlfEBBDb250ZW50LUxhbmd1YWdlVERhdGVeQ29udGV
udC1MZW5ndGhdQ2FjaGUtQ29udHJvbKEJU0FUU6ELWXRleHQvaHRtbKENXxAQbWF4LWFnZT0zMTUzNjAwMKEPUmVuoRFfEB1UaHUsIDA2IE1hciAyMDI1IDE2OjM2OjI5IEdNVK
ETUTShFV8QGHB1YmxpYywgbWF4LWFnZT0zMTUzNjAwMAgXHitHWl9ufH6ChI6Qo6WoqsrMztAAAAAAAAABAQAAAAAAAAAWAAAAAAAAAAAAAAAAAAAA6w==_
max-age=31536000Ren_
Thu, 06 Mar 2025 16:36:29 GMTQ4_
public, max-age=31536000_
 __CFURLResponseNullTokenString__Ytext/html
bplist00
WVersionUArray
_CFURLStringType\_CFURLString
!https://data.flurry.com/v1/flr.do#@4
__CFURLRequestNullTokenString__
TPOST
 !"#$%VAccept\Content-TypeX__hhaa___
X-Flurry-Api-Key_
Accept-Language^Content-Length_
Accept-EncodingS*/*_
application/o
O	https://data.flurry.com/v1/flr.do
3	2025-02-18 16:48:13
ctet-stream_
YnBsaXN0MDDWAQIDBAUGBwkLDQ8RXxAPQWNjZXB0LUVuY29kaW5nVkFjY2VwdF5Db250ZW50LUxlbmd0aFxDb250ZW50LVR5cGVfEBBYLU
ZsdXJyeS1BcGktS2V5XxAPQWNjZXB0LUxhbmd1YWdloQhfEBFnemlwLCBkZWZsYXRlLCBicqEKUyovKqEMVDM1NTOhDl8QGGFwcGxpY2F0aW9uL
29jdGV0LXN0cmVhbaEQXxAUOFJNNVdIUDYyODg1M0hRWEZLRFihElVlcy1lcwgVJy49Sl1vcYWHi42SlK+xyMoAAAAAAAABAQAAAAAAAAATAAAAAAAAAAAAAAAAAAAA0A==_
8RM5WHP628853HQXFKDXUes-esT3553_
gzip, deflate, br
{"fl.frame.version":1,"fl.frame.log.counter":76}^
{"fl.sdk.version.code":"12.1.1","fl.frame.version":1,"fl.background.enabled":false}Y
{"fl.frame.version":1,"fl.device.properties":{"bnd.ver":"1","device.arch":"arm64","scr.height":"1024","device.os.version":"13.3.1","scr.width":"768","device.model.1":"iPad5,1"}}
{"fl.app.orientation":1,"fl.frame.version":1}k
{"fl.country":"CO","fl.language":"en","fl.frame.version":1}
{"fl.frame.version":1,"fl.ad.tracking":true,"fl.reported.id":{"iOSInstallationId":"IwNJCjOWTg+1DW4byBFCbA==","VendorId":"3E69204B-94BB-403B-A289-A9A0D22E25B1"}}fH
{"fl.timezone.value":"America\/Bogota","fl.frame.version":1}3
{"fl.frame.version":1,"fl.app.previous.state":0,"fl.app.current.state":1}
{"fl.background.session.metrics":true,"fl.frame.version":1,"fl.play.service.availability":-1,"fl.agent.version":283,"fl.apikey":"8RM5WHP628853HQXFKDX","fl.agent.report.key":1,"fl.agent.platform":8}
{"fl.cellular.name":"unavailable","fl.network.status":2,"fl.cellular.operator":"unavailable","fl.frame.version":2,"fl.cellular.band":"unavailable"}
{"fl.bundle.id":"com.highaltitudehacks.DVIAswiftv2","fl.app.version.code":"1","fl.app.version":"2.0","fl.frame.version":1,"fl.build.environment":1}
{"fl.frame.version":1,"fl.report.location.enabled":true,"fl.location.permission.status":false}
{"fl.session.elapsed.start.time":847659484,"fl.session.id.current.state":0,"fl.session.id":1741278849806,"fl.frame.version":1}
{"fl.cellular.name":"unavailable","fl.network.status":2,"fl.cellular.operator":"unavailable","fl.frame.version":2,"fl.cellular.band":"unavailable"}
{"fl.frame.version":1,"fl.app.previous.state":1,"fl.app.current.state":0}F
{"fl.frame.version":1,"fl.session.property":{"battery.remaining.start":{"value":"1"},"disk.size.used":{"value":"31031205888"},
"carrier.mnc":{"value":"unavailable"},"boot.time":{"value":"1740431190"},"carrier.mcc":{"value":"unavailable"},
"memory.available.start":{"value":"211566592"},"cpu.load.start":{"value":"0"},"disk.size.total":{"value":"127999954944"},
"disk.size.available":{"value":"96968749056"},"memory.used.inactive.start":{"value":"485359616"},"memory.total":{"value":"1639809024"},
"memory.used.wired.start":{"value":"292700160"},"battery.charging.start":{"value":"1"},"carrier.name":{"value":"unavailable"},"memory.used.active.start":{"value":"650182656"}}}@
{"fl.frame.version":1,"fl.report.previous.success":true}
{"fl.frame.version":1,"fl.report.previous.success":true}w\
{"fl.frame.version":1,"fl.app.previous.state":0,"fl.app.current.state":1}
{"fl.session.elapsed.start.time":847659484,"fl.session.id.current.state":0,"fl.session.id":1741278849806,"fl.session.elapsed.end.time":847798781,"fl.frame.version":1}
{"fl.continue.session.millis":10000,"fl.initial.timestamp":1739897292267,"fl.frame.version":1,"fl.session.event":"SESSION_PAUSE","fl.session.timestamp":1741278989104,"fl.session.state":0}
{"fl.frame.version":1,"fl.flush.frame.code":2,"fl.flush.frame.reason":"App State has changed"}

si organizamos esta data, podemos sacar esta información relevante

Información relevante extraída

🔑 Claves y tokens

  • fl.apikey: 8RM5WHP628853HQXFKDX
  • fl.agent.report.key: 1
  • fl.agent.version: 283

📱 Información del dispositivo

  • Modelo: iPad5,1
  • Arquitectura: arm64
  • Sistema operativo: iOS 13.3.1
  • Resolución de pantalla: 768x1024
  • ID de instalación: IwNJCjOWTg+1DW4byBFCbA==
  • Vendor ID: 3E69****-****-****-****-********25B1

🌍 Información de red y ubicación

  • País: CO
  • Idioma: en
  • Zona horaria: America/Bogota
  • Estado de red: 2 (posiblemente “conectado”)
  • Operador celular: unavailable
  • Banda celular: unavailable

🔋 Estado del dispositivo

  • Batería restante: 1 (probablemente 100%)
  • Batería cargando: 1 (cargando)
  • CPU load start: 0
  • Memoria total: 1.6 GB (1639809024 bytes)
  • Memoria activa usada: 650 MB (650182656 bytes)
  • Memoria inactiva usada: 485 MB (485359616 bytes)
  • Memoria cableada usada: 292 MB (292700160 bytes)
  • Memoria disponible: 211 MB (211566592 bytes)

💾 Almacenamiento

  • Espacio total: 127.99 GB
  • Espacio usado: 31 GB
  • Espacio disponible: 96.96 GB

🕒 Datos de sesión

  • ID de sesión: 1741278849806
  • Tiempo de inicio de sesión: 847659484
  • Tiempo de finalización de sesión: 847798781
  • Evento de sesión: SESSION_PAUSE
  • Tiempo inicial: 1739897292267
  • Timestamp de sesión: 1741278989104
  • Duración continua de sesión: 10,000 ms

🌐 URLs Accedidas

  • https://data.flurry.com/v1/flr.do (múltiples veces)

Realm

¿Qué es Realm? Realm es un sistema de base de datos utilizado en aplicaciones móviles (iOS y Android) como alternativa a SQLite. Es rápida y eficiente, pero muchas veces las aplicaciones no protegen adecuadamente los datos almacenados en Realm, lo que permite a un atacante acceder a información sensible.

El reto dice: La entrada ingresada aquí se guarda en Realm. Tu tarea es encontrar dónde se almacena esta información en el sandbox de la aplicación

{7FEB9C19-148E-48BB-8DA8-CF130E8EA686}.png

con la herramienta Grapefruit, podemos ver el archivo, vamos a realizar el proceso como el reto anterios para ver que información tiene

image.png

ingresamos por ssh

┌──(rootangussMoody)-[/home/angussmoody]
└─# ssh root@192.168.1.1
root@192.168.1.1's password: 
iPad-21:~ root# 

buscamos el archivo con el comando find /private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 -name "**.realm*"

iPad-21:/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 root# find /private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 -name "**.realm*"
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Documents/default.realm
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Documents/default.realm.lock
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Documents/default.realm.management
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Documents/default.realm.note

Descargamos el archivo

┌──(rootangussMoody)-[/mnt/angussMoody/iOs/cache]
└─# scp root@192.168.1.1:/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Documents/default.realm .
root@192.168.1.1's password: 
default.realm

y con la herramienta realm studio, cargamos el archivo, en este caso vemos que maneja un error

cargamos el archivo

image.png

y vemos los resultados, en este caso no da información

image.png

Couchbase Lite

¿Qué es Couchbase Lite?

Couchbase Lite es una base de datos NoSQL embebida diseñada para aplicaciones móviles, incluyendo iOS. Permite almacenar y sincronizar datos de forma eficiente sin necesidad de una conexión permanente a internet. Se utiliza en aplicaciones que requieren almacenamiento local y sincronización con la nube cuando sea posible

El reto dice: La entrada introducida aquí se guarda en una base de datos de Couchbase Lite. Su tarea es encontrar dónde se almacena este valor en el sandbox de la App

image.png

el archivo se puede ver con la herramienta Grapefruit

image.png

ahora vamos a buscar el archivo para descargarlo

ingresamos por ssh

┌──(rootangussMoody)-[/home/angussmoody]
└─# ssh root@192.168.1.1
root@192.168.1.1's password: 
iPad-21:~ root# 

buscamos el archivo con el comando find /private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 -name "*db.sqlite3*"

iPad-21:~ root# find /private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937 -name "*db.sqlite3*"
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Application Support/CouchbaseLite/dvcouchbasedb.cblite2/db.sqlite3
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Application Support/CouchbaseLite/dvcouchbasedb.cblite2/db.sqlite3-shm
/private/var/mobile/Containers/Data/Application/FEE1ECF4-9562-4EDA-BD52-AC31AEEB5937/Library/Application Support/CouchbaseLite/dvcouchbasedb.cblite2/db.sqlite3-wal
iPad-21:~ root#

ahora ya podemos descargar el archivo para verlo en local

┌──(rootangussMoody)-[/mnt/angussMoody/iOS/cache/copi]
└─# scp root@192.168.1.1:/var/mobile/Containers/Data/Application/7BA2CB88-F7F0-4800-A1BC-7FE9C6226728/Library/Application\ Support/CouchbaseLite/dvcouchbasedb.cblite2/db.sqlite3 .
root@192.168.1.1's password: 
db.sqlite3                                                                                                                                                100% 4096   219.9KB/s   00:00    

┌──(rootangussMoody)-[/mnt/angussMoody/iOS/cache/copi]
└─# ll
.rwxrwxrwx 4.1k angussmoody  7 Mar 12:50 db.sqlite3

YapDatabase

¿Qué es YapDatabase?

YapDatabase es una base de datos basada en SQLite optimizada para aplicaciones iOS y macOS. Se usa principalmente en apps que necesitan almacenamiento eficiente, indexación avanzada y sincronización.

El reto dice: La entrada introducida aquí se guarda utilizando una biblioteca YapDatabase. Su tarea es encontrar dónde se almacena este valor en el sandbox de la App.

{3DD30037-BD65-4FFD-AA5E-6E89ADD4C9ED}.png

a la aplicación de Grapefruit podemos ver el archivo llamado YapDatabase.sqlite

image.png

una vez abrimos este archivo podemos ver que cuenta con unas tablas, pero esta data aparce vacía

{83FD51D0-637A-4275-BF83-952D990719DC}.png

también si descargamos el archivo y lo vemos nos sale sin data

{26B09093-24E4-4F3A-8B1C-37601F910B8D}.png