mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-19 01:24:50 +00:00
107 lines
9.1 KiB
Markdown
107 lines
9.1 KiB
Markdown
```markdown
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras formas de apoiar o HackTricks:
|
|
|
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**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) 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 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:
|
|
|
|
* 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 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 sensíveis para a área de transferência** (o que é recomendado).
|
|
|
|
## 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), 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 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
|
|
|
|
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 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** 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 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, você pode querer usar o comando do **objection** `ios pasteboard monitor`:
|
|
|
|
> 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 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 imprimirá:
|
|
```
|
|
```javascript
|
|
const UIPasteboard = ObjC.classes.UIPasteboard;
|
|
const Pasteboard = UIPasteboard.generalPasteboard();
|
|
var items = "";
|
|
var count = Pasteboard.changeCount().toString();
|
|
|
|
setInterval(function () {
|
|
const currentCount = Pasteboard.changeCount().toString();
|
|
const currentItems = Pasteboard.items().toString();
|
|
|
|
if (currentCount === count) { return; }
|
|
|
|
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);
|
|
|
|
}, 1000 * 5);
|
|
```
|
|
# Referências
|
|
|
|
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
|
|
|
|
|
|
|
|
<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 [**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>
|