GCP - Storage Privesc

Support HackTricks

Storage

基本情報:

GCP - Storage Enum

storage.objects.get

この権限は、Cloud Storage内に保存されたファイルをダウンロードすることを許可します。これは、場合によっては機密情報がそこに保存されているため、権限を昇格させる可能性があります。さらに、いくつかのGCPサービスは、バケットに情報を保存します:

  • GCP Composer: Composer環境を作成すると、すべてのDAGのコードバケット内に保存されます。これらのタスクは、そのコード内に興味深い情報を含む可能性があります。

  • GCR (Container Registry): コンテナのイメージバケット内に保存されており、バケットを読み取ることができれば、イメージをダウンロードし、漏洩やソースコードを検索することができます。

storage.objects.setIamPolicy

この権限を使用して、このセクションの以前のシナリオを悪用することができます。

storage.buckets.setIamPolicy

この権限での権限の変更方法については、次のページを確認してください:

GCP - Public Buckets Privilege Escalation

storage.hmacKeys.create

Cloud Storageの「相互運用性」機能は、AWS S3などのクロスクラウドインタラクションのために設計されており、サービスアカウントとユーザーのHMACキーの作成を含みます。攻撃者は、権限のあるサービスアカウントのHMACキーを生成することによって、Cloud Storage内で権限を昇格させることができます。ユーザーに関連付けられたHMACキーはウェブコンソールを介してのみ取得可能ですが、アクセスキーとシークレットキーは永続的にアクセス可能であり、バックアップアクセスストレージの可能性を提供します。一方、サービスアカウントにリンクされたHMACキーはAPI経由でアクセス可能ですが、作成後はそのアクセスキーとシークレットキーは取得できず、継続的なアクセスのための複雑さを追加します。

# Create key
gsutil hmac create <sa-email> # You might need to execute this inside a VM instance

## If you have TROUBLES creating the HMAC key this was you can also do it contacting the API directly:
PROJECT_ID = '$PROJECT_ID'
TARGET_SERVICE_ACCOUNT = f"exam-storage-sa-read-flag-3@{PROJECT_ID}.iam.gserviceaccount.com"
ACCESS_TOKEN = "$CLOUDSDK_AUTH_ACCESS_TOKEN"
import requests
import json
key = requests.post(
f'https://www.googleapis.com/storage/v1/projects/{PROJECT_ID}/hmacKeys',
params={'access_token': ACCESS_TOKEN, 'serviceAccountEmail': TARGET_SERVICE_ACCOUNT}
).json()
#print(json.dumps(key, indent=4))
print(f'ID: {key["metadata"]["accessId"]}')
print(f'Secret: {key["secret"]}')


# Configure gsutil to use the HMAC key
gcloud config set pass_credentials_to_gsutil false
gsutil config -a

# Use it
gsutil ls gs://[BUCKET_NAME]

# Restore
gcloud config set pass_credentials_to_gsutil true

この方法の別のエクスプロイトスクリプトはこちらで見つけることができます。

storage.objects.create, storage.objects.delete = ストレージ書き込み権限

バケット内に新しいオブジェクトを作成するにはstorage.objects.createが必要で、ドキュメントによると、既存のオブジェクトを変更するにはstorage.objects.deleteも必要です。

クラウドに書き込むことができるバケットの非常に一般的な悪用は、バケットがウェブサーバーファイルを保存している場合であり、ウェブアプリケーションで使用される新しいコードを保存できる可能性があります。

Composer

ComposerはGCP内で管理されているApache Airflowです。いくつかの興味深い機能があります:

  • GKEクラスター内で実行されるため、クラスターが使用するSAはComposer内で実行されるコードからアクセス可能です。

  • コードをバケットに保存するため、そのバケットに書き込みアクセスを持つ誰でもDGAコード(Apache Airflowが実行するコード)を変更/追加できることになります。 そのため、Composerがコードを保存するバケットに書き込みアクセスがある場合GKEクラスターで実行されているSAに権限昇格できます

Cloud Functions

  • Cloud Functionsのコードはストレージに保存されているため、上書きすることで任意のコードを実行することが可能です

App Engine

  • App Engineのソースコードはバケットに保存されており、コードを上書きすることで任意のコードを実行することが可能です。これは不可能です

  • コンテナレイヤーがバケットに保存されているようです。これを変更することはできるでしょうか?

GCR

  • Google Container Registryはバケット内にイメージを保存しており、**これらのバケットに書き込むことができれば、それらのバケットが実行されている場所に横移動できる可能性があります

  • GCRが使用するバケットのURLはgs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.comのようになります(トップレベルのサブドメインはこちらで指定されています)。

参考文献

HackTricksをサポートする

Last updated