Translated ['src/pentesting-cloud/azure-security/README.md', 'src/pentes

This commit is contained in:
Translator
2025-01-25 14:37:58 +00:00
parent dcd6a671c7
commit 21fc5f249b
5 changed files with 323 additions and 231 deletions
+103 -70
View File
@@ -4,80 +4,86 @@
## 基本信息
在以下页面学习 Azure 和 Entra ID 的基础知识:
{{#ref}}
az-basic-information/
{{#endref}}
## Azure 渗透测试/红队方法论
为了审计 AZURE 环境,了解以下内容非常重要:使用了哪些 **服务**,暴露了什么,谁有 **访问权限**,以及内部 Azure 服务和 **外部服务** 是如何连接的。
为了审计 AZURE 环境,了解以下内容非常重要:使用了哪些 **服务**,暴露了什么,谁对什么**访问权限**,以及内部 Azure 服务和 **外部服务** 是如何连接的。
从红队的角度来看,**攻陷 Azure 环境的第一步**是设法获一些 Azure AD 的 **凭证**。以下是一些获取凭证的思路:
从红队的角度来看,**攻陷 Azure 环境的第一步**是设法获一些 **立足点**
- GitHub(或类似平台)中的 **泄露** - OSINT
- **社交** 工程
- **密码** 重用(密码泄露)
- Azure 托管应用中的漏洞
- [**服务器端请求伪造**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) 访问元数据端点
- **本地文件读取**
- `/home/USERNAME/.azure`
- `C:\Users\USERNAME\.azure`
- **`accessTokens.json`** 文件在 `az cli` 2.30 之前 - Jan2022 - 存储 **明文** 访问令牌
- **`azureProfile.json`** 文件包含有关登录用户的 **信息**
- **`az logout`** 移除令牌。
- 较旧版本的 **`Az PowerShell`** 在 **`TokenCache.dat`** 中以 **明文** 存储 **访问令牌**。它还在 **`AzureRmContext.json`** 中以 **明文** 存储 **ServicePrincipalSecret**。可以使用 cmdlet **`Save-AzContext`** 来 **存储** **令牌**。\
使用 `Disconnect-AzAccount` 来移除它们。
- 第三方 **被攻破**
- **内部** 员工
- [**常见钓鱼**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html)(凭证或 Oauth 应用)
- [设备代码认证钓鱼](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md)
- [Azure **密码喷洒**](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md)
### 外部枚举与初始访问
即使您 **没有攻陷任何用户** 在您攻击的 Azure 租户中,您仍然可以 **收集一些信息**
第一步当然是枚举你所攻击的租户的信息,并尝试获取立足点。
根据域名,可以知道 **公司是否在使用 Azure**,获取 **租户 ID**,获取同一租户中的其他 **有效域名**(如果有的话),并获取 **相关信息**,例如 SSO 是否启用、邮件配置、有效用户邮箱等。
查看以下页面以了解如何进行 **外部枚举**
{{#ref}}
az-unauthenticated-enum-and-initial-entry/
{{#endref}}
> [!NOTE]
> 在您成功获取凭证后,您需要知道 **这些凭证属于谁**,以及 **他们可以访问什么**,因此您需要进行一些基本的枚举:
## 基本枚举
根据这些信息,尝试获取立足点的最常见方法有:
- **OSINT**:检查 Github 或任何其他可能包含 **凭据** 或有趣信息的开源平台上的 **泄露**
- **密码** 重用、泄露或 [密码喷洒](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md)
- 购买员工的凭据
- [**常见钓鱼**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html)(凭据或 Oauth 应用)
- [设备代码认证钓鱼](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md)
- 第三方 **被攻破**
- Azure 托管应用中的漏洞
- [**服务器端请求伪造**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) 访问元数据端点
- **子域接管**,如 [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/)
- 如果某个开发者的笔记本被攻破([WinPEAS 和 LinPEAS](https://github.com/peass-ng/PEASS-ng) 可以找到这些信息):
-**`<HOME>/.Azure`**
- **`azureProfile.json`** 包含过去登录用户的信息
- **`clouds.config`** 包含订阅信息
- **`service_principal_entries.json`** 包含应用凭据(租户 ID、客户端和密钥)。仅在 Linux 和 macOS 上
- **`msal_token_cache.json`** 包含访问令牌和刷新令牌。仅在 Linux 和 macOS 上
- **`service_principal_entries.bin`** 和 msal_token_cache.bin 在 Windows 上使用,并使用 DPAPI 加密
- **`msal_http_cache.bin`** 是 HTTP 请求的缓存
- 加载它:`with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)`
- **`AzureRmContext.json`** 包含使用 Az PowerShell 的先前登录信息(但没有凭据)
-**`C:\Users\<username>\AppData\Local\Microsoft\IdentityCache\*`** 中有几个 `.bin` 文件,包含使用用户 DPAPI 加密的 **访问令牌**、ID 令牌和帐户信息。
- 可以在 **`C:\Users\<username>\AppData\Local\Microsoft\TokenBroken\Cache\`** 中找到更多 **访问令牌**,其中的 `.tbres` 文件包含使用 DPAPI 加密的 base64 访问令牌。
- 在 Linux 和 macOS 中,可以通过运行 `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"` 从 Az PowerShell 获取 **访问令牌、刷新令牌和 ID 令牌**(如果使用)。
- 在 Windows 中,这只会生成 ID 令牌。
- 可以通过检查 `$HOME/.local/share/.IdentityService/` 是否存在来查看是否在 Linux 和 macOS 中使用了 Az PowerShell(尽管包含的文件是空的且无用)。
> [!NOTE]
> 请记住,枚举中 **最嘈杂** 的部分是 **登录**,而不是枚举本身。
> 请记住,通常枚举中 **最嘈杂** 的部分是 **登录**,而不是枚举本身。
### SSRF
### Azure 和 Entra ID 工具
如果您在 Azure 内部的机器上发现了 SSRF,请查看此页面以获取技巧
以下工具将非常有用,可以慢慢(以避免被检测)或自动(以节省时间)枚举 Entra ID 租户和 Azure 环境
{{#ref}}
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html
az-enumeration-tools.md
{{#endref}}
### 绕过登录条件
<figure><img src="../../images/image (268).png" alt=""><figcaption></figcaption></figure>
拥有一些有效凭但无法登录的情况下,以下是一些可能存在常见保护措施:
拥有一些有效凭但无法登录的情况下,可能存在一些常见保护措施:
- **IP 白名单** -- 需要攻一个有效的 IP
- **IP 白名单** -- 需要攻一个有效的 IP
- **地理限制** -- 找到用户居住的地方或公司的办公室位置,并获取来自同一城市(或至少同一国家)的 IP
- **浏览器** -- 可能只允许某些操作系统(Windows、Linux、Mac、Android、iOS的浏览器。找出受害者/公司使用的操作系统。
- 还可以尝试 **攻服务主体凭**,因为它们通常限制较少,登录审核也较少
- **浏览器** -- 可能只允许某些操作系统(Windows、Linux、Mac、Android、iOS)的浏览器。找出受害者/公司使用的操作系统。
- 还可以尝试 **攻服务主体凭**,因为它们通常限制较少,登录审核也较少
绕过后,可能能够返回到初始设置,并且仍然可以访问。
### 子域名接管
- [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/)
绕过后,可能能够返回到最初的设置,并且仍然可以访问。
### Whoami
> [!CAUTION]
> 学习 **如何安装** az cli、AzureAD 和 Az PowerShell 在 [**Az - Entra ID**](az-services/az-azuread.md) 部分。
需要了解的第一件事是 **是谁**处于哪个环境中):
需要知道的第一件事是 **是谁**处于哪个环境中):
{{#tabs }}
{{#tab name="az cli" }}
@@ -91,16 +97,7 @@ az account management-group list #Not allowed by default
```
{{#endtab }}
{{#tab name="AzureAD" }}
```bash
#Get the current session state
Get-AzureADCurrentSessionInfo
#Get details of the current tenant
Get-AzureADTenantDetail
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
{{#tab name="Az" }}
```bash
# Get the information about the current context (Account, Tenant, Subscription etc.)
Get-AzContext
@@ -110,43 +107,79 @@ Get-AzContext -ListAvailable
Get-AzSubscription
#Get Resource group
Get-AzResourceGroup
# Enumerate all resources visible to the current user
Get-AzResource
# Enumerate all Azure RBAC role assignments
Get-AzRoleAssignment # For all users
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com # For current user
```
{{#endtab }}
{{#tab name="Mg" }}
```bash
#Get the current session
Get-MgContext
```
{{#endtab }}
{{#tab name="AzureAD" }}
```bash
#Get the current session state
Get-AzureADCurrentSessionInfo
#Get details of the current tenant
Get-AzureADTenantDetail
```
{{#endtab }}
{{#endtabs }}
> [!CAUTION]
> 识别 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))。\
可以在这里找到指南:
默认情况下,任何用户应该具有**足够的权限来枚举**用户、组、角色、服务主体等内容...(查看 [default AzureAD permissions](az-basic-information/index.html#default-user-permissions)).\
可以在这里找到指南:
{{#ref}}
az-services/az-azuread.md
{{#endref}}
> [!NOTE]
> 现在你 **已经有了一些关于你凭据的信息**(如果你是红队,希望你 **没有被发现**)。是时候找出环境中正在使用哪些服务。\
> 在接下来的部分中,你可以查看一些 **枚举常见服务的方法**。
查看**后期利用工具**以查找在 Entra ID 中提升权限的工具,如**AzureHound**
## 应用服务 SCM
{{#ref}}
az-enumeration-tools.md#automated-post-exploitation-tools
{{#endref}}
Kudu 控制台用于登录到应用服务 '容器'。
## Webshell
### 枚举 Azure 服务
使用 portal.azure.com 并选择 shell,或使用 shell.azure.com,进行 bash 或 powershell。此 shell 的 '磁盘' 作为图像文件存储在存储帐户中
一旦您知道自己是谁,您就可以开始枚举**您可以访问的 Azure 服务**
## Azure DevOps
Az PowerShell 命令 **`Get-AzResource`** 让您**了解当前用户可见的资源**。
Azure DevOps 与 Azure 是分开的。它具有代码库、管道(yaml 或发布)、看板、维基等。变量组用于存储变量值和秘密。
此外,您可以通过访问 [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) 或搜索“所有资源”来在**Web 控制台**中获取相同的信息,或执行:`az rest --method GET --url "https://management.azure.com/subscriptions/<subscription-id>/resources?api-version=2021-04-01"`
此外,拥有足够权限的情况下,可以使用角色 **`Get-AzRoleAssignment`** 来**枚举订阅中的所有角色**或特定资源的权限,指示方式如下:**`Get-AzRoleAssignment -Scope /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.RecoveryServices/vaults/vault-m3ww8ut4`**
在以下部分,您可以找到有关最常见 Azure 服务及其枚举方法的信息:
{{#ref}}
az-services/
{{#endref}}
### 权限提升、后期利用与 Azure 服务中的持久性
一旦您了解 Azure 环境的结构以及正在使用的服务,您就可以开始寻找**提升权限、横向移动、执行其他后期利用攻击和保持持久性**的方法。
在以下部分,您可以找到有关如何在最常见 Azure 服务中提升权限的信息:
{{#ref}}
az-privilege-escalation/
{{#endref}}
在接下来的部分,您可以找到有关如何在最常见 Azure 服务中执行后期利用攻击的信息:
{{#ref}}
az-post-exploitation/
{{#endref}}
在接下来的部分,您可以找到有关如何在最常见 Azure 服务中保持持久性的信息:
{{#ref}}
az-persistence/
{{#endref}}
{{#include ../../banners/hacktricks-training.md}}
@@ -13,7 +13,7 @@ Entra ID 是微软基于云的身份和访问管理 (IAM) 平台,作为 Micros
1. **资源服务器 (RS)** 保护资源所有者拥有的资源。
2. **资源所有者 (RO)** 通常是拥有受保护资源的最终用户。
3. **客户端应用程序 (CA)** 代表资源所有者请求访问资源的应用程序。
4. **授权服务器 (AS)** 在对客户端应用程序进行身份验证和授权后向其发放访问令牌。
4. **授权服务器 (AS)** 在对客户端应用程序进行身份验证和授权后向其发放访问令牌。
**范围和同意:**
@@ -50,7 +50,7 @@ Entra ID 是微软基于云的身份和访问管理 (IAM) 平台,作为 Micros
- 获取新的刷新令牌不会撤销先前的刷新令牌。
> [!WARNING]
> **条件访问**的信息存储在**JWT**中。因此,如果您从允许的 IP 地址请求**令牌**,该**IP**将被**存储**在令牌中,然后您可以从**不允许的 IP 访问资源**使用该令牌
> **条件访问**的信息存储在**JWT**中。因此,如果您从**允许的 IP 地址**请求**令牌**,该**IP**将被**存储**在令牌中,然后您可以使用该令牌从**不允许的 IP 访问资源**。
### 访问令牌 "aud"
@@ -144,19 +144,31 @@ scopes=["https://graph.microsoft.com/.default"],
)
pprint(new_azure_cli_bearer_tokens_for_graph_api)
```
## FOCI Tokens Privilege Escalation
### 其他访问令牌字段
之前提到过,刷新令牌应该与生成时的**范围**、**应用程序**和**租户**绑定。如果这些边界中的任何一个被打破,就有可能提升权限,因为将能够生成对用户有访问权限的其他资源和租户的访问令牌,并且具有比最初预期更多的范围。
- **appid**: 用于生成令牌的应用程序 ID
- **appidacr**: 应用程序身份验证上下文类引用指示客户端的身份验证方式,对于公共客户端,值为 0,如果使用了客户端密钥,则值为 1
- **acr**: 身份验证上下文类引用声明在最终用户身份验证未满足 ISO/IEC 29115 的要求时为 "0"。
- **amr**: 身份验证方法指示令牌是如何被验证的。值为“pwd”表示使用了密码。
- **groups**: 指示主体是哪些组的成员。
- **iss**: 发行者标识生成令牌的安全令牌服务 (STS)。例如 https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/uuid 是租户 ID
- **oid**: 主体的对象 ID
- **tid**: 租户 ID
- **iat, nbf, exp**: 签发时间(何时签发)、不可用时间(在此时间之前不可使用,通常与 iat 相同)、过期时间。
此外,**所有刷新令牌都可以这样做**在 [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/)Microsoft Entra 账户、Microsoft 个人账户以及 Facebook 和 Google 等社交账户)中,因为正如 [**文档**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens) 所提到的:“刷新令牌绑定于用户和客户端的组合,但**不与资源或租户绑定**。客户端可以使用刷新令牌获取**在其有权限的任何资源和租户组合**中的访问令牌。刷新令牌是加密的,只有 Microsoft identity platform 可以读取它们。”
## FOCI 令牌特权提升
此外,请注意 FOCI 应用程序是公共应用程序,因此**不需要秘密**来进行服务器身份验证
之前提到过,刷新令牌应与生成时的 **范围**、**应用程序**和 **租户** 绑定。如果打破了这些边界,就有可能提升特权,因为将能够生成用户有权访问的其他资源和租户的访问令牌,并且具有比最初预期更多的范围
然后在 [**原始研究**](https://github.com/secureworks/family-of-client-ids-research/tree/main) 中报告的已知 FOCI 客户端可以在 [**这里找到**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv)。
此外,**所有刷新令牌都可以这样做** 在 [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/)Microsoft Entra 账户、Microsoft 个人账户以及 Facebook 和 Google 等社交账户)中,因为正如 [**文档**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens) 所提到的:“刷新令牌绑定于用户和客户端的组合,但 **不绑定于资源或租户**。客户端可以使用刷新令牌获取 **在其有权限的任何资源和租户组合** 中的访问令牌。刷新令牌是加密的,只有 Microsoft identity platform 可以读取它们。”
### Get different scope
此外,请注意 FOCI 应用程序是公共应用程序,因此 **不需要密钥** 来进行服务器身份验证。
继续之前的示例代码,在这段代码中请求一个不同范围的新令牌:
然后在 [**原始研究**](https://github.com/secureworks/family-of-client-ids-research/tree/main) 中报告的已知 FOCI 客户端可以 [**在这里找到**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv)。
### 获取不同的范围
继续之前的示例代码,在此代码中请求一个不同范围的新令牌:
```python
# Code from https://github.com/secureworks/family-of-client-ids-research
azure_cli_bearer_tokens_for_outlook_api = (
@@ -192,5 +204,6 @@ pprint(microsoft_office_bearer_tokens_for_graph_api)
## 参考
- [https://github.com/secureworks/family-of-client-ids-research](https://github.com/secureworks/family-of-client-ids-research)
- [https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md](https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md)
{{#include ../../../banners/hacktricks-training.md}}
@@ -36,7 +36,7 @@ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
```sh
brew install powershell/tap/powershell
```
3. 运行 PowerShell:
3. 运行 PowerShell
```sh
pwsh
```
@@ -49,7 +49,7 @@ brew upgrade powershell
### az cli
[**Azure 命令行界面 (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) 是一个跨平台工具,使用 Python 编写,用于管理和管理 (大多数) Azure 和 Entra ID 资源。它连接到 Azure 并通过命令行或脚本执行管理命令。
[**Azure 命令行界面 (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) 是一个用 Python 编写的跨平台工具,用于管理和管理 (大多数) Azure 和 Entra ID 资源。它连接到 Azure 并通过命令行或脚本执行管理命令。
请访问此链接以获取 [**安装说明¡**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install)。
@@ -79,6 +79,21 @@ export REQUESTS_CA_BUNDLE=/Users/user/Downloads/cacert.pem
```
{{#endtab }}
{{#tab name="CMD" }}
```bash
set ADAL_PYTHON_SSL_NO_VERIFY=1
set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1
set HTTPS_PROXY="http://127.0.0.1:8080"
set 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 cacert.der -inform DER -out cacert.pem -outform PEM
set REQUESTS_CA_BUNDLE=C:\Users\user\Downloads\cacert.pem
```
{{#endtab }}
{{#tab name="PS" }}
```bash
$env:ADAL_PYTHON_SSL_NO_VERIFY=1
@@ -93,9 +108,9 @@ $env:HTTP_PROXY="http://127.0.0.1:8080"
Azure PowerShell 是一个模块,包含用于直接从 PowerShell 命令行管理 Azure 资源的 cmdlets。
请访问此链接以获取 [**安装说明**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell)
Follow this link for the [**installation instructions**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell).
Azure PowerShell AZ 模块中的命令结构如下:`<Action>-Az<Service> <parameters>`
Commands in Azure PowerShell AZ Module are structured like: `<Action>-Az<Service> <parameters>`
#### Debug | MitM Az PowerShell
@@ -121,7 +136,7 @@ Get-MgUser -Debug
```
### ~~**AzureAD Powershell**~~
Azure Active Directory (AD) 模块现在 **已弃用**,是 Azure PowerShell 的一部分,用于管理 Azure AD 资源。它提供了用于管理用户、组和 Entra ID 中应用程序注册的 cmdlet。
Azure Active Directory (AD) 模块现在 **已弃用**,是用于管理 Azure AD 资源的 Azure PowerShell 的一部分。它提供了用于管理用户、组和 Entra ID 中应用程序注册的 cmdlet。
> [!TIP]
> 这被 Microsoft Graph PowerShell 替代
@@ -132,7 +147,7 @@ Azure Active Directory (AD) 模块现在 **已弃用**,是 Azure PowerShell
### [turbot azure plugins](https://github.com/orgs/turbot/repositories?q=mod-azure)
Turbot 与 steampipe 和 powerpipe 结合使用,可以从 Azure 和 Entra ID 收集信息,执行合规检查并查找配置错误。目前推荐运行的 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)
@@ -226,7 +241,7 @@ python scout.py azure --cli
```
### [Azure-MG-Sub-Governance-Reporting](https://github.com/JulianHayward/Azure-MG-Sub-Governance-Reporting)
这是一个 PowerShell 脚本,帮助您 **可视化管理组和 Entra ID** 租户中的所有资源和权限,并查找安全错误配置。
这是一个 PowerShell 脚本,帮助您 **可视化管理组和 Entra ID** 租户中的所有资源和权限,并查找安全配置错误
它使用 Az PowerShell 模块工作,因此该工具支持的任何身份验证也被该工具支持。
```bash
@@ -270,7 +285,7 @@ Get-AzureDomainInfo -folder MicroBurst -Verbose
```
### [**PowerZure**](https://github.com/hausec/PowerZure)
PowerZure 的创建是出于对一个可以同时进行 Azure、EntraID 及相关资源的侦察和利用的框架的需求。
PowerZure 的创建是出于对一个能够同时进行 Azure、EntraID 及相关资源的侦察和利用的框架的需求。
它使用 **Az PowerShell** 模块,因此该工具支持的任何身份验证也都被该工具支持。
```bash
@@ -303,7 +318,7 @@ 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) 账户中掠夺数据。
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
@@ -347,7 +362,7 @@ Invoke-GraphRunner -Tokens $tokens
```
### [Stormspotter](https://github.com/Azure/Stormspotter)
Stormspotter 创建了一个 Azure 订阅中资源的“攻击图”。它使红队和渗透测试人员能够可视化攻击面和租户内的转移机会,并增强了防御者快速定位和优先处理事件响应工作的能力。
Stormspotter 创建了一个 Azure 订阅中资源的“攻击图”。它使红队和渗透测试人员能够可视化攻击面和租户内的转移机会,并增强了防御者快速定位和优先处理事件响应工作的能力。
**不幸的是,它看起来没有维护**
```bash
@@ -66,12 +66,23 @@ $token = (az account get-access-token --resource https://graph.microsoft.com --q
$secureToken = ConvertTo-SecureString $token -AsPlainText -Force
Connect-MgGraph -AccessToken $secureToken
# Get token from session
Parameters = @{
Method = "GET"
Uri = "/v1.0/me"
OutputType = "HttpResponseMessage"
}
$Response = Invoke-MgGraphRequest @Parameters
$Headers = $Response.RequestMessage.Headers
$Headers.Authorization.Parameter
# Find commands
Find-MgGraphCommand -command *Mg*
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
{{#tab name="Az" }}
```bash
Connect-AzAccount #Open browser
# Using credentials
@@ -80,15 +91,11 @@ $creds = New-Object System.Management.Automation.PSCredential("test@corp.onmicro
Connect-AzAccount -Credential $creds
# Get Access Token
(Get-AzAccessToken).Token
# Request access token to other endpoints: AadGraph, AnalysisServices, Arm, Attestation, Batch, DataLake, KeyVault, MSGraph, OperationalInsights, ResourceManager, Storage, Synapse
(Get-AzAccessToken -ResourceTypeName MSGraph).Token
(Get-AzAccessToken -Resource "https://graph.microsoft.com").Token
(ConvertFrom-SecureString (Get-AzAccessToken -ResourceTypeName Arm -AsSecureString).Token -AsPlainText)
# Connect with access token
Connect-AzAccount -AccountId test@corp.onmicrosoft.com -AccessToken $token
Connect-AzAccount -AccessToken $token -GraphAccessToken $graphaccesstoken -AccountId <ACCOUNT-ID>
## The -AccessToken is from management.azure.com
Connect-AzAccount -AccountId test@corp.onmicrosoft.com [-AccessToken $ManagementToken] [-GraphAccessToken $AADGraphToken] [-MicrosoftGraphAccessToken $MicrosoftGraphToken] [-KeyVaultAccessToken $KeyVaultToken]
# Connect with Service principal/enterprise app secret
$password = ConvertTo-SecureString 'KWEFNOIRFIPMWL.--DWPNVFI._EDWWEF_ADF~SODNFBWRBIF' -AsPlainText -Force
@@ -151,7 +158,7 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
当您通过 **CLI** 登录 Azure 时,您使用的是属于 **Microsoft****租户** 中的 **Azure 应用程序**。这些应用程序,如您可以在您的帐户中创建的应用程序,**具有客户端 ID**。您 **无法看到所有这些应用程序** 在控制台中可见的 **允许的应用程序列表** 中,**但它们默认是被允许的**。
例如,一个 **powershell 脚本** 使用客户端 ID **`1950a258-227b-4e31-a9cf-717495945fc2`** 进行 **身份验证**。即使该应用程序未出现在控制台中,系统管理员仍然可以 **阻止该应用程序**,以便用户无法使用通过该应用程序连接的工具访问。
例如,一个 **powershell 脚本** 通过客户端 ID **`1950a258-227b-4e31-a9cf-717495945fc2`** 进行 **身份验证** 的应用程序。即使该应用程序未出现在控制台中,系统管理员仍然可以 **阻止该应用程序**,以便用户无法使用通过该应用程序连接的工具访问。
然而,还有 **其他客户端 ID** 的应用程序 **将允许您连接到 Azure**
```bash
@@ -279,7 +286,7 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
{{#tab name="Az" }}
```bash
# Enumerate users
Get-AzADUser
@@ -302,7 +309,7 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
```
### MFA & Conditional Access Policies
强烈建议为每个用户添加 MFA,然而,一些公司可能不会设置它,或者可能会通过条件访问进行设置:用户在特定位置、浏览器或 **某些条件** 登录时将 **需要 MFA**。如果这些策略配置不正确,可能会容易受到 **绕过**。检查:
强烈建议为每个用户添加 MFA,然而,一些公司可能不会设置它,或者可能会通过条件访问进行设置:用户在特定位置、浏览器或 **某些条件** 登录时将 **需要 MFA**。如果这些策略配置不正确,可能会容易受到 **绕过**。检查:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -346,6 +353,22 @@ az role assignment list --include-groups --include-classic-administrators true -
```
{{#endtab }}
{{#tab name="Az" }}
```bash
# Get all groups
Get-AzADGroup
# Get details of a group
Get-AzADGroup -ObjectId <id>
# Search group by string
Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName
Get-AzADGroup |?{$_.Displayname -match "admin"}
# Get members of group
Get-AzADGroupMember -GroupDisplayName <resource_group_name>
# Get roles of group
Get-AzRoleAssignment -ResourceGroupName <resource_group_name>
```
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# Enumerate Groups
@@ -373,22 +396,6 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
Get-AzureADGroup -ObjectId <id> | Get-AzureADGroupAppRoleAssignment | fl *
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```bash
# Get all groups
Get-AzADGroup
# Get details of a group
Get-AzADGroup -ObjectId <id>
# Search group by string
Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName
Get-AzADGroup |?{$_.Displayname -match "admin"}
# Get members of group
Get-AzADGroupMember -GroupDisplayName <resource_group_name>
# Get roles of group
Get-AzRoleAssignment -ResourceGroupName <resource_group_name>
```
{{#endtab }}
{{#endtabs }}
#### 将用户添加到组
@@ -433,28 +440,7 @@ az ad sp list --query '[?length(keyCredentials) > `0` || length(passwordCredenti
```
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# Get Service Principals
Get-AzureADServicePrincipal -All $true
# Get details about a SP
Get-AzureADServicePrincipal -ObjectId <id> | fl *
# Get SP by string name or Id
Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl
Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"}
# Get owner of SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwner |fl *
# Get objects owned by a SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwnedObject
# Get objects created by a SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalCreatedObject
# Get groups where the SP is a member
Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembership |fl *
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
{{#tab name="Az" }}
```bash
# Get SPs
Get-AzADServicePrincipal
@@ -481,6 +467,27 @@ Headers = @{
(Invoke-RestMethod @RequestParams).value
```
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# Get Service Principals
Get-AzureADServicePrincipal -All $true
# Get details about a SP
Get-AzureADServicePrincipal -ObjectId <id> | fl *
# Get SP by string name or Id
Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl
Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"}
# Get owner of SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwner |fl *
# Get objects owned by a SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwnedObject
# Get objects created by a SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalCreatedObject
# Get groups where the SP is a member
Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembership |fl *
```
{{#endtab }}
{{#endtabs }}
> [!WARNING]
@@ -625,6 +632,19 @@ az ad app list --query '[?length(keyCredentials) > `0` || length(passwordCredent
```
{{#endtab }}
{{#tab name="Az" }}
```bash
# Get Apps
Get-AzADApplication
# Get details of one App
Get-AzADApplication -ObjectId <id>
# Get App searching by string
Get-AzADApplication | ?{$_.DisplayName -match "app"}
# Get Apps with password
Get-AzADAppCredential
```
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# List all registered applications
@@ -637,19 +657,6 @@ Get-AzureADApplication -All $true | %{if(Get-AzureADApplicationPasswordCredentia
Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```bash
# Get Apps
Get-AzADApplication
# Get details of one App
Get-AzADApplication -ObjectId <id>
# Get App searching by string
Get-AzADApplication | ?{$_.DisplayName -match "app"}
# Get Apps with password
Get-AzADAppCredential
```
{{#endtab }}
{{#endtabs }}
> [!WARNING]
@@ -716,7 +723,7 @@ az role assignment list --all --query "[?principalName=='carlos@carloshacktricks
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
{{#tab name="Az" }}
```bash
# Get role assignments on the subscription
Get-AzRoleDefinition
@@ -850,7 +857,7 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
{{#endtabs }}
> [!WARNING]
> 如果设备(虚拟机)是 **AzureAD 加入**,来自 AzureAD 的用户将 **能够登录**。\
> 如果设备(虚拟机)是 **AzureAD 加入**,来自 AzureAD 的用户将能够 **登录**。\
> 此外,如果登录的用户是设备的 **所有者**,他将成为 **本地管理员**。
### 管理单位
@@ -906,10 +913,10 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
### 特权身份管理 (PIM)
Azure 中的特权身份管理 (PIM) 有助于 **防止不必要地将过多的权限** 分配给用户。
特权身份管理 (PIM) 在 Azure 中帮助**防止不必要地将过多特权**分配给用户。
PIM 提供的主要功能之一是,它允许不将角色分配给持续活跃的主体,而是使其 **在一段时间内(例如 6 个月)有资格**。然后,每当用户想要激活该角色时,他需要请求并指明他需要该权限的时间(例如 3 小时)。然后 **管理员需要批准** 该请求。\
请注意,用户还可以请求 **延长** 时间。
PIM 提供的主要功能之一是,它允许不将角色分配给持续活跃的主体,而是使其**在一段时间内(例如 6 个月)有资格**。然后,每当用户想要激活该角色时,他需要请求并指明他需要特权的时间(例如 3 小时)。然后**管理员需要批准**该请求。\
请注意,用户还可以请求**延长**时间。
此外,**PIM 会在特权角色被分配给某人时发送电子邮件**。
@@ -924,7 +931,7 @@ PIM 提供的主要功能之一是,它允许不将角色分配给持续活跃
- 激活时需要票据信息
- 激活时需要批准
- 过期的合格分配的最大时间
- 以及更多关于何时以及谁在某些操作发生时发送通知的配置
- 还有更多关于何时以及谁在某些操作发生时发送通知的配置
### 条件访问策略 <a href="#title-text" id="title-text"></a>
@@ -936,9 +943,9 @@ PIM 提供的主要功能之一是,它允许不将角色分配给持续活跃
### Entra 身份保护 <a href="#title-text" id="title-text"></a>
Entra 身份保护是一项安全服务,允许 **检测用户或登录尝试的风险过高**,从而 **阻止** 用户或登录尝试。
Entra 身份保护是一项安全服务,允许**检测用户或登录尝试是否过于风险**以被接受,从而**阻止**用户或登录尝试。
它允许管理员配置在风险为“低及以上”、“中等及以上”或“高”时 **阻止** 尝试。尽管默认情况下它是完全 **禁用** 的:
它允许管理员配置在风险为“低及以上”、“中等及以上”或“高”时**阻止**尝试。尽管默认情况下它是完全**禁用**的:
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
@@ -948,11 +955,11 @@ Entra 身份保护是一项安全服务,允许 **检测用户或登录尝试
### Entra 密码保护
Entra 密码保护 ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) 是一项安全功能,**通过在多次登录尝试失败时锁定帐户来帮助防止弱密码的滥用**。\
它还允许 **禁止自定义密码列表**,该列表需要您提供。
它还允许**禁止自定义密码列表**,该列表需要您提供。
它可以 **同时应用于** 云级别和本地 Active Directory。
它可以**同时应用于**云级别和本地 Active Directory。
默认模式是 **审计**
默认模式是**审计**
<figure><img src="../../../images/image (355).png" alt=""><figcaption></figcaption></figure>
@@ -6,22 +6,23 @@
### 租户枚举
有一些 **公共 Azure API**,只需知道 **租户的域名**,攻击者就可以查询以收集更多信息。\
您可以直接查询 API 或使用 PowerShell 库 [**AADInternals**](https://github.com/Gerenios/AADInternals)**:**
有一些**公共 Azure API**,只需知道**租户的域名**,攻击者就可以查询以收集更多信息。\
您可以直接查询 API 或使用 PowerShell 库 [**AADInternals**](https://github.com/Gerenios/AADInternals) (`Install-Module 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>` |
- **登录信息,包括租户 ID**
- `Get-AADIntTenantID -Domain <domain>` (主要 API `login.microsoftonline.com/<domain>/.well-known/openid-configuration`)
- **租户中的所有有效域名**
- `Get-AADIntTenantDomains -Domain <domain>` (主要 API `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`)
- **用户的登录信息**。如果 `NameSpaceType``Managed`,则表示使用了 EntraID
- `Get-AADIntLoginInformation -UserName <UserName>` (主要 API `login.microsoftonline.com/GetUserRealm.srf?login=<UserName>`)
您可以使用 **[**AADInternals**](https://github.com/Gerenios/AADInternals) 的一个命令** 查询 Azure 租户的所有信息:
您可以使用 [**AADInternals**](https://github.com/Gerenios/AADInternals) 的**一个命令**查询 Azure 租户的所有信息:
```bash
# Doesn't work in macos because 'Resolve-DnsName' doesn't exist
Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table
```
Azure 租户信息的示例:
```
## Output Example of the Azure tenant info:
Tenant brand: Company Ltd
Tenant name: company
Tenant id: 1937e3ab-38de-a735-a830-3075ea7e5b39
@@ -34,13 +35,16 @@ company.mail.onmicrosoft.com True True True Managed
company.onmicrosoft.com True True True Managed
int.company.com False False False Managed
```
可以观察到有关租户的名称、ID和“品牌”名称的详细信息。此外,桌面单点登录(SSO)的状态,也称为 [**无缝 SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso),也会显示。当启用时,此功能有助于确定目标组织中特定用户的存在(枚举)。
可以观察到有关租户的名称、ID和“品牌”名称的详细信息。此外,桌面单点登录(SSO)的状态,也称为 [**Seamless 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”语句,这可能导致假阴性。
### 用户枚举
可以 **检查用户名是否存在** 于租户中。这也包括 **访客用户**,其用户名格式为:
> [!TIP]
> 请注意,即使一个租户为同一用户使用多个电子邮件,**用户名是唯一的**。这意味着它只会与用户关联的域有效,而不适用于其他域。
可以**检查用户名是否存在**于租户中。这也包括**访客用户**,其用户名格式为:
```
<email>#EXT#@<tenant name>.onmicrosoft.com
```
@@ -71,23 +75,30 @@ external.user_outlook.com#EXT#@company.onmicrosoft.com
# Invoke user enumeration
Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal
```
有**三种不同的枚举方法**可供选择
目前有 **4 种不同的枚举方法** 可供选择。您可以在 `Get-Help Invoke-AADIntUserEnumerationAsOutsider` 中找到信息
| 方法 | 描述 |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Normal | 这指的是上述提到的 GetCredentialType API。默认方法。 |
| Login | <p>此方法尝试以用户身份登录。<br><strong>注意:</strong>查询将记录到登录日志中。</p> |
| Autologon | <p>此方法尝试通过自动登录端点以用户身份登录。<br><strong>查询不会记录</strong>到登录日志中!因此,对于密码喷射和暴力攻击也非常有效。</p> |
它支持以下枚举方法:Normal、Login、Autologon 和 RST2。
在发现有效用户名后,您可以通过以下方式获取**用户信息**:
- **Normal** 方法似乎目前适用于所有租户。之前它要求至少为一个域启用桌面 SSO(即无缝 SSO)。
- **Login** 方法适用于任何租户,但枚举查询将作为失败的登录事件记录到 Azure AD 登录日志中!
- **Autologon** 方法似乎不再适用于所有租户。可能需要启用 DesktopSSO 或目录同步。
在发现有效的用户名后,您可以使用以下命令获取 **用户信息**
```bash
Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com
```
该脚本 [**o365creeper**](https://github.com/LMGsec/o365creeper) 还允许您发现 **电子邮件是否有效**
该脚本 [**o365spray**](https://github.com/0xZDH/o365spray) 还允许您发现 **电子邮件是否有效**
```bash
# Put in emails.txt emails such as:
# - root@corp.onmicrosoft.com
python.exe .\o365creeper\o365creeper.py -f .\emails.txt -o validemails.txt
git clone https://github.com/0xZDH/o365spray
cd o365spray
python3 -m pip install -r requirements.txt
# Check 1 email
python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -u carlos
# Check a list of emails
python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -U /tmp/users.txt
```
**通过 Microsoft Teams 进行用户枚举**
@@ -97,11 +108,17 @@ Microsoft Teams 的 API 允许搜索用户。特别是 "user search" 端点 **ex
根据 API 响应,可以区分不存在的用户和具有有效 Teams 订阅的现有用户。
脚本 [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) 可用于验证给定用户名集与 Teams API 的一致性。
脚本 [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) 可用于验证给定用户名集与 Teams API 的一致性,但您需要访问具有 Teams 访问权限的用户才能使用它
```bash
python3 TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-output.json
# Install
git clone https://github.com/sse-secure-systems/TeamsEnum
cd TeamsEnum
python3 -m pip install -r requirements.txt
# Login and ask for password
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 +136,7 @@ python3 TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-out
```
jq . teamsenum-output.json
```
请提供需要翻译的具体内容。
请提供需要翻译的内容。
```json
{
"email": "user2@domain",
@@ -168,53 +185,60 @@ jq . teamsenum-output.json
]
}
```
## Azure Services
知道我们知道 **Azure 租户** 使用的 **域名** 后,是时候尝试查找 **暴露的 Azure 服务**
您可以使用来自 [**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`** 生成排列(非常简单),以尝试 **查找开放存储账户**
```bash
Import-Module .\MicroBurst\MicroBurst.psm1
Invoke-EnumerateAzureBlobs -Base corp
[...]
https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
[...]
# Access https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
# Check: <Name>ssh_info.json</Name>
# Access then https://corpcommon.blob.core.windows.net/secrets/ssh_info.json
```
### SAS URLs
一个 _**共享访问签名**_ (SAS) URL 是一个 **提供访问** 存储帐户某些部分的 URL(可以是整个容器、一个文件...),并具有对资源的特定权限(读取、写入...)。如果你发现一个泄露的链接,你可能能够访问敏感信息,它们看起来像这样(这是访问一个容器,如果只是授予对一个文件的访问,URL 的路径也会包含该文件):
`https://<storage_account_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D`
使用 [**Storage Explorer**](https://azure.microsoft.com/en-us/features/storage-explorer/) 访问数据
## Compromise Credentials
### Phishing
- [**常见钓鱼**](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
### 密码喷洒 / 暴力破解
{{#ref}}
az-password-spraying.md
{{#endref}}
## References
## 使用域的 Azure 服务
还可以尝试在常见的 Azure 子域中查找 **暴露的 Azure 服务**,如在这篇 [文章中记录的:
](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/)
- 应用服务: `azurewebsites.net`
- 应用服务 管理: `scm.azurewebsites.net`
- 应用服务: `p.azurewebsites.net`
- 应用服务: `cloudapp.net`
- 存储帐户-文件: `file.core.windows.net`
- 存储帐户-Blob: `blob.core.windows.net`
- 存储帐户-队列: `queue.core.windows.net`
- 存储帐户-表: `table.core.windows.net`
- 数据库-Redis: `redis.cache.windows.net`
- 数据库-Cosmos DB: `documents.azure.com`
- 数据库-MSSQL: `database.windows.net`
- 密钥保管库: `vault.azure.net`
- 微软托管域: `onmicrosoft.com`
- 电子邮件: `mail.protection.outlook.com`
- SharePoint: `sharepoint.com`
- CDN: `azureedge.net`
- 搜索设备: `search.windows.net`
- API 服务: `azure-api.net`
您可以使用 [**MicroBust**](https://github.com/NetSPI/MicroBurst) 中的方法来实现此目标。此功能将在多个 **azure 域**中搜索基本域名(及其一些变体):
```bash
Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
Invoke-EnumerateAzureSubDomains -Base corp -Verbose
```
## 钓鱼
- [**常见钓鱼**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) 用于凭证或通过 [OAuth Apps](az-oauth-apps-phishing.md)
- [**设备代码认证** 钓鱼](az-device-code-authentication-phishing.md)
## 文件系统凭证
**`az cli`** 在 **`<HOME>/.Azure`** 中存储了很多有趣的信息:
- **`azureProfile.json`** 包含过去登录用户的信息
- **`clouds.config`** 包含订阅的信息
- **`service_principal_entries.json`** 包含应用程序的 **凭证**(租户 ID、客户端和密钥)
- **`msal_token_cache.json`** 包含 **访问令牌和刷新令牌**
请注意,在 macOS 和 Linux 中,这些文件是 **未保护** 的,以明文存储。
## 参考
- [https://aadinternals.com/post/just-looking/](https://aadinternals.com/post/just-looking/)
- [https://www.securesystems.de/blog/a-fresh-look-at-user-enumeration-in-microsoft-teams/](https://www.securesystems.de/blog/a-fresh-look-at-user-enumeration-in-microsoft-teams/)
- [https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/)
{{#include ../../../banners/hacktricks-training.md}}