旧瓶装新酒 - 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命令启用:
|
|
技术分析
首先回顾CVE-2022-22005的漏洞触发点ChartPreviewImage.loadChartImage():
this.sessionKey
从Request[‘sk’]获取:
|
|
该sessionKey用于通过CustomSessionState.FetchBinaryData()方法从StateService获取二进制数据:
|
|
微软通过添加SerializationBinder来修补CVE-2022-22005:
|
|
为寻找变种漏洞,我重点关注了CustomSessionState.FetchBinaryData()方法。使用dnSpy的Analyze功能查找调用该方法的代码,发现ChartAdminPageBase.get_currentWorkingSet()方法:
|
|
二进制数据直接从StateService获取后未经检查就传递给BinaryFormatter.Deserialize(),导致RCE漏洞。
完整调用链:
|
|
漏洞利用
利用过程与CVE-2022-22005基本相同,主要步骤如下:
第一步:存储payload
- 安装Microsoft InfoPath
- 创建List并发布表单
- 在附件部分上传恶意文件(使用TypeConfuseDelegate gadget链)
- 从响应中获取itemId
第二步:获取payload会话ID
- 构造特殊请求到FormServerAttachments.aspx
- 从响应中提取attachmentId(即payload会话密钥)
最终通过访问ChartPreviewImage.aspx并传入csk参数触发反序列化:
|
|
完整PoC演示视频可参考原文链接。
参考资源
- CVE-2022-22005分析文章
- SharePoint 2016安装指南
- State Service配置教程
- Microsoft InfoPath下载
- ZDI关于CVE-2021-27076的分析