hacktricks/mobile-pentesting/ios-pentesting/ios-uipasteboard.md
2023-06-03 01:46:23 +00:00

110 lines
10 KiB
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>
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>
El [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) permite compartir datos dentro de una aplicación y desde una aplicación a otras aplicaciones. Hay dos tipos de portapapeles:
* **portapapeles general de todo el sistema**: para compartir datos con **cualquier aplicación**. Persistente por defecto en reinicios de dispositivo y desinstalaciones de aplicaciones (desde iOS 10).
* **portapapeles personalizado / con nombre**: para compartir datos **con otra aplicación** (que tenga el mismo ID de equipo que la aplicación que comparte) o con la **propia aplicación** (solo están disponibles en el proceso que los crea). No persistentes por defecto (desde iOS 10), es decir, solo existen hasta que la aplicación propietaria (creadora) se cierra.
Algunas consideraciones de seguridad:
* Los usuarios **no pueden otorgar ni denegar permiso** para que las aplicaciones lean el **portapapeles**.
* Desde iOS 9, las aplicaciones [no pueden acceder al portapapeles mientras están en segundo plano](https://forums.developer.apple.com/thread/13760), lo que mitiga la monitorización del portapapeles en segundo plano.
* [Apple advierte sobre los portapapeles personalizados 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 función de Handoff llamada **Portapapeles universal** que está habilitada de forma predeterminada. Permite que el **contenido del portapapeles general se transfiera automáticamente entre dispositivos**. Esta función se puede desactivar si el desarrollador decide hacerlo y también es posible establecer una fecha y hora de caducidad para los datos copiados.
Por lo tanto, es importante **verificar que no se está guardando información sensible dentro del portapapeles general**.\
También es importante verificar que una **aplicación no está utilizando los datos del portapapeles general para realizar acciones**, ya que una aplicación malintencionada podría manipular estos datos.
Una **aplicación también puede evitar que sus usuarios copien datos sensibles al portapapeles** (lo que se recomienda).
## Análisis estático
El **portapapeles general de todo el sistema** se puede obtener utilizando [`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), buscar en el código fuente o en el binario compilado para encontrar este método. Se debe evitar el uso del portapapeles general de todo el sistema al tratar con datos sensibles.
Se pueden crear **portapapeles personalizados** 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). Verificar 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.
## Análisis dinámico
Enganchar o rastrear lo siguiente:
* `generalPasteboard` para el portapapeles general de todo el sistema.
* `pasteboardWithName:create:` y `pasteboardWithUniqueName` para portapapeles personalizados.
También se puede 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.
Al **monitorizar** los **portapapeles**, hay varios **detalles** que se pueden obtener dinámicamente:
* Obtener el **nombre del portapapeles** enganchando `pasteboardWithName:create:` e inspeccionando sus parámetros de entrada o `pasteboardWithUniqueName` e inspeccionando su valor de retorno.
* Obtener el **primer elemento disponible del portapapeles**: por ejemplo, para cadenas de texto, utilizar el método `string`. O utilizar cualquiera de los otros métodos para los [tipos de datos estándar](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275).
* Obtener el **número de elementos** con `numberOfItems`.
* Verificar 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).
* Verificar otros tipos de datos (típicamente UTIs) con [`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Se pueden 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 datos personalizados como com.mycompany.myapp.mytype. Recuerda que, en este caso, solo aquellas aplicaciones que _declaren conocimiento_ del tipo pueden entender los datos escritos en el portapapeles. Se pueden recuperar utilizando [`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) y estableciendo los UTIs correspondientes.
* Verificar elementos excluidos o que caducan enganchando `setItems:options:` e inspeccionando sus opciones para `UIPasteboardOptionLocalOnly` o `UIPasteboardOptionExpirationDate`.
Si solo se buscan cadenas de texto, se puede utilizar el comando **objection** `ios pasteboard monitor`:
> Se engancha en la clase UIPasteboard de iOS y sondea el portapapeles general cada 5 segundos en busca de datos. Si se encuentra un nuevo dato, diferente al de la última consulta, se imprimirá en pantalla.
También se puede construir un monitor de portapapeles propio que monitorice información específica como se ha visto anteriormente.
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á:
```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);
```
# 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><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>
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>