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端口,就可以看到全部的场景信息。

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

使用gobuster爆破目录,找到/.git/HEAD
使用git-dumper下载源码
查看日志和以前的提交历史来验证 git 历史和信息

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

Docker-in-Docker的漏洞利用
根据提示,访问1231端口

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

配置反弹shell

切换交互式终端
运行linepeas枚举系统
找到docker sock接口

查看版本

下载docker二进制版本
解压
使用docker调用sock

docker提权到宿主机
Kubernetes (K8S) 中的 SSRF
修改scenarios/internal-proxy/deployment.yaml文件应用的内存和CPU值
访问http://127.0.0.1:5000,告诉你访问http://metadata-db会有更多的信息。

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

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

容器逃逸到主系统
访问1233端口

打印当前系统的进程的 capabilities 状态。capabilities 是指给予进程的特权,用于控制它可以执行哪些操作。
mount查看挂载,发现host-system目录是挂载了宿主机的根目录

查看/host-system

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

使用kubectl获取pods信息

Docker CIS 基线分析
运行服务
运行容器应用
执行docker CIS基线分析脚本

K8S CIS基线分析
运行服务
它是一个检测任务
查看日志,可以看到K8S基线情况。

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

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

查看环境变量,找到API_KEY。

NodePort 暴露的服务
按照提示进行端口扫描,发现30003端口开启。
访问30003端口

分析加密矿工容器
查看工作任务详情
然后通过运行以下命令获取 pod 信息,该命令展示了标签和选择器匹配的 pod
查看pod的yaml文件,我们可以看到这个作业 pod 正在运行 madhuakula/k8s-goat-batch-check docker 容器镜像
在这里我们可以看到它包含一个在构建时在其中一层中执行外部脚本的命令
Kubernetes 命名空间绕过
默认情况下,Kubernetes 使用平面网络架构,这意味着集群中的任何 pod/服务都可以与其他人通信。默认情况下,集群中的命名空间没有任何网络安全限制。
运行hacker-container镜像。
查看网络IP。

查看redis端口
连接redis

获取环境信息
访问1233端口

输入printenv,获取环境信息
拒绝服务(DoS)内存/CPU资源
访问1236端口

我们可以使用像 stress-ng 这样的简单实用程序来执行压力测试,比如访问更多资源。下面的命令是访问比指定更多的资源
您可以看到正常资源消耗与运行 stress-ng 时的区别,后者消耗的资源比预期消耗的要多
需要安装
metricsx509: cannot validate certificate 的解决方案: https://ssoor.github.io/2020/03/25/k8s-metrics-server-error-1/
原始阶段
压测过程中
黑客容器预览
进入黑客容器
我们可以使用像 amicontained 这样简单而强大的实用程序来执行容器内省并获得系统功能的概述等。
扫描

隐藏在层中
查看madhuakula/k8s-goat-hidden-in-layers镜像信息
查看构建历史,找到secret.txt

我们可以通过利用 docker 内置命令将 docker 镜像导出为 tar 文件来恢复 /root/secret.txt
解压hidden-in-layers.tar
使用dive分析镜像
https://github.com/wagoodman/dive/releases

进入layer层
获取secret.txt
RBAC 最低特权配置错误
访问1236端口

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

要指向内部 API 服务器主机名,我们可以从环境变量中导出它
设置 ServiceAccount 令牌的路径
设置命名空间值
读取 ServiceAccount token
指向 ca.crt 路径,以便我们可以在 curl 请求中查询时使用它
现在我们可以使用令牌和构造的查询来探索 Kubernetes API

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

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

从secrets中获取k8svaulapikey值

KubeAudit - 审核Kubernetes集群
kubeaudit 是一个命令行工具和一个 Go 包,用于审计 Kubernetes 集群的各种安全问题。
要开始使用此方案,您可以运行以下命令以使用集群管理员权限启动黑客容器
下载kubeaudit
执行审计

Falco - 运行时安全监测和检测
部署 Falco
运行镜像,里面执行cat /etc/shadow
一会后,查看falco日志,可以监控到执行查看shadow命令。

Popeye - Kubernetes集群清理工具
运行镜像
使用 NSP 保护网络边界
启动web镜像
启动终端

创建一个网络策略并将其应用于 Kubernetes 集群以阻止/拒绝任何请求。
让我们通过运行以下命令将此 NSP 策略部署到集群:
最后更新于
这有帮助吗?