GCP - Storage Enum
Tip
学习并练习 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 subscription plans!
- 加入 💬 Discord group 或者 telegram group 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库 提交 PRs 来分享 hacking tricks。
Storage
Google Cloud Platform (GCP) Storage 是一个 基于云的存储解决方案,为非结构化数据提供高度耐用和可用的对象存储。它提供 多种存储类别,基于性能、可用性和成本,包括 Standard、Nearline、Coldline 和 Archive。GCP Storage 还提供高级功能,如 生命周期策略、版本控制和访问控制,以有效管理和保护数据。
存储桶可以存储在一个区域、两个区域或 多区域(默认)。
Storage Types
- Standard Storage:这是默认的存储选项,提供高性能、低延迟的频繁访问数据。适用于广泛的用例,包括提供网站内容、流媒体和托管数据分析管道。
- Nearline Storage:此存储类别提供 较低的存储成本 和 略高的访问成本,与 Standard Storage 相比。它针对不常访问的数据进行了优化,最低存储期限为 30 天。非常适合备份和归档目的。
- Coldline Storage:此存储类别针对 长期存储不常访问的数据 进行了优化,最低存储期限为 90 天。它提供 低于 Nearline Storage 的存储成本,但 访问成本更高。
- Archive Storage:此存储类别专为 非常不常访问的冷数据 设计,最低存储期限为 365 天。它提供 所有 GCP 存储选项中最低的存储成本,但 访问成本最高。适合需要因合规或监管原因长期保留的数据。
- Autoclass:如果您 不知道将访问多少 数据,可以选择 Autoclass,GCP 将 自动为您更改存储类型以最小化成本。
Access Control
默认情况下,建议通过 IAM 控制访问,但也可以 启用 ACL 的使用。
如果您选择仅使用 IAM(默认),并且 经过 90 天,您 将无法为存储桶启用 ACL。
Versioning
可以启用版本控制,这将 保存存储桶内文件的旧版本。可以配置 要保留的版本数量,甚至 非当前 版本(旧版本)希望保留的 时间。推荐的保留时间为 标准类型的 7 天。
非当前版本的元数据会被保留。此外,非当前版本的 ACL 也会被保留,因此旧版本可能与当前版本具有不同的 ACL。
在 docs 中了解更多信息。
Retention Policy
指示您希望 禁止删除存储桶内对象的时间(至少对合规性非常有用)。
版本控制或保留策略只能同时启用一个。
Encryption
默认情况下,对象是 使用 Google 管理的密钥加密,但您也可以使用 来自 KMS 的密钥。
Public Access
可以为 外部用户(无论是否登录 GCP)提供 访问存储桶内容 的权限。
默认情况下,当创建存储桶时,它将 禁用公开暴露 存储桶的选项,但在拥有足够权限的情况下可以更改。
访问存储桶的 URL 格式 为 https://storage.googleapis.com/<bucket-name> 或 https://<bucket_name>.storage.googleapis.com(两者均有效)。
HMAC Keys
HMAC 密钥是一种 凭证,可以 与 Cloud Storage 中的服务帐户或用户帐户关联。您使用 HMAC 密钥创建 签名,然后将其包含在对 Cloud Storage 的请求中。签名表明 给定请求已由用户或服务帐户授权。
HMAC 密钥有两个主要部分,一个 访问 ID 和一个 密钥。
- Access ID:与特定服务或用户帐户关联的字母数字字符串。当与服务帐户关联时,字符串长度为 61 个字符;当与用户帐户关联时,字符串长度为 24 个字符。以下是访问 ID 的示例:
GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA
- Secret:与特定访问 ID 关联的 40 字符 Base-64 编码字符串。密钥是一个预共享密钥,只有您和 Cloud Storage 知道。您使用您的密钥创建签名,作为身份验证过程的一部分。以下是密钥的示例:
bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ
访问 ID 和密钥唯一标识一个 HMAC 密钥,但密钥是更敏感的信息,因为它用于 创建签名。
Enumeration
# List all storage buckets in project
gsutil ls
# Get each bucket configuration (protections, CLs, times, configs...)
gsutil ls -L
# List contents of a specific bucket
gsutil ls gs://bucket-name/
gsutil ls -r gs://bucket-name/ # Recursive
gsutil ls -a gs://bucket-name/ # Get ALL versions of objects
# Cat the context of a file without copying it locally
gsutil cat 'gs://bucket-name/folder/object'
gsutil cat 'gs://bucket-name/folder/object#<num>' # cat specific version
# Copy an object from the bucket to your local storage for review
gsutil cp gs://bucket-name/folder/object ~/
# List using a raw OAuth token
## Useful because "CLOUDSDK_AUTH_ACCESS_TOKEN" and "gcloud config set auth/access_token_file" doesn't work with gsutil
curl -H "Authorization: Bearer $TOKEN" "https://storage.googleapis.com/storage/v1/b/<storage-name>/o"
# Download file content from bucket
curl -H "Authorization: Bearer $TOKEN" "https://storage.googleapis.com/storage/v1/b/supportstorage-58249/o/flag.txt?alt=media" --output -
# Enumerate HMAC keys
gsutil hmac list
# Get permissions
gcloud storage buckets get-iam-policy gs://bucket-name/
gcloud storage objects get-iam-policy gs://bucket-name/folder/object
如果您在列出存储桶时遇到权限被拒绝错误,您仍然可能可以访问内容。因此,现在您知道存储桶的命名约定,可以生成可能名称的列表并尝试访问它们:
for i in $(cat wordlist.txt); do gsutil ls -r gs://"$i"; done
使用权限 storage.objects.list 和 storage.objects.get,您应该能够枚举存储桶中的所有文件夹和文件以便下载。您可以使用以下 Python 脚本实现:
import requests
import xml.etree.ElementTree as ET
def list_bucket_objects(bucket_name, prefix='', marker=None):
url = f"https://storage.googleapis.com/{bucket_name}?prefix={prefix}"
if marker:
url += f"&marker={marker}"
response = requests.get(url)
xml_data = response.content
root = ET.fromstring(xml_data)
ns = {'ns': 'http://doc.s3.amazonaws.com/2006-03-01'}
for contents in root.findall('.//ns:Contents', namespaces=ns):
key = contents.find('ns:Key', namespaces=ns).text
print(key)
next_marker = root.find('ns:NextMarker', namespaces=ns)
if next_marker is not None:
next_marker_value = next_marker.text
list_bucket_objects(bucket_name, prefix, next_marker_value)
list_bucket_objects('<storage-name>')
权限提升
在以下页面中,您可以查看如何滥用存储权限以提升权限:
未认证枚举
GCP - Storage Unauthenticated Enum
后期利用
GCP - Storage Post Exploitation
持久性
Tip
学习并练习 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 subscription plans!
- 加入 💬 Discord group 或者 telegram group 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库 提交 PRs 来分享 hacking tricks。
HackTricks Cloud

