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)
Ця стаття присвячена розумінню того, як експлуатується гаджет ObjectDataProvider для отримання RCE та як бібліотеки серіалізації Json.Net та xmlSerializer можуть бути зловживані з цим гаджетом.
З документації: клас ObjectDataProvider обгортає та створює об'єкт, який ви можете використовувати як джерело прив'язки. Так, це дивне пояснення, тож давайте подивимося, що ж цікавого є в цьому класі: цей клас дозволяє обгортати довільний об'єкт, використовувати MethodParameters для встановлення довільних параметрів і потім використовувати MethodName для виклику довільної функції довільного об'єкта, оголошеного з використанням довільних параметрів. Отже, довільний об'єкт буде виконувати функцію з параметрами під час десеріалізації.
Простір імен System.Windows.Data, який знаходиться в PresentationFramework.dll за адресою C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
, є місцем, де визначено та реалізовано ObjectDataProvider.
Використовуючи dnSpy, ви можете переглянути код класу, який нас цікавить. На зображенні нижче ми бачимо код PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name
Як ви можете спостерігати, коли MethodName
встановлено, викликається base.Refresh()
, давайте подивимося, що це робить:
Добре, продовжимо дивитися, що робить this.BeginQuery()
. BeginQuery
переозначено класом ObjectDataProvider
, і ось що він робить:
Зверніть увагу, що в кінці коду викликається this.QueryWorke(null)
. Давайте подивимося, що це виконує:
Зверніть увагу, що це не повний код функції QueryWorker
, але він показує цікаву частину: код викликає this.InvokeMethodOnInstance(out ex);
це рядок, де викликається встановлений метод.
Якщо ви хочете перевірити, що просто встановивши MethodName** він буде виконаний**, ви можете запустити цей код:
Зверніть увагу, що вам потрібно додати як посилання C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll, щоб завантажити System.Windows.Data
Використовуючи попередній експлойт, будуть випадки, коли об'єкт буде десеріалізовано як екземпляр ObjectDataProvider (наприклад, у вразливості DotNetNuke, використовуючи XmlSerializer, об'єкт був десеріалізований за допомогою GetType
). Тоді не буде відомо про тип об'єкта, який обгорнутий в екземплярі ObjectDataProvider (наприклад, Process
). Ви можете знайти більше інформації про вразливість DotNetNuke тут.
Цей клас дозволяє вказати типи об'єктів об'єктів, які інкапсульовані в даному екземплярі. Отже, цей клас може бути використаний для інкапсуляції об'єкта-джерела (ObjectDataProvider) в новий тип об'єкта та надання необхідних властивостей (ObjectDataProvider.MethodName та ObjectDataProvider.MethodParameters). Це дуже корисно для випадків, як той, що був представлений раніше, оскільки ми зможемо обернути _ObjectDataProvider** всередині екземпляра **ExpandedWrapper _ і коли десеріалізується цей клас створить об'єкт OjectDataProvider, який виконає функцію, вказану в MethodName.
Ви можете перевірити цей обгортальник за допомогою наступного коду:
На офіційному веб-сайті вказано, що ця бібліотека дозволяє Серіалізувати та десеріалізувати будь-який .NET об'єкт за допомогою потужного JSON-серіалізатора Json.NET. Отже, якщо ми зможемо десеріалізувати гаджет ObjectDataProvider, ми зможемо викликати RCE, просто десеріалізуючи об'єкт.
По-перше, давайте подивимося приклад того, як серіалізувати/десеріалізувати об'єкт, використовуючи цю бібліотеку:
Використовуючи ysoserial.net, я створив експлойт:
В цьому коді ви можете перевірити експлойт, просто запустіть його, і ви побачите, що виконується calc:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)