# GCP - Cloud Functions Enum {{#include ../../../banners/hacktricks-training.md}} ## Cloud Functions [Google Cloud Functions](https://cloud.google.com/functions/) sind dafür konzipiert, Ihren Code zu hosten, der **als Reaktion auf Ereignisse ausgeführt wird**, ohne dass die Verwaltung eines Host-Betriebssystems erforderlich ist. Darüber hinaus unterstützen diese Funktionen die Speicherung von Umgebungsvariablen, die der Code nutzen kann. ### Speicherung Der **Code der Cloud Functions wird in GCP Storage gespeichert**. Daher kann jeder mit **Lesezugriff auf Buckets** in GCP den **Code der Cloud Functions lesen**.\ Der Code wird in einem Bucket wie einem der folgenden gespeichert: - `gcf-sources--/-/version-/function-source.zip` - `gcf-v2-sources--/function-source.zip` Zum Beispiel:\ `gcf-sources-645468741258-us-central1/function-1-003dcbdf-32e1-430f-a5ff-785a6e238c76/version-4/function-source.zip` > [!WARNING] > Jeder Benutzer mit **Leseprivilegien über den Bucket**, der die Cloud Function speichert, könnte **den ausgeführten Code lesen**. ### Artifact Registry Wenn die Cloud-Funktion so konfiguriert ist, dass der ausgeführte Docker-Container in einem Artifact Registry-Repo innerhalb des Projekts gespeichert wird, kann jeder mit Lesezugriff auf das Repo das Image herunterladen und den Quellcode überprüfen. Für weitere Informationen siehe: {{#ref}} gcp-artifact-registry-enum.md {{#endref}} ### SA Wenn nicht angegeben, wird standardmäßig das **App Engine Standarddienstkonto** mit **Editor-Berechtigungen** über das Projekt an die Cloud Function angehängt. ### Trigger, URL & Authentifizierung Wenn eine Cloud Function erstellt wird, muss der **Trigger** angegeben werden. Ein häufiger ist **HTTPS**, dies wird **eine URL erstellen, über die die Funktion** über das Web aufgerufen werden kann.\ Andere Trigger sind pub/sub, Storage, Filestore... Das URL-Format ist **`https://-.cloudfunctions.net/`** Wenn der HTTPS-Trigger verwendet wird, wird auch angegeben, ob der **Aufrufer IAM-Berechtigungen benötigt**, um die Funktion aufzurufen, oder ob **jeder** sie einfach aufrufen kann:
### Innerhalb der Cloud Function Der Code wird **im Ordner** **`/workspace`** mit denselben Dateinamen wie die Dateien in der Cloud Function heruntergeladen und wird mit dem Benutzer `www-data` ausgeführt.\ Die Festplatte **wird nicht als schreibgeschützt gemountet.** ### Enumeration ```bash # List functions gcloud functions list gcloud functions describe # Check triggers to see how is this function invoked gcloud functions get-iam-policy # Get logs of previous runs. By default, limits to 10 lines gcloud functions logs read --limit [NUMBER] # Call a function curl https://-.cloudfunctions.net/ gcloud functions call --data='{"message": "Hello World!"}' # If you know the name of projects you could try to BF cloud functions names # Get events that could be used to trigger a cloud function gcloud functions event-types list # Access function with authentication curl -X POST https://-.cloudfunctions.net/ \ -H "Authorization: bearer $(gcloud auth print-identity-token)" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Privilegieneskalation Auf der folgenden Seite können Sie überprüfen, wie man **Cloud-Funktionsberechtigungen missbraucht, um Privilegien zu eskalieren**: {{#ref}} ../gcp-privilege-escalation/gcp-cloudfunctions-privesc.md {{#endref}} ### Unauthentifizierter Zugriff {{#ref}} ../gcp-unauthenticated-enum-and-access/gcp-cloud-functions-unauthenticated-enum.md {{#endref}} ### Nach der Ausnutzung {{#ref}} ../gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md {{#endref}} ### Persistenz {{#ref}} ../gcp-persistence/gcp-cloud-functions-persistence.md {{#endref}} ## Referenzen - [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/#reviewing-stackdriver-logging](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/#reviewing-stackdriver-logging) {{#include ../../../banners/hacktricks-training.md}}