GCP - Storage Privesc
Storage
基本信息:
storage.objects.get
storage.objects.get
此权限允许您下载存储在 Cloud Storage 中的文件。这可能会让您提升权限,因为在某些情况下敏感信息会保存在那里。此外,一些 GCP 服务将其信息存储在存储桶中:
GCP Composer:当您创建一个 Composer 环境时,所有 DAG 的代码将保存在一个存储桶中。这些任务的代码中可能包含有趣的信息。
GCR (容器注册表):容器的镜像存储在存储桶中,这意味着如果您可以读取存储桶,您将能够下载镜像并搜索泄漏和/或源代码。
storage.objects.setIamPolicy
storage.objects.setIamPolicy
您可以授予自己权限以滥用本节中的任何先前场景。
storage.buckets.setIamPolicy
storage.buckets.setIamPolicy
有关如何使用此权限修改权限的示例,请查看此页面:
storage.hmacKeys.create
storage.hmacKeys.create
Cloud Storage 的“互操作性”功能,旨在实现与 AWS S3 等的跨云交互,涉及为服务账户和用户创建 HMAC 密钥。攻击者可以通过为具有提升权限的服务账户生成 HMAC 密钥来利用这一点,从而在 Cloud Storage 中提升权限。虽然与用户相关的 HMAC 密钥只能通过网络控制台检索,但访问密钥和秘密密钥始终保持可访问,允许潜在的备份访问存储。相反,与服务账户关联的 HMAC 密钥可以通过 API 访问,但其访问密钥和秘密密钥在创建后无法检索,增加了持续访问的复杂性。
另一个针对此方法的利用脚本可以在 这里 找到。
storage.objects.create
, storage.objects.delete
= 存储写入权限
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.py
或app.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 不会将图像存储在存储桶中。
参考文献
Last updated