Ret2csu
Μάθετε & εξασκηθείτε στο AWS Hacking: Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:
Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
https://www.scs.stanford.edu/brop/bittau-brop.pdfΒασικές Πληροφορίες
Το ret2csu είναι μια τεχνική χάκερ που χρησιμοποιείται όταν προσπαθείτε να πάρετε τον έλεγχο ενός προγράμματος αλλά δεν μπορείτε να βρείτε τα gadgets που συνήθως χρησιμοποιείτε για να χειριστείτε τη συμπεριφορά του προγράμματος.
Όταν ένα πρόγραμμα χρησιμοποιεί κάποιες βιβλιοθήκες (όπως η libc), έχει μερικές ενσωματωμένες λειτουργίες για τη διαχείριση του πώς διάφορα κομμάτια του προγράμματος επικοινωνούν μεταξύ τους. Ανάμεσα σε αυτές τις λειτουργίες υπάρχουν μερικά κρυμμένα κειμήλια που μπορούν να λειτουργήσουν ως τα λείποντα gadgets μας, ειδικά ένα που ονομάζεται __libc_csu_init
.
Τα Μαγικά Gadgets στο __libc_csu_init
Στο __libc_csu_init
, υπάρχουν δύο ακολουθίες εντολών (gadgets) που ξεχωρίζουν:
Η πρώτη ακολουθία μας επιτρέπει να ρυθμίσουμε τιμές σε διάφορους καταχωρητές (rbx, rbp, r12, r13, r14, r15). Αυτοί είναι σαν υποδοχές όπου μπορούμε να αποθηκεύσουμε αριθμούς ή διευθύνσεις που θέλουμε να χρησιμοποιήσουμε αργότερα.
Αυτό το εργαλείο μας επιτρέπει να ελέγχουμε αυτά τα registries παίρνοντας τιμές από τη στοίβα και τις τοποθετεί σε αυτά.
Η δεύτερη ακολουθία χρησιμοποιεί τις τιμές που έχουμε ορίσει για να κάνει μερικά πράγματα:
Μεταφορά συγκεκριμένων τιμών σε άλλα registries, κάνοντάς τα έτοιμα για να τα χρησιμοποιήσουμε ως παραμέτρους σε συναρτήσεις.
Εκτέλεση κλήσης σε μια τοποθεσία που καθορίζεται από την πρόσθεση των τιμών στο r15 και rbx, και στη συνέχεια πολλαπλασιασμό του rbx με 8.
Ίσως δεν ξέρεις καμία διεύθυνση για να γράψεις εκεί και χρειάζεσαι μια εντολή
ret
. Σημείωσε ότι το δεύτερο εργαλείο θα τελειώσει επίσης με έναret
, αλλά θα πρέπει να πληροίς κάποιες συνθήκες προκειμένου να το φτάσεις:
Οι συνθήκες θα είναι:
Το
[r12 + rbx*8]
πρέπει να δείχνει σε μια διεύθυνση που αποθηκεύει μια κλήσιμη συνάρτηση (αν δεν υπάρχει ιδέα και δεν υπάρχει Position Independent Executable, μπορείτε απλά να χρησιμοποιήσετε τη συνάρτηση_init
):Αν η συνάρτηση
_init
βρίσκεται στη διεύθυνση0x400560
, χρησιμοποιήστε το GEF για να αναζητήσετε ένα δείκτη στη μνήμη προς αυτήν και να κάνετε το[r12 + rbx*8]
να είναι η διεύθυνση με το δείκτη προς το_init
:
Τα
rbp
καιrbx
πρέπει να έχουν την ίδια τιμή για να αποφευχθεί το άλμαΥπάρχουν ορισμένα παραλειπόμενα pops που πρέπει να λάβετε υπόψη
RDI και RSI
Ένας άλλος τρόπος να ελέγξετε τα rdi
και rsi
από το gadget ret2csu είναι προσπελαώντας συγκεκριμένα offsets:
Ελέγξτε αυτή τη σελίδα για περισσότερες πληροφορίες:
BROP - Blind Return Oriented ProgrammingΠαράδειγμα
Χρησιμοποιώντας την κλήση
Φανταστείτε ότι θέλετε να κάνετε ένα syscall ή να καλέσετε μια συνάρτηση όπως η write()
αλλά χρειάζεστε συγκεκριμένες τιμές στα registries rdx
και rsi
ως παραμέτρους. Συνήθως, θα αναζητούσατε gadgets που ορίζουν αυτά τα registries απευθείας, αλλά δεν μπορείτε να βρείτε κανένα.
Εδώ είναι που μπαίνει σε παιχνίδι το ret2csu:
Ρύθμιση των Registries: Χρησιμοποιήστε το πρώτο μαγικό gadget για να εξάγετε τιμές από τη στοίβα και να τις μεταφέρετε στα rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) και r15.
Χρήση του Δεύτερου Gadget: Με αυτά τα registries ορισμένα, χρησιμοποιείτε το δεύτερο gadget. Αυτό σας επιτρέπει να μετακινήσετε τις επιλεγμένες τιμές σας στα
rdx
καιrsi
(από r14 και r13 αντίστοιχα), ετοιμάζοντας τις παραμέτρους για μια κλήση συνάρτησης. Επιπλέον, ελέγχοντας τοr15
και τοrbx
, μπορείτε να κάνετε το πρόγραμμα να καλέσει μια συνάρτηση που βρίσκεται στη διεύθυνση που υπολογίζετε και την τοποθετείτε στο[r15 + rbx*8]
.
Έχετε ένα παράδειγμα χρησιμοποιώντας αυτή την τεχνική και εξηγώντας την εδώ, και αυτή είναι η τελική εκμετάλλευση που χρησιμοποιήθηκε:
Σημειώστε ότι το προηγούμενο exploit δεν προορίζεται να κάνει RCE
, αλλά απλά να καλέσει μια συνάρτηση που ονομάζεται win
(παίρνοντας τη διεύθυνση του win
από την είσοδο καλώντας τη gets στη ROP αλυσίδα και αποθηκεύοντάς τη στο r15) με ένα τρίτο όρισμα με την τιμή 0xdeadbeefcafed00d
.
Παράκαμψη της κλήσης και φτάνοντας στο ret
Το παρακάτω exploit εξήχθη από αυτή τη σελίδα όπου χρησιμοποιείται το ret2csu αλλά αντί να χρησιμοποιεί την κλήση, παρακάμπτει τις συγκρίσεις και φτάνει στο ret
μετά την κλήση:
Γιατί Να Μην Χρησιμοποιήσετε Απευθείας την libc;
Συνήθως αυτές οι περιπτώσεις είναι επίσης ευάλωτες στο ret2plt + ret2lib, αλλά μερικές φορές χρειάζεται να ελέγξετε περισσότερες παραμέτρους από ό,τι είναι εύκολα ελέγξιμες με τα gadgets που βρίσκετε απευθείας στην libc. Για παράδειγμα, η συνάρτηση write()
απαιτεί τρεις παραμέτρους, και η εύρεση gadgets για να ορίσετε αυτές απευθείας ενδέχεται να μην είναι δυνατή.
Last updated