GCP - Storage Enum

Support HackTricks

Storage

Google Cloud Platform (GCP) Storage 是一个 基于云的存储解决方案,提供高耐久性和可用性的对象存储,用于非结构化数据。它提供 多种存储类别,基于性能、可用性和成本,包括标准、近线、冷线和归档。GCP Storage 还提供高级功能,如 生命周期策略、版本控制和访问控制,以有效管理和保护数据。

存储桶可以存储在一个区域、两个区域或 多区域(默认)

Storage Types

  • 标准存储:这是默认的存储选项,提供高性能、低延迟的访问频繁访问的数据。适用于广泛的用例,包括提供网站内容、流媒体和托管数据分析管道。

  • 近线存储:此存储类别提供 较低的存储成本略高的访问成本,与标准存储相比。它针对不常访问的数据进行了优化,最小存储期限为 30 天。非常适合备份和归档目的。

  • 冷线存储:此存储类别针对 长期存储不常访问的数据 进行了优化,最小存储期限为 90 天。它提供 比近线存储更低的存储成本,但 访问成本更高

  • 归档存储:此存储类别专为 非常不常访问的冷数据 设计,最小存储期限为 365 天。它提供 所有 GCP 存储选项中最低的存储成本,但 访问成本最高。适合需要因合规或监管原因长期保留的数据。

  • 自动分类:如果您 不知道将访问多少数据,可以选择自动分类,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 和一个 密钥

  • 访问 ID:与特定服务或用户帐户关联的字母数字字符串。当与服务帐户关联时,字符串长度为 61 个字符;当与用户帐户关联时,字符串长度为 24 个字符。以下是访问 ID 的示例:

GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA

  • 密钥:与特定访问 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.liststorage.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 Privesc

未认证枚举

GCP - Storage Unauthenticated Enum

利用后

GCP - Storage Post Exploitation

持久性

GCP - Storage Persistence
支持 HackTricks

Last updated