Ret2csu
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)
ret2csu είναι μια τεχνική hacking που χρησιμοποιείται όταν προσπαθείτε να ελέγξετε ένα πρόγραμμα αλλά δεν μπορείτε να βρείτε τα gadgets που συνήθως χρησιμοποιείτε για να χειριστείτε τη συμπεριφορά του προγράμματος.
Όταν ένα πρόγραμμα χρησιμοποιεί ορισμένες βιβλιοθήκες (όπως η libc), έχει κάποιες ενσωματωμένες λειτουργίες για τη διαχείριση του πώς διαφορετικά κομμάτια του προγράμματος επικοινωνούν μεταξύ τους. Μεταξύ αυτών των λειτουργιών υπάρχουν μερικοί κρυμμένοι θησαυροί που μπορούν να λειτουργήσουν ως τα χαμένα μας gadgets, ειδικά ένα που ονομάζεται __libc_csu_init
.
Στο __libc_csu_init
, υπάρχουν δύο ακολουθίες εντολών (gadgets) που πρέπει να επισημανθούν:
Η πρώτη ακολουθία μας επιτρέπει να ρυθμίσουμε τιμές σε αρκετούς καταχωρητές (rbx, rbp, r12, r13, r14, r15). Αυτοί είναι σαν θέσεις όπου μπορούμε να αποθηκεύσουμε αριθμούς ή διευθύνσεις που θέλουμε να χρησιμοποιήσουμε αργότερα.
Αυτή η συσκευή μας επιτρέπει να ελέγχουμε αυτούς τους καταχωρητές αφαιρώντας τιμές από τη στοίβα σε αυτούς.
Η δεύτερη ακολουθία χρησιμοποιεί τις τιμές που έχουμε ρυθμίσει για να κάνουμε μερικά πράγματα:
Μετακίνηση συγκεκριμένων τιμών σε άλλους καταχωρητές, προετοιμάζοντάς τους για να τους χρησιμοποιήσουμε ως παραμέτρους σε συναρτήσεις.
Εκτέλεση κλήσης σε μια τοποθεσία που καθορίζεται προσθέτοντας τις τιμές σε r15 και rbx, και στη συνέχεια πολλαπλασιάζοντας το rbx με 8.
Ίσως να μην γνωρίζετε καμία διεύθυνση για να γράψετε εκεί και χρειάζεστε μια εντολή ret
. Σημειώστε ότι το δεύτερο gadget θα τελειώνει επίσης σε ret
, αλλά θα χρειαστεί να πληροίτε κάποιες προϋποθέσεις για να το φτάσετε:
Οι συνθήκες θα είναι:
[r12 + rbx*8]
πρέπει να δείχνει σε μια διεύθυνση που αποθηκεύει μια κλήσιμη συνάρτηση (αν δεν έχετε ιδέα και δεν υπάρχει pie, μπορείτε απλά να χρησιμοποιήσετε τη συνάρτηση _init
):
Αν το _init είναι στη διεύθυνση 0x400560
, χρησιμοποιήστε το GEF για να αναζητήσετε έναν δείκτη στη μνήμη προς αυτό και κάντε το [r12 + rbx*8]
να είναι η διεύθυνση με τον δείκτη προς το _init:
rbp
και rbx
πρέπει να έχουν την ίδια τιμή για να αποφευχθεί η εκτροπή
Υπάρχουν μερικά παραλειπόμενα pops που πρέπει να λάβετε υπόψη
Ένας άλλος τρόπος για να ελέγξετε rdi
και rsi
από το gadget ret2csu είναι με την πρόσβαση σε συγκεκριμένες μετατοπίσεις:
Ελέγξτε αυτή τη σελίδα για περισσότερες πληροφορίες:
Φανταστείτε ότι θέλετε να κάνετε μια syscall ή να καλέσετε μια συνάρτηση όπως το write()
, αλλά χρειάζεστε συγκεκριμένες τιμές στους καταχωρητές rdx
και rsi
ως παραμέτρους. Κανονικά, θα ψάχνατε για gadgets που ρυθμίζουν αυτούς τους καταχωρητές άμεσα, αλλά δεν μπορείτε να βρείτε κανένα.
Εδώ είναι που μπαίνει σε παιχνίδι το ret2csu:
Ρύθμιση των Καταχωρητών: Χρησιμοποιήστε το πρώτο μαγικό gadget για να βγάλετε τιμές από τη στοίβα και να τις τοποθετήσετε στους rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) και r15.
Χρησιμοποιήστε το Δεύτερο Gadget: Με αυτούς τους καταχωρητές ρυθμισμένους, χρησιμοποιείτε το δεύτερο gadget. Αυτό σας επιτρέπει να μεταφέρετε τις επιλεγμένες τιμές σας στους rdx
και rsi
(από r14 και r13, αντίστοιχα), προετοιμάζοντας παραμέτρους για μια κλήση συνάρτησης. Επιπλέον, ελέγχοντας r15
και rbx
, μπορείτε να κάνετε το πρόγραμμα να καλέσει μια συνάρτηση που βρίσκεται στη διεύθυνση που υπολογίζετε και τοποθετείτε σε [r15 + rbx*8]
.
Έχετε ένα παράδειγμα που χρησιμοποιεί αυτή την τεχνική και το εξηγεί εδώ, και αυτή είναι η τελική εκμετάλλευση που χρησιμοποιήθηκε:
Σημειώστε ότι η προηγούμενη εκμετάλλευση δεν προορίζεται να κάνει RCE
, προορίζεται απλώς να καλέσει μια συνάρτηση που ονομάζεται win
(λαμβάνοντας τη διεύθυνση του win
από το stdin καλώντας gets στην αλυσίδα ROP και αποθηκεύοντάς την στο r15) με ένα τρίτο επιχείρημα με την τιμή 0xdeadbeefcafed00d
.
Η παρακάτω εκμετάλλευση εξήχθη από αυτή τη σελίδα όπου χρησιμοποιείται το ret2csu αλλά αντί να χρησιμοποιεί την κλήση, παρακάμπτει τις συγκρίσεις και προσεγγίζει το ret
μετά την κλήση:
Συνήθως αυτές οι περιπτώσεις είναι επίσης ευάλωτες σε ret2plt + ret2lib, αλλά μερικές φορές χρειάζεται να ελέγξετε περισσότερες παραμέτρους από όσες είναι εύκολα ελεγχόμενες με τα gadgets που βρίσκετε απευθείας στη libc. Για παράδειγμα, η συνάρτηση write()
απαιτεί τρεις παραμέτρους, και η εύρεση gadgets για να ρυθμίσετε όλες αυτές απευθείας μπορεί να μην είναι δυνατή.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)