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)
Este post é dedicado a entender como o gadget ObjectDataProvider é explorado para obter RCE e como as bibliotecas de Serialização Json.Net e xmlSerializer podem ser abusadas com esse gadget.
Da documentação: a Classe ObjectDataProvider envolve e cria um objeto que você pode usar como uma fonte de vinculação. Sim, é uma explicação estranha, então vamos ver o que essa classe tem de tão interessante: Esta classe permite envolver um objeto arbitrário, usar MethodParameters para definir parâmetros arbitrários e então usar MethodName para chamar uma função arbitrária do objeto arbitrário declarado usando os parâmetros arbitrários. Portanto, o objeto arbitrário irá executar uma função com parâmetros enquanto está sendo desserializado.
O namespace System.Windows.Data, encontrado dentro do PresentationFramework.dll em C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
, é onde o ObjectDataProvider é definido e implementado.
Usando dnSpy você pode inspecionar o código da classe que nos interessa. Na imagem abaixo estamos vendo o código de PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Nome do método
Como você pode observar, quando MethodName
é definido, base.Refresh()
é chamado, vamos dar uma olhada no que isso faz:
Ok, vamos continuar vendo o que this.BeginQuery()
faz. BeginQuery
é sobrescrito por ObjectDataProvider
e isso é o que ele faz:
Note que no final do código está chamando this.QueryWorke(null)
. Vamos ver o que isso executa:
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:
Note que você precisa adicionar como referência C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll para carregar System.Windows.Data
Usando o exploit 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.
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). 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:
Na página oficial é indicado que esta biblioteca permite Serializar e desserializar qualquer objeto .NET com o poderoso serializador JSON do Json.NET. Portanto, se pudéssemos desserializar o gadget ObjectDataProvider, poderíamos causar um RCE apenas desserializando um objeto.
Primeiramente, vamos ver um exemplo de como serializar/desserializar um objeto usando esta biblioteca:
Usando ysoserial.net eu criei o exploit:
Neste código você pode testar a exploração, basta executá-lo e você verá que um calc é executado:
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)