Aqua CNDR助您瓦解 DreamBus 僵尸网络攻击

发布时间: 2022-01-26      作者:并擎科技

最近,我们遇到了一个对于企业来说非常典型的攻击场景,一名拥有管理员权限的开发者在启动云原生应用时,错误地用了一个较弱的凭证来进行配置。仅12个小时之后,该环境就受到了DreamBus 僵尸网络的攻击,它试图躲避防御系统,并开始攻击系统,运行Kinsing恶意软件和加密货币挖矿代码(门罗)。在这时,Aqua的云原生监测及响应功能(CNDR)及时的发出了攻击警报。本文将介绍受攻击环境的基本情况,黑客如何获得访问权,以及Aqua的 CNDR 如何以与云化应用相匹配的速度进行检测、调查,和抵御攻击。





搭建环境




首先,开发者搭建了一个的简单的容器环境,由四个专属容器镜像组成:


  •  Web UI:允许用户由此登录并交互处理应用程序
  •  网关:可作为应用程序的网关
  •  微服务:可支持应用程序
  •  数据库:一个PostgreSQL 数据库




为了更好的理解攻击发生的方式和原因,我们首先复现开发者在运行容器之前所进行的动作。




扫描容器镜像




首先,开发者合理运用了Aqua的解决方案扫描了容器镜像从下面的截图您可以看到,容器镜像微服务和web UI存在着低至中等程度的漏洞。由于它们的影响可以忽略不计,开发者没有理会这些漏洞,因此它们通过了该公司的安全合规政策评估。其他两个容器镜像看上去也似乎一切正常。




接下来,开发者利用Aqua的动态威胁分析(Dynamic Threat Analysis, DTA)扫描了容器镜像。DTA的作用是在安全的隔离环境(即沙盒)中运行容器镜像,以便在容器开始运行后更好地了解其情况。因为静态扫描软件会基于数字签名和哈希算法来探测已知漏洞和恶意文件,而DTA能检测出在运行时才会显现的恶意行为,而一般的静态检测方法则没有办法检测出这种行为。


举例来说,即使一个容器镜像看上去是安全的,但这时若有一条命令要求从远程C2服务器里获得并执行有效负载(通常是通过Entrypoint),在这种情况下,静态扫描软件是不会监测该异常的。同样,对于采用无文件攻击的手法以及打包一些转码文件文件也可以达到逃避静态检测的效果。相较于静态扫描软件,DTA还有一个优势,它可以检测出恶意的网络流量。因此,DTA能够在给定的容器镜像上提供更全面的威胁检测输出。在这个案例中,DTA没有检测出任何问题——容器镜像中没有恶意软件。




运行工作负载




开发人员部署了 Aqua 的工作负载保护和 CNDR,但禁用了drift prevention的功能,如果该功能开启,在镜像实例化成为容器后,这一功能会严格禁止对镜像进行任何修改。 而且,该开发人员在设定相关外部防火墙策略时,将数据库容器开放允许用户从任何 IP 地址 (0.0.0.0:5432)进行访问,并没有创建任何微分段策略(Micro-segmentation policies)来限制对容器或数据库的访问。除此之外,开发人员还给PostgreSQL 数据库配置了弱密码(Weak credentials)。




利用CNDR监测攻击




首次警报


Aqua的 CNDR是最近推出的云原生监测和响应功能,它利用基于内核观察形成的告警信号,实时检测并阻止未知攻击。


在环境创建之后的12个小时之内,CNDR警告其中一个容器出现了严重的安全问题。开发者即刻停止了这个容器的运行,并开始调查问题的成因。




CNDR一共发出25条报警,提示容器和底层主机出现了不同的问题。通过CNDR的控制面板,事件和响应团队能够轻松地获知相应的信息、各个事件和相关背景、来源(例如主机或容器)、相关描述及严重性,从而节约了大量时间。


点击“查看完整事件数据”(View Full Event Data),可获取有关每个事件的详细信息。在本案例中,黑客在容器中执行了来自/tmp的Kinsing恶意软件。




进一步收集证据


可以通过CNDR的审核筛选来进一步收集证据。CNDR监测到,有人使用了wget和curl从远程源下载文件。这就说明在运行期间,容器下载了应用curl,黑客因此能够从远程源下载更多的文件。




CNDR的审计日志记录了约7000个事件,完整地重现了攻击时的情形。记录中包括检测可疑和恶意行为,以及阻断网络通信等,例如:



 监测到Wget/Curl 程序


 监测到加密挖矿


 通过/tmp执行 二进制


 禁用安全工具


 复制远程文件 


我们在审计日志中发现了Kinsing恶意软件(MD5 648effa354b3cbaad87b45f48d59c616)和kdevtmpfsi (MD5 8c6681daba966addd295ad89bf5146af) 。有人将它们从远程源中下载到了/tmp 库。如下面的截图所示,它们的所有者都是“postgres”群组中的用户“postgres”。




审计日志进一步显示了代码执行情况,如下:




此外,容器中还发现了几个恶意文件:



  • k (MD5 d79229c6c7fcbc4802934e34f80661a8), 打包挖矿病毒
  • c (MD5 080a3bccdddc6979e3f1e74f732603b0), 打包挖矿病毒
  • ss (MD5 a0db00b585a994be2cff9bb4a62ca385), 尽管 VirusTotal未检测到,仍是挖矿病毒




获得初始访问权


尽管通过分析PostgreSQL日志可以知道为了获取初始访问权而出现的违规操作,但是这些日志连同其他日志一起都丢失了。删除系统日志正是Kingsing黑客的惯用伎俩之一。


通过CNDR的事件屏幕中的一个警报能够推断出,黑客通过删除系统日志破坏了系统的完整性。这就解释了日志文件丢失的原因。这也不禁让人怀疑,黑客是否转储了数据库的内容,并将其泄露到外部环境。


从Postgres 9.3版开始, 数据库的超级用户和‘pg_execute_server_program’群组中的用户就能利用‘COPY TO/FROM PROGRAM’功能运行任意的OS指令。该功能可能会在身份验证后被攻击,或在后台运行PostgreSQL时通过SQL注入攻击。值得注意的是,供应商却并不认为这个功能是一个漏洞。




重要经验:深度防御非常关键




从这次攻击中,我们可以看到深度防御战略发挥了明显的作用。在该环境中部署的,包括工作负载保护和安全扫描在内的保护初始层,都无法预防或监测到攻击的发生。


如果不是CNDR的告警提示,黑客就已经成功完成了攻击,神不知鬼不觉地挖矿加密货币,并可能造成更大的破坏。然而,CNDR实时监测到了攻击,不仅针对恶意活动发出了警报,还提供了额外的日志,以协助进一步调查。


类似的攻击表明,深度防御的方法是有价值的——它构建了多重的安全功能,部署了丰富的防御能力,可以瓦解多种攻击向量(attack vectors)。如果一个安全管控失效了,还有其它的安全层可以预防或阻止攻击。




迁移推荐:Aqua的运行时深度防御战略




Aqua的运行时保护方法部署了一系列的安全机制,在您的云原生环境中建立了一层又一层的管控功能,以保护网络、工作负载和数据的保密性、完整性和可用性。




高级恶意软件和行为保护




Aqua高级防恶意软件保护功能能持续对环境进行扫描,根据数字签名和哈希算法监测已知威胁和恶意软件。在本次攻击中,Aqua的防恶意软件保护功能监测到了恶意脚本(.systemd-service.sh)、Kinsing恶意软件、Kdevtmpfsi加密货币挖矿代码和其它的恶意内容。


为了检测未知的威胁,Aqua基于行为的保护功能可以发现可疑和恶意的行为,包括无文件的恶意软件执行、防御规避技术、可疑的网络通信和木马。在本案例中,CNDR发现了若干个可疑的实例和恶意活动,包括删除日志和下载并执行二进制。


我们强烈推荐您使用工具来确保密码的高强度并与生产兼容。比如,Avishai Wool 和Liron David的项目可以预估密码长度,即通过预测密码破解软件需要尝试多少次才能破解密码,从而帮助用户避免选择那些保密性弱的密码。


调查期间,我们利用Aqua的解决方案扫描了我们的容器镜像:静态扫描软件和DTA本案例中被攻击的漏洞存在争议,因而被忽视了。为此,我们强烈建议在生产环境中部署CNDR等监测及响应解决方案,它们不仅能够在运行时发现恶意行为,还有助于监测并预防生产环境中出现零日攻击(Zero-day attacks)。




Aqua的云工作负载保护平台能力




Aqua的云工作负载保护平台能力包含了一套强大的运行时控制(Runtime controls)能力,适用于虚拟机、容器和无服务器架构负载保护。它们充当深度防御层,在运行前就加固工作负载,之后实时抵御生产环境中正在进行的攻击。而另外一些事前控制策略例如镜像合规策略等负责检测工作负载是否符合规范运行要求,决定哪些可以运行以及哪些不能。


微分段策略决定了节点、集群和主机之间可接受的流量 ,而Kubernetes保证策略则要求必须存在(或不存在)Kubernetes配置才能允许工作负载运行。最终用户可以完全控制工作负载保护功能,也可以为了保护运行环境而提前配置。




我们强烈建议您不要暴露一些私有服务到Internet环境,例如,PostgreSQL数据库。不过,当数据需要公开访问时,也会存在合法的用例。如果是这种情况,可以考虑使用网络防火墙并限制对数据库的访问。与其允许任何人都可以获得进站流量,不如将流量限制到特定的IP或容器。




Drift prevention




为了在运行时保持容器间的不变性,在镜像被实例化成为容器后,Drift prevention功能将严格禁止对镜像的修改。这一功能利用了容器属性的不可变性,在运行中的容器中识别并阻止异常行为。