漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现

渗透技巧 2年前 (2022) admin
1,157 2 0

★且听安全-点关注,不迷路!



漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现

★漏洞空间站-优质漏洞资源和小伙伴聚集地!


漏洞信息


微软 5 月份发布 Microsoft SharePoint Server 存在远程命令执行漏洞,编号 CVE-2022-29108 :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


早在 2 月份微软就发布过另一个 CVE-2022-22005 漏洞:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


CVE-2022-29108 和 CVE-2022-22005 都是反序列化漏洞,并且漏洞原理也一样,再往前看与 CVE-2021-27076 也是一样的,只是触发点不同而已:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


CVE-2022-29108 可以看成是 CVE-2022-22005 漏洞补丁的绕过,微软这种“哪里有洞补哪里”的做法治标不治本,未来 SharePoint 可能还会有类似的漏洞产生也说不定。

环境安装


获取完整环境安装教程请加入我们的漏洞空间站-致力于打造优质漏洞资源和小伙伴聚集地!



漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


漏洞调用链分析


0x01 CVE-2022-22005


反序列化漏洞触发点 `Microsoft.Office.Server.Internal.Charting.UI.WebControls.ChartPreviewImage#loadChartImage` 函数位于 `Microsoft.Office.Server.Chart.dll` 中:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


定位漏洞触发函数 `loadChartImage` :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


通过 `CustomSessionState#FetchBinaryData` 从参数 `sessionKey` 中提取字节数组,然后利用 `BinaryFormatter` 进行反序列化操作。`loadChartImage` 在 `renderChartImage` 函数中被调用,而 `renderChartImage` 又被 `Render` 调用:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


进入 `Render` 函数:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


提取 `sk` 参数赋值给 `sessionKey`,当不为空时将调用 `renderChartImage` 函数,进而调用 `loadChartImage` :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


`ChartPreviewImage` 继承于 `Page` 类,对应一个 ASPX 页面处理类。通过搜索发现访问 `/_layouts/15/Chart/WebUI/Controls/ChartPreviewImage.aspx` 页面调用了 `ChartPreviewImage` 函数:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


构造测试请求触发 `loadChartImage` 中的断点:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


进入 `FetchBinaryData` 函数:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


一直跟到对 `sessionKey` 进行解析的函数 `StateKey#TryParseKey`:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


参数 `sessionKey` 合法格式是 `g1_g2` 。其中 `g1` 用于从数据库中读取 `StateDatabase` 对象,将与 `g2` 用于构建 `StateKey` 对象( `ChartImageSessionBlock` 类型 )。


总结从 HTTP 请求到反序列化触发的调用过程如下:


ChartPreviewImage#Render  ->ChartPreviewImage#renderChartImage    ->ChartPreviewImage#loadChartImage //get payload from CustomSessionState#FetchBinaryData        ->BinaryFormatter#.Deserialize


0x02 CVE-2022-29108


CVE-2022-29108 反序列化触发点类似,回到 `ChartPreviewImage#Render` 函数,定位第 86 行:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


当 HTTP 参数传递满足一定条件时,可以调用 `base.FetchFromCurrentWorkingSet` :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


与 CVE-2022-22005 一样,通过 `CustomSessionState#FetchBinaryData` 函数提取反序列化数据。进入 `FetchBinaryData` 函数的前提是 `CustomSessionStateKey` 非空,查看 `CustomSessionState#OnLoad` 函数:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


只需要增加 GET 参数 `csk` 用来给 `CustomSessionStateKey` 赋值即可,然后调用 `BinaryFormatter` 进行了反序列化操作。构造请求触发断点:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


总结从 HTTP 请求到反序列化触发的调用过程如下:


ChartPreviewImage.Render  ->ChartAdminPageBase.FetchFromCurrentWorkingSet    ->ChartAdminPageBase.currentWorkingSet //get      ->BinaryFormatter.Deserialize
漏洞触发构造


CVE-2022-22005 和 CVE-2022-29108 反序列化触发的过程是一样的,只是传递的 HTTP GET 参数不同。下面想办法构造参数来传递给 `CustomSessionState#FetchBinaryData` 函数。回顾 ZDI 发布的漏洞 CVE-2021-27076 :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


在 SharePoint 的 InfoPath 功能中,文档被序列化并以会话的状态进行存储。最终可以通过从会话状态中读取数据并通过 `BinaryFormatter` 进行反序列化操作,从而实现 RCE 。CVE-2022-22005 和 CVE-2022-29108 也是类似的,下面我们分析一下 InfoPath 上传文件的机制,参考如下:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


通过 Edit Item 来编辑创建的 app :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


启动 infoPath 并推送创建 new Item:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


新增附件:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


在返回包中获取了 state key :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


接下来 ZDI 提到了页面 `FormServerAttachments.aspx` :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


从描述来看,返回客户端的内容是附加文件下载,定位 `FormServerAttachments`:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


重点关注函数 `FileDownload` :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


GET 请求传递的参数 `fid` 、 `sid` 、 `key` 、 `dl` 要求非空并且 `dl` 的取值必须为 `fa` 或者 `ip` :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


从参数 `sid` 提取 `solutionById` ,然后通过 `Canary.VerifyCanaryFromCookie` 验证 Cookie:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


进入 `Canary.VerifyCanaryFromCookie` 函数:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


Cookie 格式为 `_InfoPath_CanaryValue***` ,后缀就是上面传递的 `sid` 参数的值,可以在请求数据包的 Cookie 中找到对应的值:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


Cookie 验证通过后,进入如下代码段:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


`value` 来自参数 `key`,进入 `DeserializeObjectsFromString` 函数:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


可见 `value` 应该是 Base64 编码格式,获取了 `binaryReader` 对象。继续往下走,对 `binaryReader` 进行的第一个读操作为 `Base64DataStorage.Base64DataItem` :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


所以 `key` 包含三个值,如下:


  • `Base64ItemState` 枚举类型,取值如下:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


  • `Base64DataStorage.Base64DataItem.DataTypeInSessionState` 枚举类型,取值如下:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


  • `Base64SerializationId` ,定义如下:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


继续往下走,对 `binaryReader` 进行的第二个读操作为 `((IBinaryDeserializable)stateInfo).Deserialize` :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


所以 `key` 还包含以下三个值:


  •  `reader.ReadString` 对应 `_serializedKey` 序列化字符串

  •  `reader.ReadCompressedInt` 对应 `_size` 大小 整数

  •  `reader.ReadCompressedInt` 对应 `_version` 版本 整数


接下来通过 `StateKey#ParseKey` 实例化 `StateKey` 对象:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


回顾前面分析过程,`stateInfo.SerializedKey` 的格式为 `g1_g2` ,接着调用 `EnsureData` 函数:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


`Base64DataStorage.State` 必须取值为 `Base64ItemState.DelayLoad` 才会成功获取 `sessionData`。综上所述, 参数 `key` 的值结构如下所示:


  •   `Base64ItemState`                 类型:`int`          取值:`4`

  •   `DataTypeInSessionState`    类型:`int`          取值:`2`

  •   `Base64SerializationId`      类型:`String`    取值:无要求

  •   `_serializedKey`                   类型:`String`     取值:`g1_g2`

  •   `_size`                                   类型:`int`           取值:无要求

  •   `_version`                             类型:`int`            取值:无要求


可以自己构造代码生成参数 `key` ,由于 SharePoint 提供的 `EnhancedBinaryWriter` 等类存在 `internal` 修饰符,所以无法直接引入 DLL 进行调用,根据 `Microsoft.Office.InfoPath.Server.dll` 代码逻辑自行改写如下生成 `key` 的辅助代码:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


最后看下 `FileDownload` 函数的返回:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


当 `strA` (来自参数 `dl`) 不等于 `fa` (即必须取值为 `ip`)时,将会以文件下载的形式返回前端。


漏洞复现


利用 `ysoserial.exe` 生成 `BinaryFormatter` 反序列化的 payload  (这里选择 DataSet Gadget):


ysoserial.exe -o raw -f BinaryFormatter -g DataSet -c calc > calc.bin


利用 InfoPath 创建新的 Item ,上传附件选择上面生成的 `calc.bin` ,过程见前面分析,这里不再重复。选择生成的 payload 加载到附件:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


返回的 state key 为:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


利用自定义的代码生成 `key` 。构造 `formserverattachments.aspx` 请求:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


返回 `attachmentId`:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


以 CVE-2022-22005 为例,构造 `ChartPreviewImage.aspx` 请求:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


触发 RCE :


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


类似也可以构造 CVE-2022-29108 请求实现 RCE:


漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现


有兴趣获取完整环境搭建、工具源码、漏洞分析与复现过程的小伙伴,请加入我们的漏洞空间站-致力于打造优质漏洞资源和小伙伴聚集地!



由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。



★且听安全-点关注,不迷路!

漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现



★漏洞空间站-优质漏洞资源和小伙伴聚集地!

漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现

原文始发于微信公众号(且听安全):漏洞空间站上线啦!CVE-2022-29108&CVE-2022-22005 SharePoint远程命令执行漏洞分析与复现

相关文章

2 条评论

您必须登录才能参与评论!
立即登录
  • Mike1992
    Mike1992 游客

    hey man. Can you share the key generator codes? I searched everywhere but couldn’t find anything useful.