ProxyShell 利用分析1——CVE-2021-34473

发布于 2024-12-17 08:49:34 字数 5389 浏览 5 评论 0

0x00 前言

Orange 在今年的 BlackHat 演讲中介绍了在 Pwn2Own 2021 上使用的 Microsoft Exchange 攻击链,他分享的 内容 给了我很大的启发。

本文仅在技术研究的角度记录我在研究 ProxyShell 中的细节,分析利用思路。

0x01 简介

本文将要介绍以下内容:

  • 调试环境搭建
  • 漏洞分析
  • 利用思路

0x02 调试环境搭建

1.禁用 Visual Studio 中的调试优化

设置环境变量 COMPLUS_ZapDisable=1

重启系统

2.查看 Exchange 中对应的进程

执行命令:

C:\Windows\System32\inetsrv\appcmd list wp

可以获得 Exchange 的所有进程和对应的 pid,如下图

Alt text

3.使用 dnSpy 进行调试

打开相关的 dll 文件并在待调试的位置下断点,选择附加进程开始调试

如果不确定待调试的 Exchange 进程,可以选择所有 w3wp.exe

0x03 漏洞调试

使用 dnSpy 打开文件 C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\bin\Microsoft.Exchange.FrontEndHttpProxy.dll

依次定位到 Microsoft.Exchange.Clients.Owa.Core -> Microsoft.Exchange.HttpProxy

关于 SSRF 漏洞(CVE-2021-34473) 的漏洞原理可以参考如下文章:

https://peterjson.medium.com/reproducing-the-proxyshell-pwn2own-exploit-49743a4ea9a1

0x04 漏洞分析

1.判断漏洞是否存在

这里使用 Orange 原文给出的方法:

访问:https:///autodiscover/autodiscover.json?@foo.com/mapi/nspi/?&Email=autodiscover/autodiscover.json%3f@foo.com

如果漏洞存在,返回如下结果:

如下图

Alt text

权限为 System

url 地址中的"/mapi/nspi"为 Exchange 服务器访问的最终地址

url 地址中的"?&Email=autodiscover/autodiscover.json%3f@foo.com"作为参数,这是为了满足漏洞触发的条件。此处还可以通过设置 Cookie 的内容为"Email=Autodiscover/autodiscover.json%3f@foo.com"实现相同的效果,源码如下图

Alt text

2.通过 SSRF 漏洞调用 Exchange Web Service(EWS)

Exchange Web Service(EWS) 对应邮箱用户的邮件内容,关于 EWS 的使用可以参考之前的文章 《Exchange Web Service(EWS) 开发指南 2——SOAP XML message》 %E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%972-SOAP-XML-message),通过发送 XML 请求,能够获得对应用户的邮件内容

由于 SSRF 默认的权限为 System,所以我们需要找到能够模拟任意邮箱用户的方法,才能够读取对应用户的邮件内容

经过一段时间的调试,我没有找到通过参数指定 EWS 认证用户的方法,但是这里我们可以使用 Exchange 提权漏洞(CVE-2018-8581) 中的技巧,通过在 Header 中使用 SerializedSecurityContext,指定 SID 可以实现身份伪装,从而以指定用户身份进行 EWS 调用操作

代码地址:https://github.com/thezdi/PoC/blob/master/CVE-2018-8581/serverHTTP_relayNTLM.py

Header 格式如下:

    <soap:Header>
     <t:RequestServerVersion Version="Exchange2016" />

<m:SerializedSecurityContext>
<m:UserSid>'''+VICTIM_SID+'''</m:UserSid>
<m:GroupSids>
   <m:GroupIdentifier>
     <t:SecurityIdentifier>'''+VICTIM_SID+'''</t:SecurityIdentifier>
   </m:GroupIdentifier>
</m:GroupSids>

<RestrictedGroupSids>
<RestrictedGroupIdentifier> </RestrictedGroupIdentifier>
</RestrictedGroupSids>
</m:SerializedSecurityContext>

</soap:Header>

为了获得用户的 SID,我们可以使用 Exchange SSRF 漏洞(CVE-2021-26855) 中的技巧,通过访问/autodiscover/autodiscover.xml 获得 legacyDn,作为参数继续访问/mapi/emsmdb,就能够获得用户对应的 sid

至此,整个利用链完成,流程如下:

1.访问/autodiscover/autodiscover.xml 获得 legacyDn 2.访问/mapi/emsmdb 获得用户对应的 sid 3.在 Header 中使用 SerializedSecurityContext,指定用户身份进行 EWS 调用操作

3.枚举邮箱用户列表

我在之前的文章 《渗透技巧——获得 Exchange GlobalAddressList 的方法》 提到过:“Exchange GlobalAddressList(全局地址列表) 包含 Exchange 组织中所有邮箱用户的邮件地址,只要获得 Exchange 组织内任一邮箱用户的凭据,就能够通过 GlobalAddressList 导出其他邮箱用户的邮件地址。”

这里也是可以进行利用的,我们只需要使用 FindPeople 操作,做一个遍历并进行结果去重即可

实现细节可以参考之前开源的脚本:https://github.com/3gstudent/Homework-of-Python/blob/master/ewsManage.py

4.默认邮箱用户

为了读取 Exchange GlobalAddressList(全局地址列表),我们需要获得 Exchange 组织内任一邮箱用户的凭据,对应到这个漏洞,我们仅仅需要邮箱用户名称

Exchange 中默认存在以下四个用户可供使用:

  • SystemMailbox{bb558c35-97f1-4cb9-8ff7-d53741dc928c}
  • SystemMailbox{e0dc1c29-89c3-4034-b678-e6c29d823ed9}
  • SystemMailbox{D0E409A0-AF9B-4720-92FE-AAC869B0D201}(Exchange 2016 CU8 and later)
  • SystemMailbox{2CE34405-31BE-455D-89D7-A7C7DA7A0DAA}(Exchange 2016 CU8 and later)

参考资料:https://docs.microsoft.com/en-us/exchange/architecture/mailbox-servers/recreate-arbitration-mailboxes?view=exchserver-2019

0x05 小结

CVE-2021-34473 作为 ProxyShell 攻击链的基础,验证简单,危害巨大。站在防御的角度,建议用户尽快更新补丁。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

上一篇:

下一篇:

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

幸福丶如此

暂无简介

文章
评论
26 人气
更多

推荐作者

七七

文章 0 评论 0

囍笑

文章 0 评论 0

盛夏尉蓝

文章 0 评论 0

ゞ花落谁相伴

文章 0 评论 0

Sherlocked

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文