草庐IT

全球警惕HeadCrab!针对Redis的新型恶意软件已出现

塞讯验证 2023-03-28 原文
近期,一种新的难以捉摸的严重威胁已经出现,自2021年9月以来,它一直在渗透并驻留在全球的服务器上。这种被称为HeadCrab的高级威胁利用了一种最先进的定制恶意软件方式,使得该恶意软件无法被无代理和传统的防病毒解决方案检测到,会危害大量 Redis 服务器。HeadCrab僵尸网络已经控制了至少 1,200 台服务器。

本报告将深入研究HeadCrab 攻击的细节,研究其操作方法、用于逃避检测的技术以及组织可以采取的保护其系统的步骤。

什么是 Redis?

Redis是一种开源的内存数据结构存储,可用作数据库、缓存或消息代理。默认情况下,Redis服务器不启用身份验证,旨在运行在安全、封闭的网络上,而非暴露在互联网上。这使得可从Internet访问的默认Redis服务器容易受到未经授权的访问和命令执行的攻击。

Redis集群提供了一种运行Redis安装的方法,其中数据自动划分并存储在多个Redis节点上。在一个集群中,有一个主服务器和一个从服务器,可以方便地复制和同步数据。

默认的Redis命令之一是SLAVEOF,它指定一个服务器作为集群中另一个Redis服务器的从属服务器。当服务器被定义为从服务器时,它将与主服务器同步,包括下载主服务器中存在的任何Redis模块。

Redis模块是可执行的共享对象文件,可用于以各种方式增强服务器的功能。通过上传模块并通过Redis端口使用MODULE LOAD命令将模块加载到服务器上。Redis 模块使用Redis API执行与服务器管理和控制相关的各种任务,例如使用RedisModule_CreateCommand API 定义自定义命令。

近年来,Redis 服务器已成为攻击者的目标,通常是通过错误配置和漏洞。随着 Redis 服务器变得越来越流行,攻击的频率也越来越高。

攻击流程

这个故事始于对一个蜜罐的攻击,当时攻击者以 Redis 服务器为目标。该服务器最终使用SLAVEOF 命令被攻破,将其设置为攻击者控制的另一台 Redis 服务器的从服务器。Redis 主服务器随后启动了从服务器的同步,从服务器又将恶意Redis模块 HeadCrab 恶意软件下载到从服务器(蜜罐)上。攻击者已使用此技术一段时间,并允许他们将恶意 Redis 模块加载到受影响的主机上。如下图所示,这些是从入站网络数据收集中获得的Redis命令日志。攻击者首先列出所有可用模块,配置服务器以允许上传新模块,然后将模块下载到/tmp目录。

将受害Redis服务器设置为从服务器

一旦模块下载到受害服务器上的/tmp目录,它就会使用MODULE LOAD /tmp/<module_name>命令加载到 Redis 进程中。如下面的屏幕截图所示,攻击者在最终成功之前尝试加载多个模块。

HeadCrab 恶意软件模块加载

在对加载的模块进行逆向工程后,我们发现了一种复杂的、长期开发的恶意软件。它为攻击者提供了许多高级功能,并最终完全控制目标服务器。该模块引入了 8 个自定义命令,以模式rds*命名,攻击者使用这些命令在受感染的服务器上执行操作。HeadCrab 恶意软件的技术分析部分讨论了恶意软件功能和命令的完整列表。

蜜罐显示攻击的主要影响是用于加密货币挖掘的资源劫持。从内存中提取的矿工配置文件显示,矿池主要托管在私人合法 IP 地址上。对这些 IP 地址的检查表明,它们要么属于干净的主机,要么属于一家领先的安全公司,这使得检测和归属变得更加困难。在配置文件中找到了一项公共 Monero 矿池服务,但矿工在运行时未使用该服务。

我们不仅发现了HeadCrab恶意软件,还发现了一种在Redis服务器中检测其感染的独特方法。当这一方法应用于暴露在外的服务器时,发现了大约 1,200 台活跃的受感染服务器。受害者似乎没有什么共同点,但攻击者似乎主要针对Redis服务器,并且对Redis模块和API有深刻的理解和专业知识,正如恶意软件所展示的那样。

我们注意到攻击者已竭尽全力确保其攻击的隐蔽性。该恶意软件旨在绕过基于卷的扫描,因为它仅在内存中运行,而不存储在磁盘上。此外,使用Redis模块框架和API删除日志。攻击者与合法IP地址(主要是其他受感染的服务器)通信,以逃避检测并降低被安全解决方案列入黑名单的可能性。该恶意软件主要基于不太可能被标记为恶意的Redis进程。有效载荷通过memfd加载,内存文件,内核模块直接从内存加载,避免磁盘写入。

HeadCrab 恶意软件的技术分析

HeadCrab 恶意软件是一种高度复杂且先进的威胁。作为恶意Redis模块框架构建,它拥有众多选项和功能。本节将概述通过我们的静态和动态分析确定的恶意软件的主要功能。

如截图所示,HeadCrab样本在Virus Total (MD5=c5b992c76b7c9fa3b9bd755dd3b5af76) 上只有少量安全产品可以检测。尽管我们尝试获取更多样本,目前还没有发现更多的样本,这让我们更加怀疑这是一种高度规避的新型恶意软件。

验证它在执行时只运行一次

在初始执行时,恶意软件利用RedisModule_OnLoad函数,该函数在Redis服务器加载模块时触发。然后,恶意软件会保存相关Redis API函数的地址以备后用,并检查是否已加载名为rds的模块,如果已加载,则立即退出而不进行任何恶意操作。

初始环境范围界定

存储启动模块加载的连接信息以供将来检查。此外,恶意软件会检查它是作为特权 root 用户还是作为名为redis的特权较低的用户运行。

重视操作安全性(幻数)

该模块可以加载2个参数(幻数),它们实际上是2个全局幻数,用作加密密钥并验证它的操作者是否真的是威胁者。之后,恶意软件可以在其执行流程中的不同位置对这些幻数进行一些操作。该模块可以加载或不加载幻数,这将影响恶意软件执行期间的某些功能。如果模块加载了2个参数,一些Redis默认命令(8个命令:Module、Client、Debug、Shutdown、Monitor、Slaveof、Replicaof、Config) 被主要返回错误的命令覆盖。这样做是为了避免恶意软件检测。如果模块未加载2个参数,则跳过此步骤。修改后的默认命令如下:

此外,恶意软件会删除Redis日志文件,如果它是通过将其截断为0大小重新创建的,则将其清空。

准备工作

恶意软件会进行一些检查以确定操作过程。我们不会详细介绍这些检查,但会检查/testing路径和执行日期,并根据某些功能是否正在执行来进行检查。信号处理函数被替换并被恶意软件用来与其子进程通信。

隐藏代码执行

恶意软件找到动态加载程序的路径,以便它可以执行进程。通过简单地提供所需可执行文件的路径作为参数,动态加载程序可用于以其名称执行进程。这可用于绕过基于检查进程执行来检测恶意文件的安全解决方案。由于动态加载器是一个合法的二进制文件,它不会被标记为恶意的,并且恶意软件可以在这些安全解决方案中隐藏自己。

从内存中执行

该恶意软件试图在memfd_create系统调用的帮助下创建无文件文件。如果成功,它会创建10个memfd或临时文件并保存它们供以后使用。

强调在容器中执行

恶意软件检查进程ID是否低于31。我们推测这样做是为了检测服务是否在容器中运行。如果恶意软件不在容器上运行,则会检查几个服务管理程序,如systemd、initd、upstart等。如果安装了它们中的任何一个,它们将被标记,稍后将用于将持久化的服务和脚本放置在适当的位置。我们假设恶意软件在容器上跳过了这一步,因为它是无效的。

创建新的Redis命令

然后恶意软件创建新的 Redis 命令,用于使攻击者能够操作恶意软件:

  • rdsa该命令接受两个参数。一个是 Redis 配置文件的路径,第二个是恶意 Redis 模块的路径。此函数在 Redis 配置中添加一行,用于加载带有幻数的恶意模块。为了获得恶意软件的进一步持久性,它隐藏了loadmodule命令输出。此命令用于加载恶意模块,并通过向打印到屏幕的输出添加填充来隐藏其活动。
  • rdss执行带有popen并返回进程输出作为命令输出
  • rdsp将默认命令替换为恶意函数以逃避检测。
  • rdsi通过截断更新加密中使用的幻数和空日志。
  • rdsmMONITOR是一个 Redis 调试命令,它流回 Redis 服务器处理的每个命令。它也被 rdsp 命令或使用 2 个参数加载模块所取代。这个新命令负责恢复对MONITOR命令的更改——重新启用服务器调试。
  • rdsc侦听所需端口上的传入连接,并启用与 C2 服务器建立加密通信通道。下面的附录部分详细描述了可用的命令。为了强调它的一些强大功能,恶意软件可以创建一个新套接字并将其连接到 C2 命令套接字,将网络隧道连接到另一个 IP 地址和端口对,执行 shell 命令,将文件内容发送到 C2,将数据写入打开 memfd 文件,读取保存的 memfd 文件的内容并发送回 C2,加载无文件内核模块,以及许多其他强大的功能。
  • rdsr与 C2 服务器建立加密通信通道。与上面的 rdsc 相同。
  • rdsx恢复被覆盖的命令并将它们恢复为默认的 Redis 命令。
在以下截图中,您可以看到对其中一些命令的模拟:

覆盖和恢复默认命令的示例

谁是HeadCrab?或者,什么是 HeadCrab?

这个攻击者和恶意软件为什么被称为HeadCrab。答案很简单。攻击者在攻击过的机器中留下了如下信息。

正如以上截图所示,攻击者被识别为HeadCrab,这是游戏《半条命》中的一种怪物,它会附着在人类身上并将他们变成僵尸。这很合理,因为我们已经看到这种威胁使 Redis服务器僵尸化并使用它们横向移动到其他服务器。

此外,攻击者还创建了一个专门针对Nautilus团队的博客条目。此参考适用于有关Redigo的博客。Redigo是一种针对Redis服务器的新型恶意软件,攻击者利用了一个允许从LUA沙箱中逃逸的漏洞,并导致目标服务器上的远程代码执行 (CVE-2022-0543)。在进一步审查新发现的恶意软件并在恶意软件中发表个人专用评论后,我们认为到Redigo恶意软件也在利用主从技术,而不是 LUA 沙箱逃逸。

这个攻击组织是高度离散的,因此无法在开源中找到其活动的许多迹象。我们确实找到了上图中出现的“pamdicks”。在Trend Micro的博客中,提到了一个名为netlink的rootkit用于更改与CPU相关的统计信息(可以隐藏pamdicks进程和 CPU 负载)来隐藏加密挖矿。但很可能是攻击者所指的内容。

运行时检测

HeadCrab恶意软件旨在偷偷攻击Redis服务器,无论它们是在容器中还是在VM上运行。企业都需要使用容器安全或主机安全类解决方案进行实时检测,我并使用实时恶意行为指标来识别 HeadCrab 恶意软件等隐秘攻击。

将攻击映射到 MITRE ATT&CK 框架

这里我们将上述攻击中的组件映射到MITRE ATT&CK框架的相应攻击技术:

总结、补救和缓解

在此报告中,我们揭示了负责创建高级恶意Redis框架的攻击者 HeadCrab 的威胁。我们深入研究恶意软件的内部工作原理并展示其丰富的功能。调查显示,HeadCrab 的僵尸网络已经控制了 1,200 多台服务器,所有服务器都感染了该恶意软件。我们有理由相信,HeadCrab 将坚持使用尖端技术渗透服务器,无论是通过利用错误配置还是漏洞。

立即修复受感染的服务器

如果您的服务器遭到破坏,则必须假设您的网络也遭到破坏并立即启动您的事件响应流程。这将帮助您检测违规的程度、隔离受感染的系统并清理受影响的环境。虽然可以通过删除关联的服务和脚本来删除恶意软件,但删除加载模块从Redis配置和重启服务器来看,攻击者仍然保留了一些能力,包括删除文件、执行二进制文件、窃取 SSH 密钥、扫描和与其他系统通信以及加载内核模块的能力。这使得攻击者可以在网络中横向移动。从服务器中完全消除攻击者的存在可能是一项复杂的任务。为确保您的网络安全,我们建议将Redis数据库的备份保存到一个文件中,并尽可能将其迁移到具有适当授权和流量控制并且不能直接从Internet访问的新服务器。

缓解建议

为了降低 Redis 服务器的风险,您希望通过确保Redis配置符合安全最佳实践来强化环境。

在本报告中,攻击者使用“主从”技术从远程服务器复制数据库到目标服务器(蜜罐)。此功能最初由Redis创建以提高性能和创建冗余,但被攻击者积极使用以迅速感染目标并逃避检测。我们建议采取以下步骤来加强您的Redis服务器的安全性:

(1) Redis 旨在供受信任环境中的受信任客户端访问。

这意味着通常,将Redis实例直接暴露给Internet或通常暴露给不受信任的客户端可以直接访问Redis TCP端口或UNIX套接字的环境并不是一个好主意。

(2) 每当您在云中使用Redis时,最好启用保护模式以增强安全性。

保护模式确保数据库只响应环回地址,并生成错误作为对所有从其他IP地址连接的节点的答复。

(3) 使用绑定参数接受来自已知主机的通信.

您的Redis服务器将只监听通过bind选项指定的地址的连接。这是一种安全措施,允许丢弃不是在网络内部建立的连接。

(4) 如果没有主动使用“slaveof”功能,我们强烈建议禁用它。

(5) 您可以在Redis安全管理部分或他们的相关博客中阅读更多安全建议。

可以采取一些进一步的步骤来减轻对云中软件开发生命周期的威胁,我们建议遵循以下准则:

  • 未知威胁和零日漏洞将继续存在。即使您做的每件事都正确,您也无法始终保护您的运行时环境免受此类攻击。因此,您需要监视运行时环境。部署 容器安全或主机安全解决方案以保护您的运行时环境。运行时监控是一种基本实践,可帮助快速缓解问题并最大程度地减少中断。监视过程还适用于可能发生可疑活动(例如,下载恶意二进制文件)的运行时环境。
  • 扫描您的软件供应链。您可以使用开源工具,例如 Chain-bench,旨在根据新的 CIS 软件供应链基准审核您的软件供应链堆栈的安全合规性。
  • 为您的开发人员、DevOps 和安全团队提供扫描漏洞和错误配置的工具。除了 商业化软件工具,您还可以找到特定的开源工具(例如 Trivy)来扫描此类漏洞。

有关全球警惕HeadCrab!针对Redis的新型恶意软件已出现的更多相关文章

  1. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  2. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  3. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  4. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

    我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

  5. ruby - 如何让几条 haml 线出现在同一行上? - 2

    我有以下haml:9%strongAskedby:10=link_to@user.full_name,user_path(@user)11.small="(#{@question.created_at.strftime("%B%d,%Y")})"这当前将链接和日期放在不同的行上,当它看起来像“链接(日期)”并且日期的类跨度为小...... 最佳答案 您的代码将生成类似这样的html:Askedby:UsernameApril26,2011当您使用类似.small的东西(即使用点而不指定元素类型)时,haml会创建一个implicit

  6. ruby - 获取数组中值的最大连续出现次数 - 2

    下面有没有更优雅的方法来实现这个:输入:array=[1,1,1,0,0,1,1,1,1,0]输出:4我的算法:streak=0max_streak=0arr.eachdo|n|ifn==1streak+=1elsemax_streak=streakifstreak>max_streakstreak=0endendputsmax_streak 最佳答案 类似于w0lf'sanswer,但通过从chunk返回nil来跳过元素:array.chunk{|x|x==1||nil}.map{|_,x|x.size}.max

  7. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  8. ruby - 按数组中出现的频率排序 - 2

    有没有一种有效的方法来做到这一点。我有一个数组a=[1,2,2,3,1,2]我想按升序输出出现的频率。示例[[3,1],[1,2],[2,3]]这是我的ruby​​代码。b=a.group_by{|x|x}out={}b.eachdo|k,v|out[k]=v.sizeendout.sort_by{|k,v|v} 最佳答案 a=[1,2,2,3,1,2]a.each_with_object(Hash.new(0)){|m,h|h[m]+=1}.sort_by{|k,v|v}#=>[[3,1],[1,2],[2,3]]

  9. ruby - 使用 SizedQueue 在 ruby​​ 代码中出现死锁 - 2

    我认为我对线程在ruby​​中的工作原理存在根本性的误解,我希望获得一些见解。我想要一个简单的生产者和消费者。首先,生产者线程从文件中提取行并将它们粘贴到SizedQueue中;当那些用完时,在末端贴上一些token,让消费者知道事情已经完成。require'thread'numthreads=2filename='edition-2009-09-11.txt'bq=SizedQueue.new(4)producerthread=Thread.new(bq)do|queue|File.open(filename)do|f|f.eachdo|r|queue现在有几个消费者。为简单起见,让

  10. jquery - Ruby 1.9.1、Rails 2.3.2 和 jrails 0.4 出现 "rescue in const_missing"错误 - 2

    我最近开始了一个项目,团队决定我们希望使用jQuery而不是Prototype/Scriptaculous来满足我们的javascript需求。我们设置了我们的项目,并开始切换。插件已安装viatheseinstructions,一切都按计划进行。不久之后,当尝试运行“./script/server”时,我们收到以下错误:=>Rails2.3.2applicationstartingonhttp://0.0.0.0:3000/usr/local/lib/ruby/gems/1.9.1/gems/activesupport-2.3.2/lib/active_support/depende

随机推荐