1.k8s简介
1.1 基础架构
k8s集群由 Master节点节点和Node节点组成:
-
Master节点负责资源调度,调度应用,维护状态和应用扩容等。 -
Node节点上跑着应用服务,每个Node节点有一个kubelet,负责node与master之间的通信。
1.2 组件
2.k8s对外攻击面
2.1 kube-apiserver
-
漏洞名称:kube-apiserver未授权 -
漏洞概述:k8s api server存在未授权访问,攻击者可通过kubectl创建恶意pod或控制已有pod,后续可尝试逃逸至宿主机 -
威胁等级:高危 -
修复建议:使用安全端口替代8080端口,并使用–tls-cert-file参数开启证书认证 -
利用过程:
(2)访问http://x.x.x.x:8080/api/v1/namespaces/kube-system/secrets/,获取kube-system的token
(3)创建kubectl配置文件,指定目标地址和步骤2中拿到的token等
(4)kubectl–kubeconfig=./test_config get pod -n kube-system -o wide成功通过kubectl使用kube-system的token获取pod列表。之后可进一步创建pod或控制已有pod进行命令执行等操作
2.2 kubelet
-
漏洞名称:kubelet未授权
-
漏洞概述:k8s node对外开启10250(kubelet API)和10255端口(readonly API),攻击者可创建恶意pod或控制已有pod,后续可尝试逃逸至宿主机
-
威胁等级:高危
-
修复建议:
(1)readOnlyPort=0:关闭只读端口(默认 10255); (2)authentication.anonymous.enabled:设置为 false,不允许匿名访问 10250 端口;
(3)authentication.x509.clientCAFile:指定签名客户端证书的 CA 证书,开启 HTTP 证书认证;authentication.webhook.enabled=true:开启 HTTPs bearer token 认证;
-
漏洞利用:
(2)使用kubeletctl批量获取pod等信息:./kubeletctl pods -s x.x.x.x
2.3 etcd
-
漏洞名称:etcd未授权
-
威胁等级:高危
-
漏洞概述:etcd若存在未授权,攻击者导出全量etcd配置,获取k8s认证证书等关键配置,进而通过kubectl创建恶意pod或控制已有pod,后续可尝试逃逸至宿主机
-
漏洞利用 (1)访问https://x.x.x.x:2379/v2/keys,有如下回显则漏洞存在
(2)通过etcdctl工具,导出etcd数据库中内容:etcdctl –insecure-transport=false–insecure-skip-tls-verify –endpoints=https://IP:2379/ get / –prefix–keys-only | sort | uniq | xargs -I{} sh -c ‘ETCDCTL_API=3 ./etcdctl–insecure-transport=false –insecure-skip-tls-verify–endpoints=https://IP:2379 get {} >> output.data && echo”” >> output.data’,通过搜索关键字获取kube-system secret
(3)curl –header -k”Authorization: Bearer TOKEN” -X GET https://x.x.x.x:6443/api,通过请求kube-apiserver验证token是否有效。
2.4 dashboard
-
漏洞名称:k8s dashboard认证绕过(CVE-2018-18264)
-
威胁等级:高危 -
漏洞概述:攻击者可跳过登录,直接进入dashboard web页获取pod和job等状态,并可创建恶意pod,尝试逃逸至宿主机 -
修复建议:关闭dashboard的–enable-skip-login -
漏洞利用
(1)登录页面选择跳过登录
(2)可通过dashboard获取pod、node和job等状态
(3)若业务配置错误或为了方便给 Kubernetes dashboard 绑定 cluster-admin等角色,攻击者可直接在界面上创建特权 pod 进行容器逃逸
2.5 docker
-
漏洞名称:docker未授权 -
威胁等级:高危 -
漏洞概述:攻击者可利用对外暴露的docker remote api,执行docker命令, -
修复建议:生成证书进行api校验:docker -d –tlsverify –tlscacert=ca.pem–tlscert=server-cert.pem–tlskey=server-key.pem-H=tcp://x.x.x.x:2375-H unix:///var/run/dock -
漏洞利用
(1)访问http://x.x.x.x:2376/version可获取docker版本等信息,证明存在漏洞
(2)通过调用docker未授权接口,创建特权容器,挂载宿主机根目录
(3)后续可通过写入ssh公钥和crontab等,完成逃逸和持久化
2.6 kube-proxy
-
漏洞名称:kube-proxy配置错误 -
威胁等级:高危 -
漏洞概述:攻击者可通过kube-proxy代理来未授权访问本地kube-apiserver组件,创建恶意pod或控制已有pod,后续可尝试逃逸至宿主机 -
修复建议:kube-proxy禁止对外直接使用–address=0.0.0.0参数 -
漏洞利用
(1)该漏洞一般为业务或开发为了方便,通过kubectl proxy –address=0.0.0.0命令,将kube-apiserver暴露到0.0.0.0,且默认未授权
(2)之后请求8001端口即可未授权访问kube-apiserver,利用过程与2.2相同
3.漏洞检测
基于攻防演练、红蓝对抗的攻击方视角,为避免打poc(检测对外组件类漏洞)直接导致入侵检测系统告警或被防守方感知,周期性自动化扫描检测一般遵从以下原则:
(1)尽量不直接rce执行命令,通过页面返回特征、组件版本或上下文关联等进行检测
(2)在1的基础上,宁可一定量的误报,而非漏报
(3)由于互联网甲方资产较多,每个poc的请求量需严格控制,能少则少
另外,收集到的资产多少和准确度也是个影响扫描的重要因素,资产收集不仅仅依赖于传统前期信息收集来源的资产,也需要对已有数据(来自互联网或自己存下的)进行深入二次分析,如:
-
域名存活性扫描中的response header,提取其中csp和Access-Control-Allow-Origin等 -
路径爆破中的crossdomain.xml -
移动端app中的域名和接口等 -
ssl证书中的DNS Names等
在第二节中提到的大多数组件未授权漏洞,均可通过页面返回特征进行匹配,少数漏洞如kubelet的10250端口和10255端口未授权,由于返回特征类似,不一定要根据返回页面细分。
配合自研分布式漏扫,即可进行周期检测。
4.总结
本文介绍了k8s相关基础知识,并详细阐述了k8s主要组件对外攻击面和利用过程,最后提出了针对k8s对外攻击面的漏洞检测思路和方法。
原文始发于微信公众号(哔哩哔哩安全应急响应中心):k8s对外攻击面总结