# GCP - Cloud Functions Enum

{{#include ../../../banners/hacktricks-training.md}}

## Cloud Functions <a href="#reviewing-cloud-functions" id="reviewing-cloud-functions"></a>

[Google Cloud Functions](https://cloud.google.com/functions/) sono progettate per ospitare il tuo codice, che **viene eseguito in risposta a eventi**, senza necessitare della gestione di un sistema operativo host. Inoltre, queste funzioni supportano la memorizzazione di variabili di ambiente, che il codice può utilizzare.

### Storage

Il **codice delle Cloud Functions è memorizzato in GCP Storage**. Pertanto, chiunque abbia **accesso in lettura sui bucket** in GCP sarà in grado di **leggere il codice delle Cloud Functions**.\
Il codice è memorizzato in un bucket come uno dei seguenti:

- `gcf-sources-<number>-<region>/<function-name>-<uuid>/version-<n>/function-source.zip`
- `gcf-v2-sources-<number>-<region>/<function-name>function-source.zip`

Ad esempio:\
`gcf-sources-645468741258-us-central1/function-1-003dcbdf-32e1-430f-a5ff-785a6e238c76/version-4/function-source.zip`

> [!WARNING]
> Qualsiasi utente con **privilegi di lettura sul bucket** che memorizza la Cloud Function potrebbe **leggere il codice eseguito**.

### Artifact Registry

Se la cloud function è configurata in modo che il contenitore Docker eseguito sia memorizzato all'interno di un repo Artifact Registry all'interno del progetto, chiunque abbia accesso in lettura al repo sarà in grado di scaricare l'immagine e controllare il codice sorgente. Per ulteriori informazioni, controlla:

{{#ref}}
gcp-artifact-registry-enum.md
{{#endref}}

### SA

Se non specificato, per impostazione predefinita, l'**App Engine Default Service Account** con **permessi di Editor** sul progetto sarà allegato alla Cloud Function.

### Triggers, URL & Authentication

Quando viene creata una Cloud Function, è necessario specificare il **trigger**. Uno comune è **HTTPS**, questo **creerà un URL dove la funzione** può essere attivata tramite navigazione web.\
Altri trigger sono pub/sub, Storage, Filestore...

Il formato dell'URL è **`https://<region>-<project-gcp-name>.cloudfunctions.net/<func_name>`**

Quando viene utilizzato il trigger HTTPS, viene anche indicato se il **chiamante deve avere autorizzazione IAM** per chiamare la funzione o se **chiunque** può semplicemente chiamarla:

<figure><img src="../../../images/image (19).png" alt=""><figcaption></figcaption></figure>

### Inside the Cloud Function

Il codice viene **scaricato all'interno** della cartella **`/workspace`** con gli stessi nomi di file di quelli che i file hanno nella Cloud Function ed è eseguito con l'utente `www-data`.\
Il disco **non è montato come di sola lettura.**

### Enumeration
```bash
# List functions
gcloud functions list
gcloud functions describe <func_name> # Check triggers to see how is this function invoked
gcloud functions get-iam-policy <func_name>

# Get logs of previous runs. By default, limits to 10 lines
gcloud functions logs read <func_name> --limit [NUMBER]

# Call a function
curl https://<region>-<project>.cloudfunctions.net/<func_name>
gcloud functions call <func_name> --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://<region>-<project>.cloudfunctions.net/<func_name> \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{}'
```
### Escalation dei privilegi

Nella pagina seguente, puoi controllare come **abusare dei permessi delle funzioni cloud per escalare i privilegi**:

{{#ref}}
../gcp-privilege-escalation/gcp-cloudfunctions-privesc.md
{{#endref}}

### Accesso non autenticato

{{#ref}}
../gcp-unauthenticated-enum-and-access/gcp-cloud-functions-unauthenticated-enum.md
{{#endref}}

### Post Exploitation

{{#ref}}
../gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md
{{#endref}}

### Persistenza

{{#ref}}
../gcp-persistence/gcp-cloud-functions-persistence.md
{{#endref}}

## Riferimenti

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