前言微软在上半年三月披露了关于Exchange邮件服务器’CVE-2021–26855’(SSRF)与’CVE-2021–27065’(任意文件写入)的漏洞,这两个漏洞配合可以造成未授权的webshell写入,是非常严重的高危漏洞。…
前言
微软在上半年三月披露了关于Exchange邮件服务器CVE-2021–26855
(SSRF)与CVE-2021–27065
(任意文件写入)的漏洞,这两个漏洞配合可以造成未授权的webshell写入,是非常严重的高危漏洞。漏洞刚出来那会儿并未注意,正好前两天4哥在群里发了个关于该漏洞的复现环境,重新想起这个事,正好暑假也没干啥正事,借此机会复现分析一下。
CVE-2021–26855
CVE-2021–26855
是⼀个SSRF,只需要能够访问Exchange服务器,攻击者可以不经过任何类型的身份验证来利⽤此漏洞。
相关漏洞在C:\Program Files\Microsoft\ExchangeServer\V15\FrontEnd\HttpProxy\bin
目录下的Microsoft.Exchange.FrontEndHttpProxy.dll
进入ProxyModule
类的OnPostAuthorizeRequest
函数,该函数用于对post请求的安全检查,函数中继续调用了该类的OnPostAuthorizeInternal
函数。
OnPostAuthorizeInternal
函数中调用SelectHandlerForUnauthenticatedRequest
函数,从函数名称上来看该函数作用为:寻找对未验证安全请求的处理方法。
跟进SelectHandlerForUnauthenticatedRequest
函数,发现对不同的ProtocolType
,生成了不同的 httpHandler
。而这个ProtocolType
正是url中的web子目录,比如请求/ecp/n.png
,ProtocolType
就是ecp。
当ProtocolType
为ecp时,如果BEResourceRequestHandler
类的CanHandle
函数返回值为真,就会使用BEResourceRequestHandler
作为处理方法。
可以看到如果要返回真,则需要同时让GetBEResouceCookie
和IsResourceRequest
函数同时返回值为真。跟进这两个函数。
先看GetBEResouceCookie
,该函数要请求cookies中一个BEResource
字段的值,实际上就是X-BEResource
。
那么在cookies中设置一个X-BEResource
字段的值即可。
IsResourceRequest
则是需要请求路径以.js
,.png
等结尾。
这时候回到OnPostAuthorizeInternal
函数中,由于BEResourceRequestHandler
是继承于ProxyRequstHandler
类的,就会执行((ProxyRequestHandler)httpHandler).Run(context)
,最终在HttpContext.RemapHandler
中把该httpHandler设置给this._remapHandler
,即是context.Handler。
又调用了Handler.BeginProcessRequest()
,此时Handler为BEResourceRequestHandler
,该类没有BeginProcessRequest
函数,但却继承了ProxyRequestHandler
。因此实际上调用的是ProxyRequestHandler.BeginProcessRequest()
函数。
BeginProcessRequest
函数创建线程调用ProxyRequestHandler.BeginCalculateTargetBackEnd
函数。该函数作用是根据Cookie中的X-BEResource
字段来判断与生成指向BackEnd的目标url。
继续跟入,BeginCalculateTargetBackEnd
调用ProxyRequestHandler.InternalBeginCalculateTargetBackEnd
方法。
InternalBeginCalculateTargetBackEnd
调用BEResourceRequestHandler.ResolveAnchorMailbox
方法。
BEResourceRequestHandler.ResolveAnchorMailbox
方法会获取X-BEResource
字段。
跟入查看BackEndServer.FromString
函数,会发现它依据~
符号切割beresourceCookie
字符串,前半段作为fqdn,后半段作为version。
fqdn为:全限定域名。在邮件中例如:sd@vip.com
而version指的是BackEndServer Version。
fqdn和verison变量将在ProxyRequestHandler.BeginProxyRequest
函数中调用的的GetTargetBackEndServerUrl
函数进行调用。
由于BackEndServer.Fqdn
是可控的,clientUrlForProxy.Host
则是可控的。
继续看ProxyRequestHandler.BeginProxyRequest
后面,ProxyRequestHandler.CreateServerRequest
将吧uri发送给后端服务器。
跟踪ProxyRequestHandler.CreateServerRequest
,函数中PrepareServerRequest
将进行uri代理请求的身份认证判断。
通过最后一个else绕过认证,达到一个SSRF漏洞攻击的过程。
CVE-2021–27065
CVE-2021–27065
是⼀个任意⽂件写⼊漏洞,它需要登陆的管理员账号权限才能触发。而CVE-2021–26855
正好可以为我们提供了管理员账号权限。
编辑OAB配置,在外部链接中写⼊shell并保存。
http://aaa/<script language="JScript" runat="server">function Page_Load(){eval(Request["SD"],"unsafe");}</script>
保存后选择重置虚拟目录
写下shell位置为:\\127.0.0.1\c$\inetpub\wwwroot\aspnet_client\sd.aspx
参考
https://www.praetorian.com/blog/reproducing-proxylogon-exploit/
- 本文作者: ccYo1
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/539
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!