Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Questo post è dedicato a comprendere come il gadget ObjectDataProvider venga sfruttato per ottenere RCE e come le librerie di Serializzazione Json.Net e xmlSerializer possano essere abusate con quel gadget.
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. Pertanto, l'oggetto arbitrario eseguirà una funzione con parametri mentre viene deserializzato.
Lo spazio dei nomi System.Windows.Data, trovato all'interno di PresentationFramework.dll in C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
, è dove l'ObjectDataProvider è definito e implementato.
Utilizzando dnSpy puoi ispezionare il codice della classe che ci interessa. Nell'immagine qui sotto vediamo il codice di PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Nome del metodo
Come puoi osservare, quando MethodName
è impostato, viene chiamato base.Refresh()
, diamo un'occhiata a cosa fa:
Ok, continuiamo a vedere cosa fa this.BeginQuery()
. BeginQuery
è sovrascritto da ObjectDataProvider
e questo è ciò che fa:
Nota che alla fine del codice viene chiamato this.QueryWorke(null)
. Vediamo cosa esegue:
Nota che questo non è il codice completo della funzione QueryWorker
, ma mostra la parte interessante: Il codice chiama this.InvokeMethodOnInstance(out ex);
questa è la riga in cui viene invocato il metodo impostato.
Se vuoi controllare che impostando semplicemente il MethodName** verrà eseguito**, puoi eseguire questo codice:
Nota che devi aggiungere come riferimento C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll per caricare System.Windows.Data
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 (ad esempio Process
). Puoi trovare ulteriori informazioni sulla vulnerabilità di DotNetNuke qui.
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:
Nella pagina web ufficiale è indicato che questa libreria consente di Serializzare e deserializzare qualsiasi oggetto .NET con il potente serializzatore JSON di Json.NET. Quindi, se potessimo deserializzare il gadget ObjectDataProvider, potremmo causare un RCE semplicemente deserializzando un oggetto.
Prima di tutto vediamo un esempio su come serializzare/deserializzare un oggetto utilizzando questa libreria:
Utilizzando ysoserial.net ho creato l'exploit:
In questo codice puoi testare l'exploit, basta eseguirlo e vedrai che viene eseguito un calc:
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)