AzureADPentestPart1

admin 2025-12-23 01:42:13 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 这篇文章介绍了AzureAD渗透测试的技术方法,包括使用官方SDK进行信息收集、查询用户权限和组关系、利用服务主体权限进行提权,以及最终接管全局管理员账户并绕过MFA认证。文章提供了具体的PowerShell脚本和操作步骤,展示了如何从普通用户权限提升到管理员权限,并通过设备流机制绕过多重身份验证。 综合评分: 89 文章分类: 渗透测试,云安全,内网渗透,红队,实战经验


cover_image

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》

评论:0   参与:  2