MASTG-TECH-0058: Explorando o Pacote do App
Uma vez que você tenha coletado o nome do pacote do aplicativo que deseja analisar, você deve começar a coletar informações sobre ele. Primeiro, recupere iGoat-Swift IPA conforme explicado em Obtenção e Extração de Apps.
Você pode descompactar o IPA usando o utilitário padrão unzip ou qualquer outro utilitário ZIP.
unzip iGoat-Swift.ipa
Dentro você encontrará uma pasta Payload contendo o chamado Application Bundle (.app). Segue um exemplo na saída abaixo, observe que foi truncado para melhor legibilidade e visão geral:
$ ls -1 Payload/iGoat-Swift.app
rutger.html
mansi.html
splash.html
about.html
LICENSE.txt
Sentinel.txt
README.txt
URLSchemeAttackExerciseVC.nib
CutAndPasteExerciseVC.nib
RandomKeyGenerationExerciseVC.nib
KeychainExerciseVC.nib
CoreData.momd
archived-expanded-entitlements.xcent
SVProgressHUD.bundle
Base.lproj
Assets.car
PkgInfo
_CodeSignature
AppIcon60x60@3x.png
Frameworks
embedded.mobileprovision
Credentials.plist
Assets.plist
Info.plist
iGoat-Swift
Os itens mais relevantes são:
Info.plistcontém informações de configuração do aplicativo, como seu bundle ID, número de versão e nome de exibição._CodeSignature/contém um arquivo plist com uma assinatura sobre todos os arquivos no bundle.Frameworks/contém as bibliotecas nativas do app como arquivos .dylib ou .framework.PlugIns/pode conter extensões do app como arquivos .appex (não presente no exemplo).- iGoat-Swift é o binário do app contendo o código do aplicativo. Seu nome é o mesmo do nome do bundle menos a extensão .app.
- Vários recursos como imagens/ícones, arquivos
*.nib(armazenando as interfaces de usuário do app iOS), conteúdo localizado (<language>.lproj), arquivos de texto, arquivos de áudio, etc.
O Arquivo Info.plist¶
A information property list ou Info.plist (nomeada por convenção) é a principal fonte de informação para um app iOS. Consiste em um arquivo estruturado contendo pares chave-valor descrevendo informações essenciais de configuração sobre o app. Na verdade, todos os executáveis empacotados (extensões de app, frameworks e apps) devem ter um arquivo Info.plist. Você pode encontrar todas as chaves possíveis na Documentação para Desenvolvedores da Apple.
O arquivo pode estar formatado em XML ou binário (bplist). Você pode convertê-lo para formato XML com um comando simples:
- No macOS com
plutil, que é uma ferramenta que vem nativamente com macOS 10.2 e versões superiores (nenhuma documentação online oficial está disponível atualmente):
plutil -convert xml1 Info.plist
- No Linux:
apt install libplist-utils
plistutil -i Info.plist -o Info_xml.plist
Aqui está uma lista não exaustiva de algumas informações e as palavras-chave correspondentes que você pode facilmente buscar no arquivo Info.plist apenas inspecionando o arquivo ou usando grep -i <keyword> Info.plist:
- Strings de finalidade de permissões do app:
UsageDescription(veja "APIs da Plataforma iOS)") - Esquemas de URL personalizados:
CFBundleURLTypes(veja "APIs da Plataforma iOS)") - Tipos de documento personalizados exportados/importados:
UTExportedTypeDeclarations/UTImportedTypeDeclarations(veja "APIs da Plataforma iOS)") - Configuração de App Transport Security (ATS):
NSAppTransportSecurity(veja "Comunicação de Rede iOS)")
Consulte os capítulos mencionados para saber mais sobre como testar cada um desses pontos.
Binário do App¶
Binários de apps iOS são binários fat (podem ser implantados em todos os dispositivos 32 e 64 bits). Diferente do Android, onde você pode realmente decompilar o binário do app para código Java, os binários de apps iOS só podem ser desmontados.
Bibliotecas Nativas¶
Apps iOS podem tornar sua base de código modular usando diferentes elementos. No MASTG nos referiremos a todos eles como bibliotecas nativas, mas elas podem vir em diferentes formas:
- Bibliotecas Estáticas e Dinâmicas:
- Bibliotecas Estáticas podem ser usadas e serão compiladas no binário do app.
- Bibliotecas Dinâmicas (normalmente com extensão
.dylib) também são usadas, mas devem fazer parte de um bundle de framework. Bibliotecas Dinâmicas independentes não são suportadas no iOS, watchOS ou tvOS, exceto para as bibliotecas do sistema Swift fornecidas pelo Xcode.
- Frameworks (desde iOS 8). Um Framework é um diretório hierárquico que encapsula uma biblioteca dinâmica, arquivos de cabeçalho e recursos, como storyboards, arquivos de imagem e strings localizadas, em um único pacote.
- Binary Frameworks (
XCFrameworks): Xcode 11 suporta distribuir bibliotecas binárias usando o formatoXCFrameworks, que é uma nova maneira de empacotar múltiplas variantes de um Framework, por exemplo, para qualquer uma das plataformas que o Xcode suporta (incluindo simulador e dispositivos). Eles também podem empacotar bibliotecas estáticas (e seus cabeçalhos correspondentes) e suportam distribuição binária de código baseado em Swift e C.XCFrameworkspodem ser distribuídos como Swift Packages. - Swift Packages: Xcode 11 adiciona suporte para Swift packages, que são componentes reutilizáveis de código Swift, Objective-C, Objective-C++, C ou C++ que desenvolvedores podem usar em seus projetos e são distribuídos como código fonte. Desde o Xcode 12 eles também podem empacotar recursos, como imagens, storyboards e outros arquivos. Como as bibliotecas de pacotes são estáticas por padrão. O Xcode as compila, junto com os pacotes dos quais dependem, e então linka e combina tudo no aplicativo.
Você pode visualizar bibliotecas nativas em Grapefruit clicando no ícone Modules na barra de menu esquerda:

E obter uma visão mais detalhada incluindo suas importações/exportações:

Elas estão disponíveis na pasta Frameworks no IPA, você também pode inspecioná-las pelo terminal:
$ ls -1 Frameworks/
Realm.framework
libswiftCore.dylib
libswiftCoreData.dylib
libswiftCoreFoundation.dylib
ou do dispositivo com objection (bem como por SSH é claro):
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection ... Name
------------ ------- ------------------ ... ----------------------------
Directory 493 None ... Realm.framework
Regular 420 None ... libswiftCore.dylib
Regular 420 None ... libswiftCoreData.dylib
Regular 420 None ... libswiftCoreFoundation.dylib
...
Por favor, note que esta pode não ser a lista completa de elementos de código nativo sendo usados pelo app, pois alguns podem fazer parte do código fonte, significando que eles serão compilados no binário do app e portanto não podem ser encontrados como bibliotecas ou Frameworks independentes na pasta Frameworks.
Por enquanto esta é toda a informação que você pode obter sobre os Frameworks a menos que você comece a fazer engenharia reversa deles. Consulte Grapefruit para mais informações sobre como fazer engenharia reversa de Frameworks.
Outros Recursos do App¶
Normalmente vale a pena dar uma olhada no restante dos recursos e arquivos que você pode encontrar no Application Bundle (.app) dentro do IPA, pois às vezes eles contêm itens adicionais interessantes como bancos de dados criptografados, certificados, etc.
