# GCP - Enumération des Cloud Functions

{{#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/) sont conçues pour héberger votre code, qui **est exécuté en réponse à des événements**, sans nécessiter la gestion d'un système d'exploitation hôte. De plus, ces fonctions prennent en charge le stockage de variables d'environnement, que le code peut utiliser.

### Stockage

Le **code des Cloud Functions est stocké dans GCP Storage**. Par conséquent, toute personne ayant **un accès en lecture sur les buckets** dans GCP pourra **lire le code des Cloud Functions**.\
Le code est stocké dans un bucket comme l'un des suivants :

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

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

> [!WARNING]
> Tout utilisateur ayant **des privilèges de lecture sur le bucket** stockant la Cloud Function pourrait **lire le code exécuté**.

### Artifact Registry

Si la fonction cloud est configurée de sorte que le conteneur Docker exécuté soit stocké à l'intérieur d'un dépôt Artifact Registry dans le projet, toute personne ayant un accès en lecture sur le dépôt pourra télécharger l'image et vérifier le code source. Pour plus d'infos, consultez :

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

### SA

Si non spécifié, par défaut, le **Compte de Service par Défaut de l'App Engine** avec **des permissions d'Éditeur** sur le projet sera attaché à la Cloud Function.

### Déclencheurs, URL & Authentification

Lorsqu'une Cloud Function est créée, le **déclencheur** doit être spécifié. Un déclencheur courant est **HTTPS**, cela **créera une URL où la fonction** peut être déclenchée via la navigation web.\
D'autres déclencheurs sont pub/sub, Storage, Filestore...

Le format de l'URL est **`https://<region>-<project-gcp-name>.cloudfunctions.net/<func_name>`**

Lorsque le déclencheur HTTPS est utilisé, il est également indiqué si le **demandeur doit avoir une autorisation IAM** pour appeler la fonction ou si **tout le monde** peut simplement l'appeler :

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

### À l'intérieur de la Cloud Function

Le code est **téléchargé à l'intérieur** du dossier **`/workspace`** avec les mêmes noms de fichiers que ceux des fichiers dans la Cloud Function et est exécuté avec l'utilisateur `www-data`.\
Le disque **n'est pas monté en lecture seule.**

### Énumération
```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 '{}'
```
### Escalade de Privilèges

Dans la page suivante, vous pouvez vérifier comment **abuser des permissions des fonctions cloud pour escalader les privilèges** :

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

### Accès Non Authentifié

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

### Persistance

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

## Références

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