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

110 lines
10 KiB
Markdown
Raw Normal View History

2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- ¿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)!
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- **Ú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)**.**
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- **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)**.
2022-04-28 16:01:33 +00:00
</details>
2023-06-03 01:46:23 +00:00
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:
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
* **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.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Algunas consideraciones de seguridad:
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
* 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.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
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.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Una **aplicación también puede evitar que sus usuarios copien datos sensibles al portapapeles** (lo que se recomienda).
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
## Análisis estático
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
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.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
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.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
## Análisis dinámico
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Enganchar o rastrear lo siguiente:
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
* `generalPasteboard` para el portapapeles general de todo el sistema.
* `pasteboardWithName:create:` y `pasteboardWithUniqueName` para portapapeles personalizados.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
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.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Al **monitorizar** los **portapapeles**, hay varios **detalles** que se pueden obtener dinámicamente:
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
* 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`.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
Si solo se buscan cadenas de texto, se puede utilizar el comando **objection** `ios pasteboard monitor`:
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
> 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.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +00:00
También se puede construir un monitor de portapapeles propio que monitorice información específica como se ha visto anteriormente.
2021-05-21 16:38:18 +00:00
2023-06-03 01:46:23 +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á:
2021-05-21 16:38:18 +00:00
```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);
```
2023-06-03 01:46:23 +00:00
# Referencias
2021-05-21 16:38:18 +00:00
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
2021-05-21 16:38:18 +00:00
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- ¿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)!
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- **Ú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)**.**
2022-04-28 16:01:33 +00:00
2023-06-03 01:46:23 +00:00
- **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)**.
2022-04-28 16:01:33 +00:00
</details>