hacktricks/mobile-pentesting/ios-pentesting/ios-universal-links.md

122 lines
9.6 KiB
Markdown
Raw Normal View History

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 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
- Obtén la [**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 PRs 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
Los enlaces universales permiten **redirigir a los usuarios directamente** a la aplicación sin pasar por Safari para la redirección.\
Los enlaces universales son **únicos**, por lo que no pueden ser reclamados por otras aplicaciones porque utilizan enlaces HTTP(S) estándar al **sitio web donde el propietario ha subido un archivo para asegurarse de que el sitio web y la aplicación están relacionados**.\
Como estos enlaces utilizan esquemas HTTP(S), cuando la **aplicación no está instalada, Safari abrirá el enlace** redirigiendo a los usuarios a la página. Esto permite que las **aplicaciones se comuniquen con la aplicación incluso si no está instalada**.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Para crear enlaces universales es necesario **crear un archivo JSON llamado `apple-app-site-association`** con los detalles. Luego, este archivo debe ser **alojado en el directorio raíz de su servidor web** (por ejemplo, [https://google.com/apple-app-site-association](https://google.com/apple-app-site-association)).\
Para el pentester, este archivo es muy interesante ya que **revela rutas**. Incluso puede estar revelando rutas de versiones que aún no se han publicado.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
## **Comprobación de la autorización de dominios asociados**
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
En Xcode, vaya a la pestaña **Capabilities** y busque **Associated Domains**. También puede inspeccionar el archivo `.entitlements` buscando `com.apple.developer.associated-domains`. Cada uno de los dominios debe tener el prefijo `applinks:`, como `applinks:www.mywebsite.com`.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Aquí hay un ejemplo del archivo `.entitlements` de Telegram:
2021-05-21 16:38:18 +00:00
```markup
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>
```
2023-06-03 01:46:23 +00:00
Se puede encontrar información más detallada en la [Documentación de Desarrolladores de Apple archivada](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Si solo tienes la aplicación compilada, puedes extraer los entitlements siguiendo esta guía:
2021-05-21 16:38:18 +00:00
{% content-ref url="extracting-entitlements-from-compiled-application.md" %}
[extracting-entitlements-from-compiled-application.md](extracting-entitlements-from-compiled-application.md)
{% endcontent-ref %}
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
## **Recuperando el archivo de asociación de sitio de la aplicación de Apple**
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Intenta recuperar el archivo `apple-app-site-association` del servidor utilizando los dominios asociados que obtuviste en el paso anterior. Este archivo debe ser accesible a través de HTTPS, sin redireccionamientos, en `https://<dominio>/apple-app-site-association` o `https://<dominio>/.well-known/apple-app-site-association`.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Puedes recuperarlo tú mismo con tu navegador o utilizar el [Validador de Asociación de Sitio de Aplicación de Apple (AASA)](https://branch.io/resources/aasa-validator/).
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
## **Comprobando el Método Receptor de Enlaces**
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Para recibir enlaces y manejarlos adecuadamente, el delegado de la aplicación debe implementar [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Si tienes el proyecto original, intenta buscar este método.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Ten en cuenta que si la aplicación utiliza [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) para abrir un enlace universal al sitio web de la aplicación, el enlace no se abrirá en la aplicación. Como la llamada se origina desde la aplicación, no se manejará como un enlace universal.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
* El esquema de `webpageURL` debe ser HTTP o HTTPS (cualquier otro esquema debería lanzar una excepción). La propiedad de instancia [`scheme`](https://developer.apple.com/documentation/foundation/urlcomponents/1779624-scheme) de `URLComponents` / `NSURLComponents` se puede utilizar para verificar esto.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
## **Comprobando el Método Manejador de Datos**
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Cuando iOS abre una aplicación como resultado de un enlace universal, la aplicación recibe un objeto `NSUserActivity` con un valor de `activityType` de `NSUserActivityTypeBrowsingWeb`. La propiedad `webpageURL` del objeto de actividad contiene la URL HTTP o HTTPS a la que accede el usuario. El siguiente ejemplo en Swift verifica exactamente esto antes de abrir la URL:
2021-05-21 16:38:18 +00:00
```swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// ...
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
application.open(url, options: [:], completionHandler: nil)
}
return true
}
```
2023-06-03 01:46:23 +00:00
Además, recuerda que si la URL incluye parámetros, no se deben confiar en ellos antes de ser cuidadosamente saneados y validados (incluso cuando provienen de un dominio de confianza). Por ejemplo, podrían haber sido falsificados por un atacante o podrían incluir datos malformados. Si ese es el caso, toda la URL y, por lo tanto, la solicitud de enlace universal deben ser descartados.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
La API `NSURLComponents` se puede utilizar para analizar y manipular los componentes de la URL. Esto también puede ser parte del método `application:continueUserActivity:restorationHandler:` en sí mismo o puede ocurrir en un método separado que se llama desde él. El siguiente [ejemplo](https://developer.apple.com/documentation/uikit/core\_app/allowing\_apps\_and\_websites\_to\_link\_to\_your\_content/handling\_universal\_links#3001935) lo demuestra:
2021-05-21 16:38:18 +00:00
```swift
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL,
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
let path = components.path,
let params = components.queryItems else {
return false
}
if let albumName = params.first(where: { $0.name == "albumname" })?.value,
let photoIndex = params.first(where: { $0.name == "index" })?.value {
// Interact with album name and photo index
return true
} else {
// Handle when album and/or album name or photo index missing
return false
}
}
```
2023-06-03 01:46:23 +00:00
# Referencias
2021-05-21 16:38:18 +00:00
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
2021-05-21 16:38:18 +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
- ¿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 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
- Obtén la [**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** 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 [hacktricks](https://github.com/carlospolop/hacktricks) y al repositorio [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
2022-04-28 16:01:33 +00:00
</details>