前言
这是我们2018年Top 5趣案系列中的第三个案例。这些漏洞都有一些因素使它们从今年发布的大约1,400个报告中脱颖而出。今天我们将分析一个Exchange漏洞,它允许任何经过身份验证的用户冒充Exchange Server上的其他用户。
在ZDI的Dustin Childs 12月的文章 中,他提到了一个Exchange漏洞,允许Exchange服务器上的任何用户冒充该Exchange服务器上的任何人。虽然这个漏洞可以用于一些内网的劫持,但这个漏洞更有可能被用于钓鱼活动、窃取数据或其他恶意软件操作。作为2018年Top 5趣案系列的一部分,本文深入研究了这个SSRF(服务器端请求伪造)漏洞的细节,并展示了冒充过程是如何实现的。
漏洞
该漏洞是由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
冒充管理员。
Exploit
为了演示,我们将使用几个Python脚本:
serverHTTP_relayNTLM.py
– 通过入站连接获取NTLM散列并用于EWS身份验证
exch_EWS_pushSubscribe.py
– 导致PushSubscription EWS调用serverHTTP_relayNTLM.py
你可以在这里下载这些脚本。你还需要python-NTLM模块。
漏洞的第一步是获取我们要冒充的用户的SID。一种可能的使用方法是这样的:
- 以授权用户身份登录OWA。在这里,我们以“攻击者”身份登录:
- 接下来,创建任意新文件夹。在这个例子中,我们使用了temfold。点击context中“Permissions…”选项:
- 在这里,添加要冒充的人的电子邮件。我们的目标是受害者
victim@contoso.local
: - 现在我们需要按F12键并选择Network选项。然后在新文件夹中再次选择context中“Permissions…”选项。
- 我们需要检查第一个
service.svc?action=GetFolder
请求的响应。查看方法:Body->ResponseMessages->Items->0->Folders->0->PermissionSet->Permissions->N->UserId->SID
。
在这个例子中,N是2(最新的),但是你可以全部检查一遍以便找到正确的。PrimarySmtpAddress应该是理想的受害者。如果响应不包含PermissionSet项,则需要检查另一个service.svc?action=GetFolder
请求。 - 我们将在
serverHTTP_relayNTLM.py
中使用这个SID来冒充受害者。另外,我们还需要选择在攻击者控制的计算机上不太可能被阻止的TCP端口,这些端口将允许Exchange Server上的外部连接。例如,TCP端口8080可能可用。
现在,让我们用真实信息更改serverHTTP_relayNTLM.py
中的下一行:
一旦脚本有了正确的变量,就可以启动了: - 下一步是在
Exch_EWS_PushSubscribe.py
脚本中设置适当的变量:
一旦完成,我们就可以执行以下脚本: - 最后一步。我们需要一些事件触发推送通知。如果可以等待一段时间,或者我们也可以执行一些操作,比如创建和发送新的电子邮件,或者删除我们的新文件夹:
-
如果成功,我们应该接收从Exchange服务器到serverHTTP_relayNTLM.py
的入站连接:
如果攻击成功,我们将在最后一个响应中看到UpdateInboxRulesResponse ResponseClass=“Success”
。这意味着入站规则已添加到受害者邮箱中,所有入站电子邮件都将转发给攻击者。
现在一切就绪,是时候测试了。我们需要从任意帐户向受害者发送电子邮件,但与我们新规则中的目的地不相同(在本例是attacker@contoso.local),因为如果源和目的地是相同的地址,则该规则不会转发电子邮件。让我们以管理员身份登录并向受害者发送一些“敏感”信息:
检查攻击者的收件箱,我们看到消息成功转发:
正如我们所看到的,新的邮件被转发给攻击者。类似的结果可以通过其他EWS API实现,比如AddDelegate或将编辑权限分配给目标文件夹。
修补
微软将该漏洞分配为CVE-2018-8581,并在11月份发布时给出缓解措施。实际上这个漏洞还没有修补程序。相反,Microsoft强调应该删除注册表项。删除这个键可启用回送检查。回想上面的内容,Exchange服务器默认设置了以下注册表项:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaDisableLoopbackCheck = 1
如果删除HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaDisableLoopbackCheck
键,则漏洞不可以。若要删除注册表项,请在CMD窗口中输入以下命令:
删除密钥后不需要重新启动或Exchange Server。公告指出,将来Exchange的更新在默认情况下将不再启用注册表项。
结论
电子邮件已经成为我们商业生活的核心组成部分,Exchange Server多年来一直是一个热门的目标。该漏洞允许冒充用户,通过以前报告的漏洞允许任意代码执行。这两种情况都表明,有时最大的安全风险来自内部。这些漏洞还展示了外部攻击者如何从单个入口点在整个企业中扩散。