hacktricks/mobile-pentesting/ios-pentesting/ios-universal-links.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

9.6 KiB
Raw Blame History

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

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.

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).
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.

Comprobación de la autorización de dominios asociados

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.

Aquí hay un ejemplo del archivo .entitlements de Telegram:

    <key>com.apple.developer.associated-domains</key>
    <array>
        <string>applinks:telegram.me</string>
        <string>applinks:t.me</string>
    </array>

Se puede encontrar información más detallada en la Documentación de Desarrolladores de Apple archivada.

Si solo tienes la aplicación compilada, puedes extraer los entitlements siguiendo esta guía:

{% content-ref url="extracting-entitlements-from-compiled-application.md" %} extracting-entitlements-from-compiled-application.md {% endcontent-ref %}

Recuperando el archivo de asociación de sitio de la aplicación de Apple

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.

Puedes recuperarlo tú mismo con tu navegador o utilizar el Validador de Asociación de Sitio de Aplicación de Apple (AASA).

Comprobando el Método Receptor de Enlaces

Para recibir enlaces y manejarlos adecuadamente, el delegado de la aplicación debe implementar application:continueUserActivity:restorationHandler:. Si tienes el proyecto original, intenta buscar este método.

Ten en cuenta que si la aplicación utiliza openURL:options:completionHandler: 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.

  • El esquema de webpageURL debe ser HTTP o HTTPS (cualquier otro esquema debería lanzar una excepción). La propiedad de instancia scheme de URLComponents / NSURLComponents se puede utilizar para verificar esto.

Comprobando el Método Manejador de Datos

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:

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
}

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.

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 lo demuestra:

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
    }
}

Referencias

{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}

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