mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/mobile-pentesting/android-app-pentesting/android-an
This commit is contained in:
parent
9bf413aefb
commit
b55fdb2f8c
@ -2,30 +2,30 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Bu sayfa, enstrümantasyonu tespit eden veya root‑ile 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 kopyala‑yapıştır kullanılabilir hook/taktiklere odaklanır.
|
||||
Bu sayfa, instrumentation tespit eden/root‑block 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 kopyala‑yapış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 anti‑debug: ptrace(), syscall'lar, anti‑attach, 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 anti‑debug: ptrace(), syscalls, anti‑attach, 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 — 30‑second Frida Codeshare tests
|
||||
|
||||
Derinlemesine incelemeye geçmeden önce yaygın drop‑in 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'ı cherry‑pick 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. Spawn‑time 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. Spawn‑time 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 anti‑debug'i atlatmak için ptrace'i etkisizleştirme:
|
||||
Örnek: ptrace'i etkisizleştirerek libc'deki basit anti‑debug'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ü init‑time 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ü init‑time 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ı CA‑trust hileleri için (ve Android 7+ kullanıcı CA trust), bkz:
|
||||
- Ağ yapılandırması CA‑trust 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 Toolkit’s 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/)
|
||||
|
Loading…
x
Reference in New Issue
Block a user