Skip to content

Latest commit

 

History

History
229 lines (105 loc) · 8.82 KB

[小佑科技]-2021-9-2-3种攻击手段教你拿下k8s集群.md

File metadata and controls

229 lines (105 loc) · 8.82 KB

3种攻击手段教你拿下k8s集群

原创 小佑科技 小佑科技

小佑科技

微信号 xiaoyoudosec

功能介绍 北京小佑科技专注于云计算安全的科技公司,我们开发了自主知识产权的PAAS容器安全防护产品,解决容器全生命周期的安全问题,同时为客户提供高品质的安全事件应急处理、合规咨询等安全服务,以产品加服务的方式为客户提供高价值的安全解决方案。


__

收录于话题

一、 概览

云原生技术架构在带来颠覆性技术架构变革的同时,也带来了新的安全要求和挑战。在过去几年以及未来数年内,云原生架构会成为黑客攻击和利用的重点。Kubernetes,简称k8s,是当前主流的容器调度平台,更被称为云原生时代的操作系统,可见其重要性。简单来说,k8s是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。本文从k8s用户授权方面来谈谈针对k8s集群渗透的手法,如有不足之处,还望各位老师傅进行斧正。

二、 Kubernetes中的用户

Kubernetes 集群中包含两类用户:一类是由 Kubernetes 管理的 service account,另一类是普通用户。普通用户被假定为由外部独立服务管理。管理员分发私钥,用户存储(如 Keystone 或 Google 账户),甚至包含用户名和密码列表的文件。在这方面,Kubernetes 没有代表普通用户账户的对象。无法通过 API 调用的方式向集群中添加普通用户。

相对的,service account 是由 Kubernetes API 管理的账户。它们都绑定到了特定的 namespace,并由 API server 自动创建,或者通过 API 调用手动创建。Service account 关联了一套凭证,存储在 Secret,这些凭证同时被挂载到 pod 中,从而允许 pod 与 kubernetes API 之间的调用。

API 请求被绑定到普通用户或 serivce account 上,或者作为匿名请求对待。这意味着集群内部或外部的每个进程,无论从在工作站上输入 kubectl 的人类用户到节点上的 kubelet,到控制平面的成员,都必须在向 API Server 发出请求时进行身份验证,或者被视为匿名用户。

  1. user

外部用户是 k8s 中非常常见的一种访问者身份,通常用于从 k8s 之外来访问集群中的资源。因为这种资源的定位就是外部用户,所以 k8s 是不会存储 User 信息的,我们可以通过 Keystone 或者 Google Accounts 这种外部应用来管理。

  1. group

同外部用户,Group 也是一种外部的概念,在X509客户端证书认证的方式中,Group 名字就是证书的组织名(Orgnization)

  1. service account

相对于外部用户 User 而言,Service Account 则是集群内部的用户,我们可以使用 k8s api 来查看和管理这种用户。

  1. anonymous

当一个请求没有携带任何的认证信息时,它会自动获得用户名:system:anonymous和用户组system:unauthenticated,我们可以配置分配特定的权限给这种匿名用户,适用于想要公开一些不敏感的资源等场景。kubelet 10250 未授权访问、kube-apiserver 8080端口未授权访问,皆属于此种情况。

三、渗透思路

  1. k8s api-server 8080未授权

部署在Master上暴露Kubernetes API,是Kubernetes的控制面。Kubernetes

API服务器为API对象验证和配置数据,这些对象包含Pod,Service,ReplicationController等等。API Server提供REST操作以及前端到集群的共享状态,所有其他组件可以通过这些共享状态交互。默认情况,Kubernetes API Server提供HTTP的两个端口:8080,6443。insecure-port: 默认端口8080,在HTTP中没有认证和授权检查。secure- port :默认端口6443, 认证方式,令牌文件或者客户端证书,如下图访问http://IP:8080

渗透思路:通过未授权的8080端口,可以读写kube-apiserver的api,创建挂载根目录的特权DaemonSet实现控制集群的目的。

注:k8s DeamonSet会在集群中的每台机器上创建一个

2. kubelet 10250端口未授权

kubelet会在kubernetes集群中的每一个节点上运行一个实例,对容器进行生命周期的管理。kubelet开放的端口有:4194、10248、10250和10255。kubelet的10255端口提供了pod和node的信息。如果对外开放,攻击者利用公开api可以获取敏感信息。kubelet的10250端口是kubelet server 与 apiserver 通信的端口,定期请求 apiserver 获取自己所应当处理的任务,通过该端口可以访问获取node资源以及状态。如果kubelet的10250端口对外暴露,存在远程命令执行漏洞。

渗透手法:用curl直接连接kublet的10250端口:curl –insecure -v -H “X-Stream-Protocol-Version: v2.channel.k8s.io” -H “X-Stream-Protocol-Version: channel.k8s.io” -X POST “https://IP:10250/exec/namespace/podID/containername?command=touch&command=/tmp/test&input=1&output=1&tty=1"

3. Service acount 高权限账户的风险

k8s创建pod时,默认会把token、ca.crt、namespace三个文件挂载到pod内部,默认挂载到/run/secrets/kubernetes.io/serviceaccount目录, 如果挂载到集群内的token具有创建pod的权限,可以通过token访问集群的api创建特权容器,然后通过特权容器逃逸到宿主机,从而拥有集群节点的权限。如下图这种权限控制有较大的风险,可以直接拿到集群权限:(激进一点的举例,勿喷。相信各位运维小哥,不会犯这种错误。):

此种情况下有两种渗透方式:

  • 调用k8s sdk创建特权容器、挂载根目录的容器

  • 把kubectl 放到pod内,创建特权容器、挂载根目录的容器

四、总结

本文从k8s api-server 8080端口未授权访问、kubelet 10250端口未授权访问、rbac权限三方面不安全配置,介绍了渗透k8s集群的方法。渗透集群手法还有很多种,后文再表。

END

关于鲲鹏安全实验室

鲲鹏安全实验室专注于容器安全和业务灰黑产对抗的研究,收集和挖掘容器相关技术的安全漏洞,采集业务灰黑产情报,研究对抗手段。并将研究成功转换为产品和服务。

内容编辑:鲲鹏安全实验室 令狐冲 责任编辑:剁肉工

往期推荐

小佑科技入选Gartner《云原生应用保护平台创新洞察》代表厂商
一个存在了15年可导致容器逃逸的最新漏洞详解
小佑科技创始人袁曙光受邀参加全球技术峰会GOTC深圳站专题论坛

连创佳绩|小佑科技再次当选年度“CCIA潜力之星”

预览时标签不可点

收录于话题 #

个 __

上一篇 下一篇

阅读

分享 收藏

赞 在看

____已同步到看一看写下你的想法

前往“发现”-“看一看”浏览“朋友在看”

示意图

前往看一看

看一看入口已关闭

在“设置”-“通用”-“发现页管理”打开“看一看”入口

我知道了

__

已发送

取消 __

发送到看一看

发送

3种攻击手段教你拿下k8s集群

最多200字,当前共字

__

发送中

写下你的留言

微信扫一扫
关注该公众号

知道了

微信扫一扫
使用小程序


取消 允许


取消 允许

: , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看