GCP - Storage Privesc

Support HackTricks

Storage

基本信息:

storage.objects.get

此权限允许您下载存储在 Cloud Storage 中的文件。这可能会让您提升权限,因为在某些情况下敏感信息会保存在那里。此外,一些 GCP 服务将其信息存储在存储桶中:

  • GCP Composer:当您创建一个 Composer 环境时,所有 DAG 的代码将保存在一个存储桶中。这些任务的代码中可能包含有趣的信息。

  • GCR (容器注册表):容器的镜像存储在存储桶中,这意味着如果您可以读取存储桶,您将能够下载镜像并搜索泄漏和/或源代码

storage.objects.setIamPolicy

您可以授予自己权限以滥用本节中的任何先前场景

storage.buckets.setIamPolicy

有关如何使用此权限修改权限的示例,请查看此页面:

storage.hmacKeys.create

Cloud Storage 的“互操作性”功能,旨在实现与 AWS S3 等的跨云交互,涉及为服务账户和用户创建 HMAC 密钥。攻击者可以通过为具有提升权限的服务账户生成 HMAC 密钥来利用这一点,从而在 Cloud Storage 中提升权限。虽然与用户相关的 HMAC 密钥只能通过网络控制台检索,但访问密钥和秘密密钥始终保持可访问,允许潜在的备份访问存储。相反,与服务账户关联的 HMAC 密钥可以通过 API 访问,但其访问密钥和秘密密钥在创建后无法检索,增加了持续访问的复杂性。

# Create key
gsutil hmac create <sa-email> # You might need to execute this inside a VM instance

## If you have TROUBLES creating the HMAC key this was you can also do it contacting the API directly:
PROJECT_ID = '$PROJECT_ID'
TARGET_SERVICE_ACCOUNT = f"exam-storage-sa-read-flag-3@{PROJECT_ID}.iam.gserviceaccount.com"
ACCESS_TOKEN = "$CLOUDSDK_AUTH_ACCESS_TOKEN"
import requests
import json
key = requests.post(
f'https://www.googleapis.com/storage/v1/projects/{PROJECT_ID}/hmacKeys',
params={'access_token': ACCESS_TOKEN, 'serviceAccountEmail': TARGET_SERVICE_ACCOUNT}
).json()
#print(json.dumps(key, indent=4))
print(f'ID: {key["metadata"]["accessId"]}')
print(f'Secret: {key["secret"]}')


# Configure gsutil to use the HMAC key
gcloud config set pass_credentials_to_gsutil false
gsutil config -a

# Use it
gsutil ls gs://[BUCKET_NAME]

# Restore
gcloud config set pass_credentials_to_gsutil true

另一个针对此方法的利用脚本可以在 这里 找到。

storage.objects.create, storage.objects.delete = 存储写入权限

为了在存储桶中创建新对象,您需要 storage.objects.create,并且根据 文档,您还需要 storage.objects.delete修改现有对象。

在可以在云中写入的存储桶中,常见的利用是当存储桶保存网页服务器文件时,您可能能够存储新代码,该代码将被网页应用程序使用。

Composer

Composer 是在 GCP 中管理的 Apache Airflow。它有几个有趣的功能:

  • 它运行在 GKE 集群 中,因此 集群使用的服务账户可以被 Composer 中运行的代码访问

  • Composer 环境的所有组件(DAG 的代码、插件和数据)都存储在 GCP 存储桶中。如果攻击者对其具有读写权限,他可以监控存储桶,并且每当创建或更新 DAG 时,提交一个后门版本,这样 Composer 环境就会从存储中获取后门版本。

您可以在该仓库中找到此攻击的 PoC: https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs

Cloud Functions

  • Cloud Functions 代码存储在存储中,每当创建新版本时,代码会推送到存储桶,然后从该代码构建新容器。因此,在新版本构建之前覆盖代码可以使云函数执行任意代码

您可以在该仓库中找到此攻击的 PoC: https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions

App Engine

AppEngine 版本在存储桶中生成一些数据,格式为:staging.<project-id>.appspot.com。在此存储桶中,可以找到一个名为 ae 的文件夹,该文件夹将包含每个 AppEngine 应用程序版本的文件夹,在这些文件夹中可以找到 manifest.json 文件。该文件包含一个 JSON,列出必须用于创建特定版本的所有文件。此外,可以找到文件的真实名称、它们在 GCP 存储桶中的 URL(存储桶中的文件更改了名称为其 sha1 哈希)和每个文件的 sha1 哈希。

请注意,由于 GCP 用户没有权限使用域名 appspot.com 生成存储桶,因此无法预先接管此存储桶。

然而,拥有对该存储桶的读写访问权限,可以通过监控存储桶并在每次进行更改(新版本)时尽快修改新版本,从而提升与 App Engine 版本关联的服务账户的权限。这样,从该代码创建的容器将执行后门代码。

提到的攻击可以通过多种不同方式执行,所有这些方式都从监控 staging.<project-id>.appspot.com 存储桶开始:

  • 将 AppEngine 版本的完整新代码上传到不同且可用的存储桶,并准备一个包含新存储桶名称和其 sha1 哈希的 manifest.json 文件。然后,当在存储桶中创建新版本时,您只需修改 manifest.json 文件并上传恶意文件。

  • 上传一个修改过的 requirements.txt 版本,该版本将使用恶意依赖代码并更新 manifest.json 文件,包含新文件名、URL 和哈希。

  • 上传一个修改过的 main.pyapp.yaml 文件,该文件将执行恶意代码并更新 manifest.json 文件,包含新文件名、URL 和哈希。

您可以在该仓库中找到此攻击的 PoC: https://github.com/carlospolop/Monitor-Backdoor-AppEngine

GCR

  • Google Container Registry 将图像存储在存储桶中,如果您可以写入这些存储桶,您可能能够横向移动到这些存储桶运行的地方。

  • GCR 使用的存储桶将具有类似于 gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com 的 URL(顶级子域在 这里 指定)。

此服务已被弃用,因此此攻击不再有效。此外,替代此服务的 Artifact Registry 不会将图像存储在存储桶中。

参考文献

支持 HackTricks

Last updated