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

111 lines
7.6 KiB
Markdown
Raw Normal View History

# iOS Universal Links
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
2023-06-05 18:33:24 +00:00
<summary>Support HackTricks</summary>
2023-06-05 18:33:24 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}
2023-06-05 18:33:24 +00:00
## Introducción
2023-06-05 18:33:24 +00:00
Los enlaces universales ofrecen una **experiencia de redirección** fluida a los usuarios al abrir directamente el contenido en la aplicación, evitando la necesidad de redirección a Safari. Estos enlaces son **únicos** y seguros, ya que no pueden ser reclamados por otras aplicaciones. Esto se asegura al alojar un archivo JSON `apple-app-site-association` en el directorio raíz del sitio web, estableciendo un enlace verificable entre el sitio web y la aplicación. En los casos en que la aplicación no está instalada, Safari tomará el control y dirigirá al usuario a la página web, manteniendo la presencia de la aplicación.
2023-06-05 18:33:24 +00:00
Para los pentesters, el archivo `apple-app-site-association` es de particular interés, ya que puede revelar **rutas sensibles**, potencialmente incluyendo aquellas relacionadas con características no publicadas.
2023-06-05 18:33:24 +00:00
### **Analizando el derecho de dominios asociados**
2023-06-05 18:33:24 +00:00
Los desarrolladores habilitan los enlaces universales configurando los **Dominios Asociados** en la pestaña Capacidades de Xcode o inspeccionando el archivo `.entitlements`. Cada dominio está precedido por `applinks:`. Por ejemplo, la configuración de Telegram podría aparecer de la siguiente manera:
```xml
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>
2023-06-05 18:33:24 +00:00
```
Para obtener información más completa, consulta la [documentación de Apple Developer archivada](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
2023-06-05 18:33:24 +00:00
Si trabajas con una aplicación compilada, los derechos pueden ser extraídos como se detalla en [esta guía](extracting-entitlements-from-compiled-application.md).
2023-06-05 18:33:24 +00:00
### **Recuperando el archivo de asociación de sitios de aplicaciones de Apple**
2023-06-05 18:33:24 +00:00
El archivo `apple-app-site-association` debe ser recuperado del servidor utilizando los dominios especificados en los derechos. Asegúrate de que el archivo sea accesible a través de HTTPS directamente en `https://<domain>/apple-app-site-association`. Herramientas como el [validador de Apple App Site Association (AASA)](https://branch.io/resources/aasa-validator/) pueden ayudar en este proceso.
2023-06-05 18:33:24 +00:00
### **Manejando enlaces universales en la aplicación**
2023-06-05 18:33:24 +00:00
La aplicación debe implementar métodos específicos para manejar enlaces universales correctamente. El método principal a buscar es [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Es crucial que el esquema de las URL manejadas sea HTTP o HTTPS, ya que otros no serán soportados.
2023-06-05 18:33:24 +00:00
#### **Validando el método de manejo de datos**
2023-06-05 18:33:24 +00:00
Cuando un enlace universal abre una aplicación, se pasa un objeto `NSUserActivity` a la aplicación con la URL. Antes de procesar esta URL, es esencial validarla y sanearla para prevenir riesgos de seguridad. Aquí hay un ejemplo en Swift que demuestra el proceso:
2023-06-05 18:33:24 +00:00
```swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// Check for web browsing activity and valid URL
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
application.open(url, options: [:], completionHandler: nil)
}
2023-06-05 18:33:24 +00:00
return true
2023-06-05 18:33:24 +00:00
}
```
Las URL deben ser analizadas y validadas cuidadosamente, especialmente si incluyen parámetros, para protegerse contra posibles suplantaciones o datos mal formados. La API `NSURLComponents` es útil para este propósito, como se demuestra a continuación:
2023-06-05 18:33:24 +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 {
// Process the URL with album name and photo index
return true
} else {
// Handle invalid or missing parameters
return false
}
2023-06-05 18:33:24 +00:00
}
```
A través de **una configuración y validación diligentes**, los desarrolladores pueden asegurarse de que los enlaces universales mejoren la experiencia del usuario mientras mantienen los estándares de seguridad y privacidad.
## Tools
* [GetUniversal.link](https://getuniversal.link/): Ayuda a simplificar la prueba y gestión de los Enlaces Universales de tu aplicación y el archivo AASA. Simplemente ingresa tu dominio para verificar la integridad del archivo AASA o utiliza el panel personalizado para probar fácilmente el comportamiento de los enlaces. Esta herramienta también te ayuda a determinar cuándo Apple indexará nuevamente tu archivo AASA.
2023-06-05 18:33:24 +00:00
## References
* [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0070/#static-analysis](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0070/#static-analysis)
* [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8)
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
<summary>Support HackTricks</summary>
2023-06-05 18:33:24 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}