Ret2lib
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Basic Information
Η ουσία του Ret2Libc είναι να ανακατευθύνει τη ροή εκτέλεσης ενός ευάλωτου προγράμματος σε μια συνάρτηση εντός μιας κοινής βιβλιοθήκης (π.χ., system, execve, strcpy) αντί να εκτελεί τον κώδικα που παρέχεται από τον επιτιθέμενο στο στοίβα. Ο επιτιθέμενος δημιουργεί ένα payload που τροποποιεί τη διεύθυνση επιστροφής στη στοίβα ώστε να δείχνει στη συνάρτηση της βιβλιοθήκης που επιθυμεί, ενώ ταυτόχρονα φροντίζει ώστε οποιαδήποτε απαραίτητα επιχειρήματα να είναι σωστά ρυθμισμένα σύμφωνα με τη σύμβαση κλήσης.
Example Steps (simplified)
Πάρτε τη διεύθυνση της συνάρτησης που θα καλέσετε (π.χ. system) και την εντολή που θα καλέσετε (π.χ. /bin/sh)
Δημιουργήστε μια αλυσίδα ROP για να περάσετε το πρώτο επιχείρημα που δείχνει στη συμβολοσειρά εντολής και τη ροή εκτέλεσης στη συνάρτηση
Finding the addresses
Υποθέτοντας ότι η
libc
που χρησιμοποιείται είναι αυτή της τρέχουσας μηχανής, μπορείτε να βρείτε πού θα φορτωθεί στη μνήμη με:
Αν θέλετε να ελέγξετε αν το ASLR αλλάζει τη διεύθυνση της libc μπορείτε να κάνετε:
Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να βρείτε την απόσταση στη συνάρτηση
system
με:
Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να βρείτε την απόσταση προς τη συμβολοσειρά
/bin/sh
με:
Χρησιμοποιώντας gdb-peda / GEF
Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να χρησιμοποιήσετε το Peda ή το GEF για να αποκτήσετε τη διεύθυνση της συνάρτησης system, της συνάρτησης exit και της συμβολοσειράς /bin/sh
:
Χρήση /proc/<PID>/maps
Αν η διαδικασία δημιουργεί παιδιά κάθε φορά που μιλάτε μαζί της (διακομιστής δικτύου) προσπαθήστε να διαβάσετε αυτό το αρχείο (πιθανώς θα χρειαστεί να είστε root).
Εδώ μπορείτε να βρείτε ακριβώς πού είναι φορτωμένη η libc μέσα στη διαδικασία και πού θα φορτωθεί για κάθε παιδί της διαδικασίας.
Σε αυτή την περίπτωση είναι φορτωμένη στο 0xb75dc000 (Αυτή θα είναι η βασική διεύθυνση της libc)
Άγνωστη libc
Είναι πιθανό να μην γνωρίζετε ποια libc φορτώνει το δυαδικό αρχείο (γιατί μπορεί να βρίσκεται σε έναν διακομιστή όπου δεν έχετε πρόσβαση). Σε αυτή την περίπτωση μπορείτε να εκμεταλλευτείτε την ευπάθεια για να διαρρεύσετε κάποιες διευθύνσεις και να βρείτε ποια βιβλιοθήκη libc χρησιμοποιείται:
Leaking libc address with ROPΚαι μπορείτε να βρείτε ένα πρότυπο pwntools γι' αυτό στο:
Leaking libc - templateΓνωρίζοντας τη libc με 2 offsets
Ελέγξτε τη σελίδα https://libc.blukat.me/ και χρησιμοποιήστε μερικές διευθύνσεις συναρτήσεων μέσα στη libc για να ανακαλύψετε την έκδοση που χρησιμοποιείται.
Παράκαμψη ASLR σε 32 bit
Αυτές οι επιθέσεις brute-force είναι μόνο χρήσιμες για συστήματα 32bit.
Αν η εκμετάλλευση είναι τοπική, μπορείτε να προσπαθήσετε να κάνετε brute-force τη βασική διεύθυνση της libc (χρήσιμο για συστήματα 32bit):
Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να σπάσετε τη διεύθυνση της συνάρτησης
libc
usleep
, περνώντας ως επιχείρημα 10 (για παράδειγμα). Αν σε κάποιο σημείο ο διακομιστής χρειαστεί 10 δευτερόλεπτα επιπλέον για να απαντήσει, βρήκατε τη διεύθυνση αυτής της συνάρτησης.
One Gadget
Εκτελέστε ένα shell απλά πηδώντας σε μία συγκεκριμένη διεύθυνση στη libc:
One Gadgetx86 Ret2lib Code Example
Σε αυτό το παράδειγμα, η βίαιη σάρωση ASLR είναι ενσωματωμένη στον κώδικα και το ευάλωτο δυαδικό αρχείο βρίσκεται σε έναν απομακρυσμένο διακομιστή:
x64 Ret2lib Code Example
Δείτε το παράδειγμα από:
ROP - Return Oriented ProgramingARM64 Ret2lib Example
Στην περίπτωση του ARM64, η εντολή ret πηδάει εκεί που δείχνει το μητρώο x30 και όχι εκεί που δείχνει το μητρώο της στοίβας. Έτσι είναι λίγο πιο περίπλοκο.
Επίσης στο ARM64, μια εντολή κάνει αυτό που κάνει η εντολή (δεν είναι δυνατόν να πηδήξεις στη μέση των εντολών και να τις μετατρέψεις σε νέες).
Δείτε το παράδειγμα από:
Ret2lib + Printf leak - arm64Ret-into-printf (ή puts)
Αυτό επιτρέπει να διαρρεύσει πληροφορίες από τη διαδικασία καλώντας printf
/puts
με κάποια συγκεκριμένα δεδομένα τοποθετημένα ως επιχείρημα. Για παράδειγμα, τοποθετώντας τη διεύθυνση του puts
στο GOT σε μια εκτέλεση του puts
θα διαρρεύσει τη διεύθυνση του puts
στη μνήμη.
Ret2printf
Αυτό σημαίνει βασικά την κατάχρηση ενός Ret2lib για να το μετατρέψουμε σε μια ευπάθεια μορφών συμβολοσειρών printf
χρησιμοποιώντας το ret2lib
για να καλέσουμε το printf με τις τιμές για να το εκμεταλλευτούμε (ακούγεται άχρηστο αλλά είναι δυνατό):
Άλλα παραδείγματα & αναφορές
Ret2lib, δεδομένης μιας διαρροής στη διεύθυνση μιας συνάρτησης στη libc, χρησιμοποιώντας ένα gadget
64 bit, ενεργοποιημένο ASLR αλλά χωρίς PIE, το πρώτο βήμα είναι να γεμίσει μια υπερχείλιση μέχρι το byte 0x00 του καναρίου για να καλέσει στη συνέχεια το puts και να το διαρρεύσει. Με το κανάρι δημιουργείται ένα ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και ένα ROP gadget για να καλέσει
system('/bin/sh')
64 bits, ενεργοποιημένο ASLR, χωρίς κανάρι, υπερχείλιση στοίβας από μια παιδική συνάρτηση. ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και στη συνέχεια να καλέσει ένα gadget.
64 bits, χωρίς pie, χωρίς κανάρι, χωρίς relro, nx. Χρησιμοποιεί τη συνάρτηση write για να διαρρεύσει τη διεύθυνση του write (libc) και καλεί ένα gadget.
Χρησιμοποιεί μια μορφή συμβολοσειράς για να διαρρεύσει το κανάρι από τη στοίβα και μια υπερχείλιση buffer για να καλέσει το system (είναι στο GOT) με τη διεύθυνση του
/bin/sh
.32 bit, χωρίς relro, χωρίς κανάρι, nx, pie. Κατάχρηση κακής ευρετηρίασης για να διαρρεύσουν διευθύνσεις της libc και του heap από τη στοίβα. Κατάχρηση της υπερχείλισης buffer για να κάνουμε ένα ret2lib καλώντας
system('/bin/sh')
(η διεύθυνση του heap είναι απαραίτητη για να παρακαμφθεί μια έλεγχο).
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated