Ret2lib
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Η ουσία του Ret2Libc είναι να ανακατευθύνει τη ροή εκτέλεσης ενός ευάλωτου προγράμματος σε μια συνάρτηση εντός μιας κοινής βιβλιοθήκης (π.χ., system, execve, strcpy) αντί να εκτελεί τον κώδικα που παρέχεται από τον επιτιθέμενο στο στοίβα. Ο επιτιθέμενος δημιουργεί ένα payload που τροποποιεί τη διεύθυνση επιστροφής στη στοίβα ώστε να δείχνει στη συνάρτηση της βιβλιοθήκης που επιθυμεί, ενώ ταυτόχρονα φροντίζει ώστε οποιαδήποτε απαραίτητα επιχειρήματα να είναι σωστά ρυθμισμένα σύμφωνα με τη σύμβαση κλήσης.
Πάρτε τη διεύθυνση της συνάρτησης που θα καλέσετε (π.χ. system) και την εντολή που θα καλέσετε (π.χ. /bin/sh)
Δημιουργήστε μια αλυσίδα ROP για να περάσετε το πρώτο επιχείρημα που δείχνει στη συμβολοσειρά εντολής και τη ροή εκτέλεσης στη συνάρτηση
Υποθέτοντας ότι η libc
που χρησιμοποιείται είναι αυτή της τρέχουσας μηχανής, μπορείτε να βρείτε πού θα φορτωθεί στη μνήμη με:
Αν θέλετε να ελέγξετε αν το ASLR αλλάζει τη διεύθυνση της libc μπορείτε να κάνετε:
Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να βρείτε την απόσταση στη συνάρτηση system
με:
Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να βρείτε την απόσταση προς τη συμβολοσειρά /bin/sh
με:
Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να χρησιμοποιήσετε το Peda ή το GEF για να αποκτήσετε τη διεύθυνση της συνάρτησης system, της συνάρτησης exit και της συμβολοσειράς /bin/sh
:
Αν η διαδικασία δημιουργεί παιδιά κάθε φορά που μιλάτε μαζί της (διακομιστής δικτύου) προσπαθήστε να διαβάσετε αυτό το αρχείο (πιθανώς θα χρειαστεί να είστε root).
Εδώ μπορείτε να βρείτε ακριβώς πού είναι φορτωμένη η libc μέσα στη διαδικασία και πού θα φορτωθεί για κάθε παιδί της διαδικασίας.
Σε αυτή την περίπτωση είναι φορτωμένη στο 0xb75dc000 (Αυτή θα είναι η βασική διεύθυνση της libc)
Είναι πιθανό να μην γνωρίζετε ποια libc φορτώνει το δυαδικό αρχείο (γιατί μπορεί να βρίσκεται σε έναν διακομιστή όπου δεν έχετε πρόσβαση). Σε αυτή την περίπτωση μπορείτε να εκμεταλλευτείτε την ευπάθεια για να διαρρεύσετε κάποιες διευθύνσεις και να βρείτε ποια βιβλιοθήκη libc χρησιμοποιείται:
Leaking libc address with ROPΚαι μπορείτε να βρείτε ένα πρότυπο pwntools γι' αυτό στο:
Leaking libc - templateΕλέγξτε τη σελίδα https://libc.blukat.me/ και χρησιμοποιήστε μερικές διευθύνσεις συναρτήσεων μέσα στη libc για να ανακαλύψετε την έκδοση που χρησιμοποιείται.
Αυτές οι επιθέσεις brute-force είναι μόνο χρήσιμες για συστήματα 32bit.
Αν η εκμετάλλευση είναι τοπική, μπορείτε να προσπαθήσετε να κάνετε brute-force τη βασική διεύθυνση της libc (χρήσιμο για συστήματα 32bit):
Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να σπάσετε τη διεύθυνση της συνάρτησης libc
usleep
, περνώντας ως επιχείρημα 10 (για παράδειγμα). Αν σε κάποιο σημείο ο διακομιστής χρειαστεί 10 δευτερόλεπτα επιπλέον για να απαντήσει, βρήκατε τη διεύθυνση αυτής της συνάρτησης.
Εκτελέστε ένα shell απλά πηδώντας σε μία συγκεκριμένη διεύθυνση στη libc:
One GadgetΣε αυτό το παράδειγμα, η βίαιη σάρωση ASLR είναι ενσωματωμένη στον κώδικα και το ευάλωτο δυαδικό αρχείο βρίσκεται σε έναν απομακρυσμένο διακομιστή:
Δείτε το παράδειγμα από:
ROP - Return Oriented ProgramingΣτην περίπτωση του ARM64, η εντολή ret πηδάει εκεί που δείχνει το μητρώο x30 και όχι εκεί που δείχνει το μητρώο της στοίβας. Έτσι είναι λίγο πιο περίπλοκο.
Επίσης στο ARM64, μια εντολή κάνει αυτό που κάνει η εντολή (δεν είναι δυνατόν να πηδήξεις στη μέση των εντολών και να τις μετατρέψεις σε νέες).
Δείτε το παράδειγμα από:
Ret2lib + Printf leak - arm64Αυτό επιτρέπει να διαρρεύσει πληροφορίες από τη διαδικασία καλώντας printf
/puts
με κάποια συγκεκριμένα δεδομένα τοποθετημένα ως επιχείρημα. Για παράδειγμα, τοποθετώντας τη διεύθυνση του puts
στο GOT σε μια εκτέλεση του puts
θα διαρρεύσει τη διεύθυνση του puts
στη μνήμη.
Αυτό σημαίνει βασικά την κατάχρηση ενός 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)