hacktricks/mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md
2023-06-03 01:46:23 +00:00

25 KiB

Obtener el UDID de un dispositivo iOS

{% hint style="info" %} Realice estas acciones teniendo el dispositivo conectado a la computadora a través de USB y teniendo el dispositivo desbloqueado. {% endhint %}

El UDID es una secuencia única de 40 dígitos de letras y números para identificar un dispositivo iOS. Puede encontrar el UDID de su dispositivo iOS en macOS Catalina en adelante en la aplicación Finder, ya que iTunes ya no está disponible en Catalina. Simplemente seleccione el dispositivo iOS conectado en Finder y haga clic en la información debajo del nombre del dispositivo iOS para iterar a través de ella. Además del UDID, puede encontrar el número de serie, IMEI y otra información útil.

Si está utilizando una versión de macOS anterior a Catalina, puede encontrar el UDID de su dispositivo iOS a través de iTunes, seleccionando su dispositivo y haciendo clic en "Número de serie" en la pestaña Resumen. Al hacer clic en esto, iterará a través de diferentes metadatos del dispositivo iOS, incluido su UDID.

También es posible obtener el UDID a través de varias herramientas de línea de comandos en macOS mientras el dispositivo está conectado a través de USB:

  • Usando la herramienta I/O Registry Explorer ioreg:

      $ ioreg -p IOUSB -l | grep "USB Serial"
      |         "USB Serial Number" = "9e8ada44246cee813e2f8c1407520bf2f84849ec"
    
  • Usando ideviceinstaller (también disponible en Linux):

      $ brew install ideviceinstaller
      $ idevice_id -l
      316f01bd160932d2bf2f95f1f142bc29b1c62dbc
    
  • Usando el system_profiler:

      $ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p;/iPod/,/Serial/p' | grep "Serial Number:"
      2019-09-08 10:18:03.920 system_profiler[13251:1050356] SPUSBDevice: IOCreatePlugInInterfaceForService failed 0xe00002be
                  Serial Number: 64655621de6ef5e56a874d63f1e1bdd14f7103b1
    
  • Usando instruments:

      $ instruments -s devices
    

Accediendo a la Shell del Dispositivo

Después de hacer jailbreak al dispositivo, debería haber instalado algún nuevo administrador de aplicaciones como Cydia.

SSH

Para habilitar el acceso SSH a su dispositivo iOS, puede instalar el paquete OpenSSH. Una vez instalado, puede acceder a su dispositivo a través de ssh ejecutando ssh root@<device_ip_address>, lo que lo iniciará sesión como usuario root:

$ ssh root@192.168.197.234
root@192.168.197.234's password:
iPhone:~ root#

Al acceder a su dispositivo iOS a través de SSH, tenga en cuenta lo siguiente:

  • Los usuarios predeterminados son root y mobile.
  • La contraseña predeterminada para ambos es alpine.

Recuerde cambiar la contraseña predeterminada para ambos usuarios root y mobile, ya que cualquier persona en la misma red puede encontrar la dirección IP de su dispositivo y conectarse a través de la contraseña predeterminada conocida, lo que les dará acceso de root a su dispositivo.

Conectar a un dispositivo a través de SSH por USB

Durante una prueba real de caja negra, es posible que no haya una conexión Wi-Fi confiable disponible. En esta situación, puede usar usbmuxd para conectarse al servidor SSH de su dispositivo a través de USB.

Conecte macOS a un dispositivo iOS instalando e iniciando iproxy:

$ brew install libimobiledevice
$ iproxy 2222 22
waiting for connection

El comando anterior mapea el puerto 22 del dispositivo iOS al puerto 2222 en localhost. También puedes hacer que iproxy se ejecute automáticamente en segundo plano si no quieres ejecutar el binario cada vez que quieras hacer SSH a través de USB.

Con el siguiente comando en una nueva ventana de terminal, puedes conectarte al dispositivo:

$ ssh -p 2222 root@localhost
root@localhost's password:
iPhone:~ root#

Pequeña nota sobre el USB de un iDevice: en un dispositivo iOS no se pueden hacer conexiones de datos después de 1 hora de estar bloqueado, a menos que lo desbloquees de nuevo debido al Modo Restringido de USB, que se introdujo con iOS 11.4.1.

Aplicación de Shell en el dispositivo

Aunque normalmente el uso de una shell en el dispositivo (emulador de terminal) puede resultar muy tedioso en comparación con una shell remota, puede resultar útil para la depuración en caso de, por ejemplo, problemas de red o para verificar alguna configuración. Por ejemplo, puedes instalar NewTerm 2 a través de Cydia para este propósito (admite iOS 6.0 a 12.1.2 en el momento de escribir esto).

Además, hay algunos jailbreaks que desactivan explícitamente el SSH entrante por razones de seguridad. En esos casos, es muy conveniente tener una aplicación de shell en el dispositivo, que puedes usar para primero SSH fuera del dispositivo con una shell inversa, y luego conectarte desde tu computadora host a ella.

Para abrir una shell inversa sobre SSH, ejecuta el comando ssh -R <remote_port>:localhost:22 <username>@<host_computer_ip>.

En la aplicación de shell en el dispositivo, ejecuta el siguiente comando y, cuando se te solicite, ingresa la contraseña del usuario mstg de la computadora host:

ssh -R 2222:localhost:22 mstg@192.168.197.235

En tu ordenador anfitrión ejecuta el siguiente comando y, cuando se te solicite, introduce la contraseña del usuario root del dispositivo iOS:

$ ssh -p 2222 root@localhost

Contraseña olvidada

Si olvidas tu contraseña y quieres restablecerla a la predeterminada alpine:

  1. Edita el archivo /private/etc/master.passwd en tu dispositivo iOS con jailbreak usando una terminal en el dispositivo o usando aplicaciones como Filza o iFile.

  2. Encuentra las líneas:

     root:xxxxxxxxx:0:0::0:0:System Administrator:/var/root:/bin/sh
     mobile:xxxxxxxxx:501:501::0:0:Mobile User:/var/mobile:/bin/sh
    
  3. Cambia xxxxxxxxx por /smx7MYTQIi2M (que es la contraseña cifrada alpine).

  4. Guarda y sal.

Transferencia de datos

Copiar archivos de datos de aplicaciones a través de SSH y SCP

Como sabemos ahora, los archivos de nuestra aplicación se almacenan en el directorio Data. Ahora puedes simplemente archivar el directorio Data con tar y extraerlo del dispositivo con scp:

iPhone:~ root# tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
iPhone:~ root# exit
$ scp -P 2222 root@localhost:/tmp/data.tgz .

Usando iFunbox

iFunbox es una aplicación GUI que se puede utilizar para varias cosas (subir/bajar archivos entre ellas).
Otra herramienta GUI para este propósito es iExplorer.

{% hint style="info" %} A partir de la versión 8.4 de iOS, Apple ha restringido el acceso de los administradores de terceros al sandbox de la aplicación, por lo que herramientas como iFunbox e iExplorer ya no muestran/recuperan archivos de las aplicaciones instaladas en el dispositivo si el dispositivo no está jailbroken. {% endhint %}

Usando Objection

Cuando se inicia objection (objection --gadget com.apple.mobilesafari explorer) se encontrará el prompt dentro del directorio Bundle.

org.owasp.MSTG on (iPhone: 10.3.3) [usb] # pwd print
Current directory: /var/containers/Bundle/Application/DABF849D-493E-464C-B66B-B8B6C53A4E76/org.owasp.MSTG.app

Utiliza el comando env para obtener los directorios de la aplicación y navega al directorio de Documentos.

org.owasp.MSTG on (iPhone: 10.3.3) [usb] # cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
/var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents

Con el comando file download <nombre_archivo> puedes descargar un archivo del dispositivo iOS a tu computadora y analizarlo posteriormente.

org.owasp.MSTG on (iPhone: 10.3.3) [usb] # file download .com.apple.mobile_container_manager.metadata.plist
Downloading /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/.com.apple.mobile_container_manager.metadata.plist to .com.apple.mobile_container_manager.metadata.plist
Streaming file from device...
Writing bytes to destination...
Successfully downloaded /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/.com.apple.mobile_container_manager.metadata.plist to .com.apple.mobile_container_manager.metadata.plist

También puedes subir archivos al dispositivo iOS con file upload <local_file_path>.

Obtención y Extracción de Aplicaciones

Obteniendo el archivo IPA desde un enlace de distribución OTA

Durante el desarrollo, a veces se proporcionan aplicaciones a los probadores a través de la distribución por aire (OTA). En esa situación, recibirás un enlace de itms-services, como el siguiente:

itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist

Puedes utilizar la herramienta ITMS services asset downloader para descargar el archivo IPA desde una URL de distribución OTA. Instálalo a través de npm:

$ npm install -g itms-services

Guarda el archivo IPA localmente con el siguiente comando:

# itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa

Adquisición del binario de la aplicación

  1. Desde un IPA:

    Si tienes el IPA (probablemente incluyendo un binario de aplicación ya descifrado), descomprímelo y estará listo para usar. El binario de la aplicación se encuentra en el directorio principal del paquete (.app), por ejemplo, Payload/Telegram X.app/Telegram X. Consulta la siguiente subsección para obtener detalles sobre la extracción de las listas de propiedades.

    En el Finder de macOS, los directorios .app se abren haciendo clic derecho en ellos y seleccionando "Mostrar contenido del paquete". En la terminal, simplemente puedes usar cd para acceder a ellos.

  2. Desde un dispositivo con Jailbreak:

    Si no tienes el IPA original, necesitarás un dispositivo con Jailbreak donde instalarás la aplicación (por ejemplo, a través de la App Store). Una vez instalada, necesitas extraer el binario de la aplicación de la memoria y reconstruir el archivo IPA. Debido a la protección DRM, el archivo binario de la aplicación está cifrado cuando se almacena en el dispositivo iOS, por lo que simplemente extraerlo del paquete (ya sea a través de SSH o Objection) no será suficiente para ingeniería inversa (lee la siguiente sección).

Descifrado (Manual)

A diferencia de una aplicación de Android, el binario de una aplicación de iOS solo puede ser desensamblado y no decompilado.
Cuando se envía una aplicación a la App Store, Apple primero verifica la conducta de la aplicación y antes de lanzarla en la App Store, Apple cifra el binario usando FairPlay. Por lo tanto, la descarga del binario desde la App Store está cifrada, lo que complica las tareas de ingeniería inversa.

Sin embargo, ten en cuenta que hay otros software de terceros que se pueden utilizar para ofuscar los binarios resultantes.

Para ejecutar el binario cifrado, el dispositivo necesita descifrarlo en la memoria. Luego, es posible volcar el binario descifrado desde la memoria.

Primero, comprueba si el binario se compila con la marca PIE (Código de Posición Independiente):

otool -Vh Original_App #Check the last word of the last line of this code
Home:
Mach header
      magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   X86_64        ALL  0x00     EXECUTE    47       6080   NOUNDEFS DYLDLINK TWOLEVEL PIE

Si está establecido, puedes usar el script change_macho_flags.py para eliminarlo con python2:

python change_mach_o_flags.py --no-pie Original_App
otool -Vh Hello_World
Hello_World:
Mach header
      magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC      ARM         V7  0x00     EXECUTE    22       2356   NOUNDEFS DYLDLINK TWOLEVEL MH_NO_HEAP_EXECUTION

Ahora que la bandera PIE no está establecida, el sistema operativo cargará el programa en una ubicación de inicio fija cada vez. Para encontrar esta ubicación, puedes usar:

otool -l Original_App | grep -A 3 LC_SEGMENT | grep -A 1 __TEXT
  segname __TEXT
   vmaddr 0x00004000

Entonces, es necesario extraer el rango de memoria que debe ser volcado:

otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO
          cmd LC_ENCRYPTION_INFO
      cmdsize 20
     cryptoff 16384
    cryptsize 17416192
      cryptid 0

El valor de cryptoff indica la dirección de inicio del contenido cifrado y cryptsize indica el tamaño del contenido cifrado.

Por lo tanto, la dirección de inicio para el volcado será vmaddr + cryptoff y la dirección final será dirección de inicio + cryptsize.
En este caso: dirección_de_inicio = 0x4000 + 0x4000 = 0x8000 __ y dirección_final = 0x8000 + 0x109c000 = 0x10a4000

Con esta información, solo es necesario ejecutar la aplicación en el dispositivo con jailbreak, adjuntarse al proceso con gdb (gdb -p <pid>) y volcar la memoria:

dump memory dump.bin 0x8000 0x10a4000

¡Felicidades! Has descifrado la sección encriptada en dump.bin. Ahora transfiere este volcado a tu ordenador y sobrescribe la sección encriptada con la descifrada:

dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App

Hay un paso más para completar. La aplicación todavía indica en sus metadatos que está encriptada, pero no lo está. Entonces, cuando se ejecuta, el dispositivo intentará descifrar la sección que ya está descifrada y fallará.
Sin embargo, puedes usar herramientas como MachOView para cambiar esta información. Solo abre el binario y establece el cryptid en 0:

Descifrado (Automáticamente)

frida-ios-dump

Puedes usar herramientas como frida-ios-dump para eliminar automáticamente la encriptación de una aplicación.

Primero, asegúrate de que la configuración en Frida-ios-dump dump.py esté configurada en localhost con el puerto 2222 cuando uses iproxy, o en la dirección IP real y el puerto del dispositivo desde el cual deseas volcar el binario.

Ahora puedes usar la herramienta de manera segura para enumerar las aplicaciones instaladas:

$ python dump.py -l
 PID  Name             Identifier
----  ---------------  -------------------------------------
 860  Cydia            com.saurik.Cydia
1130  Settings         com.apple.Preferences
 685  Mail             com.apple.mobilemail
 834  Telegram         ph.telegra.Telegraph
   -  Stocks           com.apple.stocks
   ...

y puedes volcar uno de los binarios listados:

$ python3 dump.py -u "root" -p "<PASSWORD>" ph.telegra.Telegraph

Start the target app ph.telegra.Telegraph
Dumping Telegram to /var/folders/qw/gz47_8_n6xx1c_lwq7pq5k040000gn/T
[frida-ios-dump]: HockeySDK.framework has been loaded.
[frida-ios-dump]: Load Postbox.framework success.
[frida-ios-dump]: libswiftContacts.dylib has been dlopen.
...
start dump /private/var/containers/Bundle/Application/14002D30-B113-4FDF-BD25-1BF740383149/Telegram.app/Frameworks/libswiftsimd.dylib
libswiftsimd.dylib.fid: 100%|██████████| 343k/343k [00:00<00:00, 1.54MB/s]
start dump /private/var/containers/Bundle/Application/14002D30-B113-4FDF-BD25-1BF740383149/Telegram.app/Frameworks/libswiftCoreData.dylib
libswiftCoreData.dylib.fid: 100%|██████████| 82.5k/82.5k [00:00<00:00, 477kB/s]
5.m4a: 80.9MB [00:14, 5.85MB/s]
0.00B [00:00, ?B/s]Generating "Telegram.ipa"

Después de esto, el archivo Telegram.ipa se creará en su directorio actual. Puede validar el éxito del volcado eliminando la aplicación y reinstalándola (por ejemplo, usando ios-deploy ios-deploy -b Telegram.ipa). Tenga en cuenta que esto solo funcionará en dispositivos con jailbreak, ya que de lo contrario la firma no será válida.

flexdecrypt

Para obtener el archivo ipa de una aplicación instalada, también puede usar la herramienta flexdecrypt o un envoltorio de la herramienta llamado flexdump.
En cualquier caso, deberá instalar flexdecrypt en el dispositivo ejecutando algo como:

wget https://github.com/JohnCoates/flexdecrypt/releases/download/1.1/flexdecrypt.deb
dpkg -i flexdecrypt.deb
rm flexdecrypt.deb

y para usar flexdump:

apt install zip unzip
wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump
flexdump list #List apps
flexdump dump Twitter.app #Create .ipa file from app

r2flutch

r2flutch es una herramienta que utiliza radare y frida para descifrar y volcar aplicaciones de iOS.

Consulte el github para obtener más información.

Instalación de aplicaciones

Cuando instala una aplicación sin usar la App Store de Apple, esto se llama sideloading. Hay varias formas de sideloading que se describen a continuación. En el dispositivo iOS, el proceso de instalación real es manejado por el daemon installd, que descomprimirá e instalará la aplicación. Para integrar servicios de aplicaciones o ser instalado en un dispositivo iOS, todas las aplicaciones deben estar firmadas con un certificado emitido por Apple. Esto significa que la aplicación solo se puede instalar después de una verificación exitosa de la firma del código. En un teléfono con jailbreak, sin embargo, puede evitar esta función de seguridad con AppSync, un paquete disponible en la tienda Cydia. Contiene numerosas aplicaciones útiles que aprovechan los privilegios de root proporcionados por el jailbreak para ejecutar funcionalidades avanzadas. AppSync es un ajuste que parchea installd, permitiendo la instalación de paquetes IPA falsificados.

Existen diferentes métodos para instalar un paquete IPA en un dispositivo iOS, que se describen en detalle a continuación.

Tenga en cuenta que iTunes ya no está disponible en macOS Catalina. Si está utilizando una versión anterior de macOS, iTunes todavía está disponible, pero desde iTunes 12.7 no es posible instalar aplicaciones.

Cydia Impactor

Cydia Impactor fue creado originalmente para hacer jailbreak a iPhones, pero ha sido reescrito para firmar e instalar paquetes IPA en dispositivos iOS a través de sideloading (e incluso archivos APK en dispositivos Android). Cydia Impactor está disponible para Windows, macOS y Linux. Una guía paso a paso y pasos de solución de problemas están disponibles en yalujailbreak.net.

libimobiledevice

En Linux y también en macOS, puede usar libimobiledevice, una biblioteca de protocolo de software multiplataforma y un conjunto de herramientas para la comunicación nativa con dispositivos iOS. Esto le permite instalar aplicaciones a través de una conexión USB ejecutando ideviceinstaller. La conexión se implementa con el demonio de multiplexación USB usbmuxd, que proporciona un túnel TCP sobre USB.

El paquete para libimobiledevice estará disponible en su administrador de paquetes de Linux. En macOS, puede instalar libimobiledevice a través de brew:

$ brew install libimobiledevice
$ brew install ideviceinstaller

Después de la instalación, tendrás disponibles varias nuevas herramientas de línea de comandos, como ideviceinfo, ideviceinstaller o idevicedebug.

# The following command will show detailed information about the iOS device connected via USB.
$ ideviceinfo
# The following command will install the IPA to your iOS device.
$ ideviceinstaller -i iGoat-Swift_v1.0-frida-codesigned.ipa
...
Install: Complete
# The following command will start the app in debug mode, by providing the bundle name. The bundle name can be found in the previous command after "Installing".
$ idevicedebug -d run OWASP.iGoat-Swift

ipainstaller

El IPA también se puede instalar directamente en el dispositivo iOS a través de la línea de comandos con ipainstaller. Después de copiar el archivo en el dispositivo, por ejemplo, a través de scp, puede ejecutar ipainstaller con el nombre de archivo IPA:

$ ipainstaller App_name.ipa

ios-deploy

En macOS también puedes usar la herramienta ios-deploy para instalar aplicaciones de iOS desde la línea de comandos. Deberás descomprimir tu IPA ya que ios-deploy utiliza los paquetes de aplicaciones para instalarlas.

$ unzip Name.ipa
$ ios-deploy --bundle 'Payload/Name.app' -W -d -v

Después de que la aplicación se instale en el dispositivo iOS, simplemente puedes iniciarla agregando la bandera -m, lo que iniciará la depuración directamente sin instalar la aplicación de nuevo.

$ ios-deploy --bundle 'Payload/Name.app' -W -d -v -m

Xcode

También es posible utilizar el entorno de desarrollo integrado (IDE) Xcode para instalar aplicaciones iOS siguiendo los siguientes pasos:

  1. Iniciar Xcode
  2. Seleccionar Window/Devices and Simulators
  3. Seleccionar el dispositivo iOS conectado y hacer clic en el signo + en Installed Apps.

Permitir la instalación de aplicaciones en un dispositivo que no sea un iPad

A veces, una aplicación puede requerir ser utilizada en un dispositivo iPad. Si solo tienes dispositivos iPhone o iPod touch, entonces puedes forzar a la aplicación a aceptar ser instalada y utilizada en estos tipos de dispositivos. Puedes hacer esto cambiando el valor de la propiedad UIDeviceFamily al valor 1 en el archivo Info.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>UIDeviceFamily</key>
  <array>
    <integer>1</integer>
  </array>

</dict>
</plist>

Es importante tener en cuenta que cambiar este valor romperá la firma original del archivo IPA, por lo que deberá volver a firmar el IPA después de la actualización para poder instalarlo en un dispositivo en el que no se haya desactivado la validación de la firma.

Es posible que este bypass no funcione si la aplicación requiere capacidades específicas de los iPads modernos mientras que su iPhone o iPod es un poco más antiguo.

Los posibles valores para la propiedad UIDeviceFamily se pueden encontrar en la documentación de desarrolladores de Apple.

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥