攻击者会使用多种策略,在本地部署的 Windows 机器之间进行横向移动,包括 Pass-the-Ticket, Pass-the-Hash, Overpass-the-Hash 和 Golden Tickets 攻击。但类似技术同样能够有效地将攻击者从已被入侵的工作站横向移动到已连接的云端资源,从而绕过 MFA 等强认证措施。
本文将解释攻击者如何通过一种称为 Pass-the-PRT 的攻击,在云环境中进行横向移动(lateral movement)。
什么是 PRT?
primary refresh token(PRT)类似于 Kerberos 的票据授权票据(ticket-granting ticket,TGT)——两者都用于提供单点登录(SSO)。不过,TGT 用于 Windows 系统,而 PRT 使你能够登录到 Windows 10 设备,然后无需重新进行身份验证即可访问 Azure 和 Microsoft 365 资源。该 Windows 10 设备必须是 Azure-joined 或混合 Azure-joined。
下面是该过程如何运作的概览:当你登录时,你的 Windows 10 设备将与 Windows 10 Cloud Authentication Provider 通信。其 Azure AD 插件将验证你的凭据,并返回 PRT 和会话密钥。你的设备会使用其受信任平台模块(Trusted Platform Module,TPM)对会话密钥进行重新加密,然后将密钥和 PRT 都存储到 LSASS 中。随后,当你尝试使用支持对 Azure 进行 SSO 的浏览器(Edge,或带有 Windows 10 扩展的 Chrome)登录网站时,Cloud Authentication Provider 会为该浏览器创建一个 PRT cookie,并使用该 cookie 从 Azure AD 获取令牌。Azure AD 会验证 PRT cookie 并让你登录成功。
(如果你想了解得更深入,请查看 Microsoft documentation、Jairo Cadena 的 summary of PRT and SSO、这篇 article on PRT(作者 Dirk-jan Mollema),以及 GitHub 上的 ROADtoken 和 RequestAADRefreshToken 项目。)
要查看你是否拥有 PRT,请运行以下命令:
Dsregcmd.exe /status
在 SSO State 部分中,检查 AzureAdPrt;如果将其设置为 YES,则表示你拥有 PRT。
如果设置为 NO,请使用下面的命令检查你的设备是否已加入 Azure AD,因为发放 PRT 需要满足这一条件。
执行 Pass-the-PRT 攻击
如果攻击者设法获取了用户的 PRT 和会话密钥,他们就可以创建 PRT Cookie,使其能够以该用户的身份访问 Web 资源,从而绕过已启用的任何条件访问要求。PRT 的有效期为 14 天,因此在账户未被禁用的情况下,他们最长可获得长达 2 周的访问权限。
让我们逐步准确地了解如何执行这种攻击。
先决条件: 我们已经攻破了一台已向其签发 PRT 的 Windows 10 设备,并且我们在该机器上拥有本地管理员权限。
步骤概览:
- 从 LSASS 中提取 PRT,并保存以备后用。
- 提取会话密钥。
- 解密会话密钥,并使用 DPAPI masterkey 进行使用。我们已在 Pass-the-Cookie attack中了解过这一点,并将采用相同的方法。
- 使用解密后的 Session Key 获取派生密钥和上下文。这需要用于创建我们的 PRT cookie。派生密钥用于为该 cookie 的 JWT 进行签名。
- 在任意系统上,使用 PRT、派生密钥和上下文来创建新的 PRT cookie。
- 将 cookie 导入到我们的 Chrome 浏览器会话中。现在,我们将作为该用户在网站上完成身份验证——无需知道其密码,也不必处理任何 MFA 提示。
让我们更深入地了解每个步骤。
第 1 步。 从 LSASS 中提取 PRT。
要查看我们已入侵的这台机器的 PRT 数据,我们在 Mimikatz release 2.2.0 20200807 或更高版本 中使用以下命令:
Privilege::debug
Sekurlsa::cloudap
下面是输出结果。我们将复制标记为 PRT 的部分,并保存以备后用。
如果你没有看到任何 PRT 数据,请按前面所示运行命令 dsregcmd /status ,检查该设备是否已加入 Azure AD。如果 AzureAdPrt 设置为 YES,请检查该机器正在运行的 Windows 10 版本;在我们的实验环境中,为了让攻击生效,我们需要至少升级到 1909 版本。
第 2 步。提取“Proof of possession(持有证明)”密钥。
现在我们将提取会话密钥,或“ProofOfPosessionKey”(下方已突出显示)。它已加密,我们需要使用 DPAPI masterkeys 对其进行解密。
第 3 步:解密会话密钥。
现在我们将提升权限到 SYSTEM,并在计算机上下文下运行,以便能够使用 DPAPI masterkey 来解密会话密钥:
Token::elevate
Dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect
现在我们将复制两个值。第一个是 Context 值:
第二个是 Derived Key 值:
第 4 步:生成 PRT cookies。
其余攻击步骤可以从任何工作站执行。要生成 PRT cookies,我们只需运行以下命令:
Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
输出将在 Signature with key 之后包含已签名的 PRT cookies。复制该文本。
第 5 步:将 PRT cookie 注入浏览器会话。
以无痕模式启动 Google Chrome,然后导航到 https://login.microsoftonline.com 。当系统提示你输入登录数据时,在页面任意位置右键单击,然后选择 Inspect ,以打开 Chrome 的开发者工具。
转到“Application(应用)”选项卡,双击 Cookies,然后点击 login.microsoftonline.com 。在右侧窗格中,点击顶部操作栏中的带对角斜杠的圆形图标,以清除所有现有 cookies。
然后在表格中双击一个空行,并添加以下新的 cookie:
Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
HttpOnly: Set to True (checked)
将其他字段保留为默认值。
刷新页面,并确保该 cookie 没有消失。如果消失了,可能是您操作时出错了,需要再按步骤执行一遍。
再次访问 https://login.microsoftonline.com,然后应该会自动以被入侵的用户身份登录:
防范 Pass-the-PRT 攻击
Pass-the-PRT 攻击难以检测,因为它们会滥用合法的 SSO 流程。一种有用的策略是使用能够检测 Mimikatz 使用情况的终端防护软件;Mimikatz 会在攻击的第一阶段运行。
然而,预防要比检测更好。请记住,Pass-the-PRT 是一种横向移动技术;要执行它,入侵者需要已经获得对某台机器的访问权限。借助类似 Netwrix Active Directory Security Solution 这样的工具,你可以从一开始就阻止恶意人员在你的环境中占据立足点。
此外,该攻击还需要本地管理员权限。使用诸如 Netwrix PolicyPak 之类的终端管理软件,你可以在不影响用户工作效率的情况下,撤销用户的这些强大权限。此外,你还可以阻止计算机启动恶意软件,甚至保护其浏览器设置。
分享到
了解更多
关于作者
Jeff Warren
首席产品官
Jeff Warren 负责监督 Netwrix 的产品组合,在安全领域的产品管理与开发方面拥有十多年的经验。在加入 Netwrix 之前,Jeff 曾在 Stealthbits Technologies 领导产品团队;他运用自己作为软件工程师的经验,开发创新且面向企业规模的安全解决方案。凭借亲力亲为的工作方式以及解决棘手安全挑战的能力,Jeff 致力于打造真正可落地、行之有效的实用解决方案。他拥有特拉华大学(University of Delaware)的信息系统(Information Systems)学士学位。