文章总结: 这篇文章介绍了AzureAD渗透测试的技术方法,包括使用官方SDK进行信息收集、查询用户权限和组关系、利用服务主体权限进行提权,以及最终接管全局管理员账户并绕过MFA认证。文章提供了具体的PowerShell脚本和操作步骤,展示了如何从普通用户权限提升到管理员权限,并通过设备流机制绕过多重身份验证。 综合评分: 89 文章分类: 渗透测试,云安全,内网渗透,红队,实战经验
Azure AD Pentest Part 1
T4x0r
T大4的小圈圈
2025年12月21日 23:42 浙江
前言
这次研究只是靶场环境,仅供学习参考
沉默这么久,不是我不想更新,也是一些内容没办法更新,这期间也一直在学习研究
为什么要更新这个内容,以后也会陆续更新现在可公开内容
Azure AD 是微软适配的云上单点机制,从21年开始到如今,越来越多的办公都上了云,云的环境包含高价值资产如:sharepoint,outlook等,避免了很多如今年:sharepoint的toolshell攻击
遇到资产上云,在21年我们还是通过T0服务器Azure connect(现Entra ID connect)窃取凭据去打,以前是可以解密出来,现在解密出来的内容被加密了,有兴趣的可以去dnspy去看看miiserver进程,他是在云端加密,而且很多工具只支持老api,在现在大多目标上不适用
本文只单纯做技术分享,其中的很小的一个攻击方式,菜菜勿喷,希望能和各位大佬交流
那我们切入正题
信息收集
博主这里使用微软提供的官方sdk,在我这个环境中,一般情况我们要拿下域控,然后把hash解成明文,直接去官网测试登录,有些账户是没有开mfa的,我们可以直接把mfa绑定在自己的工作机上,来解决进入云域环节
假设我们拥有了可以登录云的普通用户,我们可以去看组定位管理,以及登录过的机器
req2:我们如何绕过每次请求和sdk请求的mfa,我们就要去了解微软的设备流机制来解决(tap)
req3:prt需要whfb流才能有cloudap信息(以后再讨论)
req4:现代我们去解密entra connect他是再云上加密,accesstoken换了新api之后是不允许直接访问的(微软文档有)
域外打云需要绑定设备流才可以进行,我们先用官方sdk绑定设备流登录微软组织账号
输入我们已知的微软组织账号
绑定成功之后我们进行权限查询,查询当前用户规则
接下来我们要看用户属于什么组,分配了什么权限 如下图,这几行命令显示我们当前用户没有任何的特权,全部的权限列举出来了搜索guid并可以 找到拥有权限
下面我们查询用户与组之间的关系
该用户仅是默认租户组的一部分,每个 Entra ID 用户为协作服务(如 SharePoint 或 Teams)分配 了该组。这里也没有权限升级的路径
我们还会检查 当前用户 是否拥有任何组,因为组主可以将自己添加为成员并继承组的权限 (如分配的角色)。该检查同样返回为空
然而,查询服务主体权限时会返回一个结果,当前用户拥有的服务主体
然后我们查询下这个服务主体(Finance Analytics Dashboard)是否有分配权限
发现没有
没有一个是配置好的。接下来,我们检查分配给它的域角色
这里查询到有分配,但它只用一个 GUID 表示。每个内置的 Entra ID 角色都由一个 GUID 表示, 该 GUID 是全局的,所有 Entra ID 租户都是相同的。你可以在这里(Microsoft Entra built-in roles | Azure Docs)查看所有官方内置角色及其 GUID
这个权限是可以提权的
下面进行权限分配和提权,直接脚本梭哈
function Find-OwnedServicePrincipals {param([string]$UserId)# Get all service principals in tenant$allSPs = Get-MgServicePrincipal -AllWrite-Host "Found $($allSPs.Count) service principals in tenant"$ownedSPs = @()$checkCount = 0# Check ownership of each service principalforeach ($sp in $allSPs) {$checkCount++if ($checkCount % 50 -eq 0) {Write-Host "Checked $checkCount/$($allSPs.Count) service principals..."}try {$owners = Get-MgServicePrincipalOwner -ServicePrincipalId $sp.Id -ErrorAction SilentlyContinueif ($owners) {foreach ($owner in $owners) {if ($owner.Id -eq $UserId) {$ownedSPs += $spWrite-Host "OWNED SERVICE PRINCIPAL FOUND!" -ForegroundColor RedWrite-Host " Name: $($sp.DisplayName)" -ForegroundColor YellowWrite-Host " SP ID: $($sp.Id)" -ForegroundColor YellowWrite-Host " App ID: $($sp.AppId)" -ForegroundColor Yellowbreak}}}} catch {continue}}return $ownedSPs然后执行:$ownedSPs = Find-OwnedServicePrincipals -UserID $currentUser.Id}function Get-ServicePrincipalRoles {param([object]$ServicePrincipal)Write-Host "Checking roles for: $($ServicePrincipal.DisplayName)"# Check directory role assignments for the SP$roleAssignments = Get-MgRoleManagementDirectoryRoleAssignment -Filter "principalId eq '$($ServicePrincipal.Id)'" -ErrorAction SilentlyContinue$roles = @()if ($roleAssignments) {foreach ($assignment in $roleAssignments) {$roleDefinition = Get-MgRoleManagementDirectoryRoleDefinition -UnifiedRoleDefinitionId $assignment.RoleDefinitionId$roles += $roleDefinitionWrite-Host " Role: $($roleDefinition.DisplayName)" -ForegroundColor Cyan}} else {Write-Host " No directory roles assigned"}return $roles}
然后执行:
$ownedSPs = Find-OwnedServicePrincipals -UserID $currentUser.Id
提权上去,这是我们委派当前用户到管理去改密码
我们首先需要去添加一个服务的后门去访问并且授权认证
接着,断开当前用户会话的 Disconnect-MgGraph,构建客户端凭证,并通过 Connect-MgGraph 使用服务主体身份进行认证
然后查看当前权限配置
Get-MgContext 命令告诉我们Microsoft Graph 会话如何被认证的信息,这直接决定了所应用的权限
我们重点关注 AuthType 和 TokenCredentialType 这两个字 段,因为它们暴露了 Entra ID 中的核心身份语义
接管全局管理员并且绕过MFA
接管
有了这种访问权限,我们还可以分配 TAP作为认证方法,从而绕过多重身份验证,直 接登录 云ad
先重置密码:
密码:xxxxxxxxxxxxx! 更新配置:
利用设备流绕过二次验证:
然后访问azure门户登录
拿下:
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:T大4的小圈圈 T4x0r《Azure AD Pentest Part 1》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论