Skills

GCP Workspace Pivot

GCP 到 Google Workspace 的穿越攻击方法论。当已获取 GCP Service Account 或 Project 权限并发现目标组织使用 Google...

Install

npx skills add wgpsec/AboutSecurity --skill gcp-workspace-pivot -g -a claude-code -y
Repository
wgpsec/AboutSecurity1.8k
Category
DevOps
Updated
11d ago
License
See repository
Context cost
Mediumabout 2,770 tokens
Runs scripts
No, instructions only

What it does

GCP 到 Google Workspace 的穿越攻击方法论。当已获取 GCP Service Account 或 Project 权限并发现目标组织使用 Google Workspace、需要从云平台穿越到企业邮件/文档/管理控制台、或发现 Domain-Wide Delegation 配置时使用。覆盖 Domain-Wide Delegation 滥用、OAuth 范围利用、Workspace API 数据窃取(Gmail/Drive/Calendar/Admin Directory)、以及 Workspace 持久化技术

GCP 到 Google Workspace 穿越攻击方法论

GCP 与 Google Workspace 同属 Google Cloud 生态,二者通过 IAM 和 OAuth 深度绑定。当攻击者拿到 GCP Service Account 或 Project 权限后,若目标组织同时使用 Google Workspace(原 G Suite),就可能从云基础设施穿越到企业办公系统, , 直接访问全员邮件、文件、日历、通讯录乃至管理控制台。

为什么这个穿越如此致命:

  • 影响面极大:一个配置了 Domain-Wide Delegation(DWD)的 Service Account 可冒充组织内任意用户
  • 权限升级无感知:DWD 滥用不需要目标用户交互或确认,被冒充的用户完全无感
  • 数据价值极高:企业邮件(Gmail)、共享文件(Drive)、会议日程(Calendar)、组织架构(Admin Directory)全部可被访问
  • 攻击路径隐蔽:通过 Service Account 生成的 OAuth Token 访问 Workspace API,不同于用户直接登录,很多组织缺少对此类访问的监控

深入参考

识别到具体 Workspace 后渗透场景后,加载参考文档获取完整技术细节:

核心概念:Domain-Wide Delegation(DWD)

DWD 是什么

Domain-Wide Delegation 是 Google Workspace 的一项功能,允许 GCP Service Account 代表 Workspace 域内的任意用户访问 Google API。其工作流程:

1. Service Account 使用私钥签署 JWT(声明要冒充的用户和请求的 OAuth scope)
2. JWT 发送到 Google OAuth 2.0 服务,请求 Access Token
3. Google 验证 DWD 配置后返回 Access Token(代表目标用户)
4. 使用该 Token 调用 Google API(Gmail/Drive/Calendar 等),以目标用户身份操作

为什么 DWD 危险

  • 配置 DWD 时只需 Service Account 的 OAuth Client ID 和 OAuth Scope,不绑定特定用户
  • 一旦配置,该 SA 可冒充域内任意用户,包括 Super Admin
  • DWD 配置只能在 Admin Console 手动管理,无法通过 API 审计其历史变更
  • 许多组织为了自动化工作流而配置 DWD,但未做最小权限限制

DWD 滥用的前提条件

条件说明
拥有 SA 私钥或可创建新密钥iam.serviceAccountKeys.create 权限
SA 已配置 DWDAdmin Console 中已授权该 SA 的 Client ID
知道至少一个有效 Workspace 用户邮箱用于冒充,Super Admin 效果最佳
SA 被授权了有用的 OAuth Scope如 Gmail、Drive、Admin Directory 等

攻击链:发现并利用 DWD

Step 1:枚举 GCP 项目中的 Service Account

# 列出当前项目的所有 Service Account
gcloud iam service-accounts list --project <project-id>

# 枚举所有可访问项目
for proj in $(gcloud projects list --format="value(projectId)"); do
  echo "=== Project: $proj ==="
  gcloud iam service-accounts list --project "$proj" \
    --format="table(email,displayName,disabled)" 2>/dev/null
done
Read the whole SKILL.md on GitHub

More in DevOps