Azure Pentesting

支持 HackTricks

我仍在构建 Azure 方法论

基本信息

Az - Basic Information

Azure 渗透测试/红队方法论

为了审计 AZURE 环境,了解以下内容非常重要:使用了哪些 服务,暴露了什么,谁有 访问权限,以及内部 Azure 服务和 外部服务 是如何连接的。

从红队的角度来看,攻陷 Azure 环境的第一步是设法获取一些 Azure AD 的 凭据。以下是一些获取凭据的想法:

  • GitHub(或类似)中的 泄露 - OSINT

  • 社会 工程

  • 密码 重用(密码泄露)

  • Azure 托管应用程序中的漏洞

  • 服务器端请求伪造 访问元数据端点

  • 本地文件读取

  • /home/USERNAME/.azure

  • C:\Users\USERNAME\.azure

  • az cli 2.30 之前的 accessTokens.json 文件 - 2022年1月 - 存储 访问令牌为明文

  • azureProfile.json 文件包含有关已登录用户的 信息

  • az logout 移除令牌。

  • 较旧版本的 Az PowerShell访问令牌 存储为 明文TokenCache.dat 中。它还将 ServicePrincipalSecret 存储为 明文AzureRmContext.json 中。可以使用 cmdlet Save-AzContext存储 令牌。 使用 Disconnect-AzAccount 来移除它们。

  • 第三方 被攻破

  • 内部 员工

  • 常见钓鱼(凭据或 Oauth 应用)

即使您 没有攻陷任何用户 在您攻击的 Azure 租户中,您仍然可以 收集一些信息

Az - Unauthenticated Enum & Initial Entry

在您成功获取凭据后,您需要知道 这些凭据属于谁,以及 他们可以访问什么,因此您需要进行一些基本的枚举:

基本枚举

请记住,枚举中 最吵闹 的部分是 登录,而不是枚举本身。

SSRF

如果您在 Azure 内部的机器上发现了 SSRF,请查看此页面以获取技巧:

绕过登录条件

在您拥有一些有效凭据但无法登录的情况下,以下是一些可能存在的常见保护措施:

  • IP 白名单 -- 您需要攻陷一个有效的 IP

  • 地理限制 -- 找到用户居住的地方或公司的办公室位置,并获取来自同一城市(或至少同一国家)的 IP

  • 浏览器 -- 可能只允许某些操作系统(Windows、Linux、Mac、Android、iOS)中的浏览器。找出受害者/公司使用的操作系统。

  • 您还可以尝试 攻陷服务主体凭据,因为它们通常限制较少,登录审核较少

绕过后,您可能能够返回到初始设置,并且仍然可以访问。

子域名接管

Whoami

了解 如何安装 az cli、AzureAD 和 Az PowerShell,请参阅 Az - AzureAD 部分。

您需要知道的第一件事是 您是谁(您处于哪个环境中):

az account list
az account tenant list # Current tenant info
az account subscription list # Current subscription info
az ad signed-in-user show # Current signed-in user
az ad signed-in-user list-owned-objects # Get owned objects by current user
az account management-group list #Not allowed by default
#Get the current session state
Get-AzureADCurrentSessionInfo
#Get details of the current tenant
Get-AzureADTenantDetail

Azure PowerShell 是一个用于管理 Azure 资源的命令行工具。通过 Az PowerShell,您可以轻松地创建、更新和删除 Azure 资源。

# Get the information about the current context (Account, Tenant, Subscription etc.)
Get-AzContext
# List all available contexts
Get-AzContext -ListAvailable
# Enumerate subscriptions accessible by the current user
Get-AzSubscription
#Get Resource group
Get-AzResourceGroup
# Enumerate all resources visible to the current user
Get-AzResource
# Enumerate all Azure RBAC role assignments
Get-AzRoleAssignment # For all users
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com # For current user

在 Azure 中枚举最重要的命令之一是 Get-AzResource,它来自 Az PowerShell,因为它让你 知道当前用户可以查看的资源

你可以在 网页控制台 中获取相同的信息,访问 https://portal.azure.com/#view/HubsExtension/BrowseAll 或搜索 "所有资源"

AzureAD 枚举

默认情况下,任何用户应该拥有 足够的权限来枚举 用户、组、角色、服务主体等(查看 默认 AzureAD 权限)。 你可以在这里找到指南:

Az - AzureAD (AAD)

现在你 已经获得了一些关于你的凭据的信息(如果你是红队,希望你 没有被检测到)。是时候弄清楚环境中正在使用哪些服务。 在接下来的部分中,你可以查看一些 枚举常见服务的方法

服务主体和访问策略

Azure 服务可以具有系统身份(服务本身的身份)或使用用户分配的托管身份。此身份可以具有访问策略,例如,访问 KeyVault 以读取机密。这些访问策略应受到限制(最小权限原则),但可能具有超出所需的权限。通常,应用服务会使用 KeyVault 来检索机密和证书。

因此,探索这些身份是有用的。

应用服务 SCM

Kudu 控制台用于登录到应用服务 '容器'。

Webshell

使用 portal.azure.com 并选择 shell,或使用 shell.azure.com,进行 bash 或 powershell。此 shell 的 '磁盘' 作为图像文件存储在存储帐户中。

Azure DevOps

Azure DevOps 与 Azure 是分开的。它具有代码库、管道(yaml 或发布)、看板、维基等。变量组用于存储变量值和机密。

自动化侦查工具

cd ROADTools
pipenv shell
roadrecon auth -u test@corp.onmicrosoft.com -p "Welcome2022!"
roadrecon gather
roadrecon gui

Import-Module monkey365
Get-Help Invoke-Monkey365
Get-Help Invoke-Monkey365 -Detailed
Invoke-Monkey365 -IncludeAzureActiveDirectory -ExportTo HTML -Verbose -Debug -InformationAction Continue
Invoke-Monkey365 - Instance Azure -Analysis All -ExportTo HTML

# Start Backend
cd stormspotter\backend\
pipenv shell
python ssbackend.pyz

# Start Front-end
cd stormspotter\frontend\dist\spa\
quasar.cmd serve -p 9091 --history

# Run Stormcollector
cd stormspotter\stormcollector\
pipenv shell
az login -u test@corp.onmicrosoft.com -p Welcome2022!
python stormspotter\stormcollector\sscollector.pyz cli
# This will generate a .zip file to upload in the frontend (127.0.0.1:9091)

# You need to use the Az PowerShell and Azure AD modules:
$passwd = ConvertTo-SecureString "Welcome2022!" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("test@corp.onmicrosoft.com", $passwd)
Connect-AzAccount -Credential $creds

Import-Module AzureAD\AzureAD.psd1
Connect-AzureAD -Credential $creds

# Launch AzureHound
. AzureHound\AzureHound.ps1
Invoke-AzureHound -Verbose

# Simple queries
## All Azure Users
MATCH (n:AZUser) return n.name
## All Azure Applications
MATCH (n:AZApp) return n.objectid
## All Azure Devices
MATCH (n:AZDevice) return n.name
## All Azure Groups
MATCH (n:AZGroup) return n.name
## All Azure Key Vaults
MATCH (n:AZKeyVault) return n.name
## All Azure Resource Groups
MATCH (n:AZResourceGroup) return n.name
## All Azure Service Principals
MATCH (n:AZServicePrincipal) return n.objectid
## All Azure Virtual Machines
MATCH (n:AZVM) return n.name
## All Principals with the ‘Contributor’ role
MATCH p = (n)-[r:AZContributor]->(g) RETURN p

# Advanced queries
## Get Global Admins
MATCH p =(n)-[r:AZGlobalAdmin*1..]->(m) RETURN p
## Owners of Azure Groups
MATCH p = (n)-[r:AZOwns]->(g:AZGroup) RETURN p
## All Azure Users and their Groups
MATCH p=(m:AZUser)-[r:MemberOf]->(n) WHERE NOT m.objectid CONTAINS 'S-1-5' RETURN p
## Privileged Service Principals
MATCH p = (g:AZServicePrincipal)-[r]->(n) RETURN p
## Owners of Azure Applications
MATCH p = (n)-[r:AZOwns]->(g:AZApp) RETURN p
## Paths to VMs
MATCH p = (n)-[r]->(g: AZVM) RETURN p
## Paths to KeyVault
MATCH p = (n)-[r]->(g:AZKeyVault) RETURN p
## Paths to Azure Resource Group
MATCH p = (n)-[r]->(g:AZResourceGroup) RETURN p
## On-Prem users with edges to Azure
MATCH  p=(m:User)-[r:AZResetPassword|AZOwns|AZUserAccessAdministrator|AZContributor|AZAddMembers|AZGlobalAdmin|AZVMContributor|AZOwnsAZAvereContributor]->(n) WHERE m.objectid CONTAINS 'S-1-5-21' RETURN p
## All Azure AD Groups that are synchronized with On-Premise AD
MATCH (n:Group) WHERE n.objectid CONTAINS 'S-1-5' AND n.azsyncid IS NOT NULL RETURN n

# You should use an account with at least read-permission on the assets you want to access
git clone https://github.com/nccgroup/azucar.git
PS> Get-ChildItem -Recurse c:\Azucar_V10 | Unblock-File

PS> .\Azucar.ps1 -AuthMode UseCachedCredentials -Verbose -WriteLog -Debug -ExportTo PRINT
PS> .\Azucar.ps1 -ExportTo CSV,JSON,XML,EXCEL -AuthMode Certificate_Credentials -Certificate C:\AzucarTest\server.pfx -ApplicationId 00000000-0000-0000-0000-000000000000 -TenantID 00000000-0000-0000-0000-000000000000
PS> .\Azucar.ps1 -ExportTo CSV,JSON,XML,EXCEL -AuthMode Certificate_Credentials -Certificate C:\AzucarTest\server.pfx -CertFilePassword MySuperP@ssw0rd! -ApplicationId 00000000-0000-0000-0000-000000000000 -TenantID 00000000-0000-0000-0000-000000000000

# resolve the TenantID for an specific username
PS> .\Azucar.ps1 -ResolveTenantUserName user@company.com

Import-Module .\MicroBurst.psm1
Import-Module .\Get-AzureDomainInfo.ps1
Get-AzureDomainInfo -folder MicroBurst -Verbose

Connect-AzAccount
ipmo C:\Path\To\Powerzure.psd1
Get-AzureTarget

# Reader
$ Get-Runbook, Get-AllUsers, Get-Apps, Get-Resources, Get-WebApps, Get-WebAppDetails

# Contributor
$ Execute-Command -OS Windows -VM Win10Test -ResourceGroup Test-RG -Command "whoami"
$ Execute-MSBuild -VM Win10Test  -ResourceGroup Test-RG -File "build.xml"
$ Get-AllSecrets # AllAppSecrets, AllKeyVaultContents
$ Get-AvailableVMDisks, Get-VMDisk # Download a virtual machine's disk

# Owner
$ Set-Role -Role Contributor -User test@contoso.com -Resource Win10VMTest

# Administrator
$ Create-Backdoor, Execute-Backdoor
支持 HackTricks

Last updated