type
status
date
slug
summary
tags
category
icon
password
Breaking The Barriers
PS:拿到env信息后可以放在自己宿主机的终端上执行 wiz平台网络会存在不稳定
初始访问
路线提示:
基础环境:
我们根据题意猜解一下攻击路线:
我们有client,但是应该没有访问权限,因此需要利用$WEB_APP_ENDPOINT去利用接口接管,进而进行后续操作(甚至获取flag)。
权限提升
首先我们尝试登录client,但是报错
类似
AADSTS90002
的错误是因为这个租户在 Azure 未订阅或者长时间不活跃,又或者tenant_id不正确,可尝试加上 --allow-no-subscriptions
参数进行无订阅登录,详见:https://stackoverflow.com/questions/63226826/azure-login-for-tenant-failing-for-az-app-principal-with-no-subscription-found-m还是一样报错,基本可以确认是tenant_id不正确。
接下来从$WEB_APP_ENDPOINT寻找信息
直接curl能获取到网页和它的前端源代码,这里就是题目提到的sso认证。

带有一个创建用户的接口 且带有谷歌验证器

我们尝试构造创建一下账户 直接skipRecaptcha=true即可绕过 token可以是任意值
(这里是因为wiz经常会断连 所以我简化一条龙命令获取可以用于登陆的VICTIM_TENANT_ID)
其中UPN 是 User Principal Name,格式通常为
username@domain.com
也就是我们create_user接口返回的邮箱最后一步就是利用 Azure 的 OpenID discovery 机制动态获取某个域名(组织)的租户ID。${UPN#*@}就是域名,这部分可以参考文章:https://www.mistercloudtech.com/2023/07/11/get-the-tenant-id-for-any-microsoft-entra-tenant/

🔎 进一步参考
- thexyz.com: 如何获取租户ID和客户端ID。
- medium.com: 使用 OpenID Connect 获取租户元信息的机制。
- jiangong-sun.medium.com: 对 Tenant ID、Client ID 与 Object ID 区别的说明。
写在我们可以尝试登录azure-cli了

成功登录之后就是翻信息
查询groups的时候确实看到了CTF标签
拿到
membershipRule
后,我苦恼许久,GID+RID一直没有访问权限(后面讲怎么获取GID+RID),以为是gourp太多结果导致需要FUZZ+正则,就各种
$filter=department eq 'Finance' and jobTitle eq 'Manager'"
去“捞人”。结果在neko的解惑下发现这个另有出路另外先放一边 拿一下更多信息
- az account get-access-token 查看token权限
- 获取flag组的GID+RID
az rest --method GET --url "https://graph.microsoft.com/beta/groups" 可以招到GID

获取RID
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/servicePrincipals/$rid”
返回::权限不够

账户邀请
之前没怎么关注User.Invite.All权限,在neko和dvk的指点下领悟过来的,果然ctf的每一个设计都有用到的地方。我们的token是拥有一个权限叫做User.Invite.All,也就是可以邀请其他人加入组织
再加上我们之前命中的规则:
• (user.displayName -startsWith "CTF") and (user.userType -eq "Guest")
这样你的来宾账号会自动被收进目标组。由于该组已被分配到企业应用“CTF Challenge Flag”,你这个来宾账号就会被认为“有权使用该应用”。
- 发送邀请
- 用 Graph 创建邀请,直接把显示名设成 CTF 开头;设置 sendInvitationMessage=false,这样响应里会返回
inviteRedeemUrl
,你可以直接点链接完成接受,无需真的收邮件。

• 记下响应里的
inviteRedeemUrl
。用浏览器打开它,按提示用你的邮箱对应的账号登录完成“接受邀请”。
这里再返回到我们之前尝试获取rid提示没有权限,使用来宾账户即有权限,我们先用az login --device-code 免账密登录比较方便
这时候我们再次执行
能获取到flag的存储桶地址
当然我们直接点击https://myapps.microsoft.com/里面的wzi flag 也是直接能访问到存储桶
但是它提示我们没有权限访问 这时候直接拿当前账户的token
ACCESS_TOKEN=$(az account get-access-token --resource https://storage.azure.com --query accessToken -o tsv)
再结合Azure存储服务的底层REST API中的
x-ms-version: 2023-11-03
(API版本控制)和x-ms-date: $(date -u '+%a, %d %b %Y %H:%M:%S GMT')
(请求时效性与安全)
构造curl即可,这一步骤pwnlab有类似题目https://labs.pwnedlabs.io/azure-blob-container-to-initial-access("x-ms-version: 2019-12-12”)