k8s对外攻击面总结

1.k8s简介

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

1.1.基础架构

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

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

用户端一般通过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中。

1.2.组件

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。

2.k8s对外攻击面

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

2.1.kube-apiserver

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

(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 认证;
  • 漏洞利用:
    (1)访问https://x.x.x.x:10250/pods,有如下回显则漏洞存在
    在这里插入图片描述
    (2)使用kubeletctl批量获取pod等信息:./kubeletctl pods -s x.x.x.x
    在这里插入图片描述

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

2.3.etcd

  • 漏洞名称:etcd未授权
  • 威胁等级:高危
  • 漏洞概述:etcd若存在未授权,攻击者导出全量etcd配置,获取k8s认证证书等关键配置,进而通过kubectl创建恶意pod或控制已有pod,后续可尝试逃逸至宿主机
  • 修复建议:etcd增加证书校验
  • 漏洞利用:
    (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/docker.sock
  • 漏洞利用:
    (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对外攻击面的漏洞检测思路和方法。

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值