hacktricks/mobile-pentesting/ios-pentesting/ios-app-extensions.md

197 lines
15 KiB
Markdown
Raw Normal View History

2023-06-03 01:46:23 +00:00
# Extensiones de aplicaciones iOS
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
2022-04-28 16:01:33 +00:00
</details>
2023-06-03 01:46:23 +00:00
Las extensiones de aplicaciones permiten a las aplicaciones ofrecer funcionalidades y contenido personalizados a los usuarios mientras interactúan con otras aplicaciones o el sistema. Algunas de las más notables son:
2023-06-03 01:46:23 +00:00
* **Teclado personalizado**: reemplaza el teclado del sistema iOS con un teclado personalizado para su uso en todas las aplicaciones.
* **Compartir**: publica en un sitio web de intercambio o comparte contenido con otros.
* **Hoy**: también llamados **widgets**, ofrecen contenido o realizan tareas rápidas en la vista Hoy del Centro de Notificaciones.
2023-06-03 01:46:23 +00:00
Por ejemplo, el usuario selecciona texto en la _aplicación anfitriona_, hace clic en el botón "Compartir" y selecciona una "aplicación" o acción de la lista. Esto activa la _extensión de la aplicación_ de la _aplicación contenedora_. La extensión de la aplicación muestra su vista dentro del contexto de la aplicación anfitriona y utiliza los elementos proporcionados por la aplicación anfitriona, el texto seleccionado en este caso, para realizar una tarea específica (publicarlo en una red social, por ejemplo). Vea esta imagen de la [Guía de programación de extensiones de aplicaciones de Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple\_ref/doc/uid/TP40014214-CH2-SW13) que resume bastante bien esto:
2021-11-30 16:46:07 +00:00
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQx9khfTwUwYuMti%2Fapp\_extensions\_communication.png?alt=media)
2023-06-03 01:46:23 +00:00
### **Consideraciones de seguridad**
2023-06-03 01:46:23 +00:00
Desde el punto de vista de la seguridad, es importante tener en cuenta que:
2023-06-03 01:46:23 +00:00
* Una **extensión de aplicación nunca se comunica directamente con su aplicación contenedora** (por lo general, ni siquiera se está ejecutando mientras se ejecuta la extensión de la aplicación contenida).
* Una **extensión de aplicación** y la **aplicación anfitriona se comunican** a través de la **comunicación entre procesos**.
* La **aplicación contenedora de una extensión** y la **aplicación anfitriona no se comunican** en absoluto.
* Un **widget de Hoy** (y ningún otro tipo de extensión de aplicación) puede pedir al sistema que abra su aplicación contenedora llamando al método `openURL:completionHandler:` de la clase `NSExtensionContext`.
* Cualquier **extensión de aplicación** y su **aplicación contenedora** pueden **acceder a datos compartidos en un contenedor compartido definido de forma privada**.
* Las extensiones de aplicaciones **no pueden acceder a algunas API**, por ejemplo, HealthKit.
* No pueden recibir datos usando AirDrop, pero sí pueden enviar datos.
* **No se permiten tareas en segundo plano de larga duración**, pero se pueden iniciar cargas o descargas.
* Las extensiones de aplicaciones **no pueden acceder a la cámara o al micrófono en un dispositivo iOS** (excepto las extensiones de aplicaciones de iMessage).
2023-06-03 01:46:23 +00:00
### Análisis estático
2023-06-03 01:46:23 +00:00
#### **Verificación de si la aplicación contiene extensiones de aplicaciones**
2023-06-03 01:46:23 +00:00
Si tiene el código fuente original, puede buscar todas las ocurrencias de `NSExtensionPointIdentifier` con Xcode (cmd+shift+f) o echar un vistazo a "Build Phases / Embed App extensions":
![](<../../.gitbook/assets/image (496).png>)
2023-06-03 01:46:23 +00:00
Allí puede encontrar los nombres de todas las extensiones de aplicaciones incrustadas seguidas de `.appex`, ahora puede navegar a las extensiones de aplicaciones individuales en el proyecto.
2023-06-03 01:46:23 +00:00
Si no tiene el código fuente original:
2023-06-03 01:46:23 +00:00
Busque `NSExtensionPointIdentifier` entre todos los archivos dentro del paquete de la aplicación (IPA o aplicación instalada):
```bash
$ grep -nr NSExtensionPointIdentifier Payload/Telegram\ X.app/
Binary file Payload/Telegram X.app//PlugIns/SiriIntents.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Share.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/NotificationContent.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Widget.appex/Info.plist matches
Binary file Payload/Telegram X.app//Watch/Watch.app/PlugIns/Watch Extension.appex/Info.plist matches
```
2023-06-03 01:46:23 +00:00
También puedes acceder por SSH, encontrar el paquete de la aplicación y listar todos los PlugIns internos (que se colocan allí por defecto) o hacerlo con objection:
```bash
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # cd PlugIns
/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
Telegram X.app/PlugIns
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection Read Write Name
------------ ------- ------------------ ------ ------- -------------------------
Directory 493 None True False NotificationContent.appex
Directory 493 None True False Widget.appex
Directory 493 None True False Share.appex
Directory 493 None True False SiriIntents.appex
```
2023-06-03 01:46:23 +00:00
Ahora podemos ver las mismas cuatro extensiones de aplicaciones que vimos en Xcode antes.
2023-06-03 01:46:23 +00:00
#### **Determinando los tipos de datos soportados**
2023-06-03 01:46:23 +00:00
Esto es importante para los datos que se comparten con aplicaciones anfitrionas (por ejemplo, a través de extensiones de Compartir o Acción). Cuando el usuario selecciona algún tipo de dato en una aplicación anfitriona y coincide con los tipos de datos definidos aquí, la aplicación anfitriona ofrecerá la extensión. Vale la pena notar la diferencia entre esto y el intercambio de datos a través de `UIActivity`, donde teníamos que definir los tipos de documentos, también usando UTIs. Una aplicación no necesita tener una extensión para eso. Es posible compartir datos usando solo `UIActivity`.
2023-06-03 01:46:23 +00:00
Inspeccione el archivo `Info.plist` de la extensión de la aplicación y busque `NSExtensionActivationRule`. Esa clave especifica los datos que se admiten, así como, por ejemplo, el máximo de elementos admitidos. Por ejemplo:
```markup
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>10</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
```
2023-06-03 01:46:23 +00:00
Solo se admitirán los tipos de datos presentes aquí y que no tengan `0` como `MaxCount`. Sin embargo, es posible realizar filtrados más complejos utilizando una cadena de predicado llamada "predicate string" que evaluará los UTI proporcionados. Consulte la [Guía de programación de extensiones de aplicaciones de Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) para obtener información más detallada sobre esto.
2023-06-03 01:46:23 +00:00
**Comprobación del intercambio de datos con la aplicación contenedora**
2023-06-03 01:46:23 +00:00
Recuerde que las extensiones de aplicaciones y sus aplicaciones contenedoras no tienen acceso directo a los contenedores del otro. Sin embargo, se puede habilitar el intercambio de datos. Esto se hace a través de los "Grupos de aplicaciones" y la API [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Consulte esta figura de la [Guía de programación de extensiones de aplicaciones de Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW11):
2022-05-01 13:25:53 +00:00
![](../../mobile-apps-pentesting/ios-pentesting/broken-reference)
2023-06-03 01:46:23 +00:00
Como también se menciona en la guía, la aplicación debe configurar un contenedor compartido si la extensión de la aplicación utiliza la clase `NSURLSession` para realizar una carga o descarga en segundo plano, para que tanto la extensión como su aplicación contenedora puedan acceder a los datos transferidos.
2023-06-03 01:46:23 +00:00
**Verificación de si la aplicación restringe el uso de extensiones de aplicaciones**
2023-06-03 01:46:23 +00:00
Es posible rechazar un tipo específico de extensión de aplicación utilizando el siguiente método:
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
2023-06-03 01:46:23 +00:00
Sin embargo, actualmente solo es posible para las extensiones de aplicaciones de "teclado personalizado" (y debe verificarse al probar aplicaciones que manejen datos sensibles a través del teclado, como aplicaciones bancarias, por ejemplo).
2023-06-03 01:46:23 +00:00
### Análisis dinámico
2023-06-03 01:46:23 +00:00
Para el análisis dinámico, podemos hacer lo siguiente para obtener conocimiento sin tener el código fuente:
2023-06-03 01:46:23 +00:00
* Inspeccionar los elementos que se comparten
* Identificar las extensiones de aplicaciones involucradas
2023-06-03 01:46:23 +00:00
**Inspeccionar los elementos que se comparten**
2023-06-03 01:46:23 +00:00
Para esto, debemos enganchar `NSExtensionContext - inputItems` en la aplicación de origen de los datos.
2023-06-03 01:46:23 +00:00
Siguiendo el ejemplo anterior de Telegram, ahora usaremos el botón "Compartir" en un archivo de texto (que se recibió de un chat) para crear una nota en la aplicación Notas con él:
![](<../../.gitbook/assets/image (497).png>)
2023-06-03 01:46:23 +00:00
Si ejecutamos un rastreo, veremos la siguiente salida:
```bash
(0x1c06bb420) NSExtensionContext - inputItems
0x18284355c Foundation!-[NSExtension _itemProviderForPayload:extensionContext:]
0x1828447a4 Foundation!-[NSExtension _loadItemForPayload:contextIdentifier:completionHandler:]
0x182973224 Foundation!__NSXPCCONNECTION_IS_CALLING_OUT_TO_EXPORTED_OBJECT_S3__
0x182971968 Foundation!-[NSXPCConnection _decodeAndInvokeMessageWithEvent:flags:]
0x182748830 Foundation!message_handler
0x181ac27d0 libxpc.dylib!_xpc_connection_call_event_handler
0x181ac0168 libxpc.dylib!_xpc_connection_mach_event
...
RET: (
"<NSExtensionItem: 0x1c420a540> - userInfo:
{
NSExtensionItemAttachmentsKey = (
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
);
}"
)
```
2023-06-03 01:46:23 +00:00
Aquí podemos observar que:
2023-06-03 01:46:23 +00:00
* Esto ocurrió bajo el capó a través de XPC, concretamente se implementa a través de una `NSXPCConnection` que utiliza el marco `libxpc.dylib`.
* Los UTI incluidos en `NSItemProvider` son `public.plain-text` y `public.file-url`, este último se incluye en `NSExtensionActivationRule` del [`Info.plist` de la "Extensión de Compartir" de Telegram](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
2023-06-03 01:46:23 +00:00
**Identificación de las Extensiones de Aplicaciones Involucradas**
2023-06-03 01:46:23 +00:00
También puede descubrir qué extensión de aplicación se encarga de sus solicitudes y respuestas enganchando `NSExtension - _plugIn`:
2023-06-03 01:46:23 +00:00
Ejecutamos el mismo ejemplo de nuevo:
```bash
(0x1c0370200) NSExtension - _plugIn
RET: <PKPlugin: 0x1163637f0 ph.telegra.Telegraph.Share(5.3) 5B6DE177-F09B-47DA-90CD-34D73121C785
1(2) /private/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35
/Telegram X.app/PlugIns/Share.appex>
(0x1c0372300) -[NSExtension _plugIn]
RET: <PKPlugin: 0x10bff7910 com.apple.mobilenotes.SharingExtension(1.5) 73E4F137-5184-4459-A70A-83
F90A1414DC 1(2) /private/var/containers/Bundle/Application/5E267B56-F104-41D0-835B-F1DAB9AE076D
/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex>
```
2023-06-03 01:46:23 +00:00
Como se puede ver, hay dos extensiones de aplicaciones involucradas:
2023-06-03 01:46:23 +00:00
* `Share.appex` está enviando el archivo de texto (`public.plain-text` y `public.file-url`).
* `com.apple.mobilenotes.SharingExtension.appex` que está recibiendo y procesará el archivo de texto.
2023-06-03 01:46:23 +00:00
Si desea aprender más sobre lo que está sucediendo bajo el capó en términos de XPC, recomendamos echar un vistazo a las llamadas internas de "libxpc.dylib". Por ejemplo, puede usar [`frida-trace`](https://www.frida.re/docs/frida-trace/) y luego profundizar en los métodos que encuentre más interesantes mediante la extensión de los stubs generados automáticamente.
2023-06-03 01:46:23 +00:00
###
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- **Comparta sus trucos de hacking enviando PR al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
2022-04-28 16:01:33 +00:00
</details>