hacktricks/mobile-pentesting/ios-pentesting/ios-uiactivity-sharing.md

95 lines
9.9 KiB
Markdown

<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
</details>
# Compartilhamento UIActivity
A partir do iOS 6, é possível para aplicativos de terceiros **compartilhar dados (itens)** através de mecanismos específicos [como o AirDrop, por exemplo](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3). Do ponto de vista do usuário, essa funcionalidade é a conhecida _folha de atividade de compartilhamento_ do sistema que aparece após clicar no botão "Compartilhar".
Uma lista completa dos mecanismos de compartilhamento integrados disponíveis pode ser encontrada em [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Se não considerados apropriados para o aplicativo, os **desenvolvedores têm a possibilidade de excluir alguns desses mecanismos de compartilhamento**.
## **Enviando Itens**
Ao testar o Compartilhamento `UIActivity`, você deve prestar atenção especial a:
* os dados (itens) sendo compartilhados,
* as atividades personalizadas,
* os tipos de atividade excluídos.
O compartilhamento de dados via `UIActivity` funciona criando um `UIActivityViewController` e passando a ele os itens desejados (URLs, texto, uma imagem) em [`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init).
Se tiver o código-fonte, você deve examinar o `UIActivityViewController`:
* Inspecione as atividades passadas para o método `init(activityItems:applicationActivities:)`.
* Verifique se ele define atividades personalizadas (também sendo passadas para o método anterior).
* Verifique os `excludedActivityTypes`, se houver.
Se você só tem o aplicativo compilado/instalado, tente procurar pelo método e propriedade anteriores, por exemplo:
```bash
$ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
0x1000df034 45 44 initWithActivityItems:applicationActivities:
```
## **Recebendo Itens**
Ao receber itens, você deve verificar:
* se o aplicativo **declara** _**tipos de documentos personalizados**_ ao olhar para **Exported/Imported UTIs** (aba "Info" do projeto Xcode). A lista de todos os UTIs declarados pelo sistema (Uniform Type Identifiers) pode ser encontrada na [documentação arquivada da Apple Developer](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259).
* se o aplicativo especifica quaisquer _**tipos de documentos que ele pode abrir**_ ao olhar para **Document Types** (aba "Info" do projeto Xcode). Se presentes, eles consistem em um nome e um ou mais UTIs que representam o tipo de dado (por exemplo, "public.png" para arquivos PNG). O iOS usa isso para determinar se o aplicativo é elegível para abrir um determinado documento (especificar Exported/Imported UTIs não é suficiente).
* se o aplicativo verifica adequadamente os _**dados recebidos**_ ao olhar para a implementação de [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) (ou sua versão obsoleta [`UIApplicationDelegate application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application?language=objc)) no app delegate.
Se não tiver o código-fonte, você ainda pode olhar para o arquivo `Info.plist` e procurar por:
* `UTExportedTypeDeclarations`/`UTImportedTypeDeclarations` se o aplicativo declara _tipos de documentos personalizados_ exportados/importados.
* `CFBundleDocumentTypes` para ver se o aplicativo especifica quaisquer _tipos de documentos que ele pode abrir_.
Uma explicação muito completa sobre o uso dessas chaves pode ser encontrada [no Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i), mas aqui está um resumo:
* `UTExportedTypeDeclarations`: Use-os para definir **seus próprios UTIs** que seu aplicativo deseja ensinar ao sistema onde está instalado. Um **UTI descreve um pedaço de dado** (_não necessariamente dados localizados dentro de um arquivo!_) e requer pelo menos um **identificador** (`com.example.MyCoolDataType`). Adicionalmente, pode ter um **nome** (`My Cool Data Type`), uma ou mais extensões de nome de **arquivo** (`.myCoolDataType`), um ou mais **tipos MIME** (`x-application/my-cool-data-type`), um ou mais **tipos de prancheta** (usados ao transferir dados desse tipo usando copiar\&colar), e um ou mais **tipos de sistema operacional legado**. Geralmente, você também quer que os UTIs estejam em conformidade com UTIs existentes (por exemplo, quando você diz que seu UTI está em conformidade com `public.data`, qualquer processo que possa lidar com dados genéricos também pode lidar com seu UTI).
* Exemplo: Você define seu próprio formato de dados de arquivo proprietário e deseja que esse formato de dados também seja conhecido por outros aplicativos, plugins, extensões e assim por diante.
* `UTImportedTypeDeclarations`: Você usa `UTImportedTypeDeclarations` para **ensinar o sistema sobre UTIs que você quer que sejam conhecidos no sistema, mas que não são seus UTIs**.
* Exemplo: Seu aplicativo é capaz de ler o formato de dados proprietário de outro aplicativo, mas você não sabe se esse aplicativo está instalado no sistema.
* `CFBundleDocumentTypes`: Você usa `CFBundleDocumentTypes` para informar ao sistema quais tipos de documentos seu aplicativo é capaz de abrir. A menos que você **também liste seus UTIs aqui**, esses UTIs não são associados ao seu aplicativo no Finder e seu aplicativo não aparecerá no menu `Abrir Com >`. \
A única coisa que você sempre deve definir para um tipo de documento é o papel. O **papel** pode ser "**Visualizador**" (você pode exibir esse tipo de arquivo, mas não pode editá-lo), "**Editor**" (você pode exibir e editar esse tipo de arquivo), "**Nenhum**" (não está especificado o que você pode fazer com esse arquivo).
* Exemplo: Você quer que seu **aplicativo seja associado a certos tipos de arquivos**, identificados por extensão, tipo MIME ou identificador UTI. **Se você quer que seu aplicativo seja associado a um tipo de UTI, o aplicativo deve importar ou exportar o tipo**, caso contrário, o tipo pode não ser conhecido pelo sistema e registrar um tipo de UTI desconhecido simplesmente não tem efeito algum.
## Teste Dinâmico
Para **atividades de envio**, você pode:
* Intercepte o método que vimos na análise estática ([`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init)) para obter os `activityItems` e `applicationActivities`.
* Descubra as atividades excluídas interceptando a propriedade [`excludedActivityTypes`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622009-excludedactivitytypes).
Para receber itens, você pode:
* _Compartilhar_ um arquivo com o aplicativo a partir de outro aplicativo ou enviá-lo via AirDrop ou e-mail. Escolha o arquivo de forma que ele acione o diálogo "Abrir com..." (ou seja, não há um aplicativo padrão que abrirá o arquivo, um PDF, por exemplo).
* Intercepte `application:openURL:options:` e quaisquer outros métodos que foram identificados em uma análise estática anterior.
* Observe o comportamento do aplicativo.
* Além disso, você poderia enviar arquivos específicos malformados e/ou usar uma técnica de fuzzing.
**Leia como** [**aqui**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#dynamic-analysis-8)**.**
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras maneiras de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga** me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
</details>