k8s对外攻击面总结

渗透技巧 2年前 (2021) admin
1,118 0 0

1.k8s简介

kubernetes简称 k8s,是一个由google开源的,用于自动部署,扩展和管理容器化应用程序的开源系统。在B站内部,k8s在管理生产级容器和应用服务部署已经有较为广泛和成熟的应用。通过k8s,可跨多台主机进行容器编排、快速按需扩展容器化应用及其资源、对应用实施状况检查、服务发现和负载均衡等。


1.1 基础架构


     k8s集群由 Master节点节点和Node节点组成:

  • Master节点负责资源调度,调度应用,维护状态和应用扩容等。
  • Node节点上跑着应用服务,每个Node节点有一个kubelet,负责node与master之间的通信。

    k8s对外攻击面总结

用户端一般通过kubectl命令行工具与kube-apiserver进行交互,当然如果不嫌麻烦也可以直接通过调用kube-apiserverapi来交互。用户端命令下发通常流程如下:
(1)客户端根据用户需求,调用kube-apiserver相应api
(2)kube-apiserver根据命令类型,联动master节点内的kube-controller-managerkube-scheduler等组件,通过kubelet进行下发新建容器配置或下发执行命令等给到对应node节点
(3)node节点与容器进行交互完成下发的命令并返回结果
(4)master节点最终根据任务类型将结果持久化存储在etcd中。

1.2 组件


k8s集群主要由以下组件组成:
(1)kube-apiserverk8s master节点api服务器,以REST API服务形式提供接口,作为整个k8s的控制入口。
(2)kube-controller-manager:执行整个k8s的后台任务,包括节点状态状况、Pod个数、PodsService的关联等。
(3)kube-scheduler:接收来自kube-apiserver创建Pods任务,通过收集的集群中所有node节点的资源负载情况分配到某个节点。
(4)etcdk8s的键值对形式数据库,保存了k8s所有集群数据的后台数据库
(5)kube-proxy:运行在每个node节点上,负责pod网络代理。定时从etcd获取到service信息来做相应的策略。
(6)kubelet:运行在每个node节点上,作为agent,接收分配该节点的pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver



2.k8s对外攻击面


节会详细阐述各k8s主要组件的对外攻击面利用。另外因篇幅有限,以下小节中提到的具体逃逸步骤和原理不会详细展开。

2.1 kube-apiserver


  • 漏洞名称:kube-apiserver未授权
  • 漏洞概述:k8s api server存在未授权访问,攻击者可通过kubectl创建恶意pod或控制已有pod,后续可尝试逃逸至宿主机
  • 威胁等级:高危
  • 修复建议:使用安全端口替代8080端口,并使用–tls-cert-file参数开启证书认证
  • 利用过程:
1)访问默认8080端口,若存在以下回显,则漏洞存在

k8s对外攻击面总结


2)访问http://x.x.x.x:8080/api/v1/namespaces/kube-system/secrets/,获取kube-systemtoken

k8s对外攻击面总结


3)创建kubectl配置文件,指定目标地址和步骤2中拿到的token

k8s对外攻击面总结


4kubectl–kubeconfig=./test_config get pod -n kube-system -o wide成功通过kubectl使用kube-systemtoken获取pod列表。之后可进一步创建pod或控制已有pod进行命令执行等操作

k8s对外攻击面总结




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 认证;

  • 漏洞利用:

1)访问https://x.x.x.x:10250/pods,有如下回显则漏洞存在

k8s对外攻击面总结


2)使用kubeletctl批量获取pod等信息:./kubeletctl pods -s x.x.x.x

k8s对外攻击面总结


3)可使用kubeletctl在特权pod内执行命令,挂载宿主机根目录,通过向宿主机批量写入ssh公钥逃逸到宿主机

k8s对外攻击面总结


k8s对外攻击面总结



2.3 etcd


  • 漏洞名称:etcd未授权

  • 威胁等级:高危

  • 漏洞概述:etcd若存在未授权,攻击者导出全量etcd配置,获取k8s认证证书等关键配置,进而通过kubectl创建恶意pod或控制已有pod,后续可尝试逃逸至宿主机

  • 漏洞利用
    1)访问https://x.x.x.x:2379/v2/keys,有如下回显则漏洞存在

k8s对外攻击面总结

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

k8s对外攻击面总结


3curl –header -k”Authorization: Bearer TOKEN” -X GET https://x.x.x.x:6443/api,通过请求kube-apiserver验证token是否有效。

k8s对外攻击面总结



2.4 dashboard


  • 漏洞名称:k8s dashboard认证绕过(CVE-2018-18264)

  • 威胁等级:高危
  • 漏洞概述:攻击者可跳过登录,直接进入dashboard web页获取pod和job等状态,并可创建恶意pod,尝试逃逸至宿主机
  • 修复建议:关闭dashboard的–enable-skip-login
  • 漏洞利用

1)登录页面选择跳过登录

k8s对外攻击面总结


2)可通过dashboard获取podnodejob等状态

k8s对外攻击面总结


k8s对外攻击面总结


(3)若业务配置错误或为了方便给 Kubernetes dashboard 绑定 cluster-admin等角色,攻击者可直接在界面上创建特权 pod 进行容器逃逸

k8s对外攻击面总结


k8s对外攻击面总结



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版本等信息,证明存在漏洞

k8s对外攻击面总结


(2)通过调用docker未授权接口,创建特权容器,挂载宿主机根目录

k8s对外攻击面总结


(3)后续可通过写入ssh公钥和crontab等,完成逃逸和持久化

k8s对外攻击面总结



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,且默认未授权

k8s对外攻击面总结


2)之后请求8001端口即可未授权访问kube-apiserver,利用过程与2.2相同

k8s对外攻击面总结



3.漏洞检测


  基于攻防演练、红蓝对抗的攻击方视角,为避免打poc(检测对外组件类漏洞)直接导致入侵检测系统告警或被防守方感知,周期性自动化扫描检测一般遵从以下原则:

(1)尽量不直接rce执行命令,通过页面返回特征、组件版本或上下文关联等进行检测

(2)在1的基础上,宁可一定量的误报,而非漏报

(3)由于互联网甲方资产较多,每个poc的请求量需严格控制,能少则少

另外,收集到的资产多少和准确度也是个影响扫描的重要因素,资产收集不仅仅依赖于传统前期信息收集来源的资产,也需要对已有数据(来自互联网或自己存下的)进行深入二次分析,如:

  • 域名存活性扫描中的response header,提取其中csp和Access-Control-Allow-Origin等
  • 路径爆破中的crossdomain.xml
  • 移动端app中的域名和接口等
  • ssl证书中的DNS Names等


k8s对外攻击面总结


  在第二节中提到的大多数组件未授权漏洞,均可通过页面返回特征进行匹配,少数漏洞如kubelet的10250端口和10255端口未授权,由于返回特征类似,不一定要根据返回页面细分。

k8s对外攻击面总结


       配合自研分布式漏扫,即可进行周期检测。

k8s对外攻击面总结




4.总结



本文介绍了k8s相关基础知识,并详细阐述了k8s主要组件对外攻击面和利用过程,最后提出了针对k8s对外攻击面的漏洞检测思路和方法。


     作者:ATpiu,bilibili高级安全工程师,现负责b站渗透测试和安全开发工作。


原文始发于微信公众号(哔哩哔哩安全应急响应中心):k8s对外攻击面总结

版权声明:admin 发表于 2021年12月9日 上午11:52。
转载请注明:k8s对外攻击面总结 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...