Objection Tutorial

Reading time: 8 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Introdução

objection - Exploração Móvel em Tempo de Execução

Objection é um kit de ferramentas de exploração móvel em tempo de execução, alimentado por Frida. Foi criado com o objetivo de ajudar a avaliar aplicativos móveis e sua postura de segurança sem a necessidade de um dispositivo móvel com jailbreak ou root.

Nota: Isso não é uma forma de bypass de jailbreak / root. Ao usar objection, você ainda está limitado por todas as restrições impostas pelo sandbox aplicável que você está enfrentando.

Resumo

O objetivo do objection é permitir que o usuário chame as principais ações que o Frida oferece. Caso contrário, o usuário precisará criar um único script para cada aplicativo que deseja testar.

Tutorial

Para este tutorial, vou usar o APK que você pode baixar aqui:

Ou do seu repositório original (baixe app-release.apk)

Instalação

bash
pip3 install objection

Conexão

Faça uma conexão ADB regular e inicie o servidor frida no dispositivo (e verifique se o frida está funcionando tanto no cliente quanto no servidor).

Se você estiver usando um dispositivo com root, é necessário selecionar o aplicativo que você deseja testar dentro da opção --gadget. neste caso:

bash
frida-ps -Uai
objection --gadget asvid.github.io.fridaapp explore

Ações Básicas

Nem todos os comandos possíveis do objection serão listados neste tutorial, apenas os que eu achei mais úteis.

Ambiente

Algumas informações interessantes (como senhas ou caminhos) podem ser encontradas dentro do ambiente.

bash
env

Informações sobre Frida

bash
frida

Upload/Download

bash
file download <remote path> [<local path>]
file upload <local path> [<remote path>]

Importar script frida

bash
import <local path frida-script>

SSLPinning

bash
android sslpinning disable #Attempts to disable SSL Pinning on Android devices.

Detecção de Root

bash
android root disable  #Attempts to disable root detection on Android devices.
android root simulate #Attempts to simulate a rooted Android environment.

Exec Command

bash
android shell_exec whoami

Capturas de tela

bash
android ui screenshot /tmp/screenshot
android ui FLAG_SECURE false  #This may enable you to take screenshots using the hardware keys

Análise estática feita dinâmica

Em uma aplicação real, devemos conhecer todas as informações descobertas nesta parte antes de usar objection graças à análise estática. De qualquer forma, dessa forma você pode ver algo novo, pois aqui você terá apenas uma lista completa de classes, métodos e objetos exportados.

Isso também é útil se, de alguma forma, você não conseguir obter algum código-fonte legível do aplicativo.

Listar atividades, receptores e serviços

bash
android hooking list activities

bash
android hooking list services
android hooking list receivers

Frida lançará um erro se nenhum for encontrado

Obtendo a atividade atual

bash
android hooking get current_activity

Buscar Classes

Vamos começar a procurar por classes dentro da nossa aplicação.

bash
android hooking search classes asvid.github.io.fridaapp

Métodos de Busca de uma classe

Agora vamos extrair os métodos dentro da classe MainActivity:

bash
android hooking search methods asvid.github.io.fridaapp MainActivity

Listar métodos declarados de uma classe com seus parâmetros

Vamos descobrir quais parâmetros os métodos da classe precisam:

bash
android hooking list class_methods asvid.github.io.fridaapp.MainActivity

Listar classes

Você também pode listar todas as classes que foram carregadas dentro da aplicação atual:

bash
android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes.

Isso é muito útil se você quiser hook a method de uma classe e você só souber o nome da classe. Você poderia usar essa função para procurar qual módulo possui a classe e então hook seu método.

Hooking sendo fácil

Hooking (observando) um método

Do código-fonte da aplicação, sabemos que a função sum() da MainActivity está sendo executada a cada segundo. Vamos tentar dump todas as informações possíveis cada vez que a função é chamada (argumentos, valor de retorno e backtrace):

bash
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return

Hooking (assistindo) uma classe inteira

Na verdade, eu acho todos os métodos da classe MainActivity realmente interessantes, vamos hook them all. Tenha cuidado, isso pode crash uma aplicação.

bash
android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return

Se você brincar com o aplicativo enquanto a classe está conectada, você verá quando cada função está sendo chamada, seus argumentos e o valor de retorno.

Mudando o valor de retorno booleano de uma função

Do código-fonte, você pode ver que a função checkPin recebe um String como argumento e retorna um boolean. Vamos fazer a função sempre retornar true:

Agora, se você escrever qualquer coisa na caixa de texto para o código PIN, você verá que qualquer coisa é válida:

Instâncias de classe

Pesquise e imprima instâncias ativas de uma classe Java específica, especificada por um nome de classe totalmente qualificado. A saída é o resultado de uma tentativa de obter um valor de string para uma objeção descoberta, que normalmente contém valores de propriedade para o objeto.

android heap print_instances <class>

Keystore/Intents

Você pode brincar com o keystore e intents usando:

bash
android keystore list
android intents launch_activity
android intent launch_service

Memória

Dump

bash
memory dump all <local destination> #Dump all memory
memory dump from_base <base_address> <size_to_dump> <local_destination> #Dump a part

Lista

bash
memory list modules

Na parte inferior da lista, você pode ver frida:

Vamos verificar o que frida está exportando:

Buscar/Escrever

Você também pode buscar e escrever na memória com objection:

bash
memory search "<pattern eg: 41 41 41 ?? 41>" (--string) (--offsets-only)
memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)

SQLite

Você pode usar o comando sqlite para interagir com bancos de dados sqlite.

Exit

bash
exit

O que eu sinto falta no Objection

  • Os métodos de hooking às vezes fazem o aplicativo travar (isso também é por causa do Frida).
  • Você não pode usar as instâncias das classes para chamar funções da instância. E você não pode criar novas instâncias de classes e usá-las para chamar funções.
  • Não há um atalho (como o para sslpinnin) para hookear todos os métodos de criptografia comuns usados pelo aplicativo para ver texto cifrado, texto simples, chaves, IVs e algoritmos usados.

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks