Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,用户可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。不幸的是,就像任何被广泛使用的应用程序一样,由于它们经常被错误地配置,对于那些主要运行在云环境中、可以访问几乎无限资源的攻击者,就成为诱人的目标。本文将讨论TeamTNT如何在野外扫描和攻击Kubernetes集群。
研究人员已经发现并确认将近50000个IP被TeamTNT在多个集群中实施的攻击所攻击。在3月至5月之间的事件发生期间,反复使用了多个IP。大多数被攻击的节点来自中国和美国,从ISP(互联网服务提供商)列表中可以看出,中国和美国的提供商是最热门的,包括一些csp(云服务提供商)。应该指出的是,这些数字反映出,美国和中国运营的集群可能比许多其他国家要多得多。
每个国家的服务器被攻击的百分比,中国和美国占了大部分
通过分析属于几个TeamTNT服务器的数据,研究人员发现了该小组用于该活动的工具和技术。
Kubernetes集群是如何被攻击的
本节将分析研究人员从这个以Kubernetes集群为目标的攻击者收集到的一个脚本。研究人员从他们的服务器上收集了一个名为kube.lateral.sh的文件,该文件在编写本文时在VirusTotal中检测率很低。研究人员分解了这个脚本的功能以及它的工作方式。
在2021年4月24日(顶部)和2021年5月5日(底部)验证的kube.lateral.sh的VirusTotal检测结果
搭建环境
TeamTNT的首要任务是禁用目标主机上的bash历史记录,并为其命令和控制(C&C)服务器定义环境变量,例如稍后安装加密矿机的脚本和XMRig Monero矿机的二进制文件。然后使用$RANDOM在/tmp中创建三次文件夹,生成一个随机数序列,例如,132963764049、64049520243和55772468520243。使用whoami和uname -m收集用户和系统架构信息,这些信息存储在环境变量中以供以后使用。
该脚本还安装了可从GitHub获得的两个免费的开放源代码工具,即使用C语言开发的masscan网络扫描工具,以及使用Go语言开发的具有标语的Zgrab(已弃用)。新版本的Zgrab2也是开源的,可在GitHub上使用,但未随脚本一起安装。
下载并安装IRCbot
该脚本具有一个大型的base64编码代码块,用于安装其IRC bot。研究人员解码、分析并发现它是用C语言编写的,并且以kube.c的名称存储在/tmp文件夹中,以避免被怀疑。bot代码是用Gnu编译器集合 (GCC)编译的,并在编译完成后删除。然后将生成的二进制文件移动到/root文件夹,并重命名为kube,如以下代码所示:
IRCbot也是用C语言编写的,它基于另一个著名的IRCbotKaiten。这些bot的类似代码也可以在GitHub上找到。
安装名为kube.c的IRCbot的代码
托管和加密劫持KubernetesPod
在脚本的最后一部分,研究人员可以看到一个函数kube_pwn()被声明,就像下图所示。从代码中可以看到,kube_pwn函数使用Masscan检查端口10250打开的所有主机。
显示了kube_pwn函数如何使用Masscan在端口10250打开的情况下检查主机的代码
Kubelets
熟悉Kubernetes的人都知道这个端口属于kubelet API,默认情况下,该端口在集群的所有节点(包括控制平面和工作节点)上都是打开的。这是你应该在可操作的K8s集群上进行的最基本的安全加固更改之一。Kubelet是在每个节点上运行的代理,它确保所有容器都在一个Pod中运行。它也是负责节点上任何配置更改的代理。尽管它不在主Kubernetes架构图上,但是如果用户想在控制平面节点上运行其他组件,那么即使控制平面节点也有一个kubelet和一个kube-proxy代理在运行。但是,在控制平面上运行应用程序pod并不是最佳实践,因为它为攻击者提供了拥有集群的机会。
kubelet安全设置有三个关键因素:
1.启用Kubelet身份验证,根据Kubernetes的官方介绍,对kubelet的API终端的请求(未被其他身份验证方法阻止)默认情况下被视为匿名请求。请确保使用--anonymous-auth = false标志启动kubelet并禁用匿名访问。要了解更多信息,请查看有关Kubelet身份验证的Kubernetes官方建议https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-authentication-authorization/#kubelet-authentication。
2.限制kubelet权限,以防止攻击者在攻击容器后读取kubelet凭据来执行恶意操作。
3.如果发生攻击,旋转kubelet证书,证书的有效期很短,潜在的影响减少。
根据通过kubeadm安装Kubernetes的文档,下面的端口是集群正常工作时需要打开的端口。kubelet API端口(10250)不应该暴露在互联网上,因为它类似于让你的Docker Daemon API暴露。然而,TeamTNT在进入特定的攻击环境后会危及kubelet,所以他们会在内部运行扫描。
安装kubeadm所需的端口
kubelet API的文档不完善;但是,研究人员直接分析了Kubernetes代码以了解发生了什么,这将在以下各节中进行解释。首先,研究人员查看了/ kubelet / server软件包中的server.go文件。如图5所示,kube_pwn()函数做的第一件事是通过/runningpods终端从Kubelet API获得一些信息,过滤名称空间、pod名称和容器名称。
Kubernetes kubelet的API源代码分析
加密劫持(部署到Pod中)
正如研究人员从上面的kubelet server.go代码中看到的那样,API终端/ runningpods完全按照终端所说的进行操作,它列出了正在运行的Pod。首先,kube_pwn()函数以JSON格式列出了节点内当前运行的所有pod。然后,对于每个节点上运行的每个容器,它利用kubelet API上的/run终端运行以下命令:
1.更新容器的包索引;
2.安装以下包:bash,wget和curl;
3.从TeamTNT C&C服务器下载一个名为setup_xmr.sh的shell脚本,并将其保存在tmp文件夹中;
4.执行脚本开始挖掘门罗币加密货币;
来自GitHub上的Kubernetes中央存储库的kubelet API服务器代码的一部分
为了完成这一任务,它们运行与研究人员分析的一系列内部IP范围相同的kube_pwn()函数,这些范围寻找新的要攻击的目标,其行为与蠕虫类似。
来自kube.lateral.sh的一段代码,该文件在TeamTNT的C&C服务器上被识别
如何保护Kube API服务器
确保它们的Kube API服务器不暴露是很重要的。一种简单的检查方法是尝试从外部IP访问API服务器。这个curl请求应该用来检查API是面向公共的还是其他的“curl -k https://API-SERVER-IP:PORT/api.”。
如果有来自这个curl请求的响应,类似于图9所示的响应,那么这意味着API是公开可用的:
执行curl请求以检查API是否可公开访问后的响应示例
总结
这次活动值得注意,因为这是研究人员第一次分析TeamTNT组织发布的工具。此外,加密劫持和证书窃取的继续使用表明,在不久的将来,这些仍将是攻击者使用的主要技术手段。
大量的目标表明,TeamTNT仍在扩大其攻击范围(尤其是在云环境中),也许还有基础架构,因为该组织可以从他们的活动中获得更多的潜在受害者,从而获得更大的利润。该组织的活动增加了Kubernetes用户面临的潜在威胁的数量。
本文翻译自:https://www.trendmicro.com/en_us/research/21/e/teamtnt-targets-kubernetes--nearly-50-000-ips-compromised.html如若转载,请注明原文地址