Da li radite u kompaniji za kibernetičku bezbednost? Želite li da vidite svoju kompaniju reklamiranu na HackTricks? Ili želite pristup najnovijoj verziji PEASS-a ili preuzimanje HackTricks-a u PDF formatu? Proverite PLANOVE ZA PRIJAVU!
Ovaj post je posvećen razumevanju kako se gadget ObjectDataProvider eksploatiše radi dobijanja RCE-a i kako se biblioteke za serijalizaciju Json.Net i xmlSerializer mogu zloupotrebiti sa tim gadgetom.
Gadget ObjectDataProvider
Iz dokumentacije: klasa ObjectDataProvider omotava i kreira objekat koji možete koristiti kao izvor povezivanja.
Da, to je čudno objašnjenje, pa da vidimo šta ova klasa ima što je tako interesantno: Ova klasa omogućava da omotate proizvoljni objekat, koristite MethodParameters da postavite proizvolne parametre, a zatim koristite MethodName da pozovete proizvoljnu funkciju proizvoljnog objekta deklarisanog koristeći proizvolne parametre.
Stoga, proizvoljni objekat će izvršiti funkciju sa parametrima dok se deserijalizuje.
Kako je ovo moguće
Prostor imena System.Windows.Data, koji se nalazi unutar PresentationFramework.dll na C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF, je gde je definisan i implementiran ObjectDataProvider.
Korišćenjem dnSpy možete pregledati kod klase koja nas zanima. Na slici ispod vidimo kod PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Naziv metode
Kao što možete primetiti, kada se postavi MethodName poziva se base.Refresh(), hajde da vidimo šta ona radi:
Ok, nastavimo da vidimo šta radi this.BeginQuery(). BeginQuery je preklopljen od strane ObjectDataProvider i ovo je šta on radi:
Primetite da na kraju koda poziva this.QueryWorke(null). Hajde da vidimo šta ta funkcija izvršava:
Primetite da ovo nije kompletan kod funkcije QueryWorker ali pokazuje interesantan deo: Kod poziva this.InvokeMethodOnInstance(out ex); ovo je linija gde se poziva postavljena metoda.
Ako želite da proverite da li će se izvršiti samo postavljanjem MethodName**, možete pokrenuti ovaj kod:
using System.Windows.Data;using System.Diagnostics;namespace ODPCustomSerialExample{classProgram{staticvoidMain(string[] args){ObjectDataProvider myODP =newObjectDataProvider();myODP.ObjectType=typeof(Process);myODP.MethodParameters.Add("cmd.exe");myODP.MethodParameters.Add("/c calc.exe");myODP.MethodName="Start";}}}
Napomena da morate dodati kao referencu C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll kako biste učitali System.Windows.Data
ExpandedWrapper
Korišćenjem prethodnog eksploata postojiće slučajevi kada će se objekatdeserijalizovati kao instanca ObjectDataProvider (na primer u DotNetNuke ranjivosti, korišćenjem XmlSerializer-a, objekat je deserijalizovan korišćenjem GetType). Tada, nećemo imati znanje o tipu objekta koji je zapakovan u instanci ObjectDataProvider (Process na primer). Više informacija o DotNetNuke ranjivosti možete pronaći ovde.
Ova klasa omogućava da se specifikuju tipovi objekata koji su zapakovani u datoj instanci. Dakle, ova klasa može biti korišćena da zapakuje izvorni objekat (ObjectDataProvider) u novi tip objekta i obezbedi potrebne osobine (ObjectDataProvider.MethodName i ObjectDataProvider.MethodParameters).
Ovo je veoma korisno za slučajeve kao što je prethodno prikazani, jer ćemo biti u mogućnosti da zapakujemo _ObjectDataProvider** unutar **ExpandedWrapper _ instance i prilikom deserijalizacije ova klasa će kreirati objekat OjectDataProvider koji će izvršitifunkciju naznačenu u MethodName.
Možete proveriti ovaj omotač pomoću sledećeg koda:
using System.Windows.Data;using System.Diagnostics;using System.Data.Services.Internal;namespace ODPCustomSerialExample{classProgram{staticvoidMain(string[] args){ExpandedWrapper<Process,ObjectDataProvider> myExpWrap =newExpandedWrapper<Process,ObjectDataProvider>();myExpWrap.ProjectedProperty0=newObjectDataProvider();myExpWrap.ProjectedProperty0.ObjectInstance=newProcess();myExpWrap.ProjectedProperty0.MethodParameters.Add("cmd.exe");myExpWrap.ProjectedProperty0.MethodParameters.Add("/c calc.exe");myExpWrap.ProjectedProperty0.MethodName="Start";}}}
Json.Net
Na zvaničnoj web stranici naznačeno je da ova biblioteka omogućava Serijalizaciju i deserijalizaciju bilo kog .NET objekta pomoću snažnog JSON serializer-a Json.NET. Dakle, ako bismo mogli deserijalizovati ObjectDataProvider gedžet, mogli bismo izazvati RCE samo deserijalizovanjem objekta.
Primer Json.Net
Prvo da vidimo primer kako serijalizovati/deserijalizovati objekat koristeći ovu biblioteku:
Da li radite u kompaniji za kibernetičku bezbednost? Želite li da vidite svoju kompaniju reklamiranu na HackTricks? ili želite pristupiti najnovijoj verziji PEASS ili preuzeti HackTricks u PDF formatu? Proverite PLANOVE ZA PRETPLATU!