Skip to content

MASTG-TECH-0054: Obtenção e Extração de Apps

Durante o desenvolvimento, os aplicativos às vezes são fornecidos aos testadores por meio de distribuição over-the-air (OTA). Nessa situação, você receberá um link do tipo itms-services, como o seguinte:

itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist

Você pode usar a ferramenta ITMS services asset downloader para baixar o IPA a partir de uma URL de distribuição OTA. Instale-a via npm:

npm install -g itms-services

Salve o arquivo IPA localmente com o seguinte comando:

itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa

Extraindo o Binário do Aplicativo

Se você tiver um IPA com um binário de aplicativo descriptografado, descompacte-o e estará pronto para prosseguir. O binário do aplicativo está localizado no diretório principal do pacote (.app), por exemplo, Payload/Telegram X.app/Telegram X. Consulte a subseção a seguir para detalhes sobre a extração das listas de propriedades.

No Finder do macOS, os diretórios .app são abertos clicando com o botão direito neles e selecionando "Mostrar Conteúdo do Pacote". No terminal, você pode simplesmente usar cd para entrar neles.

Descriptografando o Binário do Aplicativo

NOTA IMPORTANTE: Nos Estados Unidos, o Digital Millennium Copyright Act 17 U.S.C. 1201, ou DMCA, torna ilegal e passível de ação contornar certos tipos de DRM. No entanto, o DMCA também fornece isenções, como para certos tipos de pesquisa de segurança. Um advogado qualificado pode ajudá-lo a determinar se sua pesquisa se qualifica sob as isenções do DMCA. (Fonte: Corellium)

Se você não tiver o IPA original, precisará de um dispositivo jailbroken onde instalará o aplicativo (por exemplo, via App Store). Uma vez instalado, você precisa extrair o binário do aplicativo da memória e reconstruir o arquivo IPA. Devido ao DRM, o arquivo binário do aplicativo é criptografado quando armazenado no dispositivo iOS, portanto, simplesmente extraí-lo do Bundle (seja por SSH ou Objection) não será suficiente para realizar engenharia reversa.

Você pode verificar isso executando este comando no binário do aplicativo:

otool -l Payload/Telegram X.app/Telegram X | grep -i LC_ENCRYPTION -B1 -A4
Load command 12
          cmd LC_ENCRYPTION_INFO
      cmdsize 20
     cryptoff 16384
    cryptsize 32768
      cryptid 1

Ou com rabin2:

rabin2 -I Payload/Telegram X.app/Telegram X | grep crypto
crypto   true

Para recuperar a versão descriptografada, você pode usar frida-ios-dump. Ele extrairá a versão descriptografada da memória enquanto o aplicativo está em execução no dispositivo.

Primeiro, configure Frida iOS - Despejo dump.py:

  • defina-o para usar localhost com a porta 2222 ao usar iproxy (iproxy 2222 22), ou para o endereço IP real e a porta do dispositivo do qual você deseja extrair o binário.
  • atualize o nome de usuário padrão (User = 'root') e a senha (Password = 'alpine') em dump.py para aqueles que você definiu.

Enumere os aplicativos instalados no dispositivo executando python dump.py -l:

 PID  Name             Identifier
----  ---------------  -------------------------------------
 860  Cydia            com.saurik.Cydia
1130  Settings         com.apple.Preferences
 685  Mail             com.apple.mobilemail
 834  Telegram         ph.telegra.Telegraph
   -  Stocks           com.apple.stocks
   ...

Você pode extrair o aplicativo selecionado, por exemplo o Telegram, executando python dump.py -H 127.0.0.1 -p 2222 --user mobile -P alpine ph.telegra.Telegraph, se estiver usando um túnel SSH com iproxy e as credenciais padrão em um telefone jailbroken.

Após alguns segundos, o arquivo Telegram.ipa será criado em seu diretório atual. Você pode validar o sucesso da extração removendo o aplicativo e reinstalando-o (por exemplo, usando ios-deploy ios-deploy -b Telegram.ipa). Observe que isso só funcionará em dispositivos jailbroken, pois caso contrário a assinatura não será válida.

Você pode usar rabin2 para verificar se o binário do aplicativo agora está descriptografado:

rabin2 -I Payload/Telegram X.app/Telegram X | grep crypto
crypto   false

Thinning do Binário do Aplicativo

O binário do aplicativo pode conter várias arquiteturas, como armv7 (32 bits) e arm64 (64 bits). Isso é chamado de fat binary.

Um exemplo é o Damn Vulnerable iOS App DVIA v1 para demonstrar isso.

Descompacte o aplicativo e execute otool:

unzip DamnVulnerableiOSApp.ipa
cd Payload/DamnVulnerableIOSApp.app
otool -hv DamnVulnerableIOSApp

A saída será semelhante a esta:

DamnVulnerableIOSApp (architecture armv7):
Mach header
      magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC      ARM         V7  0x00     EXECUTE    33       3684   NOUNDEFS DYLDLINK TWOLEVEL PIE
DamnVulnerableIOSApp (architecture arm64):
Mach header
      magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64    ARM64        ALL  0x00     EXECUTE    33       4192   NOUNDEFS DYLDLINK TWOLEVEL PIE

Para facilitar a análise do aplicativo, é recomendado criar um chamado thin binary, que contém apenas uma arquitetura:

lipo -thin armv7 DamnVulnerableIOSApp -output DVIA32