# 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}}