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

9.2 KiB

Compartir UIActivity

A partir de iOS 6, es posible que las aplicaciones de terceros compartan datos (elementos) a través de mecanismos específicos como AirDrop, por ejemplo. Desde la perspectiva del usuario, esta función es la conocida hoja de actividad de compartir en todo el sistema que aparece después de hacer clic en el botón "Compartir".

Una lista completa de los mecanismos de intercambio integrados disponibles se puede encontrar en UIActivity.ActivityType. Si no se considera apropiado para la aplicación, los desarrolladores tienen la posibilidad de excluir algunos de estos mecanismos de intercambio.

Envío de elementos

Al probar la Compartición de UIActivity, debe prestar especial atención a:

  • los datos (elementos) que se comparten,
  • las actividades personalizadas,
  • los tipos de actividad excluidos.

El intercambio de datos a través de UIActivity funciona creando un UIActivityViewController y pasándole los elementos deseados (URL, texto, una imagen) en init(activityItems:applicationActivities:).

Si tiene el código fuente, debe echar un vistazo al UIActivityViewController:

  • Inspeccione las actividades pasadas al método init(activityItems:applicationActivities:).
  • Compruebe si define actividades personalizadas (que también se pasan al método anterior).
  • Verifique los excludedActivityTypes, si los hay.

Si solo tiene la aplicación compilada/instalada, intente buscar el método y la propiedad anterior, por ejemplo:

$ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
0x1000df034 45 44 initWithActivityItems:applicationActivities:

Recibiendo elementos

Al recibir elementos, debes verificar:

  • si la aplicación declara tipos de documentos personalizados mirando en los UTI exportados/importados ("Información" en el proyecto Xcode). La lista de todos los UTI declarados por el sistema se puede encontrar en la Documentación de desarrolladores de Apple archivada.
  • si la aplicación especifica algún tipo de documento que puede abrir mirando en los Tipos de documento ("Información" en el proyecto Xcode). Si está presente, consisten en un nombre y uno o más UTI que representan el tipo de datos (por ejemplo, "public.png" para archivos PNG). iOS utiliza esto para determinar si la aplicación es elegible para abrir un documento determinado (especificar UTI exportados/importados no es suficiente).
  • si la aplicación verifica adecuadamente los datos recibidos mirando en la implementación de application:openURL:options: (o su versión obsoleta UIApplicationDelegate application:openURL:sourceApplication:annotation:) en el delegado de la aplicación.

Si no tienes el código fuente, aún puedes echar un vistazo al archivo Info.plist y buscar:

  • UTExportedTypeDeclarations/UTImportedTypeDeclarations si la aplicación declara tipos de documentos personalizados exportados/importados.
  • CFBundleDocumentTypes para ver si la aplicación especifica algún tipo de documento que puede abrir.

Una explicación muy completa sobre el uso de estas claves se puede encontrar en Stackoverflow, pero aquí tienes un resumen:

  • UTExportedTypeDeclarations: Úsalos para definir tus propios UTI que tu aplicación quiere enseñar al sistema en el que está instalado. Un UTI describe un fragmento de datos (¡no necesariamente datos ubicados dentro de un archivo!) y requiere al menos un identificador (com.example.MyCoolDataType). Además, puede tener un nombre (Mi tipo de datos genial), una o más extensiones de nombre de archivo (.myCoolDataType), uno o más tipos MIME (x-application/my-cool-data-type), uno o más tipos de portapapeles (usados cuando se transfieren datos de ese tipo usando copiar y pegar), y uno o más tipos de sistema operativo heredados. Por lo general, también deseas que los UTI se ajusten a los UTI existentes (por ejemplo, cuando dices que tu UTI se ajusta a public.data, cualquier proceso que pueda manejar datos genéricos también puede manejar tu UTI).
    • por ejemplo: Definir tu propio formato de datos de archivo patentado y quieres que este formato de datos sea conocido también por otras aplicaciones, complementos, extensiones, etc.
  • UTImportedTypeDeclarations: Usas UTImportedTypeDeclarations para enseñar al sistema sobre UTI que deseas que se conozcan en el sistema pero que no son tus UTI.
    • por ejemplo: Tu aplicación puede leer el formato de datos patentado de otra aplicación, pero no sabes si esa aplicación está instalada en el sistema.
  • CFBundleDocumentTypes: Usas CFBundleDocumentTypes para decirle al sistema qué tipos de documentos puede abrir tu aplicación. A menos que también listes tus UTI aquí, estos UTI no están asociados con tu aplicación en Finder y tu aplicación no aparecerá en el menú Abrir con >.
    Lo único que siempre debes establecer para un tipo de documento es el rol. El rol puede ser "Visor" (puedes mostrar ese tipo de archivo pero no puedes editarlo), "Editor" (puedes mostrar y editar ese tipo de archivo), "Ninguno" (no se especifica lo que puedes hacer con ese archivo).
    • por ejemplo: Quieres que tu aplicación se asocie con ciertos tipos de archivo, identificados ya sea por extensión, por tipo MIME o por identificador UTI. Si deseas que tu aplicación se asocie con un tipo de UTI, la aplicación debe importar o exportar el tipo, de lo contrario, el tipo puede no ser conocido por el sistema y registrarse en un tipo de UTI desconocido no tiene ningún efecto en absoluto.

Pruebas dinámicas

Para enviar actividades puedes:

Para recibir elementos puedes:

  • Compartir un archivo con la aplicación desde otra aplicación o enviarlo por AirDrop o correo electrónico. Elije el archivo para que desencadene el diálogo "Abrir con..." (es decir, no hay una aplicación predeterminada que abra el archivo, un PDF, por ejemplo).
  • Enganchar application:openURL:options: y cualquier otro método que se haya identificado en un análisis estático anterior.
  • Observar el comportamiento de la aplicación.
  • Además, podrías enviar archivos específicos malformados y/o usar una técnica de fuzzing.

Lee cómo hacerlo aquí.

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥