BF Forked & Threaded Stack Canaries
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Αν αντιμετωπίζετε ένα δυαδικό που προστατεύεται από ένα canary και το PIE (Position Independent Executable) πιθανότατα χρειάζεστε έναν τρόπο για να τα παρακάμψετε.
Σημειώστε ότι το checksec
ενδέχεται να μην εντοπίσει ότι ένα δυαδικό προστατεύεται από ένα canary εάν αυτό ήταν στατικά μεταγλωττισμένο και δεν είναι ικανό να αναγνωρίσει τη λειτουργία.
Ωστόσο, μπορείτε να παρατηρήσετε χειροκίνητα αυτό εάν διαπιστώσετε ότι μια τιμή αποθηκεύεται στη στοίβα στην αρχή μιας κλήσης συνάρτησης και αυτή η τιμή ελέγχεται πριν από την έξοδο.
Ο καλύτερος τρόπος για να παρακάμψετε ένα απλό canary είναι εάν το δυαδικό είναι ένα πρόγραμμα που δημιουργεί παιδικές διεργασίες κάθε φορά που καθιερώνετε μια νέα σύνδεση μαζί του (υπηρεσία δικτύου), επειδή κάθε φορά που συνδέεστε σε αυτό θα χρησιμοποιηθεί το ίδιο canary.
Στη συνέχεια, ο καλύτερος τρόπος για να παρακάμψετε το canary είναι απλώς να το επιτεθείτε βίαια χαρακτήρα προς χαρακτήρα, και μπορείτε να καταλάβετε εάν το μάντεψε canary byte ήταν σωστό ελέγχοντας εάν το πρόγραμμα έχει καταρρεύσει ή συνεχίζει την κανονική του ροή. Σε αυτό το παράδειγμα η συνάρτηση επιτίθεται βίαια σε ένα canary 8 Bytes (x64) και διακρίνει μεταξύ ενός σωστού μαντεμένου byte και ενός κακού byte απλώς ελέγχοντας αν ένα αποτέλεσμα επιστρέφεται από τον εξυπηρετητή (μια άλλη μέθοδος σε άλλη κατάσταση θα μπορούσε να είναι η χρήση ενός try/except):
Αυτό το παράδειγμα υλοποιείται για 64bit αλλά θα μπορούσε εύκολα να υλοποιηθεί για 32 bit.
Αυτό υλοποιείται για 32 bits, αλλά μπορεί εύκολα να αλλάξει σε 64 bits. Επίσης, σημειώστε ότι για αυτό το παράδειγμα το πρόγραμμα περιμένει πρώτα ένα byte για να υποδείξει το μέγεθος της εισόδου και του φορτίου.
Τα νήματα του ίδιου διεργασίας θα μοιράζονται το ίδιο διακριτικό canary, επομένως θα είναι δυνατό να δοκιμαστεί βίαια ένα canary αν το δυαδικό αρχείο δημιουργεί ένα νέο νήμα κάθε φορά που συμβαίνει μια επίθεση.
Επιπλέον, μια υπερχείλιση buffer σε μια συνάρτηση με νήματα που προστατεύεται με canary θα μπορούσε να χρησιμοποιηθεί για να τροποποιήσει τον κύριο canary που αποθηκεύεται στο TLS. Αυτό συμβαίνει επειδή είναι πιθανό να φτάσει στη θέση μνήμης όπου αποθηκεύεται το TLS (και, συνεπώς, το canary) μέσω μιας υπερχείλισης buffer στη στοίβα ενός νήματος. Ως αποτέλεσμα, η αντιμετώπιση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο canaries που είναι τα ίδια (αν και τροποποιημένα). Αυτή η επίθεση πραγματοποιείται στο writeup: 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
σύμφωνα με αυτό, το οποίο μπορεί να επιτρέψει την υπερχείλιση όπως φαίνεται στο προηγούμενο writeup.
64 bits, no PIE, nx, BF canary, εγγραφή σε κάποια μνήμη ενός ROP για να καλέσει το execve
και να μεταβεί εκεί.