Posted in

Pentesting de aplicaciones iOS (Parte 1) Fundamentos y escaneo inicial

En esta serie de entradas, vamos a ver como realizar pruebas de pentesting en aplicaciones para iOS. En este primer artículo repasaremos conceptos fundamentales e iniciaremos con algunos pasos básicos para localizar y extraer un IPA, así como hacer una primera enumeración.

Advertencia: La información y las técnicas compartidas en este post son sólo con fines educativos o para realizar pruebas debidamente autorizadas. Atacar aplicaciones sin consentimiento, puede ser considerado ilegal. Utilice este conocimiento bajo su propio riesgo.

Antes de iniciar, es importante aclarar que esta serie de entradas no estarán enfocadas a detallar el funcionamiento de un sistema operativo iOS, o como se desarrollan aplicaciones en ese sistema operativo. Si el mundo de las aplicaciones móviles es nuevo para ti, te sugerimos que inicies investigando sobre cómo funcionan las aplicaciones en un SO móvil, no solo para iOS, sino para Android, a fin de que puedas tener las bases y entiendas adecuadamente los conceptos que compartiremos acá. Nuestro enfoque será desde la perspectiva de ciberseguridad ofensiva.

Bien, comencemos

Para poder hacer pentesting sobre una aplicación móvil, lo primero que debemos saber es que las aplicaciones generalmente de desarrollan en algun lenguaje específico como Objective-C o Swift, y luego son compiladas para ser subidas a la tienda App Store, desde donde los usuarios pueden descargarla, instalarla y utilizarla. La compilación y paquetización de la aplicación, genera un archivo con extensión .ipa.

Ahora, de forma convencional, no es posible instalar aplicaciones de terceros ya que Apple exige que las aplicaciones se firmen digitalmente, y se revisan antes de ser subidas al store. Apple, por defecto, también restringe que uno pueda descargar el archivo .ipa ya sea desde un browser o desde el propio dispositivo.

Este punto, puede ser un primer obstáculo cuando queremos hacer el pentesting de la aplicación. Si es una prueba de caja blanca o gris, puedes pedirle el compilado directamente al equipo de desarrollo, pero cuando la prueba es de caja negra, probablemente no quieran brindarte ninguna ayuda.

Extrayendo el archivo .ipa

Entonces, para poder comenzar a analizar la aplicación, es necesario previamente tener un entorno preparado. Eso implica «romper» la seguridad de un dispositivo con iOS a través de un procedimiento que se llama Jailbreak. No ahondaremos en técnicas de Jailbreak para dispositivos iOS, pero existen múltiples fuentes que te ayudarán con eso. Solo ten en cuenta que este procedimiento puede anular la garantía de tu dispositivo, además que existen riesgos de seguridad que debes asumir.

Una vez que tengamos un dispositivo iOS Jailbrekeado, las posibilidades son mayores. Ahora ya podemos extraer los archivos .ipa para poder hacer ingeniería inversa o analizar el contenido interno del paquete. Vayamos allá:

  • Cuando instalamos una aplicación en iOS, se despliega el paquete en un directorio particular. De acuerdo a Apple, cada aplicación funciona en su propia sandbox:
  • Por regla general, una aplicación no puede acceder o crear archivo fuera de su sandbox. Por supuesto, existen excepciones cuando la aplicación requiere utilizar funcionalidades del sistema como acceso a los contactos, a la galería, a SMS, etc.
  • Además de tener el Iphone con jailbreak, un requisito para continuar, es tener instalado Frida: https://github.com/frida/frida/releases. Como ya tienes acceso al SO, podrás instalar y levantar el servicio sin problemas. Como alternativa, puedes instalarlo desde alguna tienda no oficial como Cydia, que se puede utilizar cuando un dispositivo iOS ha sido jailbrekeado. Desde luego, para poder conectarte al servicio, debes instalar Frida en tu equipo, ya sea Windows, Linux o MacOS. Si quieres aprender a instalar y usar Frida, puedes ver el siguiente artículo: https://labitacoradelhacker.com/pentesting-en-aplicaciones-moviles-instalacion-de-frida/
  • Para poder extraer el ipa de alguna aplicación, utilizaremos la herramienta Bagbak, la cual puedes descargar desde acá https://github.com/ChiChou/bagbak (también se encuentra la forma de instalación). Una vez instalada, la ejecutaremos desde nuestro SO de escritorio. Recuerda que el servicio de Frida debe estar levantado, y tu dispositivo iOS debe estar conectado a tu equipo de escritorio. Sugerimos que sea mediante USB.
  • Vemos la lista de aplicaciones instaladas en el dispositivo:
  • Ejecutaremos bagbak -l para identificar la aplicación que queremos extraer, tomamos como ejemplo DVIA:
  • Ahora ejecutaremos bagbak [nombre del paquete]. La herramienta extraerá del sistema de archivos el contenido del paquete y nos devolverá un .ipa desencriptado.
  • Y listo, ya tenemos nuestro .ipa para poder analizarlo fuera del entorno de iOS.

Analizar el entorno de instalación de una aplicación

Si bien hemos podido extraer el .ipa para analizarlo de modo offline, cuando estamos haciendo pentesting a una aplicación, es importante revisar el entorno donde se ha instalado, dentro del sistema de archivos de iOS. Para poder analizar esto, necesitamos entender algunos puntos:

Ya habíamos indicado previamente que el .ipa es un archivo «zipeado» que contiene internamente los elementos principales. Dentro de un sistema de archivos iOS, las aplicaciones se instalan en la ruta /var. Hay que tener en cuenta que /private/var y /var apuntan a la misma ruta dentro del file system.

Ahora, para poder entender donde se instala la aplicación, hace falta conocer dos directorios principales:

  • Directorio del bundle: es un directorio que almacena los recursos estáticos de la aplicación, como imagenes, audio, y otros archivo, incluyendo el binario de la aplicación.. La ruta para estas carpetas es: /var/containers/Bundle/Application/[unique-identifier]/
  • Directorio de datos o documentos: es un directorio que almacena datos de la aplicación, como las configuraciones, archivos temporales y datos de usuarios. La ruta para estas carpetas es: /var/mobile/Containers/Data/Application/[unique-identifier]/

En ambas rutas hemos visto que existe un identificador único, el cual es un UUID para cada aplicación, esta es una cadena alfanumérica generada aleatoriamente, no es reversible ni contiene información útil. Teniendo en cuenta lo explicado anteriormente, vamos a explorar los contenedores de la aplicación DVIA

  • Accedemos al dispositivo mediante ssh, la contraseña por defecto es alpine. Es importante tener en cuenta que como ya explicamos antes, lo estamos haciendo desde un dispositivo con Jailbreak:
  • Ahora, nos dirigimos al directorio de datos de la aplicación:
  • Para identificar cual es la carpeta que corresponde a DVIA, podemos usar un simple find:
find -name "*DVIA*"
  • Una vez identificado el UUID, exploramos el directorio:
  • Como vemos, encontramos archivos de configuración, temporales, logs, bases de datos de usuarios etc.
  • Veamos ahora el directorio del bundle, para ello podemos listar los procesos en ejecución, a fin de que nos entregue el UUID:
  • Con este identificador, nos dirigimos a la ruta del directorio:
  • Como vemos, este contiene el archivo .plist y el directorio .app, el cual a su vez contiene el binario de la aplicación:
  • Podemos extraer este binario para analizarlo con herramientas como IDA o Hopper Disassembler.
  • El archivo plist es un tipo de archivo utilizado por iOS y MacOS para almacenar datos estructurados, como configuraciones, preferencias, información de aplicaciones, etc. Es facil de leer, ya que su estructura es un XML.

Un método alternativo para conocer los directorios y explorarlos es utilizando Objection. Esta es una herramienta que se soporta en Frida, y que nos permite analizar la aplicación en tiempo de ejecución. La puedes descargar desde acá: https://github.com/sensepost/objection. Veamos como utilizarla para obtener los directorios:

  • Primero necesitamos conocer el identificador del paquete, el cual podemos obtener directamente con Frida:
frida-ps -Uai | grep DVIA
  • Ahora, iniciaremos Objection:
objection -g com.highaltitudehacks.DVIAswiftv2 explore
  • Ejecutando el comando env, podremos conocer las rutas en donde está instalada nuestra aplicación:

Ya sea directamente en la ruta conectados con SSH, o desde Objection, podemos comenzar a revisar los archivos internos en busca de información que nos sea útil para continuar con el proceso de pentesting.

Veamos ahora las carpetas principales que existen en estructura del directorio de datos:

DirectorioDescripción
AppName.appEs el paquete que contiene la aplicación y los recursos, no se puede modificar o escribir en este directorio, para evitar la manipulación se firma el paquete en el momento de instalación.
Documents/En este directorio se almacena información generada por el usuario, puede ser de uso compartido dependiendo de lo que desee exponer el usuario.
Documents/InboxAlmacena archivos que la app recibe de origen externo.
Library/Contiene información adicional que utiliza la app para funcionar.
tmp/Almacena archivos temporales que pueden ser eliminados por el sistema en cualquier momento, especialmente cuando el dispositivo requiere espacio.

Ahora veamos la estructura de la carpeta Library:

Sub Directorio LibraryDescripción
Application SupportSe almacenan archivos de datos de la aplicación, por ejemplo, archivos de configuración, plantillas u otros archivos modificables por el aplicativo.
CachesEs un directorio para escribir archivos temporales que se utiliza regularmente, como archivos descargados, imágenes o datos, el contenido puede ser eliminado cuando se requiere espacio en el dispositivo.
FrameworksContiene frameworks utilizados por el aplicativo, como también personalizados o de terceros.
PreferencesAlmacena configuraciones de usuario específicas de la aplicación. Incluye datos y características de la aplicación.

Si bien es importante escanear todos los archivos, podemos poner foco inicial a los siguientes:

ArchivosDescripción
plistLos archivos plist (Property List), son los archivos usados en iOS para almacenar datos semi-estructurados como configuraciones, preferencias y otras. Los archivos plist pueden incluso contener credenciales cuando existe una configuración no adecuada.
Base de datosLa base de datos locales para las aplicaciones iOS usan el formato SQLite, Core Data, Realm, Firebase y Supabase.
JSON o XMLPueden contener datos temporales o metadatos que necesiten ser leídos de manera inmediata por la aplicación.
KeychainEs donde se almacena información sensible como credenciales o tokens de autenticación de manera segura.
NSURLCredentialStorageEn la memoria caché compartida se almacena y recupera instancias de NSURLCredential. Pueden alojar credenciales de forma segura.

Como ya estamos analizando la aplicación DVIA, busquemos algunos archivos que puedan contener información sensible:

  • Dentro del directorio de datos, buscamos archivos de tipo plist:
  • Vemos que existen dos archivos. Analizaremos el primero: userInfo.plist
  • Como podemos ver, el archivo en formato XML contiene un conjunto de credenciales en texto plano.
  • Ahora busquemos bases de datos. Con el siguiente comando, podemos encontrar BD en los formatos más conocidos:
find . -regex '.*\.\(sqlite\|db\|realm\)$'
  • Vemos que hay algunos archivos interesantes. Puedes utilizar cualquier herramienta para descargar los archivos y analizarlos de forma local. Nosotros usaremos Filezilla para descargar las bases SQLite:
  • Usando el programa DB Browser for SQLite, podemos abrir los archivos. Puedes descargar la herramienta desde acá: https://sqlitebrowser.org/
  • Ahora vamos a revisar algunas configuraciones de la aplicación, haciendo uso de Objection. Usando el comando ‘ios nsuserdefaults get‘, podemos obtener configuraciones y preferencias del usuario que estan almacenadas de manera persistente:
  • Con el comando ‘ios plist cat userInfo.plist‘, podemos acceder al contenido del archivo userInfo.plist, el cual en este caso nos revela credenciales:
  • Una capacidad interesante de Objection, es que nos permite acceder en modo consola a las BD Sqlite:
  • Como podemos ver, existen múltiples formas de leer la información que ha creado la aplicación durante su instalación y uso, por lo que esto podría ayudarnos durante nuestra fase de escaneo.

Bien, por ahora dejaremos este artículo acá. En una segunda parte veremos como evadir el control anti-jailbreak que tienen algunas aplicaciones, lo que puede ser un primer obstáculo si queremos continuar con el pentesting.