Microsoft Exchange任意用户伪造漏洞分析(CVE-2018-8581)
本文将详细分析Microsoft Exchange的任意用户伪造漏洞,该漏洞允许任何经过身份验证的用户冒充Exchange Server上的其他任意用户。
来自ZDI的Dustin Childs在不久前曾发表了关于Exchange漏洞的分析文章。尽管该漏洞可以用于某些工作场景的用户伪造,但更有可能的是,这一漏洞会被攻击者用于进行网络钓鱼、数据窃取或是其他恶意活动。在本文中,将深入分析这一服务器端请求伪造(SSRF)漏洞的详细信息,并复现了仿冒用户的方法。
漏洞详情
这一用户伪造漏洞,是由SSRF漏洞与其他漏洞相结合而产生的。Exchange允许任何用户为推送订阅(Push Subscription)指定所需的URL,服务器将尝试向这一URL发送通知。这一漏洞之所以存在,是因为Exchange Server使用CredentialCache.DefaultCredentials进行连接:
在Exchange Web服务中,CredentialCache.DefaultCredentials会以NT AUTHORITY\SYSTEM权限运行。这将导致Exchange Server将NTLM哈希值发送到攻击者的服务器。Exchange Server默认情况下还设置了以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\DisableLoopbackCheck = 1
这样一来,就允许我们使用这些NTLM哈希值进行HTTP身份验证。例如,可以使用这些哈希值来访问Exchange Web服务(EWS)。由于它正在以NT AUTHORITY\SYSTEM权限运行,所以攻击者可以与TokenSerializationRight进行“特权”会话,然后利用SOAP头部模拟任何想要伪装的用户。
我们使用SID为S-1-5-21-4187549019-2363330540-1546371449-500的用户,伪装成管理员用户,其SOAP头部如下:
漏洞利用
在漏洞演示中,我们会使用到几个Python脚本:
1、serverHTTP_relayNTLM.py:从入站连接中,获取NTLM哈希值,并将其用于Exchange Web服务的身份验证;
2、Exch_EWS_pushSubscribe.py:使用URL,将推送订阅(Push Subscribe)Exchange Web服务调用到serverHTTP_relayNTLM.py之中。
各位读者可以在附录中找到这些脚本的源代码。此外,还需要Python中的python-ntlm模块。
漏洞利用的第一步,需要首先获取我们想要伪装的用户的SID。下面,将介绍一种可行的方案。
1、以授权用户的身份登录OWA。在这种情况下,我们以“attacker”(攻击者)的身份登录。
2、接下来,创建任意新文件夹。我们创建的文件夹名称为“tempFold”(临时文件夹)。单击菜单中的“Permissions…”(权限…)选项。
3、在这里,添加目标用户(受害者)的电子邮件地址以进行模拟。在示例中,我们的目标是victim@contoso.local。
4、现在,我们需要按F12键,并选择“Network Tab”(网络选项卡)。之后,再次在新文件夹的菜单中选择“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中的相应位置。
一旦脚本中具有正确的变量,我们就可以开始接下来的工作了。
7、下一步,是在Exch_EWS_pushSubscribe.py脚本中,设置适当的变量。
完成后,我们就可以执行该脚本。
本文将详细分析Microsoft Exchange的任意用户伪造漏洞,该漏洞允许任何经过身份验证的用户冒充Exchange Server上的其他任意用户。
来自ZDI的Dustin Childs在不久前曾发表了关于Exchange漏洞的分析文章。尽管该漏洞可以用于某些工作场景的用户伪造,但更有可能的是,这一漏洞会被攻击者用于进行网络钓鱼、数据窃取或是其他恶意活动。在本文中,将深入分析这一服务器端请求伪造(SSRF)漏洞的详细信息,并复现了仿冒用户的方法。
漏洞详情
这一用户伪造漏洞,是由SSRF漏洞与其他漏洞相结合而产生的。Exchange允许任何用户为推送订阅(Push Subscription)指定所需的URL,服务器将尝试向这一URL发送通知。这一漏洞之所以存在,是因为Exchange Server使用CredentialCache.DefaultCredentials进行连接:
在Exchange Web服务中,CredentialCache.DefaultCredentials会以NT AUTHORITY\SYSTEM权限运行。这将导致Exchange Server将NTLM哈希值发送到攻击者的服务器。Exchange Server默认情况下还设置了以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\DisableLoopbackCheck = 1
这样一来,就允许我们使用这些NTLM哈希值进行HTTP身份验证。例如,可以使用这些哈希值来访问Exchange Web服务(EWS)。由于它正在以NT AUTHORITY\SYSTEM权限运行,所以攻击者可以与TokenSerializationRight进行“特权”会话,然后利用SOAP头部模拟任何想要伪装的用户。
我们使用SID为S-1-5-21-4187549019-2363330540-1546371449-500的用户,伪装成管理员用户,其SOAP头部如下:
漏洞利用
在漏洞演示中,我们会使用到几个Python脚本:
1、serverHTTP_relayNTLM.py:从入站连接中,获取NTLM哈希值,并将其用于Exchange Web服务的身份验证;
2、Exch_EWS_pushSubscribe.py:使用URL,将推送订阅(Push Subscribe)Exchange Web服务调用到serverHTTP_relayNTLM.py之中。
各位读者可以在附录中找到这些脚本的源代码。此外,还需要Python中的python-ntlm模块。
漏洞利用的第一步,需要首先获取我们想要伪装的用户的SID。下面,将介绍一种可行的方案。
1、以授权用户的身份登录OWA。在这种情况下,我们以“attacker”(攻击者)的身份登录。
2、接下来,创建任意新文件夹。我们创建的文件夹名称为“tempFold”(临时文件夹)。单击菜单中的“Permissions…”(权限…)选项。
3、在这里,添加目标用户(受害者)的电子邮件地址以进行模拟。在示例中,我们的目标是victim@contoso.local。
4、现在,我们需要按F12键,并选择“Network Tab”(网络选项卡)。之后,再次在新文件夹的菜单中选择“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中的相应位置。
一旦脚本中具有正确的变量,我们就可以开始接下来的工作了。
7、下一步,是在Exch_EWS_pushSubscribe.py脚本中,设置适当的变量。
完成后,我们就可以执行该脚本。
www.wnhack.com