☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! - Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) - Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) - **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
Os esquemas de URL personalizados [permitem que os aplicativos se comuniquem por meio de um protocolo personalizado](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple\_ref/doc/uid/TP40007072-CH6-SW1). Um aplicativo deve declarar suporte para os esquemas e lidar com URLs de entrada que usam esses esquemas. > Os esquemas de URL oferecem um vetor de ataque potencial para o seu aplicativo, portanto, certifique-se de **validar todos os parâmetros de URL** e **descartar URLs malformados**. Além disso, limite as **ações** disponíveis para aquelas que **não colocam em risco os dados do usuário**. Por exemplo, a URI: `myapp://hostname?data=123876123` irá **invocar** o **aplicativo** mydata (aquele que **registrou** o esquema `mydata`) para a **ação** relacionada ao **hostname** `hostname` enviando o **parâmetro** `data` com valor `123876123`. Um exemplo vulnerável é o seguinte [bug no aplicativo móvel do Skype](http://www.dhanjani.com/blog/2010/11/insecure-handling-of-url-schemes-in-apples-ios.html), descoberto em 2010: O aplicativo Skype registrou o manipulador de protocolo `skype://`, o que **permitiu que outros aplicativos acionassem chamadas para outros usuários do Skype e números de telefone**. Infelizmente, o Skype não pediu permissão aos usuários antes de fazer as chamadas, então qualquer aplicativo poderia ligar para números arbitrários sem o conhecimento do usuário. Os atacantes exploraram essa vulnerabilidade colocando um `` invisível (onde `xxx` foi substituído por um número premium), então qualquer usuário do Skype que inadvertidamente visitasse um site malicioso chamava o número premium. Você pode encontrar os **esquemas registrados por um aplicativo** no arquivo **`Info.plist`** do aplicativo procurando por **`CFBundleURLTypes`** (exemplo do [iGoat-Swift](https://github.com/OWASP/iGoat-Swift)): ```markup CFBundleURLTypes CFBundleURLName com.iGoat.myCompany CFBundleURLSchemes iGoat ``` No entanto, observe que **aplicativos maliciosos podem registrar novamente URIs** já registrados por outros aplicativos. Portanto, se você estiver enviando **informações confidenciais por meio de URIs** (myapp://hostname?password=123456), um aplicativo **malicioso** pode **interceptar** a URI com as **informações confidenciais**. Além disso, a entrada dessas URIs **deve ser verificada e sanitizada**, pois pode estar vindo de **origens maliciosas** tentando explorar SQLInjections, XSS, CSRF, Traversals de Caminho ou outras possíveis vulnerabilidades. ## Registro de Esquemas de Consulta do Aplicativo Os aplicativos podem chamar [`canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc) para verificar se o **aplicativo de destino está disponível**. No entanto, como esse método estava sendo usado por aplicativos maliciosos como uma forma de **enumerar aplicativos instalados**, [a partir do iOS 9.0, os esquemas de URL passados para ele também devem ser declarados](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc#discussion) adicionando a chave `LSApplicationQueriesSchemes` ao arquivo `Info.plist` do aplicativo e um array de **até 50 esquemas de URL**. ```markup LSApplicationQueriesSchemes url_scheme1 url_scheme2 ``` `canOpenURL` sempre retornará `NO` para esquemas não declarados, independentemente de um aplicativo apropriado estar instalado ou não. No entanto, essa restrição se aplica apenas ao `canOpenURL`. ## Testando o Manuseio e Validação de URLs Para determinar como um caminho de URL é construído e validado, se você tiver o código-fonte original, pode **procurar pelos seguintes métodos**: * Método `application:didFinishLaunchingWithOptions:` ou `application:will-FinishLaunchingWithOptions:`: verifique como a decisão é tomada e como as informações sobre a URL são recuperadas. * [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc): verifique como o recurso está sendo aberto, ou seja, como os dados estão sendo analisados, verifique as [opções](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey), especialmente se o acesso pelo aplicativo chamador ([`sourceApplication`](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey/1623128-sourceapplication)) deve ser permitido ou negado. O aplicativo também pode precisar da permissão do usuário ao usar o esquema de URL personalizado. No Telegram, você encontrará [quatro métodos diferentes sendo usados](https://github.com/peter-iakovlev/Telegram-iOS/blob/87e0a33ac438c1d702f2a0b75bf21f26866e346f/Telegram-iOS/AppDelegate.swift#L1250): ```swift func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool { self.openUrl(url: url) return true } func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { self.openUrl(url: url) return true } func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { self.openUrl(url: url) return true } func application(_ application: UIApplication, handleOpen url: URL) -> Bool { self.openUrl(url: url) return true } ``` ## Testando solicitações de URL para outros aplicativos O método [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) e o método [obsoleto `openURL:` da `UIApplication`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc) são responsáveis por **abrir URLs** (ou seja, enviar solicitações / fazer consultas para outros aplicativos) que podem ser locais para o aplicativo atual ou podem ser fornecidos por um aplicativo diferente. Se você tiver o código-fonte original, poderá procurar diretamente por usos desses métodos. Além disso, se você estiver interessado em saber se o aplicativo está consultando serviços ou aplicativos específicos e se o aplicativo é bem conhecido, também pode pesquisar por esquemas de URL comuns online e incluí-los em seus **greps (lista de esquemas de aplicativos iOS)**. ```bash egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/ egrep -nr "openURL\(" ./Telegram-iOS/ egrep -nr "mt-encrypted-file://" ./Telegram-iOS/ egrep -nr "://" ./Telegram-iOS/ ``` ## Testando Métodos Obsoletos Procure por métodos obsoletos como: * [`application:handleOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622964-application?language=objc) * [`openURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc) * [`application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application) Por exemplo, aqui encontramos esses três: ```bash $ rabin2 -zzq Telegram\ X.app/Telegram\ X | grep -i "openurl" 0x1000d9e90 31 30 UIApplicationOpenURLOptionsKey 0x1000dee3f 50 49 application:openURL:sourceApplication:annotation: 0x1000dee71 29 28 application:openURL:options: 0x1000dee8e 27 26 application:handleOpenURL: 0x1000df2c9 9 8 openURL: 0x1000df766 12 11 canOpenURL: 0x1000df772 35 34 openURL:options:completionHandler: ... ``` ## Chamando URLs arbitrárias * **Safari**: Para testar rapidamente um esquema de URL, você pode abrir as URLs no Safari e observar como o aplicativo se comporta. Por exemplo, se você escrever `tel://123456789`, o Safari tentará iniciar a chamada para o número. * **Notes App**: Pressione longamente os links que você escreveu para testar esquemas de URL personalizados. Lembre-se de sair do modo de edição para poder abri-los. Observe que você pode clicar ou pressionar links, incluindo esquemas de URL personalizados, somente se o aplicativo estiver instalado, caso contrário, eles não serão destacados como _links clicáveis_. * [**IDB**](https://github.com/facebook/idb): * Inicie o IDB, conecte-se ao seu dispositivo e selecione o aplicativo de destino. Você pode encontrar detalhes na [documentação do IDB](https://www.idbtool.com/documentation/setup.html). * Vá para a seção **URL Handlers**. Em **URL schemes**, clique em **Refresh**, e à esquerda você encontrará uma lista de todos os esquemas personalizados definidos no aplicativo em teste. Você pode carregar esses esquemas clicando em **Open**, no lado direito. Ao simplesmente abrir um esquema de URI em branco (por exemplo, abrindo `myURLscheme://`), você pode descobrir funcionalidades ocultas (por exemplo, uma janela de depuração) e contornar a autenticação local. * **Frida**: Se você simplesmente deseja abrir o esquema de URL, pode fazê-lo usando o Frida: ```javascript $ frida -U iGoat-Swift [iPhone::iGoat-Swift]-> function openURL(url) { var UIApplication = ObjC.classes.UIApplication.sharedApplication(); var toOpen = ObjC.classes.NSURL.URLWithString_(url); return UIApplication.openURL_(toOpen); } [iPhone::iGoat-Swift]-> openURL("tel://234234234") true ``` Neste exemplo do [Frida CodeShare](https://codeshare.frida.re/@dki/ios-url-scheme-fuzzing/), o autor usa a API não pública `LSApplicationWorkspace.openSensitiveURL:withOptions:` para abrir as URLs (do aplicativo SpringBoard): ```javascript function openURL(url) { var w = ObjC.classes.LSApplicationWorkspace.defaultWorkspace(); var toOpen = ObjC.classes.NSURL.URLWithString_(url); return w.openSensitiveURL_withOptions_(toOpen, null); } ``` > Observe que o uso de APIs não públicas não é permitido na App Store, é por isso que nem mesmo testamos essas APIs, mas podemos usá-las para nossa análise dinâmica. ## Fuzzing de Esquemas de URL Se o aplicativo analisa partes da URL, você também pode realizar fuzzing de entrada para detectar bugs de corrupção de memória. O que aprendemos acima pode ser usado agora para construir seu próprio fuzzer na linguagem de sua escolha, por exemplo, em Python e chamar o `openURL` usando o [RPC do Frida](https://www.frida.re/docs/javascript-api/#rpc). Esse fuzzer deve fazer o seguinte: * Gerar payloads. * Para cada um deles, chame `openURL`. * Verifique se o aplicativo gera um relatório de falha (`.ips`) em `/private/var/mobile/Library/Logs/CrashReporter`. O projeto [FuzzDB](https://github.com/fuzzdb-project/fuzzdb) oferece dicionários de fuzzing que você pode usar como payloads. ## **Fuzzing Usando Frida** Fazer isso com o Frida é bastante fácil, você pode se referir a este [post de blog](https://grepharder.github.io/blog/0x03\_learning\_about\_universal\_links\_and\_fuzzing\_url\_schemes\_on\_ios\_with\_frida.html) para ver um exemplo que faz fuzzing do aplicativo iGoat-Swift (funcionando no iOS 11.1.2). Antes de executar o fuzzer, precisamos dos esquemas de URL como entradas. A partir da análise estática, sabemos que o aplicativo iGoat-Swift suporta o seguinte esquema de URL e parâmetros: `iGoat://?contactNumber={0}&message={0}`. ```bash $ frida -U SpringBoard -l ios-url-scheme-fuzzing.js [iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}") Watching for crashes from iGoat... No logs were moved. Opened URL: iGoat://?contactNumber=0&message=0 ``` # 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 🎥 - Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! - Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) - Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) - **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.