Cloud Storage 有一个特性,即“互操作性”,它为 Cloud Storage 提供了一种与来自其他云提供商(如 AWS S3)的存储产品进行交互的方式。作为其中的一部分,可以为服务帐户和普通用户创建 HMAC 密钥。我们可以通过为更高权限的服务帐户创建 HMAC 密钥来升级 Cloud Storage 权限。
属于您的用户的 HMAC 密钥不能通过 API 访问,必须通过 Web 控制台访问,但好的是访问密钥和密钥在任何时候都可用。这意味着我们可以获取现有的一对并将它们存储起来,以便备份访问帐户。属于服务帐户的 HMAC 密钥可以通过 API 访问,但创建后,您将无法再次看到访问密钥和秘密。
上面的屏幕截图显示了来自 gsutil CLI 的简单命令,用于为服务帐户创建 HMAC 密钥。现在您只需使用这些密钥作为服务帐户访问 Cloud Storage API。
还有另一种使用 GCP API 进行身份验证的方法,称为 API 密钥。默认情况下,它们的创建没有任何限制,这意味着它们可以访问创建它们的整个 GCP 项目。我们可以通过创建一个可能比我们自己的用户拥有更多权限的新 API 密钥来利用这一事实。对此没有官方 API,因此需要将自定义 HTTP 请求发送到https://apikeys.clients6.google.com/ (或https://apikeys.googleapis.com/)。这是通过在浏览 GCP Web 控制台时监控 HTTP 请求和响应而发现的。有关与 API 密钥相关的限制的文档,请访问此链接。
发现另一个未记录的 API 用于列出已经创建的 API 密钥(这也可以在 Web 控制台中完成)。因为创建后仍然可以看到 API 密钥的值,所以我们可以拉取项目中的所有 API 密钥。
accesscontextmanager.accessPolicies.setIamPolicy
accesscontextmanager.policies.setIamPolicy
apigee.environments.setIamPolicy
artifactregistry.repositories.setIamPolicy
automl.datasets.setIamPolicy
automl.locations.setIamPolicy
automl.models.setIamPolicy
bigquery.connections.setIamPolicy
bigquery.datasets.setIamPolicy
bigtable.instances.setIamPolicy
bigtable.tables.setIamPolicy
billing.accounts.setIamPolicy
binaryauthorization.attestors.setIamPolicy
binaryauthorization.policy.setIamPolicy
cloudfunctions.functions.setIamPolicy
cloudiot.registries.setIamPolicy
cloudkms.cryptoKeys.setIamPolicy
cloudkms.importJobs.setIamPolicy
cloudkms.keyRings.setIamPolicy
cloudprivatecatalogproducer.catalogs.setIamPolicy
cloudsupport.accounts.setIamPolicy
cloudtasks.queues.setIamPolicy
compute.disks.setIamPolicy
compute.globalOperations.setIamPolicy
compute.images.setIamPolicy
compute.instanceTemplates.setIamPolicy
compute.instances.setIamPolicy
compute.licenseCodes.setIamPolicy
compute.licenses.setIamPolicy
compute.maintenancePolicies.setIamPolicy
compute.networkEndpointGroups.setIamPolicy
compute.nodeGroups.setIamPolicy
compute.nodeTemplates.setIamPolicy
compute.regionOperations.setIamPolicy
compute.securityPolicies.setIamPolicy
compute.snapshots.setIamPolicy
compute.subnetworks.setIamPolicy
compute.zoneOperations.setIamPolicy
datacatalog.categories.setIamPolicy
datacatalog.entries.setIamPolicy
datacatalog.entryGroups.setIamPolicy
datacatalog.tagTemplates.setIamPolicy
datacatalog.taxonomies.setIamPolicy
datafusion.instances.setIamPolicy
dataproc.autoscalingPolicies.setIamPolicy
dataproc.clusters.setIamPolicy
dataproc.jobs.setIamPolicy
dataproc.operations.setIamPolicy
dataproc.workflowTemplates.setIamPolicy
datastore.databases.setIamPolicy
datastore.namespaces.setIamPolicy
dns.policies.setIamPolicy
genomics.datasets.setIamPolicy
gkehub.memberships.setIamPolicy
healthcare.datasets.setIamPolicy
healthcare.dicomStores.setIamPolicy
healthcare.fhirStores.setIamPolicy
healthcare.hl7V2Stores.setIamPolicy
iam.serviceAccounts.setIamPolicy
iap.tunnel.setIamPolicy
iap.tunnelInstances.setIamPolicy
iap.tunnelZones.setIamPolicy
iap.web.setIamPolicy
iap.webServiceVersions.setIamPolicy
iap.webServices.setIamPolicy
iap.webTypes.setIamPolicy
managedidentities.domains.setIamPolicy
ml.jobs.setIamPolicy
ml.models.setIamPolicy
ml.studies.setIamPolicy
networkmanagement.connectivitytests.setIamPolicy
notebooks.environments.setIamPolicy
notebooks.instances.setIamPolicy
proximitybeacon.beacons.setIamPolicy
proximitybeacon.namespaces.setIamPolicy
pubsub.snapshots.setIamPolicy
pubsub.subscriptions.setIamPolicy
pubsub.topics.setIamPolicy
resourcemanager.folders.setIamPolicy
resourcemanager.organizations.setIamPolicy
resourcemanager.projects.setIamPolicy
run.services.setIamPolicy
runtimeconfig.configs.setIamPolicy
runtimeconfig.variables.setIamPolicy
runtimeconfig.waiters.setIamPolicy
secretmanager.secrets.setIamPolicy
securitycenter.sources.setIamPolicy
servicebroker.bindings.setIamPolicy
servicebroker.catalogs.setIamPolicy
servicebroker.instances.setIamPolicy
servicedirectory.endpoints.setIamPolicy
servicedirectory.namespaces.setIamPolicy
servicedirectory.services.setIamPolicy
servicemanagement.consumerSettings.setIamPolicy
servicemanagement.services.setIamPolicy
source.repos.setIamPolicy
spanner.backups.setIamPolicy
spanner.databases.setIamPolicy
spanner.instances.setIamPolicy
storage.buckets.setIamPolicy
storage.objects.setIamPolicy
deploymentmanager.deployments.setIamPolicy
单独的漏洞利用脚本很好,但更有用的是检查您自己的 GCP 环境以获取现有权限提升路径的方法。我们为此编写了一个脚本。它枚举成员及其对组织、文件夹、项目和服务帐户的权限,并报告任何权限提升方法和/或 setIamPolicy 权限。请注意,该脚本甚至会枚举继承的权限!例如,这意味着您在组织级别授予的所有权限也将显示在您的项目级别权限下,因为权限是向下继承的。
这是脚本运行并显示其输出的屏幕截图。枚举脚本接受访问令牌并将枚举目标项目中的所有内容,而权限升级脚本离线解析枚举的权限以查找权限升级。屏幕截图显示了一些用户/组容易受到我们测试项目中某些权限提升方法的攻击。
这个权限提升方法列表(和第 1 部分)不是最终列表,因为可能还有更多方法(例如在 GKE 中,本文未涉及)。同样,这些不是 GCP 中的漏洞,它们是您配置 GCP 环境的方式中的漏洞,因此您有责任了解这些攻击媒介并加以防御。同样重要的是要记住,权限升级不一定需要通过 IAM 服务才能生效。确保在您的环境中遵循最低权限原则,以帮助减轻这些安全风险。