Padding Oracle

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

CBC - Cipher Block Chaining

Στη λειτουργία CBC, το προηγούμενο κρυπτογραφημένο μπλοκ χρησιμοποιείται ως IV για το XOR με το επόμενο μπλοκ:

Για να αποκρυπτογραφηθεί το CBC γίνονται οι αντίθετες λειτουργίες:

Παρατηρήστε ότι απαιτείται η χρήση ενός κλειδιού κρυπτογράφησης και ενός IV.

Προσθήκη Μηνύματος

Καθώς η κρυπτογράφηση γίνεται σε σταθερά μπλοκ μεγέθους, συνήθως απαιτείται προσθήκη μηνύματος στο τελευταίο μπλοκ για να ολοκληρωθεί το μήκος του. Συνήθως χρησιμοποιείται το PKCS7, το οποίο δημιουργεί μια προσθήκη που επαναλαμβάνει τον αριθμό των bytes που απαιτούνται για να ολοκληρωθεί το μπλοκ. Για παράδειγμα, αν το τελευταίο μπλοκ λείπουν 3 bytes, η προσθήκη θα είναι \x03\x03\x03.

Ας δούμε περισσότερα παραδείγματα με 2 μπλοκ μήκους 8bytes:

Παρατηρήστε πώς στο τελευταίο παράδειγμα το τελευταίο μπλοκ ήταν γεμάτο, οπότε δημιουργήθηκε ένα ακόμα μόνο με προσθήκη.

Padding Oracle

Όταν μια εφαρμογή αποκρυπτογραφεί κρυπτογραφημένα δεδομένα, πρώτα θα αποκρυπτογραφήσει τα δεδομένα και στη συνέχεια θα αφαιρέσει την προσθήκη. Κατά τη διάρκεια της αφαίρεσης της προσθήκης, εάν μια μη έγκυρη προσθήκη προκαλέσει μια ανιχνεύσιμη συμπεριφορά, τότε έχετε μια ευπάθεια padding oracle. Η ανιχνεύσιμη συμπεριφορά μπορεί να είναι ένα σφάλμα, έλλειψη αποτελεσμάτων ή αργότερη απόκριση.

Εάν ανιχνεύσετε αυτήν τη συμπεριφορά, μπορείτε να αποκρυπτογραφήσετε τα κρυπτογραφημένα δεδομένα και ακόμα και να κρυπτογραφήσετε οποιοδήποτε καθαρό κείμενο.

Πώς να εκμεταλλευτείτε

Μπορείτε να χρησιμοποιήσετε το https://github.com/AonCyberLabs/PadBuster για να εκμεταλλευτείτε αυτού του είδους την ευπάθεια ή απλά να κάνετε

sudo apt-get install padbuster

Για να ελέγξετε αν το cookie ενός ιστότοπου είναι ευάλωτο, μπορείτε να δοκιμάσετε:

perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="

Η κωδικοποίηση 0 σημαίνει ότι χρησιμοποιείται base64 (αλλά υπάρχουν και άλλες διαθέσιμες, ελέγξτε το μενού βοήθειας).

Μπορείτε επίσης να καταχραστείτε αυτήν την ευπάθεια για να κρυπτογραφήσετε νέα δεδομένα. Για παράδειγμα, φανταστείτε ότι το περιεχόμενο του cookie είναι "_user=MyUsername_" και μπορείτε να το αλλάξετε σε "_user=administrator_" και να αναβαθμίσετε τα δικαιώματα μέσα στην εφαρμογή. Μπορείτε επίσης να το κάνετε χρησιμοποιώντας το padbuster και καθορίζοντας την παράμετρο -plaintext:

perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"

Εάν ο ιστότοπος είναι ευάλωτος, το padbuster θα προσπαθήσει αυτόματα να βρει πότε συμβαίνει το σφάλμα στο padding, αλλά μπορείτε επίσης να το υποδείξετε χρησιμοποιώντας την παράμετρο -error και το μήνυμα σφάλματος.

perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"

Η θεωρία

Συνοψίζοντας, μπορείτε να ξεκινήσετε την αποκρυπτογράφηση των κρυπτογραφημένων δεδομένων μαντεύοντας τις σωστές τιμές που μπορούν να χρησιμοποιηθούν για να δημιουργηθούν όλα τα διάφορα paddings. Στη συνέχεια, η επίθεση με padding oracle θα αρχίσει να αποκρυπτογραφεί τα bytes από το τέλος προς την αρχή, μαντεύοντας ποια θα είναι η σωστή τιμή που δημιουργεί ένα padding του 1, 2, 3, κλπ.

Φανταστείτε ότι έχετε κάποιο κρυπτογραφημένο κείμενο που καταλαμβάνει 2 blocks που αποτελούνται από τα bytes από το E0 έως το E15. Για να αποκρυπτογραφήσετε το τελευταίο block (E8 έως E15), ολόκληρο το block περνά από την "αποκρυπτογράφηση του block cipher" δημιουργώντας τα ενδιάμεσα bytes I0 έως I15. Τέλος, κάθε ενδιάμεσο byte γίνεται XOR με τα προηγούμενα κρυπτογραφημένα bytes (E0 έως E7). Έτσι:

  • C15 = D(E15) ^ E7 = I15 ^ E7

  • C14 = I14 ^ E6

  • C13 = I13 ^ E5

  • C12 = I12 ^ E4

  • ...

Τώρα, είναι δυνατόν να τροποποιήσετε το E7 μέχρι το C15 να είναι 0x01, που θα είναι επίσης ένα σωστό padding. Έτσι, σε αυτήν την περίπτωση: \x01 = I15 ^ E'7

Έτσι, βρίσκοντας το E'7, είναι δυνατόν να υπολογιστεί το I15: I15 = 0x01 ^ E'7

Αυτό μας επιτρέπει να υπολογίσουμε το C15: C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7

Γνωρίζοντας το C15, τώρα είναι δυνατόν να υπολογίσουμε το C14, αλλά αυτή τη φορά με brute-forcing το padding \x02\x02.

Αυτό το BF είναι εξίσου πολύπλοκο με το προηγούμενο, καθώς είναι δυνατόν να υπολογιστεί το E''15 του οποίου η τιμή είναι 0x02: E''7 = \x02 ^ I15, οπότε απλά χρειάζεται να βρεθεί το E'14 που δημιουργεί ένα C14 ίσο με 0x02. Στη συνέχεια, εκτελούνται τα ίδια βήματα για να αποκρυπτογραφηθεί το C14: C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6

Ακολουθήστε αυτήν την αλυσίδα μέχρι να αποκρυπτογραφήσετε ολόκληρο το κρυπτογραφημένο κείμενο.

Ανίχνευση της ευπάθειας

Καταχωρήστε έναν λογαριασμό και συνδεθείτε με αυτόν τον λογαριασμό. Εάν συνδεθείτε πολλές φορές και πάντα λαμβάνετε τον ίδιο cookie, πιθανώς υπάρχει κάτι λάθος στην εφαρμογή. Το cookie που επιστρέφεται θα πρέπει να είναι μοναδικό κάθε φορά που συνδέεστε. Εάν το cookie είναι πάντα το ίδιο, πιθανώς θα είναι πάντα έγκυρο και δεν θα υπάρχει τρόπος να το ακυρώσετε.

Τώρα, εάν προσπαθήσετε να τροποποιήσετε το cookie, μπορείτε να δείτε ότι λαμβάνετε ένα σφάλμα από την εφαρμογή. Αλλά εάν κάνετε brute-force το padding (χρησιμοποιώντας για παράδειγμα το padbuster), καταφέρνετε να λάβετε ένα άλλο έγκυρο cookie για έναν διαφορετικό χρήστη. Αυτό το σενάριο είναι πιθανόν να είναι ευπάθεια στο padbuster.

Αναφορές

Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated