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

This commit is contained in:
Translator 2025-09-29 12:18:07 +00:00
parent 9bf413aefb
commit b55fdb2f8c

View File

@ -2,30 +2,30 @@
{{#include ../../banners/hacktricks-training.md}}
Bu sayfa, enstrümantasyonu tespit eden veya rootile engelleyen ve/veya TLS pinning uygulayan Android uygulamalarına karşı dinamik analiz yetkisini yeniden kazanmak için pratik bir iş akışı sağlar. Hızlı triyaj, yaygın tespitler ve mümkün olduğunda repacking yapmadan atlamak için kopyalayapıştır kullanılabilir hook/taktiklere odaklanır.
Bu sayfa, instrumentation tespit eden/rootblock yapan veya TLS pinning uygulayan Android uygulamalarına karşı dinamik analiz yeteneğini geri kazanmak için pratik bir iş akışı sağlar. Hızlı triyaj, yaygın tespitler ve mümkün olduğunda repack yapmadan bunları atlatmak için kopyalayapıştır yapılabilir hook/taktiklere odaklanır.
## Detection Surface (what apps check)
- Root kontrolleri: su binary'si, Magisk yolları, getprop değerleri, yaygın root paketleri
- Frida/debugger kontrolleri (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), /proc taraması, classpath, yüklenmiş kütüphaneler
- Native antidebug: ptrace(), syscall'lar, antiattach, breakpoint'ler, inline hook'lar
- Erken init kontrolleri: Application.onCreate() veya enstrümantasyon varsa çökertme yapan process başlangıç hook'ları
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pin'ler
- Root kontrolleri: su binary, Magisk yolları, getprop değerleri, yaygın root paketleri
- Frida/debugger kontrolleri (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), /proc taraması, classpath, yüklü kütüphaneler
- Native antidebug: ptrace(), syscalls, antiattach, breakpoints, inline hooks
- Erken init kontrolleri: Application.onCreate() veya instrumentation varsa crash yapan process başlangıç hook'ları
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
## Step 1 — Quick win: hide root with Magisk DenyList
- Magisk'te Zygisk'i etkinleştir
- DenyList'i etkinleştir, hedef paketi ekle
- Yeniden başlat ve tekrar test et
- Enable Zygisk in Magisk
- Enable DenyList, add the target package
- Reboot and retest
Birçok uygulama sadece bariz göstergelere (su/Magisk yolları/getprop) bakar. DenyList genellikle naif kontrolleri nötralize eder.
Birçok uygulama sadece bariz göstergelere bakar (su/Magisk paths/getprop). DenyList genellikle naif kontrolleri etkisiz hale getirir.
References:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
## Step 2 — 30second Frida Codeshare tests
Derinlemesine incelemeye geçmeden önce yaygın dropin script'leri dene:
Derinlemesine incelemeye başlamadan önce yaygın hazır script'leri deneyin:
- anti-root-bypass.js
- anti-frida-detection.js
@ -35,11 +35,11 @@ Example:
```bash
frida -U -f com.example.app -l anti-frida-detection.js
```
Bunlar tipik olarak Java root/debug kontrollerini, process/service taramalarını ve native ptrace()'ı stub'lar. Hafif korumalı uygulamalarda kullanışlıdır; sertleştirilmiş hedefler için özelleştirilmiş hook'lar gerekebilir.
Genellikle Java root/debug kontrollerini, process/service taramalarını ve native ptrace() çağrılarını stub'lar. Hafifçe korunan uygulamalarda işe yarar; sertleştirilmiş hedefler için özelleştirilmiş hooks gerekebilir.
- Codeshare: https://codeshare.frida.re/
## Medusa (Frida framework) ile otomatikleştirin
## Medusa ile Otomasyon (Frida framework)
Medusa, SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception ve daha fazlası için 90+ hazır modül sağlar.
```bash
@ -54,22 +54,22 @@ use http_communications/multiple_unpinner
use root_detection/universal_root_detection_bypass
run com.target.app
```
İpucu: Medusa, custom hooks yazmadan önce hızlı kazanımlar için harikadır. Ayrıca modules'ı cherrypick yapıp kendi scripts'inizle birleştirebilirsiniz.
İpucu: Medusa, custom hooks yazmadan önce hızlı kazanımlar için mükemmeldir. Ayrıca cherry-pick modules seçebilir ve bunları kendi scripts'lerinizle birleştirebilirsiniz.
## Adım 3 — init-time detectors'ı attaching late ile atlatın
## Adım 3 — Bypass init-time detectors by attaching late
Pek çok tespit sadece process spawn/onCreate() sırasında çalışır. Spawntime injection (-f) veya gadgets yakalanır; UI yüklendikten sonra attaching yapmak atlatmayı sağlayabilir.
Birçok tespit yalnızca process spawn/onCreate() sırasında çalışır. Spawntime injection (-f) veya gadgets yakalanır; UI yüklendikten sonra attaching ile atlatılabilir.
```bash
# Launch the app normally (launcher/adb), wait for UI, then attach
frida -U -n com.example.app
# Or with Objection to attach to running process
aobjection --gadget com.example.app explore # if using gadget
```
Bu işe yararsa, oturumu kararlı tutun ve map ve stub kontrollerine geçin.
Bu işe yararsa, oturumu kararlı tutun ve map ile stub kontrollerine geçin.
## Adım 4 — Jadx ve string hunting aracılığıyla tespit mantığını haritalayın
## Adım 4 — Tespit mantığını Jadx ve string aramasıyla eşleme
Jadx'te statik triage anahtar kelimeleri:
Static triage keywords in Jadx:
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
Tipik Java kalıpları:
@ -78,16 +78,16 @@ public boolean isFridaDetected() {
return getRunningServices().contains("frida");
}
```
İncelenmesi/hook yapılması gereken yaygın API'ler:
İncelenecek / hook'lanacak yaygın API'ler:
- android.os.Debug.isDebuggerConnected
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
- java.lang.System.loadLibrary / System.load (native köprüsü)
- java.lang.Runtime.exec / ProcessBuilder (sorgulama komutları)
- android.os.SystemProperties.get (root/emülatör heuristikleri)
## Adım 5 — Frida ile çalışma zamanı stub'lama (Java)
## Adım 5 — Frida (Java) ile çalışma zamanı stubbing
Yeniden paketlemeye gerek kalmadan özel guard'ları güvenli değerler döndürecek şekilde geçersiz kılın:
Repacking yapmadan özel korumaları override ederek güvenli değerler döndürün:
```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(); };
});
```
Erken çöküşleri triage mı ediyorsunuz? Çökmeden hemen önce sınıfları dump ederek olası detection namespace'lerini tespit edin:
Erken çökme triage'i mi yapıyorsunuz? Çökmeden hemen önce Dump classes ile muhtemel detection namespaces'leri tespit edin:
```js
Java.perform(() => {
Java.enumerateLoadedClasses({
@ -119,7 +119,7 @@ RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {}
});
Çalışma akışını doğrulamak için şüpheli metodları loglayın ve devre dışı bırakın:
Şüpheli yöntemleri kaydedin ve yürütme akışını doğrulamak için etkisizleştirin:
```js
Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
@ -131,7 +131,7 @@ return false;
```
## Bypass emulator/VM detection (Java stubs)
Yaygın sezgisel kurallar: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE alanlarının generic/goldfish/ranchu/sdk içermesi; QEMU artifaktları (ör. /dev/qemu_pipe, /dev/socket/qemud); varsayılan MAC 02:00:00:00:00:00; 10.0.2.x NAT; telephony/sensors eksikliği.
Yaygın heuristikler: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE alanlarında generic/goldfish/ranchu/sdk bulunması; QEMU artifaktları (ör. /dev/qemu_pipe, /dev/socket/qemud); varsayılan MAC 02:00:00:00:00:00; 10.0.2.x NAT; telefon/sensörlerin yokluğu.
Build alanlarının hızlı spoof'lanması:
```js
@ -143,11 +143,11 @@ Build.BRAND.value = 'google';
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
});
```
Dosya varlığı kontrolleri ve tanımlayıcılar için (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) gerçekçi değerler döndürecek stub'larla tamamlayın.
Dosya varlığı kontrolleri ve tanımlayıcılar (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) için gerçekçi değerler döndüren stub'larla tamamlayın.
## SSL pinning bypass quick hook (Java)
Özelleştirilmiş TrustManagers'ı etkisiz hale getirin ve permissive SSL context'leri zorlayın:
Özel TrustManagers'ı nötralize edin ve izin verici SSL context'lerini zorlayın:
```js
Java.perform(function(){
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
@ -166,27 +166,27 @@ return SSLContextInit.call(this, km, TrustManagers, sr);
});
```
Notlar
- OkHttp için genişletin: gerektiğinde hook okhttp3.CertificatePinner ve HostnameVerifier kullanın veya CodeShare'dan universal unpinning script kullanın.
- Örnek çalıştırma: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
- OkHttp için genişlet: gerekli olduğunda okhttp3.CertificatePinner ve HostnameVerifier'ı hook et veya CodeShare'den evrensel unpinning script'ini kullan.
- Çalıştırma örneği: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
## Adım 6 — Java hooks başarısız olduğunda JNI/native izini takip edin
## Adım 6 — Java hooks başarısız olduğunda JNI/native izini takip et
Native loader'ları ve detection init'i bulmak için JNI giriş noktalarını izleyin:
Native loader'ları ve detection init'ini bulmak için JNI giriş noktalarını izle:
```bash
frida-trace -n com.example.app -i "JNI_OnLoad"
```
Paketlenmiş .so dosyaları için hızlı native triage:
Paketlenmiş .so dosyalarının hızlı yerel triyajı:
```bash
# List exported symbols & JNI
nm -D libfoo.so | head
objdump -T libfoo.so | grep Java_
strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
```
Etkileşimli/native reversing:
Etkileşimli/yerel reversing:
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
Örnek: libc içindeki basit antidebug'i atlatmak için ptrace'i etkisizleştirme:
Örnek: ptrace'i etkisizleştirerek libc'deki basit antidebug'i atlatma:
```js
const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) {
@ -202,28 +202,28 @@ reversing-native-libraries.md
## Adım 7 — Objection patching (embed gadget / strip basics)
repacking'i runtime hooks yerine tercih ediyorsanız, deneyin:
Eğer repacking'i runtime hooks yerine tercih ediyorsanız, şunu deneyin:
```bash
objection patchapk --source app.apk
```
Notlar:
- apktool gerektirir; derleme sorunlarını önlemek için resmi kılavuzdan güncel bir sürüm kullandığınızdan emin olun: https://apktool.org/docs/install
- Gadget injection root olmadan instrumentation sağlar ancak yine de daha güçlü inittime kontrolleri tarafından tespit edilebilir.
- apktool gerektirir; build sorunlarını önlemek için resmi kılavuzdan güncel bir sürüm kullandığınızdan emin olun: https://apktool.org/docs/install
- Gadget injection, root olmadan instrumentation'a izin verir ancak daha güçlü inittime kontrolleri tarafından hâlâ tespit edilebilir.
İsteğe bağlı olarak, Zygisk ortamlarında daha güçlü root gizleme için LSPosed modüllerini ve Shamiko'yu ekleyin ve DenyList'i alt süreçleri kapsayacak şekilde düzenleyin.
İsteğe bağlı olarak, Zygisk ortamlarında daha güçlü root gizleme için LSPosed modülleri ve Shamiko ekleyin ve alt süreçleri kapsayacak şekilde DenyList'i düzenleyin.
Referanslar:
Kaynaklar:
- Objection: https://github.com/sensepost/objection
## Adım 8 — Yedek: Ağ görünürlüğü için TLS pinning'i yama
## Adım 8 — Fallback: Ağ görünürlüğü için TLS pinning'i yama
Eğer instrumentation engellenmişse, pinning'i statik olarak kaldırarak trafiği yine de inceleyebilirsiniz:
Eğer instrumentation engellenmişse, pinning'i statik olarak kaldırarak trafiği hâlâ inceleyebilirsiniz:
```bash
apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
```
- Araç: https://github.com/shroudedcode/apk-mitm
- Ağ yapılandırması CAtrust hileleri için (ve Android 7+ kullanıcı CA trust), bkz:
- Ağ yapılandırması CAtrust hileleri (ve Android 7+ user CA trust) için bakınız:
{{#ref}}
make-apk-accept-ca-certificate.md
@ -233,7 +233,7 @@ make-apk-accept-ca-certificate.md
install-burp-certificate.md
{{#endref}}
## Kullanışlı komut kısayolu
## Kullanışlı komut kısa başvuru
```bash
# List processes and attach
frida-ps -Uai
@ -251,14 +251,32 @@ objection --gadget com.example.app explore
# Static TLS pinning removal
apk-mitm app.apk
```
## İpuçları ve uyarılar
## Evrensel proxy zorlaması + TLS unpinning (HTTP Toolkit Frida hooks)
- Uygulamalar başlatılırken çöküyorsa spawn etmeye kıyasla attaching'i daha geç yapmayı tercih edin
- Bazı tespitler kritik akışlarda (ör. ödeme, auth) yeniden çalıştırılır — gezinti sırasında hooks'u aktif tutun
- Statik ve dinamiği karıştırın: sınıfları daraltmak için Jadx'te string hunt yapın; sonra runtime'da doğrulamak için method'ları hook'layın
- Korumalı uygulamalar packers ve native TLS pinning kullanabilir — native kodu tersine çevirmeyi bekleyin
Modern uygulamalar genellikle sistem proxy'lerini yok sayar ve birden fazla pinning katmanı uygulayarak (Java + native) kullanıcı/sistem CAs yüklü olsa bile trafiği yakalamayı zorlaştırır. Pratik bir yöntem, hazır Frida hooks kullanarak evrensel TLS unpinning ile proxy zorlamayı birleştirmek ve tüm trafiği mitmproxy/Burp üzerinden yönlendirmektir.
## References
İş akışı
- Hostunuzda mitmproxy'yi (veya Burp) çalıştırın. Cihazın host IP/port'una ulaşabildiğinden emin olun.
- HTTP Toolkits consolidated Frida hooks'u yükleyin; hem TLS unpinning yapmak hem de yaygın stack'lerde proxy kullanımını zorlamak için (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, vb.). Bu, CertificatePinner/TrustManager kontrollerini atlar ve proxy seçicilerini geçersiz kılar; böylece uygulama açıkça proxy'leri devre dışı bıraktığında bile trafik her zaman proxy'niz üzerinden gönderilir.
- Hedef uygulamayı Frida ve hook script ile başlatın ve mitmproxy'de istekleri yakalayın.
Örnek
```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
```
Notlar
- Mümkünse sistem genelinde bir proxy ile birleştirin: `adb shell settings put global http_proxy <host>:<port>`. Frida hooks, uygulamalar global ayarları atlatmış olsalar bile proxy kullanımını zorlayacaktır.
- Bu teknik, pinning/proxy atlatmanın yaygın olduğu mobil→IoT onboarding akışlarında MITM yapmanız gerektiğinde idealdir.
- Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning
## Referanslar
- [Reversing Android Apps: Bypassing Detection Like a Pro](https://www.kayssel.com/newsletter/issue-12/)
- [Frida Codeshare](https://codeshare.frida.re/)