kubernetes-goat

简介

Kubernetes Goat 是一个交互式 Kubernetes 安全学习游乐场。它在设计场景中故意易受攻击,以展示 Kubernetes 集群、容器和云原生环境中的常见错误配置、现实漏洞和安全问题。

Kubernetes Goat 有 20 多个场景,涵盖攻击、防御、最佳实践、工具等,包括:

  • 代码库中敏感密钥

  • Docker-in-Docker的漏洞利用

  • Kubernetes (K8S) 中的 SSRF

  • 容器逃逸到主系统

  • Docker CIS 基准分析

  • Kubernetes CIS 基准分析

  • 攻击私有仓库

  • NodePort 暴露的服务

  • Helm v2 tiller 攻击集群(已废弃)

  • 分析加密矿工容器

  • Kubernetes 命名空间绕过

  • 获取环境信息

  • 拒绝服务(DoS)内存/CPU资源

  • 黑客容器预览

  • 隐藏在层中

  • RBAC 最低特权配置错误

  • KubeAudit - 审核Kubernetes集群

  • Falco - 运行时安全监测和检测

  • Popeye - Kubernetes集群清理工具

  • 使用 NSP 保护网络边界

安装

需要先安装minikube,参考这里安装

helm

安装helm

验证helm是否安装完成。

Kubernetes Goat

安装socat,用于端口转发

下载kubernetes-goat仓库

进入kubernetes-goat目录

修改scenarios/internal-proxy/deployment.yaml中CPU和内存值为300M。

运行kubernetes-goat的K8S服务

运行脚本,启动应用服务的端口转发。

访问1234端口,就可以看到全部的场景信息。

image-20230131103332657

代码库敏感密钥

开发人员倾向于将敏感信息提交给版本控制系统。当我们转向 CI/CD 和 GitOps 系统时,我们往往会忘记识别代码和提交中的敏感信息。让我们看看能不能在这里找到一些很酷的东西!

访问1230端口。

image-20230131112130039

使用gobuster爆破目录,找到/.git/HEAD

使用git-dumper下载源码

查看日志和以前的提交历史来验证 git 历史和信息

image-20230203171234734

查看d7c173ad183c574109cd5c4c648ffe551755b576commit

查看目录,找到.env文件,发现AWS密钥

image-20230203171254243

Docker-in-Docker的漏洞利用

根据提示,访问1231端口

image-20230203171912830

这是一个命令注入漏洞的页面

image-20230203171951558

配置反弹shell

image-20230203174412937

切换交互式终端

运行linepeas枚举系统

找到docker sock接口

image-20230203175307779

查看版本

image-20230203175429237

下载docker二进制版本

解压

使用docker调用sock

image-20230203175847619

docker提权到宿主机

Kubernetes (K8S) 中的 SSRF

修改scenarios/internal-proxy/deployment.yaml文件应用的内存和CPU值

访问http://127.0.0.1:5000,告诉你访问http://metadata-db会有更多的信息。

image-20230206120146995

访问http://metadata-db会访问latest路径

image-20230206120311404

最后http://metadata-db/latest/secrets/kubernetes-goat会得到一个base64值

image-20230206120404113

容器逃逸到主系统

访问1233端口

image-20230206133959947

打印当前系统的进程的 capabilities 状态。capabilities 是指给予进程的特权,用于控制它可以执行哪些操作。

mount查看挂载,发现host-system目录是挂载了宿主机的根目录

image-20230206134628255

查看/host-system

image-20230206135018536

将当前系统的根目录更改为 "/host-system"。这意味着系统将认为 "/host-system" 是根目录,并且所有的相对路径都是从 "/host-system" 开始的。执行 "chroot /host-system bash" 后,您将进入到一个以 "/host-system" 为根目录的新环境,并且可以在其中运行 bash。

执行docker ps

image-20230206135334606

使用kubectl获取pods信息

image-20230206135642044

Docker CIS 基线分析

运行服务

运行容器应用

执行docker CIS基线分析脚本

image-20230206141840540

K8S CIS基线分析

运行服务

它是一个检测任务

查看日志,可以看到K8S基线情况。

image-20230206142228145

攻击私有仓库

访问:http://192.168.32.130:1235/v2/_catalog,查看docker仓库信息

image-20230206144434187

访问:http://192.168.32.130:1235/v2/madhuakula/k8s-goat-users-repo/manifests/latest,获取madhuakula/k8s-goat-users-repo镜像信息

image-20230206144913131

查看环境变量,找到API_KEY。

image-20230206145403438

NodePort 暴露的服务

按照提示进行端口扫描,发现30003端口开启。

访问30003端口

image-20230206151042812

分析加密矿工容器

查看工作任务详情

然后通过运行以下命令获取 pod 信息,该命令展示了标签和选择器匹配的 pod

查看pod的yaml文件,我们可以看到这个作业 pod 正在运行 madhuakula/k8s-goat-batch-check docker 容器镜像

在这里我们可以看到它包含一个在构建时在其中一层中执行外部脚本的命令

Kubernetes 命名空间绕过

默认情况下,Kubernetes 使用平面网络架构,这意味着集群中的任何 pod/服务都可以与其他人通信。默认情况下,集群中的命名空间没有任何网络安全限制。

运行hacker-container镜像。

查看网络IP。

image-20230206153218517

查看redis端口

连接redis

image-20230206153921331

获取环境信息

访问1233端口

image-20230206154115612

输入printenv,获取环境信息

拒绝服务(DoS)内存/CPU资源

访问1236端口

image-20230206154401581

我们可以使用像 stress-ng 这样的简单实用程序来执行压力测试,比如访问更多资源。下面的命令是访问比指定更多的资源

您可以看到正常资源消耗与运行 stress-ng 时的区别,后者消耗的资源比预期消耗的要多

需要安装metrics

x509: cannot validate certificate 的解决方案: https://ssoor.github.io/2020/03/25/k8s-metrics-server-error-1/

原始阶段

压测过程中

黑客容器预览

进入黑客容器

我们可以使用像 amicontained 这样简单而强大的实用程序来执行容器内省并获得系统功能的概述等。

扫描

image-20230206161512696

隐藏在层中

查看madhuakula/k8s-goat-hidden-in-layers镜像信息

查看构建历史,找到secret.txt

image-20230207170913608

我们可以通过利用 docker 内置命令将 docker 镜像导出为 tar 文件来恢复 /root/secret.txt

解压hidden-in-layers.tar

使用dive分析镜像

https://github.com/wagoodman/dive/releases

image-20230207171536842

进入layer层

获取secret.txt

RBAC 最低特权配置错误

访问1236端口

image-20230207171848648

默认情况下,Kubernetes 将所有令牌和服务帐户信息存储在默认位置

image-20230207172202907

要指向内部 API 服务器主机名,我们可以从环境变量中导出它

设置 ServiceAccount 令牌的路径

设置命名空间值

读取 ServiceAccount token

指向 ca.crt 路径,以便我们可以在 curl 请求中查询时使用它

现在我们可以使用令牌和构造的查询来探索 Kubernetes API

image-20230207172803765

要查询默认命名空间中的可用机密,请运行以下命令

没有权限查看默认命名空间

image-20230207172835361

查询特定于命名空间的秘密

image-20230207172950010

从secrets中获取k8svaulapikey值

image-20230207173038641

KubeAudit - 审核Kubernetes集群

kubeaudit 是一个命令行工具和一个 Go 包,用于审计 Kubernetes 集群的各种安全问题。

要开始使用此方案,您可以运行以下命令以使用集群管理员权限启动黑客容器

下载kubeaudit

执行审计

image-20230207173913697

Falco - 运行时安全监测和检测

部署 Falco

运行镜像,里面执行cat /etc/shadow

一会后,查看falco日志,可以监控到执行查看shadow命令。

image-20230207175743660

Popeye - Kubernetes集群清理工具

运行镜像

使用 NSP 保护网络边界

启动web镜像

启动终端

image-20230208102302818

创建一个网络策略并将其应用于 Kubernetes 集群以阻止/拒绝任何请求。

让我们通过运行以下命令将此 NSP 策略部署到集群:

最后更新于

这有帮助吗?