文章总结: 本文揭示了一种针对MicrosoftEntraID的新型攻击路径EvilVM,攻击者通过滥用AzureVM的Entra登录扩展功能,结合设备代码钓鱼技术窃取PrimaryRefreshToken(PRT),实现从访客权限到全局管理员的权限提升。攻击链包含攻陷访客账户、创建恶意订阅、部署无TPM保护的VM、窃取PRT等关键步骤,并提供了针对性的检测与缓解建议。
综合评分: 87
文章分类: 渗透测试,红队,内网渗透,漏洞分析,云安全
“恶意 VM”:九个简单步骤,从访客沦陷到 Entra 全局管理员
Simon
Simon
securitainment
2026年4月3日 16:54
中国香港
在小说阅读器读本章
去阅读
| 原文链接 | 作者 |
| — | — |
| https://www.beyondtrust.com/blog/entry/evil-vm | Simon Maxwell-Stewart |
这篇博客揭示了 Microsoft Entra ID (原 Azure AD) 中一条新颖的攻击路径:攻击者可利用一个鲜为人知的 Azure VM 功能,将权限从访客访问一路提升到完整的 Entra 管理权限。通过把设备身份滥用与窃取 Primary Refresh Token (PRT) 的钓鱼技术结合起来,攻击者能够绕过传统安全控制并实施隐蔽的横向移动。基于我们此前关于 Restless Guests 的研究,本文将拆解“Evil VM”攻击链的每一个阶段,并为防御者提供用于检测和缓解这类风险的实用建议。
滥用设备身份信任并钓取 Primary Refresh Token (PRT)
“如果说我看得更远,那是因为我站在巨人的肩膀上。” – Isaac Newton
特别感谢 Dirk-jan Mollema 发布 ROADtools、撰写下文将引用的钓鱼攻击,并慷慨帮助我调试和修复 transport key解密问题。也衷心感谢 Dr. Nestori Syynimaa 分享 AADInternals,其中丰富的博客与工具同样是本文所述攻击能够完成的关键。最后还要感谢我的经理 Fletcher Davis,他为我指明了方向,并推动我不要放弃。
在这篇博客中,我们将探讨如何利用一个冷门的 Azure VM 功能来绕过那些通常用于阻止用户将设备加入 Entra ID 的控制措施。随后,我们会演示如何把这种滥用方式与已知的 Primary Refresh Token (PRT) 窃取技术结合起来,并说明这些技术如何放大防御者面临的风险。最后,我们将介绍缓解这些 Entra ID 横向移动技术 所必需的关键防御措施。
本文建立在我们此前关于 Restless Guests 的研究之上。在那项研究中,我们展示了 Entra ID (原 Azure AD) 中的 B2B 访客如何在未获得明确授权的情况下,成为你租户内某个订阅的所有者。我们还会花一些篇幅,详细说明如何把一个“restless guest”植入目标目录。
理解 Entra ID 安全中的设备身份
先从 Entra ID 中设备的基础概念讲起。设备是一类较为特殊的安全主体。它们虽然可以向目录进行身份验证,但不能像用户或服务主体那样被直接分配 Directory 角色或 RBAC 角色。例如,设备本身不能主动请求访问令牌。
设备的主要用途是提供身份,使其能够被监控、被保护,并被管理员用于判定对资源的访问权限。举例来说,使用受信任设备的用户,可能会比使用不受信任设备身份的用户获得更多访问权限。这通常通过条件访问策略实现,其中设备是决定策略是否向用户放行某项资源的关键信号。
若想进一步了解 Entra ID 中的设备管理,可阅读 Dr. Nestori Syynimaa 关于已加入设备与已注册设备的文章。
设备 (终端) 是 Microsoft Zero Trust 理念中的关键组成部分。设备可以是 Registered、Joined,或 Hybrid Joined 到 Azure AD。条件访问会把设备信息作为允许或阻止访问服务的判定标准之一。– Dr Nestori Syynimaa (@DrAzureAD)
来源:AADInternals.com
设备在 Entra 目录中获得身份的方式,要么是作为 “registered devices” (用户自带设备,即 “bring-your-own-devices”),要么是作为 “joined devices” (组织拥有的设备)。在这两种场景下,Entra ID 都会通过一组私钥 / 公钥证书为设备生成唯一的设备身份。
除证书之外,transport key还增加了一层关键安全保护。该密钥会对从 Entra ID 发送到设备的敏感数据进行加密,并起到“持有证明” (proof of possession) 的作用,因为只有持有该密钥的设备才能解密这些内容。鉴于这些证书和密钥对设备身份与安全都至关重要,它们通常会被保护在 Trusted Platform Module (TPM) 中。TPM 是 Windows 机器上的一种硬件安全芯片 (或固件模块),专门用于安全存储和管理加密密钥与机密信息。
对攻击者而言,设备行为中一个尤其重要的点,是 Entra ID 如何向已加入设备签发 Primary Refresh Token。下面我们就来进一步看看 PRT。
什么是 Primary Refresh Token (PRT),以及它为何在 Entra ID 中如此重要?
Primary Refresh Token (PRT) 用于 Entra ID 内部的单点登录 (SSO)。它会签发给那些从已加入设备登录 Entra ID 的用户。PRT 初始有效期为 14 天,如果用户在设备上持续活跃并不断续期,其有效期可延长至 90 天。PRT 的核心作用是实现无缝 SSO,让用户在无需重新认证的情况下,为各种 Microsoft 应用与服务继续请求刷新令牌和访问令牌。为了保护这类高价值令牌,强烈建议使用 TPM 对其进行保护。
如果想更深入地了解 PRT,我推荐阅读以下文章:
- https://aadinternals.com/post/prt/
- https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/
- https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
- https://dirkjanm.io/introducing-roadtools-token-exchange-roadtx/
滥用 Entra ID 中的设备身份
鉴于已加入 Entra 的设备在条件访问策略评估中是一个至关重要的信号,我们惊讶地发现,分配给 Entra 用户的默认权限,竟然允许他们把设备加入到 Entra 租户中。不过,这一默认权限并不适用于 Entra B2B 访客。除非被显式授予,否则访客在 Entra ID 中既无权加入设备,也无权注册设备。
实施方式:在 Entra ID 中配置“Users may join devices to Entra ID”设置,将设备注册权限限制到特定组。例如,可将设备注册工作交由入职团队负责,以减少过于宽泛的访问。
收益:只有经过批准的用户才能加入设备,从而降低环境中出现非预期设备的风险。— msp4msps
来源:tminus365.com
图 1:阻止用户加入设备的控制措施
图 2:即便已部署限制设备加入的控制措施,用户仍可创建已加入 Entra 的 VM,这里的警告信息说明了这一点
结合我们此前关于 Restless Guests 的研究来看——在该场景中,Entra 访客账户 可以获得某个订阅的所有权——攻击者似乎可以绕过图 1 和图 2 所示的设备加入控制。通过在这个订阅中创建虚拟机 (VM),攻击者可以将其配置为缺少设备保护的状态,从而暴露关键数据与令牌材料,例如设备证书、transport key以及签发给该 VM 的任何 PRT。
由于用户能够创建 Windows VM,他们也就可以选择为其配置“Azure AD based Windows Login”扩展。在部署过程中,该 VM 会被加入到 Entra ID 中,如下方图 3 所示。这个扩展的用途,是让用户能够使用自己的 Entra ID 凭据登录该 VM。随后,只需为用户分配以下 RBAC 角色之一,即可授予其对该 VM 的远程访问权限:“Virtual Machine User Login”或“Virtual Machine Administrator Login”。
图 3:LuckyVM 虚拟机,显示其已经加入 Entra ID
为什么 Evil VM 攻击路径对 Entra ID 安全与横向移动防护至关重要
当设备加入 Entra ID 时,条件访问策略在设计上通常默认这些设备由组织拥有。
回顾我们此前关于 Restless Guest 的研究,默认情况下,只要访客在其主目录中拥有相应的计费角色,就能够取得你目录内某个订阅的所有权。如果威胁行为者注册一个最简单的按量付费 Microsoft Account,那么他们就会成为该账户的计费所有者,从而获得创建订阅的权限。另一个默认设置是,任何用户 / 访客都可以邀请其他访客进入目录。因此,如果威胁行为者攻陷了你目录中的任意用户或访客,他们就可以把自己新创建的 Microsoft Account 所有者邀请进你的租户,并在其中创建一个恶意订阅。
订阅所有者有权在自己的订阅中创建任意基础设施。这意味着攻击者可以部署一台带有 Azure AD 登录扩展的 Windows VM,而它随后会自动作为设备加入目录。即使系统不允许任何用户加入设备,这一点仍然成立,因为该过程可以利用 managed identity。这些“evil VM”尤其危险的地方在于,攻击者可以自行决定这台 Windows VM 是否启用 TPM。实现方式是选择“Gen 1”类型镜像并将安全类型设为“Standard”,这样就不会有 TPM 保护。
总结如下:
在默认设置下,只要威胁行为者控制了任意一个初始访客 / 用户账户,他们就可以通过横向移动,拿下一台缺少 TPM 保护、且已加入目录的 VM 设备的本地管理员权限!
缺少 TPM 保护意味着,任何签发给该 VM 的 PRT 都可以被诸如 Mimikatz 之类的红队工具轻易提取。本文接下来的部分将进一步说明如何继续提权,并通过展示一种已知钓鱼攻击“device code phishing”如何在这一场景中运作,来展开完整过程。
钓取 PRT:攻击者如何在 Entra ID 中窃取 Primary Refresh Token
这一攻击最早由 Dirk-Jan Mollema 详细阐述。其核心在于利用我们将某类刷新令牌升级的能力,具体来说,是将针对 Microsoft Authentication Broker应用的刷新令牌升级为完整的 Primary Refresh Token。
设备代码钓鱼的关键优势在于,用户在任何时候都不会被重定向到恶意 URL;被钓鱼的用户从始至终只会与合法的 Entra ID URL 交互。这里利用的是 OAuth2 的设备代码标准流程,它允许一台设备发起认证流程,由另一台设备完成,随后再将得到的令牌发送回最初那台设备。
正如原文所述,这种攻击通常存在如下限制:
在租户中,注册设备或加入设备的权限可能只开放给特定用户。总体来说,加入设备通常比注册设备更常受到限制。— Dirk-Jan Mollema
来源:dirkjanm.io
此外,访客默认并不具备注册设备或加入设备的权限;只有成员才可以执行这些操作。不过,正如我们刚才展示的那样,我们可以借助 Entra ID 登录扩展绕过这一限制。完整的攻击路径如下所示:
图 4:从被攻陷访客经由设备代码钓鱼获取 PRT 的攻击路径
下面逐步拆解这一过程。
如何在 Entra ID 中分步窃取 Primary Refresh Token (PRT)
1) 攻陷一个访客账户,在 Entra ID 中建立初始立足点
假设威胁行为者攻陷了目标租户中的一个 B2B 访客账户。我们进一步假设,这个访客没有任何角色分配、组成员资格,也没有被租户管理员显式授予任何访问权限。后续的横向移动将完全依赖开箱即用的权限与租户默认控制,从而展示一个现实世界中的 Entra ID 访客账户接管场景。
需要指出的是,建立一个可用立足点的方式并不只有一种:
- 攻陷一个用户账户
- 被邀请进入目标租户
2) 将一个拥有计费权限的“Restless Guest”邀请进目标租户
为了在我们要攻击的 resource租户中引入一个“restless guest”,需要先做一套特定准备。我们先在一个由攻击者控制的独立租户中创建一个用户 (也就是我们的 home租户)。最简单的方法是用信用卡注册一个 Microsoft Account。这样甚至还能拿到价值 200 美元的免费额度。用于注册的账户会自动成为计费所有者,因为它直接绑定了用于付费的信用卡。
“默认情况下,你组织中的所有用户,包括 B2B 协作访客用户,都可以邀请外部用户参与 B2B 协作。如果你希望限制发送邀请的能力,可以为所有人开启或关闭邀请功能,或者只将邀请权限限制给特定角色。” — Microsoft Ignite
来源:Microsoft Ignite
接下来,我们需要把这个计费所有者邀请进我们打算攻击的租户。由于 Entra ID 的默认邀请策略较为宽松,我们可以使用最初攻陷的访客账户,将该计费所有者邀请到目标租户中。这样一来,在被攻击的 resource租户里,我们就拥有了一个访客用户,而该用户同时又是其 home租户中的计费账户所有者。
3) 利用访客的计费权限在目标目录中创建订阅
在我们的 home租户中,我们可以创建一个订阅。默认情况下,我们也被允许把这个订阅转移到该用户作为访客存在的 resource租户中。
如果在门户中执行此操作,那么在创建订阅时,只需在“Advanced”下的“subscription directory”下拉框中指定为 resource。完成后,我们的访客就正式成为一个订阅的所有者了。
图 5:访客在 resource 租户中创建订阅
4) 创建一台不带 TPM 的 Evil VM,为窃取 PRT 创造条件
订阅所有者可以在自己的订阅中自由创建任何资源,因此我们拥有构造一台 evil VM 所需的完整权限。这一步的主要目标,是拿下一台没有 TPM 保护的 VM 的本地管理员权限。之所以需要没有 TPM 保护的 VM,是因为这样更容易窃取 PRT。实现方式是选择“Gen 1”镜像,并把安全类型设为“Standard”。
在门户中,这一配置大致如下所示:
图 6:一台未启用 TPM 保护的不安全 VM 正在被创建
5) 将 VM 加入 Entra ID,生成可用于横向移动的设备身份
我们还会确保这台 VM 成为一个已加入 Entra ID 的设备。这样的配置意味着该 VM 将拥有自己的身份,并能够向目录进行身份验证。
在门户里,我们可以在创建 VM 的过程中完成这一点:进入“Management”选项卡,并选择“Login with Microsoft Entra ID”。
图 7:一台带有 Entra ID 登录扩展的不安全 VM 正在被创建
我们还会为这台机器填写本地管理员凭据,然后点击创建。待 VM 部署完成后,我们可以在其上运行 dsregcmd /status,同时检查其 TPM 保护状态与加入状态。
图 8:由访客创建、且已加入 Entra ID 的 VM 的状态
有意思的是,即使不安装这个扩展,我们也同样可以让设备加入目录。这个技巧最早在这篇文章中被探索。对该扩展的二进制文件进行反编译后可以发现,它本质上只是对 dsregcmd.exe的一个简单封装。我们可以手动附加自己的 Managed Identity,修改一些注册表设置,然后调用 dsregcmd.exe /AzureSecureVMJoin。
图 9:Entra ID 登录扩展的源代码
6) 提取设备证书和 transport key,构造持久化后门
由于我们已经拥有这台 VM 的本地管理员访问权限,因此可以窃取设备证书。即使这个访客账户、这台 VM 本身,甚至整个订阅都被删除,该设备身份仍会继续存在。一旦把它偷走,我们就能在另一台完全不同的机器上以这个设备身份进行认证。至此,我们就获得了一个设备后门。
我们可以借助 AADInternals-Endpoints 实现这一点:
7) 通过 IAM 角色继承枚举 Entra ID 管理员账户
为了成功实施钓鱼,我们需要掌握目标用户的详细信息,例如姓名和邮箱。幸运的是,我们通常可以通过检查新创建订阅的 IAM 角色分配来获得管理员信息。任何在根管理组拥有角色的用户,都会自动把这些权限继承到我们由访客创建的订阅中。当 Entra ID 中的 Global Admin 打开某项设置,使自己对租户内所有订阅都拥有基础访问权限时,通常就会出现这种情况。
在门户中,我们只需查看该订阅的“Access Control (IAM)”选项卡,再检查其中的“Role Assignments”即可。
图 10:访客从租户中枚举管理员
8) 通过设备代码流程钓鱼用户,获取完整的 Primary Refresh Token (PRT)
由于我们已经窃取到了设备证书,因此可以把它与一种特殊类型的刷新令牌结合,并将其升级为 PRT。这项技术最早由 Dirk-jan Mollema 在这篇文章中公开。虽然我们建议阅读原文以获得更完整的理解,但从高层次看,我们做的事情如下:
- 发起一次设备代码 OAuth 流程,使用
Microsoft Authentication Broker的客户端 ID,请求面向enrollment.manage.microsoft.com资源的刷新令牌。 - 通过钓鱼诱使管理员完成设备代码流程,并拿到产生的刷新令牌。
- 将该刷新令牌与我们之前窃取的设备证书结合,从而把它升级为 PRT (只有这组特定的客户端与资源刷新令牌允许完成 PRT 升级)。
如果你想尝试钓鱼这一步,可以使用 ROADtools 来实现:
攻击者已经在现实攻击中使用这项技术,并且取得了成功,甚至登上了 Microsoft 自己的博客。实际上,红队已经有支持这一流程的钓鱼工具包。因此,只要我们完成一次成功的钓鱼,接着只需再次使用 ROADtools,把我们的刷新令牌 升级为 PRT:
9) 使用窃取到的 PRT,在 Entra ID 中以被钓鱼管理员身份进行认证
我们随后就可以使用这个 PRT 访问任何想要访问的 Azure 服务:
恭喜,你现在已经是全局管理员了!
图 11:PRT 允许你以被钓鱼管理员的身份登录 Azure 门户
如何防御 Entra ID 中的 Primary Refresh Token (PRT) 窃取
上述攻击链在每一个阶段都利用了默认设置,因此,要阻止这类攻击,就必须认真开展系统加固。强烈建议采取以下措施:
步骤 1:限制访客邀请,防止 Entra ID 访客账户被接管
仅允许指定用户邀请访客进入目录,可以显著降低初始攻击面。
图 12:用于限制谁可以邀请访客进入目录的 Entra ID 控制项
步骤 2:阻止订阅转移,防止访客权限提升
仅允许指定用户将订阅转入目录,可以防止任何访客利用其计费角色权限,成为目录内部某个订阅的所有者。
图 13:防止访客将订阅转移到 resource 目录中的 Entra ID 控制项
步骤 3:强制执行安全的 VM 创建策略,阻止 PRT 窃取
阻止在所有与目录关联的订阅中创建“Gen 1”VM。Gen 1 VM 缺少 TPM (Trusted Platform Module) 保护,这会让威胁行为者更容易从设备中提取证书和机密信息。
可参考关于允许的 VM SKU 的 Azure policy,并在根管理组级别应用它。
步骤 4:补充检测能力,捕捉访客横向移动
如果由于业务约束,前述针对访客的控制措施无法落地,那么防御者可能就必须依赖检测来发现正在进行横向移动的 restless guest。这会带来挑战,因为攻击者可以像这篇文章所描述的那样,通过 managed identity创建持久化的联邦访问,从而绕过检测。在建立这类后门后,访客可以转移订阅所有权,并规避 Microsoft Defender for Cloud 中显示的“Guest accounts with owner permissions on Azure Resources”告警。讽刺的是,作为订阅所有者,攻击者甚至还能手动将这些告警静音。
图 14:通过将告警静音来规避 Microsoft Defender for Cloud 告警
此外,攻击者还可以更隐蔽一些,把订阅 / Azure 资源的所有权赋给真实管理员 (利用上面的枚举技术获得 principal id)。这样会让订阅及其资源更像合法资产;而攻击者自己只需要拥有 'Contributor'级别的 RBAC 权限。即便如此,一旦攻击者已经拿下 Evil VM 的本地管理员权限,他们仍然可以放弃全部 RBAC 权限。在这种情况下,下面这些检测规则可以尽力覆盖尽可能完整的攻击范围:
- 在 Azure 资源上被授予
'Owner'或'Contributor'RBAC 角色的访客或 Managed Identity - 创建时未启用 TPM 保护的 VM
- 与上一条规则识别出的 VM 对应的设备身份
- 来自
Microsoft Authentication Broker客户端、指向enrollment资源的设备代码认证。
关闭 Entra ID 攻击路径之门
“Evil VM”攻击路径揭示了 Entra ID 中的默认配置如何会被利用,通过设备身份滥用和 Primary Refresh Token (PRT) 窃取,把权限从访客访问一路升级到完全管理员控制权。通过收紧访客邀请策略、限制订阅转移以及强制执行安全的 VM 配置,组织可以显著降低 Entra ID 环境中的横向移动风险。防御者必须像审视用户账户一样审视设备身份和基于令牌的访问,才能堵住这些隐藏的提权路径。
免责声明:本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:securitainment Simon
Simon《“恶意 VM”:九个简单步骤,从访客沦陷到 Entra 全局管理员》