GCP - Storage Privesc

Support HackTricks

Storage

Grundinformationen:

GCP - Storage Enum

storage.objects.get

Diese Berechtigung erlaubt es Ihnen, Dateien, die in Cloud Storage gespeichert sind, herunterzuladen. Dies kann Ihnen potenziell ermöglichen, Privilegien zu eskalieren, da in einigen Fällen sensible Informationen dort gespeichert sind. Darüber hinaus speichern einige GCP-Dienste ihre Informationen in Buckets:

  • GCP Composer: Wenn Sie eine Composer-Umgebung erstellen, wird der Code aller DAGs in einem Bucket gespeichert. Diese Aufgaben könnten interessante Informationen in ihrem Code enthalten.

  • GCR (Container Registry): Das Bild der Container wird in Buckets gespeichert, was bedeutet, dass Sie, wenn Sie die Buckets lesen können, die Bilder herunterladen und nach Leaks und/oder Quellcode suchen können.

storage.objects.setIamPolicy

Sie können sich die Berechtigung geben, eine der vorherigen Szenarien in diesem Abschnitt auszunutzen.

storage.buckets.setIamPolicy

Für ein Beispiel, wie man Berechtigungen mit dieser Berechtigung ändert, überprüfen Sie diese Seite:

GCP - Public Buckets Privilege Escalation

storage.hmacKeys.create

Die "Interoperabilitäts"-Funktion von Cloud Storage, die für Cross-Cloud-Interaktionen wie mit AWS S3 konzipiert ist, umfasst die Erstellung von HMAC-Schlüsseln für Dienstkonten und Benutzer. Ein Angreifer kann dies ausnutzen, indem er einen HMAC-Schlüssel für ein Dienstkonto mit erhöhten Berechtigungen generiert, wodurch er die Privilegien innerhalb von Cloud Storage eskaliert. Während HMAC-Schlüssel, die mit Benutzern verbunden sind, nur über die Webkonsole abgerufen werden können, bleiben sowohl die Zugriffs- als auch die geheimen Schlüssel dauerhaft zugänglich, was potenziellen Backup-Zugriffsspeicher ermöglicht. Im Gegensatz dazu sind HMAC-Schlüssel, die mit Dienstkonten verknüpft sind, über die API zugänglich, aber ihre Zugriffs- und geheimen Schlüssel sind nach der Erstellung nicht abrufbar, was eine zusätzliche Komplexität für den kontinuierlichen Zugriff hinzufügt.

# 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

Ein weiteres Exploit-Skript für diese Methode finden Sie hier.

storage.objects.create, storage.objects.delete = Speicher Schreibberechtigungen

Um ein neues Objekt in einem Bucket zu erstellen, benötigen Sie storage.objects.create und, gemäß den Dokumenten, benötigen Sie auch storage.objects.delete, um ein bestehendes Objekt zu ändern.

Eine sehr häufige Ausnutzung von Buckets, in die Sie in der Cloud schreiben können, ist der Fall, dass der Bucket Webserver-Dateien speichert. Sie könnten in der Lage sein, neuen Code zu speichern, der von der Webanwendung verwendet wird.

Composer

Composer ist Apache Airflow, das innerhalb von GCP verwaltet wird. Es hat mehrere interessante Funktionen:

  • Es läuft innerhalb eines GKE-Clusters, sodass die SA, die der Cluster verwendet, von dem Code, der innerhalb von Composer läuft, zugänglich ist.

  • Es speichert den Code in einem Bucket, daher kann jeder mit Schreibzugriff auf diesen Bucket einen DGA-Code (den Code, den Apache Airflow ausführen wird) ändern/hinzufügen. Dann, wenn Sie Schreibzugriff auf den Bucket haben, den Composer verwendet, um den Code zu speichern, können Sie privesc zur SA, die im GKE-Cluster läuft, erhalten.

Cloud Functions

  • Der Code von Cloud Functions wird in Storage gespeichert, sodass es möglich ist, durch Überschreiben beliebigen Code auszuführen.

App Engine

  • Der Quellcode von App Engine wird in Buckets gespeichert, durch Überschreiben des Codes könnte es möglich sein, beliebigen Code auszuführen. DAS IST NICHT MÖGLICH.

  • Es scheint, dass Container-Schichten im Bucket gespeichert sind, vielleicht diese ändern?

GCR

  • Google Container Registry speichert die Images in Buckets. Wenn Sie diese Buckets beschreiben können, könnten Sie in der Lage sein, seitlich zu dem Ort zu wechseln, an dem diese Buckets ausgeführt werden.

  • Der von GCR verwendete Bucket hat eine URL, die ähnlich aussieht wie gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com (Die obersten Subdomains sind hier angegeben).

Referenzen

HackTricks unterstützen

Last updated