第一部分已在火线Zone发布,请参考https://zone.huoxian.cn/d/1289-google-cloud-platform-1-iam
这一部分重点介绍非 IAM 服务提权方法。例如,这些权限都不属于“IAM”系列,就像第 1 部分中的大多数方法一样,例如iam.serviceAccounts.update。
非IAM方法
orgpolicy.policy.set
此方法不一定会授予您更多 IAM 权限,但它可能会禁用一些阻止某些操作的障碍。例如,有一个名为appengine.disableCodeDownload的组织策略约束,它可以防止项目用户下载 App Engine 源代码。如果启用此功能,您将无法下载该源代码,但您可以使用orgpolicy.policy.set禁用约束,然后继续下载源代码。
上面的截图显示appengine.disableCodeDownload约束被强制执行,这意味着它阻止我们下载源代码。使用orgpolicy.policy.set,我们可以禁用该强制执行,然后继续下载源代码。
可以在此处(https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/orgpolicy.policy.set.py)找到此方法的漏洞利用脚本。
storage.hmacKeys.create
Cloud Storage 有一个特性,即“互操作性”,它为 Cloud Storage 提供了一种与来自其他云提供商(如 AWS S3)的存储产品进行交互的方式。作为其中的一部分,可以为服务帐户和普通用户创建 HMAC 密钥。我们可以通过为更高权限的服务帐户创建 HMAC 密钥来升级 Cloud Storage 权限。
属于您的用户的 HMAC 密钥不能通过 API 访问,必须通过 Web 控制台访问,但好的是访问密钥和密钥在任何时候都可用。这意味着我们可以获取现有的一对并将它们存储起来,以便备份访问帐户。属于服务帐户的 HMAC 密钥可以通过 API 访问,但创建后,您将无法再次看到访问密钥。
上面的屏幕截图显示了来自 gsutil CLI 的简单命令,用于为服务帐户创建 HMAC 密钥。现在您只需使用这些密钥作为服务帐户访问 Cloud Storage API。
可以在此处(https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py)找到此方法的漏洞利用脚本。
serviceusage.apiKeys.create
还有另一种使用 GCP API 进行身份验证的方法,称为 API 密钥。默认情况下,它们的创建没有任何限制,这意味着它们可以访问创建它们的整个 GCP 项目。我们可以通过创建一个可能比我们自己的用户拥有更多权限的新 API 密钥来利用这一事实。对此没有官方 API,因此需要将自定义 HTTP 请求发送到https://apikeys.clients6.google.com/ (或https://apikeys.googleapis.com/)。这是通过在浏览 GCP Web 控制台时监控 HTTP 请求和响应而发现的。有关与 API 密钥相关的限制的文档,请访问此链接。
以下屏幕截图显示了如何在 Web 控制台中创建 API 密钥。
通过发现未记录的 API,我们还可以通过 API 本身创建 API 密钥。
上面的屏幕截图显示了发送 POST 请求以检索项目的新 API 密钥。
可以在此处(https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/serviceusage.apiKeys.create.py)找到此方法的漏洞利用脚本。
serviceusage.apiKeys.list
发现另一个未记录的 API 用于列出已经创建的 API 密钥(这也可以在 Web 控制台中完成)。因为创建后仍然可以看到 API 密钥的值,所以我们可以拉取项目中的所有 API 密钥。
上面的截图显示请求和之前完全一样,只是一个 GET 请求而不是一个 POST 请求。这仅显示一个键,但如果项目中有其他键,也会列出这些键。
可以在此处(https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/serviceusage.apiKeys.list.py)找到此方法的漏洞利用脚本。
其它setlamPolicy API调用
除了上述所有方法之外,还可以通过更新与目标资源关联的 IAM 策略来执行简单的权限提升。下面的权限升级扫描器也会检查这些。
有关使用 setIamPolicy 时特定资源上的权限提升的示例,请阅读我们过去关于 Google 存储桶枚举和提升的博客文章:https://rhinosecuritylabs.com/gcp/google-cloud-platform-gcp-bucket-enumeration/
这里列出了一些值得研究的权限升级:
-
resourcemanager.organizations.setIamPolicy
-
在组织级别将 IAM 角色附加到您的用户。
-
resourcemanager.folders.setIamPolicy
-
在文件夹级别将 IAM 角色附加到您的用户。
-
resourcemanager.projects.setIamPolicy
-
在项目级别将 IAM 角色附加到您的用户。
-
iam.serviceAccounts.setIamPolicy
-
在服务帐户级别将 IAM 角色附加到您的用户。
-
cloudfunctions.functions.setIamPolicy
-
修改 Cloud Functions 的策略以允许您自己调用它。
以下权限是您可以更新的所有不同 IAM 策略:
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
如果您拥有上述任何权限,则可以修改指定资源的 IAM 策略以授予自己在该资源上的角色,从而在资源级别授予您额外的权限。
GCP提权扫描程序
单独的漏洞利用脚本很好,但更有用的是检查您自己的 GCP 环境以获取现有权限提升路径的方法。我们为此编写了一个脚本。它枚举成员及其对组织、文件夹、项目和服务帐户的权限,并报告任何权限提升方法和/或 setIamPolicy 权限。请注意,该脚本甚至会枚举继承的权限!例如,这意味着您在组织级别授予的所有权限也将显示在您的项目级别权限下,因为权限是向下继承的。
可以在Rhino Github(https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/PrivEscScanner)上找到扫描器。
本质上,您只需运行enumerate_member_permissions.py脚本来枚举成员及其权限,然后运行check_for_privesc.py脚本来检查这些权限以进行特权升级。请注意,项目所有者和编辑者可能会由于权限过大而返回大量结果。
这是脚本运行并显示其输出的屏幕截图。枚举脚本接受访问令牌并将枚举目标项目中的所有内容,而权限升级脚本离线解析枚举的权限以查找权限升级。屏幕截图显示了一些用户/组容易受到我们测试项目中某些权限提升方法的攻击。
之后,将有三个文件包含您的结果:
-
all_org_folder_proj_sa_permissions.json – 所有成员及其相关权限
-
privesc_methods.txt – 所有检测到的提权方法
-
setIamPolicy_methods.txt – 所有检测到的 setIamPolicy 方法
总结
这个权限提升方法列表(和第 1 部分)不是最终列表,因为可能还有更多方法(例如在 GKE 中,本文未涉及)。同样,这些不是 GCP 中的漏洞,它们是您配置 GCP 环境的方式中的漏洞,因此您有责任了解这些攻击并加以防御。同样重要的是要记住,权限升级不一定需要通过 IAM 服务才能生效。确保在您的环境中遵循最低权限原则,以帮助减轻这些安全风险。
本文为译文,原文链接:https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/
【火线Zone云安全社区群】
进群可以与技术大佬互相交流
进群有机会免费领取节假日礼品
进群可以免费观看技术分享直播
识别二维码回复【社区群】进群
火线Zone是[火线安全平台]运营的云安全社区,内容涵盖云计算、云安全、漏洞分析、攻防等热门主题,研究讨论云安全相关技术,助力所有云上用户实现全面的安全防护。欢迎具备分享和探索精神的云上用户加入火线Zone社区,共建一个云安全优质社区!
如需转载火线Zone公众号内的文章请联系火线小助手:hxanquan(微信)
// 火线Zone //
微信号 : huoxian_zone
点击阅读原文,加入社区,共建一个有技术氛围的优质社区!
原文始发于微信公众号(火线Zone):Google Cloud Platform中的权限提升 – 第 2 部分(非 IAM)