旧瓶装新酒 - Microsoft SharePoint 认证后反序列化远程代码执行漏洞分析(CVE-2022-29108)

本文深入分析了Microsoft SharePoint服务器中的认证后反序列化漏洞(CVE-2022-29108),详细介绍了漏洞环境搭建、技术原理分析、利用链构造过程,以及与CVE-2022-22005漏洞的关联性。文章包含完整的漏洞复现步骤和PoC演示。

旧瓶装新酒 - Microsoft SharePoint认证后反序列化RCE (CVE-2022-29108)

引言

最近我在研究SharePoint相关工作时,开始学习如何搭建环境并调试其历史漏洞。今年2月出现的反序列化漏洞CVE-2022-22005(当然是认证后漏洞)已有越南研究员撰写了详细分析文章。该博客内容详实,我也参考该文进行环境搭建和调试。由于本文所述漏洞与之密切相关,建议先阅读前文以便更好理解!

CVE-2022-29108与CVE-2022-22005在操作方式、入口点和补丁方案上都高度相似。这很可能是分析1day漏洞时的意外发现!

环境搭建

完全基于微软官方指南进行配置。完成基础搭建后,继续执行创建Web应用和站点集合的步骤。

初始我以为CVE-2022-22005在默认配置下即可利用,但调试时发现并非如此!第一个条件是"自助式网站创建"功能默认关闭,这意味着普通用户无法创建子站点。

第二个条件是CVE-2022-22005依赖SharePoint的State-Service服务,该服务在默认配置中不存在。可通过以下PowerShell命令启用:

1
2
3
4
5
6
7
8
9
# 创建State Service应用
$StateService_application = New-SPStateServiceApplication -Name "State Service"

# 创建State Service数据库
$StateService_applicationDB= New-SPStateServiceDatabase -Name "KnowledgeJunction_SP_StateService" -ServiceApplication $StateService_application

# 创建代理
New-SPStateServiceApplicationProxy -Name "KnowledgeJunction_SP_StateService" -ServiceApplication $StateService_application -DefaultProxyGroup
Initialize-SPStateServiceDatabase -Identity $StateService_applicationDB

技术分析

首先回顾CVE-2022-22005的漏洞触发点ChartPreviewImage.loadChartImage():

this.sessionKey从Request[‘sk’]获取:

1
this.sessionKey = context.Request["sk"];

该sessionKey用于通过CustomSessionState.FetchBinaryData()方法从StateService获取二进制数据:

1
byte[] chartImageData = CustomSessionState.FetchBinaryData(this.sessionKey);

微软通过添加SerializationBinder来修补CVE-2022-22005:

1
binaryFormatter.Binder = new Microsoft.SharePoint.Utilities.SafeSerializationBinder();

为寻找变种漏洞,我重点关注了CustomSessionState.FetchBinaryData()方法。使用dnSpy的Analyze功能查找调用该方法的代码,发现ChartAdminPageBase.get_currentWorkingSet()方法:

1
2
3
this.CustomSessionStateKey = context.Request["csk"];
byte[] binaryData = CustomSessionState.FetchBinaryData(this.CustomSessionStateKey);
return (ChartWorkingSet)binaryFormatter.Deserialize(new MemoryStream(binaryData));

二进制数据直接从StateService获取后未经检查就传递给BinaryFormatter.Deserialize(),导致RCE漏洞。

完整调用链:

1
2
3
4
ChartPreviewImage.Render()
   → ChartAdminPageBase.FetchFromCurrentWorkingSet()
        → ChartAdminPageBase.get_currentWorkingSet()
            → BinaryFormatter.Deserialize()

漏洞利用

利用过程与CVE-2022-22005基本相同,主要步骤如下:

第一步:存储payload

  1. 安装Microsoft InfoPath
  2. 创建List并发布表单
  3. 在附件部分上传恶意文件(使用TypeConfuseDelegate gadget链)
  4. 从响应中获取itemId

第二步:获取payload会话ID

  1. 构造特殊请求到FormServerAttachments.aspx
  2. 从响应中提取attachmentId(即payload会话密钥)

最终通过访问ChartPreviewImage.aspx并传入csk参数触发反序列化:

1
GET /_layouts/15/ChartPreviewImage.aspx?csk=[attachmentId] HTTP/1.1

完整PoC演示视频可参考原文链接。

参考资源

  1. CVE-2022-22005分析文章
  2. SharePoint 2016安装指南
  3. State Service配置教程
  4. Microsoft InfoPath下载
  5. ZDI关于CVE-2021-27076的分析
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计