From 8f6bff40eb53c23101f512ff75cfe03eb048a99f Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 29 Sep 2025 12:43:05 +0000 Subject: [PATCH] Translated ['', 'src/mobile-pentesting/android-app-pentesting/android-an --- ...-instrumentation-and-ssl-pinning-bypass.md | 108 ++++++++++-------- 1 file changed, 62 insertions(+), 46 deletions(-) diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index 0b2af8943..972d8b77e 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -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 anti‑debug: ptrace(), syscalls, anti‑attach, 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 +- Anti‑debug nativo: ptrace(), syscalls, anti‑attach, 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 — 30‑second Frida Codeshare tests -Tente scripts drop‑in comuns antes de se aprofundar: +Tente scripts drop‑in 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(). Spawn‑time 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(). Spawn‑time 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 anti‑debug simples em libc: +Exemplo: neutralizar ptrace para derrotar anti‑debug 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 CA‑trust na configuração de rede (e user CA trust no Android 7+), veja: +- Para truques de CA‑trust 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 :` 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