Translated ['', 'src/mobile-pentesting/android-app-pentesting/android-an

This commit is contained in:
Translator 2025-09-29 12:43:05 +00:00
parent 2defec8152
commit 8f6bff40eb

View File

@ -2,14 +2,14 @@
{{#include ../../banners/hacktricks-training.md}}
Esta página fornece um fluxo de trabalho prático para recuperar análise dinâmica contra apps Android que detectam/bloqueiam instrumentation por root ou que aplicam TLS pinning. Foca em triagem rápida, detecções comuns e hooks/táticas copiáveis para contornálas sem repacking quando possível.
Esta página fornece um workflow prático para recuperar análise dinâmica contra apps Android que detectam/bloqueiam instrumentação por root ou aplicam TLS pinning. Foca em triagem rápida, detecções comuns e hooks/táticas copiáveis para contornálas sem repacking quando possível.
## Detection Surface (what apps check)
## Superfície de Detecção (o que os apps verificam)
- Verificações de root: su binary, Magisk paths, getprop values, common root packages
- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
- Native antidebug: ptrace(), syscalls, antiattach, breakpoints, inline hooks
- Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present
- Verificações Frida/debugger (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
- Antidebug nativo: ptrace(), syscalls, antiattach, breakpoints, inline hooks
- Checagens de init precoce: Application.onCreate() ou process start hooks que travam se instrumentação estiver presente
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
## Step 1 — Quick win: hide root with Magisk DenyList
@ -25,7 +25,7 @@ References:
## Step 2 — 30second Frida Codeshare tests
Tente scripts dropin comuns antes de se aprofundar:
Tente scripts dropin comuns antes de aprofundar:
- anti-root-bypass.js
- anti-frida-detection.js
@ -35,11 +35,11 @@ Exemplo:
```bash
frida -U -f com.example.app -l anti-frida-detection.js
```
Estes normalmente anulam verificações Java de root/debug, process/service scans e ptrace() nativo. Úteis em apps pouco protegidos; alvos hardened podem precisar de hooks personalizados.
Estes normalmente fazem stub em Java root/debug checks, process/service scans e native ptrace(). Úteis em apps pouco protegidos; hardened targets podem precisar de hooks personalizados.
- Codeshare: https://codeshare.frida.re/
## Automatizar com Medusa (Frida framework)
## Automatize com Medusa (Frida framework)
Medusa fornece 90+ módulos prontos para SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, e mais.
```bash
@ -54,11 +54,11 @@ use http_communications/multiple_unpinner
use root_detection/universal_root_detection_bypass
run com.target.app
```
Dica: Medusa é ótimo para resultados rápidos antes de escrever hooks personalizados. Você também pode selecionar módulos individualmente e combiná-los com seus próprios scripts.
Dica: Medusa é excelente para vitórias rápidas antes de escrever custom hooks. Você também pode cherry-pick modules e combiná-los com seus próprios scripts.
## Passo 3 — Contornar detectores em tempo de inicialização anexando-se mais tarde
## Etapa 3 — Contornar detectores em tempo de inicialização anexando-se tardiamente
Muitas detecções só são executadas durante o spawn do processo/onCreate(). Spawntime injection (-f) ou gadgets são detectados; anexar-se após o carregamento da UI pode passar despercebido.
Muitas detecções só rodam durante o process spawn/onCreate(). Spawntime injection (-f) ou gadgets são detectados; anexar-se após o carregamento da UI pode passar despercebido.
```bash
# Launch the app normally (launcher/adb), wait for UI, then attach
frida -U -n com.example.app
@ -67,12 +67,12 @@ aobjection --gadget com.example.app explore # if using gadget
```
Se isso funcionar, mantenha a sessão estável e prossiga para mapear e verificar stubs.
## Passo 4 — Mapear a lógica de detecção via Jadx e busca por strings
## Etapa 4 — Mapear a lógica de detecção via Jadx e busca por strings
Palavras-chave para triagem estática no Jadx:
Palavras-chave de triagem estática no Jadx:
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
Padrões Java típicos:
Padrões típicos em Java:
```java
public boolean isFridaDetected() {
return getRunningServices().contains("frida");
@ -81,13 +81,13 @@ return getRunningServices().contains("frida");
APIs comuns para revisar/hook:
- android.os.Debug.isDebuggerConnected
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
- java.lang.System.loadLibrary / System.load (native bridge)
- java.lang.Runtime.exec / ProcessBuilder (probing commands)
- android.os.SystemProperties.get (root/emulator heuristics)
- java.lang.System.loadLibrary / System.load (ponte nativa)
- java.lang.Runtime.exec / ProcessBuilder (comandos de sondagem)
- android.os.SystemProperties.get (heurísticas de root/emulator)
## Etapa 5 — Stub em tempo de execução com Frida (Java)
## Etapa 5 — Runtime stubbing with Frida (Java)
Substitua verificações personalizadas para retornar valores seguros sem repacotar:
Sobrescreva verificações customizadas para retornar valores seguros sem repacking:
```js
Java.perform(() => {
const Checks = Java.use('com.example.security.Checks');
@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager');
AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); };
});
```
Triando falhas iniciais? Dump classes pouco antes de morrer para identificar namespaces de detecção prováveis:
Triagem de early crashes? Faça dump das classes pouco antes de morrer para identificar possíveis detection namespaces:
```js
Java.perform(() => {
Java.enumerateLoadedClasses({
@ -111,7 +111,6 @@ onComplete: () => console.log('Done')
});
});
```
```
// Quick root detection stub example (adapt to target package/class names)
Java.perform(() => {
try {
@ -119,9 +118,8 @@ const RootChecker = Java.use('com.target.security.RootCheck');
RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {}
});
```
Registre e neutralize métodos suspeitos para confirmar o fluxo de execução:
Log e neutralize métodos suspeitos para confirmar o fluxo de execução:
```js
Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
@ -133,9 +131,9 @@ return false;
```
## Bypass emulator/VM detection (Java stubs)
Heurísticas comuns: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE contendo generic/goldfish/ranchu/sdk; QEMU artifacts like /dev/qemu_pipe, /dev/socket/qemud; default MAC 02:00:00:00:00:00; 10.0.2.x NAT; missing telephony/sensors.
Heurísticas comuns: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE contendo generic/goldfish/ranchu/sdk; artefatos QEMU como /dev/qemu_pipe, /dev/socket/qemud; MAC padrão 02:00:00:00:00:00; NAT 10.0.2.x; telefonia/sensores ausentes.
Spoof rápido dos campos Build:
Falsificação rápida dos campos Build:
```js
Java.perform(function(){
var Build = Java.use('android.os.Build');
@ -145,11 +143,11 @@ Build.BRAND.value = 'google';
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
});
```
Complemente com stubs para checagens de existência de arquivos e identificadores (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) para retornarem valores realistas.
Adicione stubs para verificações de existência de arquivos e identificadores (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) para retornar valores realistas.
## SSL pinning bypass quick hook (Java)
Neutralize TrustManagers personalizados e force contextos SSL permissivos:
Neutralizar TrustManagers personalizados e forçar contextos SSL permissivos:
```js
Java.perform(function(){
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
@ -168,12 +166,12 @@ return SSLContextInit.call(this, km, TrustManagers, sr);
});
```
Notas
- Extend for OkHttp: hook okhttp3.CertificatePinner and HostnameVerifier conforme necessário, ou use um script universal de unpinning do CodeShare.
- Estenda para OkHttp: hook okhttp3.CertificatePinner e HostnameVerifier conforme necessário, ou use um script universal de unpinning do CodeShare.
- Exemplo de execução: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
## Etapa 6 — Siga a trilha JNI/native quando Java hooks falharem
## Passo 6 — Siga a trilha JNI/native quando os hooks Java falharem
Rastreie pontos de entrada JNI para localizar native loaders e detection init:
Rastreie pontos de entrada JNI para localizar carregadores nativos e a inicialização de detecção:
```bash
frida-trace -n com.example.app -i "JNI_OnLoad"
```
@ -184,11 +182,11 @@ nm -D libfoo.so | head
objdump -T libfoo.so | grep Java_
strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
```
Interactive/native reversing:
Reversão interativa/nativa:
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
Exemplo: neutralizar ptrace para contornar antidebug simples em libc:
Exemplo: neutralizar ptrace para derrotar antidebug simples em libc:
```js
const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) {
@ -197,35 +195,35 @@ return -1; // pretend failure
}, 'int', ['int', 'int', 'pointer', 'pointer']));
}
```
See also:
Veja também:
{{#ref}}
reversing-native-libraries.md
{{#endref}}
## Passo 7 — Objection patching (embed gadget / strip basics)
## Etapa 7 — Objection patching (embed gadget / strip basics)
Se você prefere reempacotar em vez de usar runtime hooks, tente:
Quando você preferir repacking em vez de runtime hooks, tente:
```bash
objection patchapk --source app.apk
```
Notas:
- Requer apktool; garanta uma versão atual seguindo o guia oficial para evitar problemas de build: https://apktool.org/docs/install
- Gadget injection permite instrumentação sem root, mas ainda pode ser detectado por verificações mais rígidas em tempo de inicialização.
- Gadget injection permite instrumentação sem root, mas ainda pode ser detectado por verificações mais rigorosas em tempo de inicialização.
Opcionalmente, adicione módulos LSPosed e Shamiko para ocultação de root mais robusta em ambientes Zygisk, e gerencie a DenyList para cobrir processos filhos.
Opcionalmente, adicione módulos LSPosed e Shamiko para ocultação de root mais forte em ambientes Zygisk, e ajuste a DenyList para cobrir processos filhos.
Referências:
- Objection: https://github.com/sensepost/objection
## Etapa 8 — Alternativa: Patch TLS pinning para visibilidade da rede
## Etapa 8 — Fallback: Patch TLS pinning para visibilidade de rede
Se a instrumentação estiver bloqueada, você ainda pode inspecionar o tráfego removendo o pinning estaticamente:
Se a instrumentação for bloqueada, você ainda pode inspecionar o tráfego removendo o pinning estaticamente:
```bash
apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
```
- Ferramenta: https://github.com/shroudedcode/apk-mitm
- Para truques de CAtrust na configuração de rede (e user CA trust no Android 7+), veja:
- Para truques de CAtrust na configuração de rede (e confiança de CA de usuário no Android 7+), veja:
{{#ref}}
make-apk-accept-ca-certificate.md
@ -235,7 +233,7 @@ make-apk-accept-ca-certificate.md
install-burp-certificate.md
{{#endref}}
## Guia rápido de comandos
## Folha de comandos útil
```bash
# List processes and attach
frida-ps -Uai
@ -253,12 +251,30 @@ objection --gadget com.example.app explore
# Static TLS pinning removal
apk-mitm app.apk
```
## Dicas & ressalvas
## Universal proxy forcing + TLS unpinning (HTTP Toolkit Frida hooks)
- Prefira attaching mais tarde em vez de spawning quando apps travam ao iniciar
- Algumas detecções re-run em fluxos críticos (e.g., payment, auth) — mantenha os hooks ativos durante a navegação
- Misture static e dynamic: string hunt no Jadx para reduzir a shortlist de classes; depois hook methods para verificar em runtime
- Hardened apps podem usar packers e native TLS pinning — espere ter que reverse native code
Aplicativos modernos frequentemente ignoram os proxies do sistema e aplicam múltiplas camadas de pinning (Java + native), tornando a captura de tráfego difícil mesmo com as CAs de usuário/sistema instaladas. Uma abordagem prática é combinar universal TLS unpinning com proxy forcing via Frida hooks prontos, e direcionar tudo através de mitmproxy/Burp.
Workflow
- Execute o mitmproxy no seu host (ou Burp). Garanta que o dispositivo consiga alcançar o IP/porta do host.
- Carregue os Frida hooks consolidados do HTTP Toolkit para tanto unpin TLS quanto forçar o uso de proxy nas pilhas comuns (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, etc.). Isso contorna as checagens de CertificatePinner/TrustManager e sobrescreve os proxy selectors, então o tráfego é sempre enviado via seu proxy mesmo se o app explicitamente desabilitar proxies.
- Inicie o app alvo com Frida e o script de hook, e capture as requisições no mitmproxy.
Exemplo
```bash
# Device connected via ADB or over network (-U)
# See the repo for the exact script names & options
frida -U -f com.vendor.app \
-l ./android-unpinning-with-proxy.js \
--no-pause
# mitmproxy listening locally
mitmproxy -p 8080
```
Notas
- Combine com um proxy em todo o sistema via `adb shell settings put global http_proxy <host>:<port>` sempre que possível. Os Frida hooks vão forçar o uso do proxy mesmo quando os aplicativos ignoram as configurações globais.
- Esta técnica é ideal quando você precisa realizar MITM em fluxos de onboarding mobile-to-IoT, onde pinning/proxy avoidance é comum.
- Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning
## Referências