mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
9.2 KiB
9.2 KiB
<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>
Otras formas de apoyar a HackTricks:
* 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).
</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:
* **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.
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.
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.
Una **aplicación también puede evitar que sus usuarios copien datos sensibles al portapapeles** (lo cual es recomendable).
## Análisis Estático
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.
**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.
## Análisis Dinámico
Engancha o rastrea lo siguiente:
* `generalPasteboard` para el portapapeles general del sistema.
* `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.
Cuando **monitorees** los **portapapeles**, hay varios **detalles** que pueden ser **recuperados** dinámicamente:
* 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`.
Si solo buscas cadenas, quizás quieras usar el comando de **objection** `ios pasteboard monitor`:
> 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.
También puedes construir tu propio monitor de portapapeles que monitoree 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á:
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" %}
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver a tu empresa anunciada en HackTricks o descargar HackTricks en PDF consulta los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sigue a Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub HackTricks y HackTricks Cloud.