GCP - Storage Enum

htARTE(HackTricks AWS Red Team Expert)を通じてゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

ストレージ

Google Cloud Platform(GCP)ストレージは、非構造化データのための高い耐久性と可用性を提供する****クラウドベースのストレージソリューションです。パフォーマンス、可用性、コストに基づいたさまざまなストレージクラスを提供し、Standard、Nearline、Coldline、およびArchiveを含みます。 GCPストレージは、ライフサイクルポリシー、バージョニング、アクセス制御などの高度な機能も提供しており、データを効果的に管理および保護します。

バケットは、**リージョン、2つのリージョン、またはマルチリージョン(デフォルト)**に保存できます。

ストレージタイプ

  • Standard Storage: これは頻繁にアクセスされるデータに高性能で低遅延のアクセスを提供するデフォルトのストレージオプションです。ウェブサイトコンテンツの提供、メディアのストリーミング、データ分析パイプラインのホスティングなど、幅広いユースケースに適しています。

  • Nearline Storage: このストレージクラスは、Standard Storageより低いストレージコストわずかに高いアクセスコストを提供します。最小のストレージ期間は30日で、アクセス頻度の低いデータに最適です。 バックアップやアーカイブ用に適しています。

  • Coldline Storage: このストレージクラスは、アクセス頻度の低いデータの長期保存に最適で、最小のストレージ期間は90日です。 Nearline Storageよりも低いストレージコストを提供しますが、高いアクセスコストがかかります。

  • Archive Storage: このストレージクラスは、非常にまれにアクセスされる冷たいデータ向けに設計されており、最小のストレージ期間は365日です。 すべてのGCPストレージオプションの中で最も低いストレージコストを提供しますが、最も高いアクセスコストがかかります。 コンプライアンスや規制上の理由で保存する必要があるデータの長期保存に適しています。

  • Autoclass: データへのアクセス量がわからない場合は、Autoclassを選択し、GCPがコストを最小限に抑えるために自動的にストレージのタイプを変更します。

アクセス制御

デフォルトでは、アクセス制御はIAMを介して行うことが推奨されていますが、ACLの使用を有効にすることも可能です。 IAMのみを選択した場合(デフォルト)、90日が経過すると、バケットのためにACLを有効にできなくなります

バージョニング

バージョニングを有効にすると、ファイルの古いバージョンがバケット内に保存されます。保存するバージョンの数や、非現行バージョン(古いバージョン)の有効期間を設定することが可能です。標準タイプの場合は7日が推奨されています。

非現行バージョンのメタデータが保持されます。さらに、非現行バージョンのACLも保持されるため、古いバージョンは現在のバージョンと異なるACLを持つ場合があります。

詳細はドキュメントを参照してください。

保持ポリシー

バケット内のオブジェクトの削除を禁止する期間を指定します(少なくともコンプライアンスには非常に便利です)。 バージョニングまたは保持ポリシーのいずれか一方しか同時に有効にできません

暗号化

デフォルトでは、オブジェクトはGoogleが管理するキーを使用して暗号化されますが、KMSからキーを使用することもできます。

パブリックアクセス

外部ユーザー(GCPにログインしているかどうかに関わらず)にバケットのコンテンツへのアクセスを許可することが可能です。 バケットが作成されると、デフォルトで、バケットを公開するオプションが無効になっていますが、十分な権限があれば変更できます。

バケットにアクセスするためのURLの形式は、**https://storage.googleapis.com/<bucket-name>またはhttps://<bucket_name>.storage.googleapis.com**です(どちらも有効です)。

HMACキー

HMACキーは資格情報の一種であり、Cloud Storageのサービスアカウントまたはユーザーアカウントに関連付けることができます。 HMACキーを使用して、Cloud Storageへのリクエストに含まれる署名を作成します。署名は、特定のリクエストがユーザーやサービスアカウントによって承認されたことを示します

HMACキーには、アクセスIDシークレットの2つの主要な部分があります。

  • アクセスID:特定のサービスまたはユーザーアカウントに関連付けられた英数字の文字列。サービスアカウントに関連付けられている場合、文字列の長さは61文字であり、ユーザーアカウントに関連付けられている場合、文字列の長さは24文字です。以下はアクセスIDの例です:

GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA

  • シークレット:特定のアクセスIDにリンクされた40文字のBase-64エンコードされた文字列。シークレットは、あなたとCloud Storageだけが知っている事前共有キーです。認証プロセスの一部として署名を作成するためにシークレットを使用します。以下はシークレットの例です:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

アクセスIDとシークレットはHMACキーを一意に識別しますが、シークレットは署名の作成に使用されるため、より機密性の高い情報です。

列挙

# 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

もしバケットのリストを取得する際にパーミッションが拒否された場合、コンテンツにアクセス権がある可能性があります。したがって、バケットの名前規則について知っているのであれば、可能な名前のリストを生成してアクセスを試みることができます。

for i in $(cat wordlist.txt); do gsutil ls -r gs://"$i"; done

以下のPythonスクリプトを使用して、権限storage.objects.liststorage.objects.getを持っていれば、バケットからすべてのフォルダとファイルを列挙してダウンロードすることができるはずです。

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>')

特権昇格

以下のページで、ストレージ権限を悪用して特権を昇格する方法を確認できます:

pageGCP - Storage Privesc

認証なしの列挙

pageGCP - Storage Unauthenticated Enum

攻撃後の利用

pageGCP - Storage Post Exploitation

永続性

pageGCP - Storage Persistence
htARTE(HackTricks AWS Red Team Expert)で AWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

最終更新