Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version du PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
Ce post est dédié à comprendre comment le gadget ObjectDataProvider est exploité pour obtenir une RCE et comment les bibliothèques de sérialisation Json.Net et xmlSerializer peuvent être abusées avec ce gadget.
Gadget ObjectDataProvider
D'après la documentation : la classe ObjectDataProvider enveloppe et crée un objet que vous pouvez utiliser comme source de liaison.
Oui, c'est une explication étrange, voyons donc ce que cette classe a d'intéressant : Cette classe permet de envelopper un objet arbitraire, d'utiliser MethodParameters pour définir des paramètres arbitraires, puis d'utiliser MethodName pour appeler une fonction arbitraire de l'objet arbitraire déclaré en utilisant les paramètres arbitraires.
Par conséquent, l'objet arbitraire exécutera une fonction avec des paramètres tout en étant désérialisé.
Comment est-ce possible
L'espace de noms System.Windows.Data, trouvé dans le fichier PresentationFramework.dll à C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF, est l'endroit où l'ObjectDataProvider est défini et implémenté.
En utilisant dnSpy, vous pouvez inspecter le code de la classe qui nous intéresse. Dans l'image ci-dessous, nous voyons le code de PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Nom de la méthode
Comme vous pouvez le constater, lorsque MethodName est défini, base.Refresh() est appelé, regardons ce qu'il fait :
D'accord, continuons à voir ce que fait this.BeginQuery(). BeginQuery est remplacé par ObjectDataProvider et voici ce qu'il fait :
Notez qu'à la fin du code, il appelle this.QueryWorke(null). Voyons ce que cela exécute :
Notez que ce n'est pas le code complet de la fonction QueryWorker mais cela montre la partie intéressante : Le code appelle this.InvokeMethodOnInstance(out ex); c'est la ligne où la méthode définie est invoquée.
Si vous voulez vérifier que simplement en définissant le MethodName, il sera exécuté, vous pouvez exécuter ce code :
using System.Windows.Data;using System.Diagnostics;namespace ODPCustomSerialExample{classProgram{staticvoidMain(string[] args){ObjectDataProvider myODP =newObjectDataProvider();myODP.ObjectType=typeof(Process);myODP.MethodParameters.Add("cmd.exe");myODP.MethodParameters.Add("/c calc.exe");myODP.MethodName="Start";}}}
Notez que vous devez ajouter comme référence C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll afin de charger System.Windows.Data
ExpandedWrapper
En utilisant l'exploit précédent, il y aura des cas où l'objet va être désérialisé en tant qu'instance d'ObjectDataProvider (par exemple dans la vulnérabilité DotNetNuke, en utilisant XmlSerializer, l'objet a été désérialisé en utilisant GetType). Ensuite, nous n'aurons aucune connaissance du type d'objet encapsulé dans l'instance ObjectDataProvider (Process par exemple). Vous pouvez trouver plus d'informations sur la vulnérabilité DotNetNuke ici.
Cette classe permet de spécifier les types d'objets encapsulés dans une instance donnée. Ainsi, cette classe peut être utilisée pour encapsuler un objet source (ObjectDataProvider) dans un nouveau type d'objet et fournir les propriétés dont nous avons besoin (ObjectDataProvider.MethodName et ObjectDataProvider.MethodParameters).
Cela est très utile pour des cas comme celui présenté précédemment, car nous serons en mesure d'envelopper l'ObjectDataProvider dans une instance de ExpandedWrapper et lors de la désérialisation de cette classe, elle créera l'objet OjectDataProvider qui exécutera la fonction indiquée dans MethodName.
Vous pouvez vérifier ce wrapper avec le code suivant:
using System.Windows.Data;using System.Diagnostics;using System.Data.Services.Internal;namespace ODPCustomSerialExample{classProgram{staticvoidMain(string[] args){ExpandedWrapper<Process,ObjectDataProvider> myExpWrap =newExpandedWrapper<Process,ObjectDataProvider>();myExpWrap.ProjectedProperty0=newObjectDataProvider();myExpWrap.ProjectedProperty0.ObjectInstance=newProcess();myExpWrap.ProjectedProperty0.MethodParameters.Add("cmd.exe");myExpWrap.ProjectedProperty0.MethodParameters.Add("/c calc.exe");myExpWrap.ProjectedProperty0.MethodName="Start";}}}
Json.Net
Sur la page web officielle, il est indiqué que cette bibliothèque permet de sérialiser et désérialiser n'importe quel objet .NET avec le puissant sérialiseur JSON de Json.NET. Ainsi, si nous pouvions désérialiser le gadget ObjectDataProvider, nous pourrions provoquer une RCE simplement en désérialisant un objet.
Exemple Json.Net
Tout d'abord, voyons un exemple sur la façon de sérialiser/désérialiser un objet en utilisant cette bibliothèque :
Travaillez-vous dans une entreprise de cybersécurité? Voulez-vous voir votre entreprise annoncée dans HackTricks? ou souhaitez-vous avoir accès à la dernière version du PEASS ou télécharger HackTricks en PDF? Consultez les PLANS D'ABONNEMENT!