GCP - local privilege escalation ssh pivoting

支持 HackTricks

在这个场景中,我们假设你已经在 Compute Engine 项目中的虚拟机内入侵了一个非特权账户

令人惊讶的是,你所入侵的计算引擎的 GCP 权限可能帮助你在机器内部提升本地权限。即使在云环境中这并不总是非常有用,但知道这是可能的还是很好的。

阅读脚本

计算实例可能用于执行一些脚本以使用其服务账户执行操作。

由于 IAM 权限非常细粒度,一个账户可能对某个资源具有读/写权限,但没有列出权限

一个很好的假设例子是一个计算实例,它有权限读取/写入名为 instance82736-long-term-xyz-archive-0332893 的存储桶的备份。

从命令行运行 gsutil ls 不会返回任何内容,因为服务账户缺少 storage.buckets.list IAM 权限。然而,如果你运行 gsutil ls gs://instance82736-long-term-xyz-archive-0332893,你可能会找到一个完整的文件系统备份,从而获得你本地 Linux 账户所缺乏的明文数据访问。

你可能能够在脚本中找到这个存储桶的名称(在 bash、Python、Ruby 等中)。

自定义元数据

管理员可以在实例项目级别添加 自定义元数据。这只是将任意键/值对传递到实例的一种方式,通常用于环境变量和启动/关闭脚本。

此外,可以添加用户数据,这是一个将在每次机器启动或重启时执行的脚本,并且可以从元数据端点访问

有关更多信息,请查看:

滥用 IAM 权限

以下大多数提议的权限是授予默认计算服务账户的,唯一的问题是默认访问范围阻止服务账户使用它们。然而,如果启用了 cloud-platform 范围或仅启用了 compute 范围,你将能够滥用它们

检查以下权限:

在文件系统中搜索密钥

检查是否有其他用户在盒子内登录了 gcloud 并将其凭据留在文件系统中:

sudo find / -name "gcloud"

这些是最有趣的文件:

  • ~/.config/gcloud/credentials.db

  • ~/.config/gcloud/legacy_credentials/[ACCOUNT]/adc.json

  • ~/.config/gcloud/legacy_credentials/[ACCOUNT]/.boto

  • ~/.credentials.json

更多 API 密钥正则表达式

TARGET_DIR="/path/to/whatever"

# Service account keys
grep -Pzr "(?s){[^{}]*?service_account[^{}]*?private_key.*?}" \
"$TARGET_DIR"

# Legacy GCP creds
grep -Pzr "(?s){[^{}]*?client_id[^{}]*?client_secret.*?}" \
"$TARGET_DIR"

# Google API keys
grep -Pr "AIza[a-zA-Z0-9\\-_]{35}" \
"$TARGET_DIR"

# Google OAuth tokens
grep -Pr "ya29\.[a-zA-Z0-9_-]{100,200}" \
"$TARGET_DIR"

# Generic SSH keys
grep -Pzr "(?s)-----BEGIN[ A-Z]*?PRIVATE KEY[a-zA-Z0-9/\+=\n-]*?END[ A-Z]*?PRIVATE KEY-----" \
"$TARGET_DIR"

# Signed storage URLs
grep -Pir "storage.googleapis.com.*?Goog-Signature=[a-f0-9]+" \
"$TARGET_DIR"

# Signed policy documents in HTML
grep -Pzr '(?s)<form action.*?googleapis.com.*?name="signature" value=".*?">' \
"$TARGET_DIR"

参考文献

支持 HackTricks

Last updated