Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Last updated
Last updated
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)
Ovaj post je posvećen razumevanju kako se gadget ObjectDataProvider koristi za dobijanje RCE i kako se biblioteke za serijalizaciju Json.Net i xmlSerializer mogu zloupotrebiti sa tim gadgetom.
Iz dokumentacije: klasa ObjectDataProvider obavija i kreira objekat koji možete koristiti kao izvor vezivanja. Da, to je čudno objašnjenje, pa hajde da vidimo šta ova klasa ima što je tako interesantno: Ova klasa omogućava obavijanje proizvoljnog objekta, korišćenje MethodParameters za postavljanje proizvoljnih parametara, a zatim korišćenje MethodName za pozivanje proizvoljne funkcije proizvoljnog objekta deklarisanog korišćenjem proizvoljnih parametara. Stoga, proizvoljni objekat će izvršiti funkciju sa parametrima dok se deserializuje.
System.Windows.Data prostor imena, koji se nalazi unutar PresentationFramework.dll na C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
, je mesto gde je ObjectDataProvider definisan i implementiran.
Korišćenjem dnSpy možete inspektovati kod klase koja nas zanima. Na slici ispod vidimo kod PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Ime metode
Kao što možete primetiti kada je MethodName
postavljen, poziva se base.Refresh()
, hajde da pogledamo šta to radi:
U redu, hajde da nastavimo da vidimo šta radi this.BeginQuery()
. BeginQuery
je prepisan od strane ObjectDataProvider
i ovo je ono što radi:
Napomena: na kraju koda poziva se this.QueryWorke(null)
. Hajde da vidimo šta to izvršava:
Napomena: ovo nije kompletan kod funkcije QueryWorker
ali pokazuje zanimljiv deo: Kod poziva this.InvokeMethodOnInstance(out ex);
ovo je linija gde se postavljena metoda poziva.
Ako želite da proverite da samo postavljanje MethodName** će biti izvršeno**, možete pokrenuti ovaj kod:
Napomena da je potrebno dodati kao referencu C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll kako bi se učitao System.Windows.Data
Koristeći prethodni exploit, biće slučajeva gde će objekat biti deserijalizovan kao ObjectDataProvider instanca (na primer u DotNetNuke vuln, koristeći XmlSerializer, objekat je deserijalizovan koristeći GetType
). Tada, neće imati znanje o tipu objekta koji je obavijen u ObjectDataProvider instanci (Process
na primer). Možete pronaći više informacija o DotNetNuke vuln ovde.
Ova klasa omogućava da se odrede tipovi objekata koji su enkapsulirani u datoj instanci. Dakle, ova klasa se može koristiti za enkapsulaciju izvornog objekta (ObjectDataProvider) u novi tip objekta i pružanje svojstava koja su nam potrebna (ObjectDataProvider.MethodName i ObjectDataProvider.MethodParameters). Ovo je veoma korisno za slučajeve kao što je onaj predstavljen ranije, jer ćemo moći da obavijemo _ObjectDataProvider** unutar **ExpandedWrapper _ instance i kada se deserijalizuje ova klasa će kreirati OjectDataProvider objekat koji će izvršiti funkciju naznačenu u MethodName.
Možete proveriti ovaj wrapper sa sledećim kodom:
Na službenoj veb stranici je naznačeno da ova biblioteka omogućava serijalizaciju i deserializaciju bilo kog .NET objekta uz pomoć moćnog JSON serijalizatora Json.NET. Dakle, ako bismo mogli deserializovati ObjectDataProvider gadget, mogli bismo izazvati RCE samo deserializovanjem objekta.
Prvo, hajde da vidimo primer kako da serijalizujemo/deserializujemo objekat koristeći ovu biblioteku:
Koristeći ysoserial.net kreirao sam eksploataciju:
U ovom kodu možete testirati eksploataciju, samo ga pokrenite i videćete da se izvršava kalkulator:
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)