BF Forked & Threaded Stack Canaries
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)
Αν αντιμετωπίζετε ένα δυαδικό αρχείο που προστατεύεται από ένα canary και PIE (Position Independent Executable) πιθανότατα χρειάζεται να βρείτε έναν τρόπο να τα παρακάμψετε.
Σημειώστε ότι checksec
μπορεί να μην εντοπίσει ότι ένα δυαδικό αρχείο προστατεύεται από ένα canary αν αυτό έχει στατικά μεταγλωττιστεί και δεν είναι ικανό να εντοπίσει τη λειτουργία.
Ωστόσο, μπορείτε να το παρατηρήσετε χειροκίνητα αν βρείτε ότι μια τιμή αποθηκεύεται στη στοίβα στην αρχή μιας κλήσης λειτουργίας και αυτή η τιμή ελέγχεται πριν την έξοδο.
Ο καλύτερος τρόπος για να παρακάμψετε ένα απλό canary είναι αν το δυαδικό αρχείο είναι ένα πρόγραμμα που δημιουργεί παιδικές διεργασίες κάθε φορά που καθορίζετε μια νέα σύνδεση με αυτό (υπηρεσία δικτύου), επειδή κάθε φορά που συνδέεστε σε αυτό το ίδιο canary θα χρησιμοποιείται.
Έτσι, ο καλύτερος τρόπος για να παρακάμψετε το canary είναι απλά να το παρακάμψετε με brute-force χαρακτήρα προς χαρακτήρα, και μπορείτε να καταλάβετε αν το μαντεμένο byte του canary ήταν σωστό ελέγχοντας αν το πρόγραμμα έχει καταρρεύσει ή συνεχίζει τη κανονική του ροή. Σε αυτό το παράδειγμα η λειτουργία παρακάμπτει ένα canary 8 Bytes (x64) και διακρίνει μεταξύ ενός σωστά μαντεμένου byte και ενός κακού byte απλά ελέγχοντας αν μια απάντηση επιστρέφεται από τον διακομιστή (ένας άλλος τρόπος σε άλλη περίπτωση θα μπορούσε να είναι η χρήση ενός try/except):
Αυτό το παράδειγμα έχει υλοποιηθεί για 64 bits αλλά θα μπορούσε να υλοποιηθεί εύκολα και για 32 bits.
Αυτό έχει υλοποιηθεί για 32 bits, αλλά αυτό θα μπορούσε να αλλάξει εύκολα σε 64 bits. Επίσης σημειώστε ότι για αυτό το παράδειγμα το πρόγραμμα αναμένει πρώτα ένα byte για να υποδείξει το μέγεθος της εισόδου και το payload.
Τα νήματα της ίδιας διαδικασίας θα μοιράζονται το ίδιο καναρί και επομένως θα είναι δυνατό να brute-force ένα καναρί αν το δυαδικό δημιουργεί ένα νέο νήμα κάθε φορά που συμβαίνει μια επίθεση.
Επιπλέον, μια υπερχείλιση buffer σε μια θρεμμένη συνάρτηση που προστατεύεται με καναρί θα μπορούσε να χρησιμοποιηθεί για να τροποποιήσει το κύριο καναρί που αποθηκεύεται στο TLS. Αυτό συμβαίνει επειδή, μπορεί να είναι δυνατό να φτάσουμε στη θέση μνήμης όπου αποθηκεύεται το TLS (και επομένως, το καναρί) μέσω μιας bof στο στοίβα ενός νήματος. Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο καναρί που είναι τα ίδια (αν και τροποποιημένα). Αυτή η επίθεση εκτελείται στην αναφορά: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Ελέγξτε επίσης την παρουσίαση του https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 που αναφέρει ότι συνήθως το TLS αποθηκεύεται με mmap
και όταν δημιουργείται μια στοίβα ενός νήματος δημιουργείται επίσης με mmap
σύμφωνα με αυτό, το οποίο μπορεί να επιτρέπει την υπερχείλιση όπως φαίνεται στην προηγούμενη αναφορά.
64 bits, no PIE, nx, BF canary, write in some memory a ROP to call execve
and jump there.