hacktricks/mobile-pentesting/ios-pentesting/ios-uipasteboard.md

108 lines
9.2 KiB
Markdown
Raw Normal View History

```markdown
2023-06-05 18:33:24 +00:00
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>
El [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) permite compartir datos dentro de una aplicación y de una aplicación a otras aplicaciones. Hay dos tipos de portapapeles:
2023-06-05 18:33:24 +00:00
* **portapapeles general del sistema**: para compartir datos con **cualquier aplicación**. Persistente por defecto tras reinicios del dispositivo y desinstalaciones de aplicaciones (desde iOS 10).
* **portapapeles personalizados / con nombre**: para compartir datos **con otra aplicación** (que tenga el mismo ID de equipo que la aplicación desde la que se comparte) o con la **misma aplicación** (solo están disponibles en el proceso que los crea). No persistentes por defecto (desde iOS 10), es decir, existen solo hasta que la aplicación propietaria (creadora) se cierra.
2023-06-05 18:33:24 +00:00
Algunas consideraciones de seguridad:
* Los usuarios **no pueden otorgar o denegar permiso** para que las aplicaciones lean el **portapapeles**.
* Desde iOS 9, las aplicaciones [no pueden acceder al portapapeles en segundo plano](https://forums.developer.apple.com/thread/13760), esto mitiga la monitorización del portapapeles en segundo plano.
* [Apple advierte sobre los portapapeles con nombre persistentes](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc) y **desaconseja su uso**. En su lugar, se deben utilizar contenedores compartidos.
* A partir de iOS 10 hay una nueva característica de Handoff llamada **Portapapeles Universal** que está habilitada por defecto. Permite que el **contenido del portapapeles general se transfiera automáticamente entre dispositivos**. Esta característica puede ser deshabilitada si el desarrollador así lo decide y también es posible establecer un tiempo y fecha de expiración para los datos copiados.
2023-06-05 18:33:24 +00:00
Entonces, es importante **verificar que la información sensible no se esté guardando dentro del portapapeles global**.\
También es importante comprobar que una **aplicación no esté utilizando los datos del portapapeles global para realizar acciones**, ya que una aplicación maliciosa podría manipular estos datos.
2023-06-05 18:33:24 +00:00
Una **aplicación también puede evitar que sus usuarios copien datos sensibles al portapapeles** (lo cual es recomendable).
2023-06-05 18:33:24 +00:00
## Análisis Estático
2023-06-05 18:33:24 +00:00
El **portapapeles general del sistema** se puede obtener utilizando [`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), busca en el código fuente o en el binario compilado este método. Se debe evitar el uso del portapapeles general del sistema al tratar con datos sensibles.
2023-06-05 18:33:24 +00:00
**Portapapeles personalizados** se pueden crear con [`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc) o [`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc). Verifica si los portapapeles personalizados están configurados para ser persistentes ya que esto está obsoleto desde iOS 10. En su lugar, se debe utilizar un contenedor compartido.
2023-06-05 18:33:24 +00:00
## Análisis Dinámico
2023-06-05 18:33:24 +00:00
Engancha o rastrea lo siguiente:
2023-06-05 18:33:24 +00:00
* `generalPasteboard` para el portapapeles general del sistema.
2023-06-05 18:33:24 +00:00
* `pasteboardWithName:create:` y `pasteboardWithUniqueName` para portapapeles personalizados.
También puedes enganchar o rastrear el método obsoleto [`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc) y verificar si se está llamando.
2023-06-05 18:33:24 +00:00
Cuando **monitorees** los **portapapeles**, hay varios **detalles** que pueden ser **recuperados** dinámicamente:
2023-06-05 18:33:24 +00:00
* Obtén el **nombre del portapapeles** enganchando `pasteboardWithName:create:` e inspeccionando sus parámetros de entrada o `pasteboardWithUniqueName` e inspeccionando su valor de retorno.
* Consigue el **primer elemento disponible en el portapapeles**: por ejemplo, para cadenas usa el método `string`. O utiliza cualquiera de los otros métodos para los [tipos de datos estándar](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275).
* Obtén el **número de elementos** con `numberOfItems`.
* Verifica la **existencia de tipos de datos estándar** con los [métodos de conveniencia](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142), por ejemplo, `hasImages`, `hasStrings`, `hasURLs` (a partir de iOS 10).
* Verifica **otros tipos de datos** (típicamente UTIs) con [`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Puedes inspeccionar tipos de datos más concretos como, por ejemplo, una imagen como public.png y public.tiff ([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)) o para datos personalizados como com.mycompany.myapp.mytype. Recuerda que, en este caso, solo aquellas aplicaciones que _declaren conocimiento_ del tipo son capaces de entender los datos escritos en el portapapeles. Recupéralos utilizando [`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) y estableciendo los UTIs correspondientes.
* Verifica elementos excluidos o que expiran enganchando `setItems:options:` e inspeccionando sus opciones para `UIPasteboardOptionLocalOnly` o `UIPasteboardOptionExpirationDate`.
2023-06-05 18:33:24 +00:00
Si solo buscas cadenas, quizás quieras usar el comando de **objection** `ios pasteboard monitor`:
2023-06-05 18:33:24 +00:00
> Se engancha a la clase UIPasteboard de iOS y sondea el generalPasteboard cada 5 segundos en busca de datos. Si se encuentran datos nuevos, diferentes de la sondeo anterior, esos datos se volcarán en pantalla.
2023-06-05 18:33:24 +00:00
También puedes construir tu propio monitor de portapapeles que monitoree información específica como se ha visto anteriormente.
2023-06-05 18:33:24 +00:00
Por ejemplo, este script (inspirado en el script detrás del [monitor de portapapeles de objection](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)) lee los elementos del portapapeles cada 5 segundos, si hay algo nuevo lo imprimirá:
```
2023-06-05 18:33:24 +00:00
```javascript
const UIPasteboard = ObjC.classes.UIPasteboard;
const Pasteboard = UIPasteboard.generalPasteboard();
var items = "";
var count = Pasteboard.changeCount().toString();
2023-06-05 18:33:24 +00:00
setInterval(function () {
const currentCount = Pasteboard.changeCount().toString();
const currentItems = Pasteboard.items().toString();
2023-06-05 18:33:24 +00:00
if (currentCount === count) { return; }
2023-06-05 18:33:24 +00:00
items = currentItems;
count = currentCount;
2023-06-05 18:33:24 +00:00
console.log('[* Pasteboard changed] count: ' + count +
' hasStrings: ' + Pasteboard.hasStrings().toString() +
' hasURLs: ' + Pasteboard.hasURLs().toString() +
' hasImages: ' + Pasteboard.hasImages().toString());
console.log(items);
2023-06-05 18:33:24 +00:00
}, 1000 * 5);
2023-06-05 18:33:24 +00:00
```
# Referencias
{% 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>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>