Exploiting __VIEWSTATE without knowing the secrets
Συμβουλή για bug bounty: Εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα bug bounty δημιουργημένη από χάκερς, για χάκερς! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα, και αρχίστε να κερδίζετε αμοιβές έως και $100,000!
Τι είναι το ViewState
Το ViewState λειτουργεί ως μηχανισμός προεπιλογής στο ASP.NET για τη διατήρηση δεδομένων σελίδας και ελέγχου σε όλες τις ιστοσελίδες. Κατά τη διάρκεια της απεικόνισης του HTML μιας σελίδας, η τρέχουσα κατάσταση της σελίδας και οι τιμές που πρέπει να διατηρηθούν κατά την επιστροφή είναι σειριοποιημένες σε συμβολοσειρές κωδικοποιημένες σε base64. Αυτές οι συμβολοσειρές τοποθετούνται στα κρυφά πεδία ViewState.
Οι πληροφορίες ViewState μπορούν να χαρακτηριστούν από τις ακόλουθες ιδιότητες ή τις συνδυασμένες τους:
Base64:
Αυτή η μορφή χρησιμοποιείται όταν τόσο οι χαρακτηριστικές
EnableViewStateMac
καιViewStateEncryptionMode
είναι ρυθμισμένες σε false.Base64 + MAC (Message Authentication Code) Ενεργοποιημένο:
Η ενεργοποίηση του MAC επιτυγχάνεται με τη ρύθμιση της χαρακτηριστικής
EnableViewStateMac
σε true. Αυτό παρέχει επαλήθευση ακεραιότητας για τα δεδομένα ViewState.Base64 + Κρυπτογραφημένο:
Η κρυπτογράφηση εφαρμόζεται όταν η χαρακτηριστική
ViewStateEncryptionMode
είναι ρυθμισμένη σε true, εξασφαλίζοντας την εμπιστευτικότητα των δεδομένων ViewState.
Δοκιμές Ελέγχου
Η εικόνα είναι ένας πίνακας που περιγράφει διαφορετικές ρυθμίσεις για το ViewState στο ASP.NET βασισμένο στην έκδοση του πλαισίου .NET. Εδώ υπάρχει μια περίληψη του περιεχομένου:
Για οποιαδήποτε έκδοση του .NET, όταν και οι δύο MAC και Κρυπτογράφηση είναι απενεργοποιημένες, δεν απαιτείται MachineKey, και συνεπώς δεν υπάρχει καμία εφαρμόσιμη μέθοδος για την αναγνώρισή της.
Για έκδοση κάτω του 4.5, αν ο MAC είναι ενεργοποιημένος αλλά η Κρυπτογράφηση όχι, απαιτείται ένα MachineKey. Η μέθοδος για την αναγνώριση του MachineKey αναφέρεται ως "Blacklist3r."
Για έκδοση κάτω του 4.5, ανεξάρτητα από το αν ο MAC είναι ενεργοποιημένος ή απενεργοποιημένος, αν η Κρυπτογράφηση είναι ενεργοποιημένη, απαιτείται ένα MachineKey. Η αναγνώριση του MachineKey είναι εργασία για το "Blacklist3r - Μελλοντική Ανάπτυξη."
Για έκδοση 4.5 και πάνω, όλοι οι συνδυασμοί MAC και Κρυπτογράφησης (είτε και τα δύο είναι true, είτε ένα είναι true και το άλλο false) απαιτούν ένα MachineKey. Το MachineKey μπορεί να αναγνωριστεί χρησιμοποιώντας το "Blacklist3r."
Δοκιμή Περίπτωσης: 1 – EnableViewStateMac=false και viewStateEncryptionMode=false
Είναι επίσης δυνατό να απενεργοποιηθεί πλήρως το ViewStateMAC καθορίζοντας το κλειδί καταχώρισης AspNetEnforceViewStateMac
σε μηδέν στο:
Αναγνώριση Χαρακτηριστικών του ViewState
Μπορείτε να προσπαθήσετε να αναγνωρίσετε εάν το ViewState προστατεύεται από MAC, αιχμαλωτίζοντας ένα αίτημα που περιέχει αυτήν την παράμετρο με το BurpSuite. Εάν το Mac δεν χρησιμοποιείται για την προστασία της παραμέτρου, μπορείτε να την εκμεταλλευτείτε χρησιμοποιώντας το YSoSerial.Net
Περίπτωση δοκιμής 1.5 - Όπως η περίπτωση δοκιμής 1 αλλά το cookie ViewState δεν αποστέλλεται από τον διακομιστή
Οι προγραμματιστές μπορούν να αφαιρέσουν το ViewState από το HTTP Request (ο χρήστης δεν θα λάβει αυτό το cookie). Μπορεί κάποιος να υποθέσει ότι αν το ViewState δεν υπάρχει, η υλοποίησή τους είναι ασφαλής από οποιεσδήποτε πιθανές ευπάθειες που προκύπτουν με την αποσειριοποίηση του ViewState. Ωστόσο, αυτό δεν ισχύει. Αν προσθέσουμε την παράμετρο ViewState στο σώμα του αιτήματος και στείλουμε τον σειριοποιημένο φορτίο που δημιουργήθηκε χρησιμοποιώντας το ysoserial, θα είμαστε ακόμα σε θέση να επιτύχουμε εκτέλεση κώδικα όπως φαίνεται στην Περίπτωση 1.
Περίπτωση Δοκιμής: 2 - .Net < 4.5 και EnableViewStateMac=true & ViewStateEncryptionMode=false
Για να ενεργοποιήσουμε το ViewState MAC για μια συγκεκριμένη σελίδα πρέπει να κάνουμε τις ακόλουθες αλλαγές σε ένα συγκεκριμένο αρχείο aspx:
Μπορούμε επίσης να το κάνουμε για τη συνολική εφαρμογή ρυθμίζοντάς το στο αρχείο web.config όπως φαίνεται παρακάτω:
Δεδομένου ότι ο παράμετρος προστατεύεται από MAC αυτή τη φορά, για να εκτελέσουμε με επιτυχία την επίθεση πρέπει πρώτα να βρούμε το χρησιμοποιούμενο κλειδί.
Μπορείτε να δοκιμάσετε να χρησιμοποιήσετε το Blacklist3r(AspDotNetWrapper.exe) για να βρείτε το χρησιμοποιούμενο κλειδί.
Badsecrets είναι ένα άλλο εργαλείο που μπορεί να αναγνωρίσει γνωστά machineKeys. Γράφτηκε σε Python, οπότε αντίθετα με το Blacklist3r, δεν υπάρχει εξάρτηση από τα Windows. Για τα viewstates του .NET, υπάρχει ένα χρήσιμο "εργαλείο python blacklist3r", το οποίο είναι ο γρηγορότερος τρόπος να το χρησιμοποιήσετε.
Μπορεί να παρασχεθεί είτε με το viewstate και τον γεννήτορα απευθείας:
Ή, μπορεί να συνδεθεί απευθείας στον στόχο URL και να προσπαθήσει να ανακόψει το viewstate από το HTML:
Για να αναζητήσετε ευάλωτα viewstates σε μεγάλη κλίμακα, σε συνδυασμό με την απαρίθμηση υποτομέων, μπορεί να χρησιμοποιηθεί το badsecrets
BBOT module:
Αν είστε τυχεροί και βρείτε το κλειδί, μπορείτε να προχωρήσετε στην επίθεση χρησιμοποιώντας το YSoSerial.Net:
Σε περιπτώσεις όπου ο παράμετρος _VIEWSTATEGENERATOR
δεν αποστέλλεται από τον διακομιστή δεν χρειάζεται να παρέχετε την παράμετρο --generator
αλλά αυτές:
Περίπτωση Δοκιμής: 3 - .Net < 4.5 και EnableViewStateMac=true/false και ViewStateEncryptionMode=true
Σε αυτήν την περίπτωση δεν είναι γνωστό αν η παράμετρος προστατεύεται με MAC. Στη συνέχεια, η τιμή πιθανότατα είναι κρυπτογραφημένη και θα χρειαστείτε το Machine Key για να κρυπτογραφήσετε το payload σας για να εκμεταλλευτείτε την ευπάθεια.
Σε αυτήν την περίπτωση το Blacklist3r module είναι υπό ανάπτυξη...
Πριν το .NET 4.5, το ASP.NET μπορεί να δεχτεί μια μη κρυπτογραφημένη παράμετρο ___VIEWSTATE
_ από τους χρήστες ακόμα κι αν έχει οριστεί ViewStateEncryptionMode
σε Always. Το ASP.NET ελέγχει μόνο την παρουσία της παραμέτρου __VIEWSTATEENCRYPTED
στο αίτημα. Αν κάποιος αφαιρέσει αυτήν την παράμετρο και στείλει το μη κρυπτογραφημένο payload, αυτό θα επεξεργαστεί ακόμα.
Επομένως, αν οι επιτιθέμενοι βρουν έναν τρόπο να λάβουν το Machinekey μέσω μιας άλλης ευπάθειας όπως η διάβαση αρχείων, το YSoSerial.Net command που χρησιμοποιήθηκε στην Περίπτωση 2, μπορεί να χρησιμοποιηθεί για να πραγματοποιήσει RCE χρησιμοποιώντας την ευπάθεια αποσυσκευοποίησης ViewState.
Αφαιρέστε την παράμετρο
__VIEWSTATEENCRYPTED
από το αίτημα προκειμένου να εκμεταλλευτείτε την ευπάθεια αποσυσκευοποίησης ViewState, διαφορετικά θα επιστρέψει ένα σφάλμα επικύρωσης MAC του Viewstate και η εκμετάλλευση θα αποτύχει.
Περίπτωση Δοκιμής: 4 - .Net >= 4.5 και EnableViewStateMac=true/false και ViewStateEncryptionMode=true/false εκτός αν και τα δύο χαρακτηριστικά είναι false
Μπορούμε να επιβάλουμε τη χρήση του πλαισίου ASP.NET καθορίζοντας την παρακάτω παράμετρο μέσα στο αρχείο web.config όπως φαίνεται παρακάτω.
Εναλλακτικά, αυτό μπορεί να γίνει καθορίζοντας την παρακάτω επιλογή μέσα στην παράμετρο machineKey
του αρχείου web.config.
Όπως και στο προηγούμενο το value είναι κρυπτογραφημένο. Έπειτα, για να στείλει ένα έγκυρο payload ο επιτιθέμενος χρειάζεται το κλειδί.
Μπορείτε να δοκιμάσετε να χρησιμοποιήσετε το Blacklist3r(AspDotNetWrapper.exe) για να βρείτε το κλειδί που χρησιμοποιείται:
Για μια πιο λεπτομερή περιγραφή για τα IISDirPath και TargetPagePath ανατρέξτε εδώ
Ή, με το Badsecrets (με μια τιμή γεννήτριας):
Αφού εντοπιστεί ένα έγκυρο κλειδί μηχανής, ο επόμενος βήμα είναι να δημιουργηθεί ένας σειριοποιημένος φορτίο χρησιμοποιώντας το YSoSerial.Net
Εάν έχετε την τιμή του __VIEWSTATEGENERATOR
μπορείτε να δοκιμάσετε να χρησιμοποιήσετε την παράμετρο --generator
με αυτήν την τιμή και να παραλείψετε τις παραμέτρους --path
και --apppath
Μια επιτυχημένη εκμετάλλευση της ευπάθειας αποσυσκευοποίησης του ViewState θα οδηγήσει σε μια αίτηση εκτός ζώνης προς έναν διακεκριμένο από τον επιτιθέμενο διακεκριμένο διακομιστή, η οποία περιλαμβάνει το όνομα χρήστη. Αυτού του είδους η εκμετάλλευση παρουσιάζεται σε ένα απόδειξης έννοιας (PoC) η οποία μπορεί να βρεθεί μέσω ενός πόρου με τίτλο "Εκμετάλλευση αποσυσκευοποίησης ViewState χρησιμοποιώντας το Blacklist3r και το YsoSerial.NET". Για περισσότερες λεπτομέρειες σχετικά με τον τρόπο λειτουργίας της διαδικασίας εκμετάλλευσης και τον τρόπο χρήσης εργαλείων όπως το Blacklist3r για την εντοπισμό του MachineKey, μπορείτε να εξετάσετε την παρεχόμενη PoC επιτυχούς εκμετάλλευσης.
Περίπτωση Δοκιμής 6 – Χρήση του ViewStateUserKeys
Η ιδιότητα ViewStateUserKey μπορεί να χρησιμοποιηθεί για την προστασία ενάντια σε μια επίθεση CSRF. Εάν έχει οριστεί ένα τέτοιο κλειδί στην εφαρμογή και προσπαθήσουμε να δημιουργήσουμε το φορτίο ViewState με τις μεθόδους που συζητήθηκαν μέχρι τώρα, το φορτίο δεν θα επεξεργαστεί από την εφαρμογή. Χρειάζεται να χρησιμοποιήσετε μια ακόμη παράμετρο για να δημιουργήσετε σωστά το φορτίο:
Αποτέλεσμα Επιτυχούς Εκμετάλλευσης
Για όλα τα σενάρια δοκιμών, εάν το ViewState YSoSerial.Net payload λειτουργεί επιτυχώς τότε ο διακομιστής ανταποκρίνεται με "500 Εσωτερικό σφάλμα διακομιστή" με περιεχόμενο απάντησης "Οι πληροφορίες κατάστασης δεν είναι έγκυρες για αυτήν τη σελίδα και ενδέχεται να είναι κατεστραμμένες" και λαμβάνουμε το OOB αίτημα.
Ελέγξτε για περισσότερες πληροφορίες εδώ
Αναφορές
Συμβουλή για ανταμοιβή ευρημάτων: Εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα ανταμοιβής ευρημάτων δημιουργημένη από χάκερς, για χάκερς! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε ανταμοιβές μέχρι $100,000!
Last updated