针对Kubernetes集群的攻击与检测
2023年4月24日,网络安全行业年度盛会 RSA Conference在旧金山隆重开幕。这次RSAC中,InGuardians公司CEO Jay Beale及安全研究员Alana Trimble带来了一个关于Kubernetes集群的攻击和检测议题Attacking and Detecting Attacks on Kubernetes Clusters。该议题通过演示DEF CON 30's Kubernetes CTF的解决方案,展示在Kubernetes集群中的攻击和防御思路。
DEF CON 30's Kubernetes CTF与议题简介
DEF CON 30's Kubernetes CTF以电影《Scott Pilgrim vs. the World》[1]为主题,是InGuardians公司举办的第二次Kubernetes CTF。
Kubernetes CTF为经验丰富的Kubernetes攻击者提供一个展示攻击技巧的机会,并为新人提供一个学习Kubernetes安全的平台。Kubernetes CTF的举办吸引了DEF CON社区中越来越多的研究人员关注Kubernetes安全。
议题《Attacking and Detecting Attacks on Kubernetes Clusters》[2]使用与DEF CON 30's Kubernetes CTF完全相同的CTF场景,给出了一个Kubernetes CTF解决方案。从一个 Kubernetes节点IP开始,在集群中Pod横向移动,拿到所有的Flag。最后,议题给出了一些Kubernetes集群安全加固策略,并介绍了其公司的一款开源Kubernetes渗透工具。
Kubernetes CTF解决思路
寻找Flag之前先了解本届Kubernetes CTF主题——《Scott Pilgrim vs. the World》。《Scott Pilgrim vs. the World》是一部2010年的动作喜剧电影。故事讲述了年轻摇滚乐手Scott Pilgrim与他所爱的女孩——发型师Ramona Flowers相遇并热恋,但在追求她的过程中,Scott需要先战胜她的七个前男友(Matthew Patel、Lucas Lee、Todd Ingram、Roxy Richter、Ken Katayanagi、Kyle Katayanagi以及Gideon Graves)。接下来,笔者将按Flag顺序介绍议题中给出的每个Flag的解决思路。
Flag1思路
1)使用端口扫描工具发现Kubernetes节点对外暴露的端口和服务;
2)使用目录遍历工具遍历出节点对外暴露服务的api;
3)使用Fuzz工具遍历出服务的请求参数,构造合适编码的参数值;
4)通过反弹Shell拿到该服务对应Pod:matthew-patel的Shell,并在该Pod的文件系统中找到Flag1。
Flag2思路
1)在Pod:matthew-patel中找到SA Token:matthew-patel(ServiceAccount Token:matthew-patel)和Namespace:matthew-patel;
2)根据提示确定Namespace:lucas-lee,并确定Token:matthew-patel在Namespace:lucas-lee中可以执行的操作——List Pod;
3)进入Namespace:lucas-lee下的Pod:lucas-lee-vault-0中,通过反弹Shell拿到Pod:lucas-lee-vault-0的Shell;
4)在Pod:lucas-lee-vault-0中利用Vault工具找到Flag2。
Flag3思路
1)确定SA Token:lucas-lee在Namespace:lucas-lee中可执行的操作——List Secret;
2)通过List列出Namespace:lucas-lee中的Secret,得到Flag3及SA Token: stunt-team。
Flag4思路
1)确定SA Token:stunt-team在Namespace:todd-ingram中可执行的操作——Get/List Pod;
2)列出Namespace:todd-ingram所有Pod,根据Pod的describe信息确定Flag4所在的Pod:spilledcoffee;
3)进入Pod:spilledcoffee中,通过反弹Shell拿到Pod:spilledcoffee的Shell,找到Flag4及SA Token:juile。
Flag5思路
1)确定SA Token:julie在Namespace:todd-ingram中可执行的操作——List/Get/Update/Patch Service;
2)导出Service:envy的yaml配置文件,将该Service绑定的app selector修改为Pod:spilledcoffee的label——spilledcoffee;
3)根据提示,通过已经拿到shell的Pod:spilledcoffee,向修改后的Service发送HTTP请求拿到Flag5以及SA Token:todd。
Flag6思路
1)在Pod:spilledcoffee中利用nodejs的反序列化漏洞拿到Pod:envy-adam的shell;
2)在Pod:envy-adam的文件系统中找到Flag6、SA Token:envy-adam及下一个Flag提示的Namespace:roxy-richter。
Flag7思路
1)确定SA Token:envy-adam在Namespace:roxy-richter中可执行的操作——List Configmap;
2)列出所有Configmap,根据Name找到Flag7存在的Configmap:roxy-richter-flag;
3)以yaml格式查看Configmap:roxy-richter-flag拿到Flag7及下一个Flag提示的Namespace:katayanagi-twins。
Flag8思路
1)确定SA Token:envy-adam在Namespace:katayanagi-twins中可执行的操作——List/Get Pod;
2)进入Namespace:katayanagi-twins下的Pod:ninth-circle;
3)在Pod:ninth-circle的文件系统中找到Flag8。
Flag9思路
1)节点目录/etc/kubernetes/manifests作为/manifests挂载到Pod:ninth-circle中;
2)将特权容器配置写入/manifests创建“特权Pod”;
3)通过挂载节点的文件系统获取Kubelet Token;
4)使用Kubelet Token进入Namespace:gideon-graves 的Pod:gideon-graves-chaos-theater中,在文件系统中找到Flag9。
Kubernetes安全加固策略
- 使用网络策略(Kubernetes 本地防火墙规则)阻止传出连接防止反弹shell。
- 使用Web应用程序防火墙(例如启用modsecurity 的 ingress-nginx)来防止自动扫描,降低远程命令执行的风险。
- 审核RBAC策略,确保ServiceAccount Token没有过度权限。
- 停用将ServiceAccount Token自动挂载到Pod的功能。
- 使用Kyverno[3]、OPA Gatekeeper[4]等out-of-tree准入控制器,防止创建可以获取/列出集群Secret的RBAC角色。
- 使用NameSpace隔离来减少用户水平越权,修改其他用户Service的风险。
- 使用服务网格(如Istio[5]、Linkerd[6]等)管理和监视不同微服务之间的通信,通过强制执行策略来增强安全性。
- 通过镜像扫描和供应链保护来检测易受攻击的库文件。
- 确保对敏感配置使用Secret,而不是Configmap。
- 考虑对敏感节点目录进行文件完整性监控,如/etc/kubernetes/manifests。
- 使用Pod安全标准或其他准入控制器来防止节点目录的HostPath安装。
- 确保Kubernetes集群有审计策略,并捕获日志。可以根据图1来关联日志内容与可能的攻击事件。
图1 攻击路径与API事件
Peirates
Peirates[7]是InGuardians公司开源的一款Kubernetes渗透工具,采用Golang编写,可以运行在Kubernetes集群的容器内或外部的Kubernetes节点上。Peirates专注于权限提升和横向移动,它可以自动窃取和收集Kubernetes集群内的ServiceAccount Token及Secret,进一步获得代码执行能力及对Kubernetes集群的控制能力。
