Azure Pentesting

Support HackTricks

I'M STILL BUILDING THE AZURE METHODOLOGY

Basic Information

Azure Pentester/Red Team Methodology

AZURE 환경을 감사하기 위해서는 어떤 서비스가 사용되고 있는지, 무엇이 노출되고 있는지, 누가 무엇에 접근할 수 있는지, 그리고 내부 Azure 서비스와 외부 서비스가 어떻게 연결되어 있는지를 아는 것이 매우 중요합니다.

Red Team 관점에서, Azure 환경을 침해하기 위한 첫 번째 단계는 Azure AD에 대한 자격 증명을 얻는 것입니다. 이를 위한 몇 가지 아이디어는 다음과 같습니다:

  • github(또는 유사한 곳)의 누수 - OSINT

  • 사회적 공학

  • 비밀번호 재사용 (비밀번호 누수)

  • Azure 호스팅 애플리케이션의 취약점

  • 서버 측 요청 위조 메타데이터 엔드포인트에 대한 접근

  • 로컬 파일 읽기

  • /home/USERNAME/.azure

  • C:\Users\USERNAME\.azure

  • az cliaccessTokens.json 파일 - 2.30 이전 - 2022년 1월 - 액세스 토큰을 평문으로 저장

  • azureProfile.json 파일은 로그인한 사용자에 대한 정보를 포함합니다.

  • **az logout**는 토큰을 제거합니다.

  • 이전 버전의 **Az PowerShell**은 **TokenCache.dat**에 액세스 토큰평문으로 저장했습니다. 또한 **AzureRmContext.json**에 ServicePrincipalSecret평문으로 저장합니다. Save-AzContext cmdlet을 사용하여 토큰저장할 수 있습니다. Disconnect-AzAccount를 사용하여 제거합니다.

  • 제3자 침해

  • 내부 직원

  • 일반적인 피싱 (자격 증명 또는 Oauth 앱)

Azure 테넌트 내에서 어떤 사용자도 침해하지 않았다 하더라도, 여전히 정보를 수집할 수 있습니다:

자격 증명을 얻은 후에는 그 자격 증명이 누구에게 속하는지그들이 무엇에 접근할 수 있는지 알아야 하므로, 기본적인 열거 작업을 수행해야 합니다:

Basic Enumeration

열거 작업에서 가장 시끄러운 부분은 로그인이며, 열거 자체는 아닙니다.

SSRF

Azure 내의 머신에서 SSRF를 발견했다면, 이 페이지에서 트릭을 확인하세요:

Bypass Login Conditions

유효한 자격 증명이 있지만 로그인할 수 없는 경우, 다음은 적용될 수 있는 일반적인 보호 조치입니다:

  • IP 화이트리스트 -- 유효한 IP를 침해해야 합니다.

  • 지리적 제한 -- 사용자가 거주하는 곳이나 회사의 사무실이 있는 곳을 찾아 같은 도시(또는 최소한 같은 국가)의 IP를 얻습니다.

  • 브라우저 -- 특정 OS(Windows, Linux, Mac, Android, iOS)에서만 허용될 수 있습니다. 피해자/회사가 사용하는 OS를 알아내세요.

  • 서비스 주체 자격 증명을 침해하려고 시도할 수도 있습니다. 이들은 일반적으로 제한이 적고 로그인 검토가 덜 이루어집니다.

이를 우회한 후, 초기 설정으로 돌아가 여전히 접근할 수 있을 것입니다.

Subdomain Takeover

Whoami

Az - AzureAD 섹션에서 az cli, AzureAD 및 Az PowerShell을 설치하는 방법을 배우세요.

가장 먼저 알아야 할 것은 당신이 누구인지 (어떤 환경에 있는지)입니다:

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

Azure를 열거하는 데 가장 중요한 명령 중 하나는 **Get-AzResource**입니다. 이 명령은 현재 사용자가 볼 수 있는 리소스를 알 수 있게 해줍니다.

같은 정보를 웹 콘솔에서 https://portal.azure.com/#view/HubsExtension/BrowseAll로 가거나 "모든 리소스"를 검색하여 얻을 수 있습니다.

AzureAD 열거

기본적으로 모든 사용자는 사용자, 그룹, 역할, 서비스 주체와 같은 항목을 열거할 수 있는 충분한 권한을 가져야 합니다... (기본 AzureAD 권한 확인 default AzureAD permissions). 여기에서 가이드를 찾을 수 있습니다:

이제 자격 증명에 대한 정보를 얻었으므로 (레드 팀이라면 탐지되지 않았기를 바랍니다). 환경에서 사용 중인 서비스가 무엇인지 파악할 시간입니다. 다음 섹션에서는 일반 서비스 열거 방법을 확인할 수 있습니다.

서비스 주체 및 액세스 정책

Azure 서비스는 시스템 ID(서비스 자체의 ID)를 가질 수 있거나 사용자 할당 관리 ID를 사용할 수 있습니다. 이 ID는 예를 들어 비밀을 읽기 위해 KeyVault에 대한 액세스 정책을 가질 수 있습니다. 이러한 액세스 정책은 제한되어야 하며(최소 권한 원칙), 필요 이상으로 많은 권한을 가질 수 있습니다. 일반적으로 앱 서비스는 비밀 및 인증서를 검색하기 위해 KeyVault를 사용합니다.

따라서 이러한 ID를 탐색하는 것이 유용합니다.

앱 서비스 SCM

앱 서비스 '컨테이너'에 로그인하기 위한 Kudu 콘솔입니다.

웹쉘

portal.azure.com을 사용하여 쉘을 선택하거나 shell.azure.com을 사용하여 bash 또는 powershell을 사용할 수 있습니다. 이 쉘의 '디스크'는 스토리지 계정에 이미지 파일로 저장됩니다.

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