2022年1月,研究人员发现了一个名为ChromeLoader(也称为ChoziosiLoader和ChromeBack)的新浏览器劫持者/广告软件活动。尽管使用了简单的恶意广告,该恶意软件还是被广泛传播,可能会泄露成千上万用户和组织的数据。

恶意软件开发者没有使用Windows可执行文件(.exe)或动态链接库(.dll)等更传统的恶意软件,而是使用浏览器扩展作为其最终负载。浏览器扩展充当广告软件和信息窃取程序,泄露用户的所有搜索引擎查询。

ChromeLoader恶意软件

ChromeLoader是一个多阶段攻击的恶意软件家族。每个变体在其攻击链中都包含不同的阶段,但不同变体之间的攻击链通常看起来非常相似,包括所有变体中使用的恶意浏览器扩展。

不同有效负载扩展具有攻击者添加的硬编码版本。各种扩展版本与此恶意软件的不同变体有关。研究人员不仅通过相关的扩展版本来区分这些变体,还通过在整个攻击链和目标操作系统中使用的技术来区分这些变体。

本文按检测顺序列出了不同的变体:

变体0:以这种方式命名,因为它在变体1(在野外发现的第一个变体)之前处于活动状态。它使用AutoHotKey(AHK)编译的可执行文件和Chrome扩展的1.0版。它的第一次已知攻击发生在12月。

变体1:它使用Chrome扩展的2.0-4.4版本作为其有效负载和一个DotNet可执行文件,该可执行文件启动混淆的PowerShell作为其释放程序。它主要活跃在1月份。

变体2:它使用6.0版的Chrome扩展程序,并使用一个经过混淆的可执行文件作为其初始释放程序,自3月以来一直很活跃。

MacOS变体:此变体专注于MacOS计算机(而其他变体仅针对Windows用户)。使用扩展的6.0版本,活动自3月就开始了。

不同变体的攻击链

攻击载体(变体1)

ChromeLoader恶意软件的第一个变体于2022年1月首次出现。

当用户通过广告网站和社交媒体平台上的恶意广告活动被诱使下载种子文件或破解视频游戏时,事件链就开始了。用户扫描这些网页上的二维码并被重定向到显示ISO映像(光盘映像文件,通常与CD/DVD一起使用)的受攻击网站。用户下载ISO镜像,通过双击挂载它并执行挂载的ISO镜像中包含的内容。

Twitter上发布的二维码示例

来自二维码的恶意ISO映像的下载链接示例

部署

下载的ISO映像包含以下内容:

Microsoft.Win32.TaskScheduler.dll:由Microsoft签名的合法.NETDLL,供其他.NET程序用于与计划任务机制集成。

Languagefolders:包含所提到的DLL使用的资源文件。

CS_installer.exe及其配置文件:恶意软件开发者编写的恶意可执行文件(请注意,名称可能会从一个版本更改为另一个版本)。在某些版本中,开发者(可能是偶然)将包含调试数据的PDB文件也留在了此文件夹中。

_meta.txt:此恶意软件高级版本中的文本文件,包含ASCII字母。

此目录中的大部分文件都是隐藏的,普通用户在使用Windows文件资源管理器打开此目录时不会注意到它们。唯一的非隐藏文件是CS_installer.exe,它诱使受害者双击它来完成软件安装下载。

已安装的恶意ISO映像示例(选择“显示隐藏文件”后)

受害者通过双击启动CS_installer.exe。在大多数情况下,可执行文件会显示如下图5所示的消息,表明程序执行失败。然而,这是开发者试图误导他们的目标。

dropper消息框,旨在欺骗用户

可执行文件是用.NET编写的非混淆程序,因此.NET反射程序可以对其进行反编译以读取源代码。当可执行文件加载到反射程序中时,会显示下图中所示的代码。此代码创建一个计划任务,配置为每十分钟执行一次恶意base64编码的PowerShell命令。任务名称由与namesDict数组中的随机后缀连接的Chrome字符串构成。

反编译的CS_installer.exe源代码示例

脚本内容来自_meta.txt文件,由下图中的以下预定义函数解密,该函数应用简单的字符替换。

unscramble函数的示例

上面提到的一些功能在该恶意软件的早期版本中没有。例如,在下图所示的版本中,这个版本是在图6和7中提到的版本前一周才发现的,开发者没有使用反汇编函数,而是简单地将已编码的PowerShell脚本硬编码到.NET可执行文件中,并使用预定义的ChromeLoader名称来执行任务,而不是生成更随机的后缀。

变体1的源代码示例

攻击者使用编码的PowerShell脚本下载恶意浏览器扩展并将其加载到用户的Chrome浏览器中。

PowerShell释放程序中的变量定义示例

负载下载尝试示例

尝试将有效负载加载到用户的浏览器中

从这个恶意软件的早期版本到后来的版本的演变也可以在编码的PowerShell脚本中看到。下图显示了由该变体的早期版本执行的PowerShell脚本,该变体明显更短,包含的代码也更简单。

此PowerShell释放程序的旧版本示例

dropper统计

出于研究目的,研究人员使用恶意软件下载恶意Chrome扩展并将其安装到受害者的浏览器中。托管Chrome扩展程序的URL被硬编码在混淆的PowerShell命令中,并且在不同版本之间发生变化。

安装服务器的第一次攻击尝试

安装服务器连接尝试传播

每个区域阻止的攻击

在变种1最活跃的时间内,每个安装服务器每天的感染尝试

有效载荷

该恶意软件的有效负载是一个Chrome扩展程序,每个可下载的扩展程序都具有相同的格式:

下载的扩展文件示例

使用清单文件中的一些定义,并使用已知的合法图片,扩展声称是合法且无害的。但是,该扩展程序要求提升权限。请求的权限包括访问浏览器数据、操纵Web请求和访问每个可能的URL地址,而合法的浏览器扩展程序不会这样做。

下载的扩展清单文件示例

Javascript文件conf.js声明了常量变量,后面会用到主脚本background.js。C2域存储在_ExtDomNoSchema中。

下载扩展的conf.js文件示例

background.js是一个包含所有扩展功能的单行JavaScript文件;它被严重混淆,但可以通过一系列简短的步骤转换为可读的JavaScript代码。但是,任何使用已知的公共JavaScript反混淆工具对该代码进行反混淆的尝试都将失败,原因将在后面详述。

下载扩展的模糊background.js文件示例

该脚本使用各种混淆技术来隐藏其目的和恶意代码。执行的第一个函数之一是负责将标准JavaScript函数和对象复制到名称混乱的新对象中,这些新对象稍后将使用脚本解码位于该脚本最后指令中的最终有效负载。

重命名机制的示例。例如,在本例中,String对象存储为b4VV。

在此脚本的整个执行过程中,开发者使用了面向switch-case的编程来使恶意软件分析人员更难阅读和理解他们的程序。

一个面向switch-case的编程示例

程序使用上图中所示的E3变量循环,并对每个值执行不同的操作。当switchcase中的相关流程结束时,程序将E3的值更改为下一条指令。该程序还使用前面提到的混淆对象名称。在下图中,研究人员在相关代码行下方的注释中添加了原始对象名称。

在了解了混淆名称和面向switch-case的编程之后,研究人员可以更好地分析这段代码的目的。它使用硬编码的整数数组,将其转换为相关的ASCII字符并按随机顺序对其进行排序。稍后,这个数组将被连接到一个字符串,程序将搜索以该名称定义的函数。如果未找到该函数,则执行流程将重新开始。

这表示脚本中存在另一种混淆技术。标准反混淆工具使用的关键特性之一是删除未引用的函数和对象。通常,它有助于缩短代码,省去永远不会真正运行的复杂部分,删除那些旨在误导恶意软件分析师的函数。但是,在这种情况下,使用反混淆工具会释放一个必不可少的函数,如果没有它,脚本将陷入无限循环。

在脚本执行过程中,h0QQ函数没有被直接引用,甚至一次也没有。然而,前面提到的使用随机排序算法的代码部分最终将尝试执行它,因为h0QQ是0hQQ字符串的排列。如果h0QQ不存在,代码将简单地尝试对字符进行排序,并反复查找函数名。

未引用的关键函数的示例

这个函数返回一个长字符串,通过一个硬编码的键进行异或,然后拆分成一个字符串数组。

包含恶意软件使用的字符串的deXORed数组示例

恶意软件最终使用这些字符串来解码其恶意代码。它引用此数组中相关索引处的字符串,而不是在代码中硬编码字符串名称。

恶意软件使用接触异或数组解码其最终有效载荷的示例,该恶意软件不使用整数作为数组的索引,而是将字符串与算术运算结合使用。

在使用调试器执行初始化代码后,研究人员导出了提到的列表成员。然后研究人员使用Python脚本对JavaScript代码的其余部分进行去混淆处理。

用于反混淆background.js的脚本