hacktricks/mobile-pentesting/ios-pentesting/ios-uiactivity-sharing.md

9.9 KiB

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Compartilhamento UIActivity

A partir do iOS 6, é possível para aplicativos de terceiros compartilhar dados (itens) através de mecanismos específicos como o AirDrop, por exemplo. Do ponto de vista do usuário, essa funcionalidade é a conhecida folha de atividade de compartilhamento do sistema que aparece após clicar no botão "Compartilhar".

Uma lista completa dos mecanismos de compartilhamento integrados disponíveis pode ser encontrada em UIActivity.ActivityType. Se não considerados apropriados para o aplicativo, os desenvolvedores têm a possibilidade de excluir alguns desses mecanismos de compartilhamento.

Enviando Itens

Ao testar o Compartilhamento UIActivity, você deve prestar atenção especial a:

  • os dados (itens) sendo compartilhados,
  • as atividades personalizadas,
  • os tipos de atividade excluídos.

O compartilhamento de dados via UIActivity funciona criando um UIActivityViewController e passando a ele os itens desejados (URLs, texto, uma imagem) em init(activityItems:applicationActivities:).

Se tiver o código-fonte, você deve examinar o UIActivityViewController:

  • Inspecione as atividades passadas para o método init(activityItems:applicationActivities:).
  • Verifique se ele define atividades personalizadas (também sendo passadas para o método anterior).
  • Verifique os excludedActivityTypes, se houver.

Se você só tem o aplicativo compilado/instalado, tente procurar pelo método e propriedade anteriores, por exemplo:

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

Recebendo Itens

Ao receber itens, você deve verificar:

  • se o aplicativo declara tipos de documentos personalizados ao olhar para Exported/Imported UTIs (aba "Info" do projeto Xcode). A lista de todos os UTIs declarados pelo sistema (Uniform Type Identifiers) pode ser encontrada na documentação arquivada da Apple Developer.
  • se o aplicativo especifica quaisquer tipos de documentos que ele pode abrir ao olhar para Document Types (aba "Info" do projeto Xcode). Se presentes, eles consistem em um nome e um ou mais UTIs que representam o tipo de dado (por exemplo, "public.png" para arquivos PNG). O iOS usa isso para determinar se o aplicativo é elegível para abrir um determinado documento (especificar Exported/Imported UTIs não é suficiente).
  • se o aplicativo verifica adequadamente os dados recebidos ao olhar para a implementação de application:openURL:options: (ou sua versão obsoleta UIApplicationDelegate application:openURL:sourceApplication:annotation:) no app delegate.

Se não tiver o código-fonte, você ainda pode olhar para o arquivo Info.plist e procurar por:

  • UTExportedTypeDeclarations/UTImportedTypeDeclarations se o aplicativo declara tipos de documentos personalizados exportados/importados.
  • CFBundleDocumentTypes para ver se o aplicativo especifica quaisquer tipos de documentos que ele pode abrir.

Uma explicação muito completa sobre o uso dessas chaves pode ser encontrada no Stackoverflow, mas aqui está um resumo:

  • UTExportedTypeDeclarations: Use-os para definir seus próprios UTIs que seu aplicativo deseja ensinar ao sistema onde está instalado. Um UTI descreve um pedaço de dado (não necessariamente dados localizados dentro de um arquivo!) e requer pelo menos um identificador (com.example.MyCoolDataType). Adicionalmente, pode ter um nome (My Cool Data Type), uma ou mais extensões de nome de arquivo (.myCoolDataType), um ou mais tipos MIME (x-application/my-cool-data-type), um ou mais tipos de prancheta (usados ao transferir dados desse tipo usando copiar&colar), e um ou mais tipos de sistema operacional legado. Geralmente, você também quer que os UTIs estejam em conformidade com UTIs existentes (por exemplo, quando você diz que seu UTI está em conformidade com public.data, qualquer processo que possa lidar com dados genéricos também pode lidar com seu UTI).
  • Exemplo: Você define seu próprio formato de dados de arquivo proprietário e deseja que esse formato de dados também seja conhecido por outros aplicativos, plugins, extensões e assim por diante.
  • UTImportedTypeDeclarations: Você usa UTImportedTypeDeclarations para ensinar o sistema sobre UTIs que você quer que sejam conhecidos no sistema, mas que não são seus UTIs.
  • Exemplo: Seu aplicativo é capaz de ler o formato de dados proprietário de outro aplicativo, mas você não sabe se esse aplicativo está instalado no sistema.
  • CFBundleDocumentTypes: Você usa CFBundleDocumentTypes para informar ao sistema quais tipos de documentos seu aplicativo é capaz de abrir. A menos que você também liste seus UTIs aqui, esses UTIs não são associados ao seu aplicativo no Finder e seu aplicativo não aparecerá no menu Abrir Com >.
    A única coisa que você sempre deve definir para um tipo de documento é o papel. O papel pode ser "Visualizador" (você pode exibir esse tipo de arquivo, mas não pode editá-lo), "Editor" (você pode exibir e editar esse tipo de arquivo), "Nenhum" (não está especificado o que você pode fazer com esse arquivo).
  • Exemplo: Você quer que seu aplicativo seja associado a certos tipos de arquivos, identificados por extensão, tipo MIME ou identificador UTI. Se você quer que seu aplicativo seja associado a um tipo de UTI, o aplicativo deve importar ou exportar o tipo, caso contrário, o tipo pode não ser conhecido pelo sistema e registrar um tipo de UTI desconhecido simplesmente não tem efeito algum.

Teste Dinâmico

Para atividades de envio, você pode:

Para receber itens, você pode:

  • Compartilhar um arquivo com o aplicativo a partir de outro aplicativo ou enviá-lo via AirDrop ou e-mail. Escolha o arquivo de forma que ele acione o diálogo "Abrir com..." (ou seja, não há um aplicativo padrão que abrirá o arquivo, um PDF, por exemplo).
  • Intercepte application:openURL:options: e quaisquer outros métodos que foram identificados em uma análise estática anterior.
  • Observe o comportamento do aplicativo.
  • Além disso, você poderia enviar arquivos específicos malformados e/ou usar uma técnica de fuzzing.

Leia como aqui.

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks: