hacktricks/mobile-pentesting/ios-pentesting/ios-universal-links.md
2023-06-06 18:56:34 +00:00

9.6 KiB

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

Os links universais permitem redirecionar usuários diretamente para o aplicativo sem passar pelo Safari para redirecionamento.
Os links universais são únicos, então eles não podem ser reivindicados por outros aplicativos porque usam links HTTP(S) padrão para o site onde o proprietário carregou um arquivo para garantir que o site e o aplicativo estejam relacionados.
Como esses links usam esquemas HTTP(S), quando o aplicativo não está instalado, o Safari abrirá o link redirecionando os usuários para a página. Isso permite que os aplicativos se comuniquem com o aplicativo mesmo que ele não esteja instalado.

Para criar links universais, é necessário criar um arquivo JSON chamado apple-app-site-association com os detalhes. Em seguida, este arquivo precisa ser hospedado no diretório raiz do seu servidor da web (por exemplo, https://google.com/apple-app-site-association).
Para o pentester, este arquivo é muito interessante, pois revela caminhos. Ele pode até estar revelando caminhos de lançamentos que ainda não foram publicados.

Verificando a Autorização de Domínios Associados

No Xcode, vá para a guia Capabilities e procure por Associated Domains. Você também pode inspecionar o arquivo .entitlements procurando por com.apple.developer.associated-domains. Cada um dos domínios deve ser prefixado com applinks:, como applinks:www.mywebsite.com.

Aqui está um exemplo do arquivo .entitlements do Telegram:

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

Mais informações detalhadas podem ser encontradas na Documentação do Desenvolvedor da Apple arquivada.

Se você só tem o aplicativo compilado, pode extrair as permissões seguindo este guia:

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

Recuperando o Arquivo de Associação do Site do Aplicativo da Apple

Tente recuperar o arquivo apple-app-site-association do servidor usando os domínios associados que você obteve na etapa anterior. Este arquivo precisa ser acessível via HTTPS, sem redirecionamentos, em https://<domain>/apple-app-site-association ou https://<domain>/.well-known/apple-app-site-association.

Você pode recuperá-lo com seu navegador ou usar o Validador de Associação do Site do Aplicativo da Apple (AASA).

Para receber links e manipulá-los adequadamente, o delegado do aplicativo deve implementar application:continueUserActivity:restorationHandler:. Se você tiver o projeto original, tente procurar por este método.

Observe que se o aplicativo usar openURL:options:completionHandler: para abrir um link universal para o site do aplicativo, o link não será aberto no aplicativo. Como a chamada se origina do aplicativo, ela não será tratada como um link universal.

  • O esquema do webpageURL deve ser HTTP ou HTTPS (qualquer outro esquema deve gerar uma exceção). A propriedade de instância scheme de URLComponents / NSURLComponents pode ser usada para verificar isso.

Verificando o Método de Manipulação de Dados

Quando o iOS abre um aplicativo como resultado de um link universal, o aplicativo recebe um objeto NSUserActivity com um valor de activityType de NSUserActivityTypeBrowsingWeb. A propriedade webpageURL do objeto de atividade contém o URL HTTP ou HTTPS que o usuário acessa. O seguinte exemplo em Swift verifica exatamente isso antes de abrir o 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
}

Além disso, lembre-se de que se a URL incluir parâmetros, eles não devem ser confiáveis antes de serem cuidadosamente sanitizados e validados (mesmo quando provenientes de um domínio confiável). Por exemplo, eles podem ter sido falsificados por um atacante ou podem incluir dados malformados. Se esse for o caso, toda a URL e, portanto, a solicitação de link universal devem ser descartadas.

A API NSURLComponents pode ser usada para analisar e manipular os componentes da URL. Isso também pode fazer parte do método application:continueUserActivity:restorationHandler: em si ou pode ocorrer em um método separado chamado a partir dele. O seguinte exemplo demonstra isso:

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

Referências

{% 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 🎥