Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
cve-2017-9822 | Kitploit
Ferramentas/GitHubGitHub/tnot123/cve-2017-9822
Análise de VulnerabilidadesAnálise de CódigoExploraçãoEngenharia ReversaExploração de Aplicações WebDepuradoresTestes de PenetraçãoAprendizado e EducaçãoDesenvolvimento de PayloadsExploração de BináriosLabs e Prática
há 10 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHub
tnot123/cve-2017-9822

cve-2017-9822

Ver Repositório
  • CVE-2017-9822
    • Informações principais
    • Configuração do ambiente
    • Configuração para depuração
    • Análise
    • Depuração
      • XmlSerializer
      • Gadget de ataque
      • ObjectDataProvider
      • ResourceDictionary
      • Da desserialização insegura de XML ao RCE

CVE-2017-9822

O DNN (também conhecido como DotNetNuke) antes da versão 9.1.1 tem capacidade de execução remota de código por meio de cookies, também conhecido como "2017-08 (Importante) Possível execução remota de código em sites DNN".

Informações principais

  • Produto afetado: DotNetNuke (DNN Platform) – um CMS/portal .NET popular.
  • Data de divulgação: Julho de 2017.
  • Gravidade: Crítica (CVSS ~9.8).
  • Tipo de vulnerabilidade: XML External Entity (XXE) / Desserialização insegura → Execução remota de código (RCE).
  • Impacto: antes da versão 9.1.1, é possível executar código remotamente por meio do cookie

alt

O que é DotNetNuke?
O DotNetNuke é um CMS (sistema de gerenciamento de conteúdo) web gratuito e de código aberto escrito em C# e baseado na plataforma .NET. O DotNetNuke é muito popular e amplamente usado na Internet porque você pode implantar uma versão web do DNN em poucos minutos, sem precisar de muito conhecimento técnico. Outra função importante do DotNetNuke é a capacidade de criar ou importar módulos personalizados de terceiros, criados em VB.NET ou C#
É possível instalar o DNN em uma stack composta por Windows Server, IIS, ASP.NET e SQL Server para Windows. O DNN também suporta o registro de novos usuários com verificação por e-mail, mas você precisa configurar um servidor SMTP válido para que esse recurso de segurança funcione. Principais recursos do DNN
• Arquitetura modular: o DNN permite fácil expansão com a instalação de módulos (módulos de funcionalidade) desenvolvidos pela comunidade. Os administradores podem carregar novos módulos pela interface de administração (envio de pacotes .zip) ou extraí-los diretamente em uma pasta no servidor.
• Administração de usuários: o sistema oferece recursos de segurança e permissões detalhadas (roles/permissions) para portais e módulos. Contas de usuário, funções e permissões são gerenciadas de forma centralizada no DNN.
• Gerenciamento de conteúdo: suporte a edição WYSIWYG, gerenciamento de artigos, imagens, documentos… Há um sistema de workflow/publicação (publicação de artigos por fluxo de aprovação) e versionamento de conteúdo. O conteúdo é armazenado em um banco de dados (SQL Server) compartilhado.
• API e integração extensível: o DNN fornece uma API .NET para os desenvolvedores criarem módulos personalizados (WebForms, MVC, Razor) e integrarem serviços externos. Há uma vasta gama de bibliotecas de terceiros disponíveis (temas de interface, módulos de comércio eletrônico, fóruns etc.) para expandir as funcionalidades.
• Interface e temas: o sistema de skins (temas) separa conteúdo – interface, permitindo um design web flexível. Os sites criados com o DNN podem mudar de aparência trocando os skins.
• Mecanismo de instalação de módulos: os módulos do DNN são empacotados em arquivos ZIP e podem ser instalados pela interface de administração ou por extração manual. O DNN suporta tanto módulos compilados (.NET DLL) quanto módulos Razor dinâmicos; todo módulo pode ter o acesso concedido ou revogado por meio das configurações de permissão em cada página .

Configuração do ambiente

Sistemas operacionais: Windows 10
.NET Framework: 4.5.1+
Servidor web: Microsoft IIS 10
Servidor de banco de dados: Microsoft® SQL Server® 2019 Express, SQL Server Management Studio
Versão do DotNetNuke 9.1.0
Você pode usar os seguintes Google dorks para encontrar versões do DotNetNuke implantadas e disponíveis na Internet e verificá-las com base no site:
inurl:dnn.js
inurl:dnn.modalpopup.js
inurl:dnn.servicesframework.js
inurl:dnn.xml.js
inurl:dnncore.js
inurl:/Portals/0/
inurl:/DesktopModules/
inurl:/DNNCorp/
inurl:/DotNetNuke
inurl:/tabid//Default.aspx
inurl:/tabid/
/language/*/Default.aspx
intext:"by DNN Corp "
Você pode seguir este artigo para montar o ambiente

Configuração para depuração

Ajuste as propriedades do assembly para as propriedades "depuráveis"; isso é essencial porque, em tempo de execução, algumas otimizações são aplicadas e acabam atrapalhando a depuração: alguns breakpoints podem não ser atingidos ou algumas variáveis podem não existir.
Carregue a DotNetNuke.dll no dnSpy (32 bits), depois selecione Edit Assembly Attributes (C#)

alt

Altere a linha de
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
Para
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]

alt

Depois, selecione Compile e salve este módulo de volta no local original.
Em seguida, execute o dnSpy com privilégios de administrador e selecione Debug -> Attach to Process

alt

Selecione o processo w3wp.exe

alt

O motivo de precisarmos anexar esse processo para depurar é que os aplicativos web no IIS normalmente usam worker processes. Eles são responsáveis por processar as requisições web enviadas ao servidor web IIS para cada application pool; pode haver vários worker processes em uma máquina, e todos têm o mesmo nome: w3wp.exe. Uma observação importante: às vezes não há nenhum processo w3wp em execução; o IIS só inicia os worker processes quando recebe a primeira requisição web.

alt

Voltando à depuração: depois de anexar o processo, selecione: Debug -> Windows -> Modules

alt

Clique em um módulo e selecione Open All Modules

alt

Neste momento, na janela Assembly, já podemos ver todos os módulos relacionados

alt

Análise

A desserialização é o processo de interpretar fluxos de bytes e convertê-los em dados que podem ser executados pela aplicação.
O principal problema da desserialização é que, na maioria das vezes, ela pode usar dados de entrada fornecidos pelo usuário. Isso significa que você pode inserir payloads maliciosos no formato esperado pela aplicação e manipular a lógica, vazar dados ou até mesmo executar código remotamente.
O DotNetNuke usa o cookie DNNPersonalization para armazenar as preferências de personalização de usuários anônimos (as preferências de usuários autenticados são armazenadas por meio da página de perfil deles). Conforme o relatório, a vulnerabilidade ocorre no processamento do cookie DNNPersonalization, usado para carregar o perfil do usuário; no entanto, ainda é possível acioná-la sem autenticação ao acessar uma página inexistente (erro 404). O ponto de entrada dessa falha está na função LoadProfile do módulo DotNetNuke.dll; vamos descompilar esse módulo com o dnSpy e analisá-lo mais a fundo:
Em PersonalizationController#LoadProfile(int, int)

alt

Se o userId for diferente de null, a variável text recebe o valor do cookie DNNPersonalization da requisição e, em seguida, chama Globals#DeserializeHashTableXml

alt

Globals#DeserializeHashTableXml chama XmlUtils#DeSerializeHashtable

alt

O fluxo de processamento é o seguinte:

  • Carrega o XML de xmlSource
  • Percorre cada nó item no root profile.
  • Para cada item, obtém o tipo de objeto definido com base no atributo type e inicializa um XmlSerializer de acordo com esse tipo de objeto, como nas linhas 160-161
  • Desserializa esse item em um objeto na linha 163 e o armazena no hashtable
  • Retorna o hashtable
    Temos controle total sobre o valor do cookie DNNPersonalization e, portanto, podemos modificar o objeto desserializado.

Depuração

Use o Burp para enviar uma requisição que aciona o status 404 + o cookie DNNPersonalization

alt

Aqui podemos ver que a função chamada para tratar o 404, Handler404OrException, acionou uma cadeia de chamadas e invocou Personalization.LoadProfile(int,int).

alt

O que chama a atenção no código acima é a condição if que verifica se a requisição atual é IsAuthenticated; claramente, a requisição que acabamos de fazer é não autenticada e foi direcionada a um entrypoint inexistente. Então, por que a requisição atual é tratada como a de um usuário autenticado?
Continuando a depuração e voltando quase ao final do stack, vemos que em AdvancedUrlRewriter#Handle404OrException há um else if como este:

alt

Aqui, ele verifica se o context.User da requisição atual é null; se for, atribui a context.User o usuário do thread atual. Definindo um breakpoint, podemos ver o seguinte resultado:

alt

A variável IsAuthenticated agora tem o valor true, e o usuário atribuído é exatamente o usuário que executa o thread atual, pertencente ao grupo IIS APPPOOL do servidor IIS; portanto, a requisição é tratada como a de um usuário autenticado. Essa lógica existe porque o handler de 404 é invocado antes de HttpContext.User ser definido, e o fluxo de processamento subsequente depende de User.IsAuthenticated; assim, para evitar erros de referência nula, os desenvolvedores atribuem ao objeto User o objeto WindowsPrincipal do thread atual.

XmlSerializer

O XmlSerializer é a classe de serialização da própria Microsoft, usada para converter entre strings e objetos XML. O namespace dela é: System.Xml.Serialization.
Exemplo de uso do XmlSerializer:

alt

alt

A condição para um ataque de RCE por meio do XmlSerializer é obrigatoriamente controlar o tipo de dado passado ao construtor do XmlSerializer. Ou seja, os tipos de dados que levam ao gadget devem ser passados para a propriedade XmlSerializer.mapping

Gadget de ataque

O gadget mais comum para atacar a desserialização de XML é o ObjectDataProvider. Esse gadget pode ser criado com a ferramenta ysoserrial .net

ObjectDataProvider

Basicamente, ao usar essa classe, podemos chamar qualquer método de qualquer classe.

alt

Por exemplo, podemos chamar Process.Start com os parâmetros passados como abaixo:
ObjectDataProvider o = new ObjectDataProvider(); o.MethodParameters.Add("cmd.exe"); o.MethodParameters.Add("/c calc"); o.MethodName = "Start"; o.ObjectInstance = new Process(); Console.ReadKey();
Construindo um payload de desserialização XML com o código acima:

alt

alt

ResourceDictionary

O ResourceDictionary é usado no desenvolvimento WPF; por ser WPF, ele precisa usar a linguagem XAML. Primeiro, vejamos um payload que usa o ResourceDictionary para executar comandos.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:b="clr-namespace:System;assembly=mscorlib" xmlns:c="clr-namespace:System.Diagnostics;assembly=system"> <ObjectDataProvider d:Key="" ObjectType="{d:Type c:Process}" MethodName="Start"> <ObjectDataProvider.MethodParameters> <b:String>cmd</b:String> <b:String>/c calc</b:String> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </ResourceDictionary>
Explicação deste XAML:

  1. xmlns:c refere-se ao namespace System.Diagnostics e o nomeia como c
  2. d:Key="" nome vazio. Na sintaxe XAML, o valor da chave Key é obrigatório.
  3. ObjectType representa o tipo do objeto
  4. d:Type equivale a typeof()
  5. MethodName é uma propriedade do ObjectDataProvider. Passar Start equivale a chamar o método Start.
  6. c:Process equivale a System.Diagnostics.Process
    Depois que todo o XAML é analisado, isso equivale a criar um objeto ObjectDataProvider, que chamará automaticamente System.Diagnostics.Process.Start("cmd.exe","/c calc")

alt

Executar o código acima equivale a ObjectDataProvider -> Person.Evil(). Se o ataque de RCE for realizado por meio do XmlSerializer, o fluxo será assim: ObjectDataProvider -> XamlReader.Parse() -> ObjectDataProvider -> System.Diagnostics.Process.Start("cmd.exe","/c calc")

Da desserialização insegura de XML ao RCE

O objetivo agora é encontrar um objeto que possa executar código durante a desserialização. No POC, a função PullFile de DotNetNuke.Common.Utilities.FileSystemUtils é usada para explorar "upload arbitrário de arquivos"

alt

alt

Obtemos o obj.xml:

alt

Envie o payload

alt

alt

Depois que o DNN desserializa os cookies, o servidor HTTP recebe uma requisição para /cmd.aspx, ou seja, a desserialização foi bem-sucedida e o webshell foi carregado no DNN

alt

Da mesma forma, exploramos a função WriteFile de DotNetNuke.Common.Utilities.FileSystemUtils para ler arquivos

alt

alt

Baixar ferramenta