2

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

 2 years ago
source link: https://3gstudent.github.io/ProxyShell%E5%88%A9%E7%94%A8%E5%88%86%E6%9E%901-CVE-2021-34473
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

12 Aug 2021

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/[email protected]/mapi/nspi/?&Email=autodiscover/autodiscover.json%[email protected]

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

Alt text

权限为System

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

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

Alt text

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

Exchange Web Service(EWS)对应邮箱用户的邮件内容,关于EWS的使用可以参考之前的文章《Exchange Web Service(EWS)开发指南2——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#L48-L64

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攻击链的基础,验证简单,危害巨大。站在防御的角度,建议用户尽快更新补丁。


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK