MASTG-TECH-0054: Obtenção e Extração de Apps
Obtendo o Arquivo IPA a partir de um Link de Distribuição OTA¶
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
cdpara 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
localhostcom a porta2222ao 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') emdump.pypara 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