趋势科技研究人员发现了一种新型恶意软件,将其命名为 "OpcJacker"(取其opc配置设计“opc”和加密货币劫持“hijack”能力英文前后缀opc-jack而成),该恶意软件自2022年下半年以来一直传播。OpcJacker是一个有趣的恶意软件,因为它的配置文件使用一个自定义的文件格式来定义窃取者的行为。具体来说,该文件格式类似于自定义的虚拟机代码,配置文件中存在的十六进制数字标识符使得窃密器可运行所需的功能。使用这种设计的目的可能是为了使研究人员更难理解和分析恶意软件的代码流。
恶意软件OpcJacker的主要功能包括键盘记录、屏幕截图、从浏览器中窃取敏感数据、加载附加模块,以及替换剪贴板中的加密货币地址以达到劫持目的。
图1. OpcJacker的感染链
研究人员观察到OpcJacker通过不同的活动进行传播,包括伪装成加密货币相关的应用和其他合法软件,然后攻击者通过虚假网站进行传播。在最近一次(2023年2月)涉及OpcJacker的活动中,感染链始于恶意广告,恶意广告对伊朗用户进行地理定位。这些恶意广告被伪装成合法的VPN服务,欺骗受害者下载一个包含OpcJacker的文档。
该恶意软件是通过在已安装得应用更新一个合法的DLL库时加载的,该应用也会加载另一个恶意DLL库。然后,恶意DLL库汇编并运行shellcode,shellcode是另一个恶意可执行文件的loader和runner,可执行文件是文件数据块里存储OpcJacker的各种格式的数据文件,如WAV和CHM。该loader自命名为”Babadeda” crypter以来,已经使用了一年多。这些活动背后的攻击者对加密器本身进行了一些改变,然后增加了一个全新的payload(一个窃密器/剪切器/记键器)。
OpcJacker通常是释放(或下载)和运行额外的模块,这些模块是远程访问工具,不是NetSupport RAT就是一个隐藏虚拟网络计算(hVNC)的变体。我们还发现一份报告分享了一个名为 "Phobos Crypter"(实际上与OpcJacker是同一个恶意软件)的loader被用来加载Phobos勒索软件的信息。
传播
正如介绍中提到的,OpcJacker是通过不同的活动传播的,包括以虚假网站宣传看似合法的软件和加密货币相关的应用,但实际都是托管恶意软件。由于这些活动除了OpcJacker之外,还会传播一些其他不同的恶意软件,因此它们很可能是OpcJacker的控制者所使用的不同类型的按次安装服务。
在最近一次(2023年2月)涉及OpcJacker的活动中,研究人员注意到OpcJacker是通过针对伊朗恶意广告的地理定位传播的。这些恶意广告链接到一个恶意网站,这个恶意网站伪装成合法VPN软件的网站。网站的内容是从一个合法的商业VPN服务的网站上复制的,然而链接被修改为指向到一个内嵌恶意内容被黑网站。
恶意网站检查客户的IP地址以确定受害者是否使用VPN服务。如果IP地址没有使用VPN服务,它就将受害者重定向到第二个被黑网站,诱使他们下载一个包含OpcJacker的文档。如果受害者正在使用VPN服务,就不会发生上述攻击行为。
图2. 一个用于提供OpcJacker的恶意广告的例子
此外,研究人员还发现了一些ISO镜像和RAR/ZIP档案,其中包含各种软件被修改过的安装程序,其导致OpcJacker加载。这些安装程序以前被其他活动使用过,被托管在各种被黑的WordPress框架的网站或软件开发平台,如GitHub。攻击者喜欢使用ISO文件的一个可能的原因是为了绕过IE浏览器的 Mark-of-the-Web 警告。
以下是我们发现的一些文件名例子:
- CLF_security.iso
- Cloudflare_security_setup.iso
- GoldenDict-1.5.0-RC2-372-gc3ff15f-Install.zip
- MSI_Afterburner.iso
- tigervnc64-winvnc-1.12.0.rar
- TradingViewDesktop.zip
- XDag.x64.rar
Babadeda 加密器
在安装程序释放所有必要的文件后,它就会加载主可执行文件(RawDigger.exe),这是一个干净的合法文件。
图3. 安装程序释放的文件列表;虽然大多数是安全文件,但有些是补丁或恶意文件
可执行文件加载了一个DLL库,其中包括打了补丁的导入(librawf.dll)
图4. 导入的DLL库列表;高亮显示的库为修补后可加载另外恶意DLL的库
修补后的DLL(librawf.dll,与合法应用RawDigger(一个原始镜像分析器)相关)的导入地址表被进一步修补,修补包括了两个额外的DLL库。在下图中,请注意FirstThunk地址(新添加的库)是如何以001Dxxxx开始的,而不是原始库的FirstThunk地址中使用的0012xxxx。
图5. 一个经过修补的导入地址表
图5中高亮显示的库(libpushpp.dll)随后被加载和执行。它的主要任务是打开其中一个数据文件(hm)并加载存储在其中的第一阶段的shellcode。
图6. 恶意库打开一个数据文件
第一阶段shellcode的偏移量和大小被硬编码到DLL库中。
图7. 恶意库从偏移量0x37D50复制第一阶段的shellcode;shellcode的大小为0x75A字节
在较新版本的Babadeda加密器中,另一个DLL库(mdb.dll,来自虚假VPN的安装程序)被加载到内存中,然后第一阶段shellcode覆盖写入到一个硬编码随机选择的内存块。请注意,这种变化只是一个小细节,对第一阶段shellcode的整体功能没有影响。
图8. 内存加载合法库(mdb.dll),然后第一阶段shellcode(0x7B5字节)被复制到库的内存空间中
在第一阶段shellcode的末尾有一个配置表,包含了加密块的偏移量和它们各自的大小。然后,第一阶段shellcode解密并整合所有的块,形成第二阶段的shellcode(一个加载器)和主要的恶意软件(OpcJacker能加载其他恶意模块)。
图9. 第一阶段shellcode的配置表
配置表以至少八个相同的字符开始(图9中红色的 "*",但在其他样本中可能使用不同的字符),然后是数据文件的总长度(绿色字体;hm的长度=0x1775e0=1537504字节),加密密钥(黄色字体;0x18),shellcode第二阶段块数(棕色字体;0x07),最后,由主恶意软件的块数(白色字体;0x08)。0x07(红线框)和0x08(蓝线框)的列表相当于每个块的15个地址和大小。
在数据文件(hm)的开头,我们可以看到(WAV)文件头,因为它试图模仿WAVE文件格式。请注意,数据文件可以是不同的文件格式,CHM格式能被模仿篡改。
图10. 以WAV头开始的数据文件
主要的窃密器组件(OpcJacker)
主要的恶意软件组件(OpcJacker)是一个有趣的窃密器,首先解密并加载其配置文件。配置文件的格式类似于用自定义机器语言编写的字节码,其中每条指令都被解析,获得单独的操作码,然后执行具体的处理程序。
在分析自定义字节码时,我们注意到以下模式:
ASCII字符串被编码为01 xx xx xx <string bytes>;其中xx xx xx xx是字符串的长度。
图11. 配置文件内编码的ASCII字符串
同样地,宽的字符串从第02字节开始,而二进制数组从第03字节开始。
图12. 配置文件内编码的UNICODE字符串
图13. 配置文件内的编码二进制阵列
配置文件的格式是一个指令序列,其中指令以三个4字节的小端(DWORD)数字开始。第一个数字是虚拟程序计数器,第二个可能是父指令的虚拟程序计数器,而第三个是处理程序ID(将在虚拟机中执行的代码),后面是数据字节或附加处理程序ID。
基于这些观察,研究人员写了一个指令解析器,从中得到了以下输出。尽管对虚拟机内部实现的观察和理解是不完整的,但解析器让研究人员很好地理解了配置文件中定义的行为是什么。
解密和解码后的配置文件从某些系统变量的初始化开始,其中 "test "和 "rik "很可能是活动ID。由SHA256 c5b499e886d8e86d0d85d0f73bc760516e7476442d3def2feeade417926f04a5释放的配置文件包含不同的关键词 "test "和 "ilk "作为活动ID。同时,2023年2月的最新活动所释放的配置文件(SHA256 565EA7469F9769DD05C925A3F3EF9A2F9756FF1F35FD154107786BFC63703B52)包含关键词 "test_installs "和 "yorik"。
图14. 初始化命令
然后初始化剪贴板替换功能(剪切)。
图15. 剪贴板替换器(clipper)的初始化
然后,变量 "exe "被初始化为可执行文件字节(见4d 5a 90 = MZ标记)。这个可执行文件是一个远程访问工具。
图16. 嵌入式模块(PE EXE格式)
恶意软件通过注册表运行和任务调度器方法设置了持久性。请注意用于保存当前进程文件名的$itself_exe变量。
图17. 设置持久性的方法
然后,该恶意软件启动剪切功能,即监控剪报板上的加密货币地址,并将其替换为由攻击者自己的加密货币地址。
图18. 剪切器功能
最后,virtual_launch_exe函数运行先前嵌入的可执行文件,这些文件是RAT,要么是NetSupport RAT、NetSupport RAT下载器,要么是hVNC。
图19. 运行嵌入式可执行文件的功能
自定义虚拟机中的处理程序ID
从前面几张截图中的第三列(或解码后的 "命令 "变量)可以看出,虚拟机实现了许多内部处理程序。其中大部分都与各种数据操作有关。我们在表1中列出了几个值得注意的处理程序,它们具有特定的高级功能。偷窃器实现的功能包括:剪贴(剪贴板内容替换)、键盘记录、文件执行和列出、杀死进程、窃取Chrome证书、检测空闲和检测虚拟机。然而,在我们的测试场景中,我们观察到窃密器大多只是设置持久性和提供额外的模块(远程访问工具)。
Handler ID | Function |
0x3E9 | Used for persistence (registry; HKCU) |
0x3EA | Used for persistence (registry; HKLM) |
0x3EB | Used for persistence (startup folder) |
0x3EC;0x3ED | Used for persistence (task scheduler) |
0x7d1 | Lists files |
0x579 | Starts clipper |
0x57A | Stops clipper |
0x12d | Puts the machine into sleep mode |
0x385 | Terminates process |
0x387 | Exits process |
0x388; 0x38B | Runs PE executable |
0x389 | Runs shellcode |
0x38A | Runs PE executable export routine |
0x76D | Gets current committed memory limit (ullTotalPageFile) |
0x76E | Gets the amount of actual physical memory (ullTotalPhys) |
0x641 | Steals sensitive data from Chromium |
0x259 | Checks if the machine is idle and if the cursor is not moving |
0x25B | Checks if the machine is idle and if no new process is being created |
0x25D | Checks if the machine idle and if no new window is being created |
0x835 | Starts keylogger |
0x836 | Starts keylogger for a certain period |
0x837 | Stops keylogger |
0x839 | Copies data (likely logs) then return 0x83a (klogs) |
0x1F5 | Retrieves VMWare via CPUID |
0x1f7 | Searches for 'virtual' in SYSTEM\\ControlSet001\\Services\\disk\\Enum |
0x83A | Writes file(s) to klogs// |
0x89a | Writes file(s) to screenshots\\ |
0x596 | Writes to clp\clp_log.txt |
0xf6 | Writes file(s) to chromium_creds\\ |
0xCE | Copies files to filesystem\\ |
0x321 | Creates messagemonitor window, which needed for the clipper |
0x322 | Destroys messagemonitor window, which is needed for the clipper |
0x5DC | Gets environment ID |
0x5E0 | Runs GetModuleFileNameW, which is needed for resolving $itself_exe |
表1. 虚拟机命令ID
图20. 在窃密器的二进制中实现的与键盘记录器有关的命令;在截图中也可以看到命令ID(0x835;0x837;0x836;0x839)
嵌入式模块
NetSupport RAT模块
一些嵌入式模块包含NetSupport RAT的client32.exe(SHA256 18DF68D1581C11130C139FA52ABB74DFD098A9AF698A250645D6A4A65EFCBF2D或SHA256 49A568F8AC11173E3A0D76CFF6BC1D4B9BDF2C35C6D8570177422F142DCFDBE3)文件。然而,这个单一的文件是不够的,因为NetSupport工具需要额外的DLL库和一个配置文件。请注意,这些缺失的文件已经被修改后的安装程序丢进了安装目录。
对于研究人员来说,最重要的文件叫做client32.ini,它包含重要的设置,如网关地址、网关密钥(GSK)和端口。
图21. NetSupport RAT的配置文件
NetSupport RAT下载器模块
一些嵌入式模块包含NetSupport RAT下载器(SHA256 C68096EB0A655924CA840EA1C71F9372AC055F299B52335AD10DDFA835F3633D)。这个下载器对URL的payload进行解密,然后下载并执行它。
图22. 解密后的下载器配置文件,额外的URL以清晰的文字显示出来
解密后的配置包含两个URL,一个通向包含NetSupport RAT的档案,就像之前的模块一样,而第二个则包含一些批处理脚本,显示的信息如图23中的信息。后来,这些批处理脚本中的一个下载了额外的窃密器。
图23. 告诉受害者等待程序安装的钓鱼信息
hVNC模块
一些嵌入式模块包含一个修改的hVNC模块F772B652176A6E40012969E05D1C75E3C51A8DB44712454975678F04DEDAAA。这个模块,除了标准的远程桌面功能外,还包含搜索以下加密货币相关的谷歌浏览器、微软Edge和火狐浏览器扩展(钱包)存在的例程:
Google Chrome extension ID | Extension name |
ffnbelfdoeiohenkjibnmadjiehjhajb | Yoroi |
ibnejdfjmmkpcnlpebklmnkoeoihofec | TronLink |
jbdaocneiiinmjbjlgalhcelgbejmnid | Nifty Wallet |
nkbihfbeogaeaoehlefnkodbefgpgknn | MetaMask |
afbcbjpbpfadlkmhmclhkeeodmamcflc | Math Wallet |
hnfanknocfeofbddgcijnmhnfnkdnaad | Coinbase Wallet |
fhbohimaelbohpjbbldcngcnapndodjp | Binance Wallet |
odbfpeeihdkbihmopkbjmoonfanlbfcl | Brave Wallet |
hpglfhgfnhbgpjdenjgmdgoeiappafln | Guarda Wallet |
blnieiiffboillknjnepogjhkgnoapac | Equall Wallet |
cjelfplplebdjjenllpjcblmjkfcffne | Jaxx Liberty |
fihkakfobkmkjojpchpfgcmhfjnmnfpi | BitApp Wallet |
kncchdigobghenbbaddojjnnaogfppfj | iWallet |
amkmjjmmflddogmhpjloimipbofnfjih | Wombat |
fhilaheimglignddkjgofkcbgekhenbh | Oxygen |
nlbmnnijcnlegkjjpcfjclmcfggfefdm | MyEtherWallet |
nanjmdknhkinifnkgdcggcfnhdaammmj | GuildWallet |
nkddgncdjgjfcddamfgcmfnlhccnimig | Saturn Wallet |
fnjhmkhhmkbjkkabndcnnogagogbneec | Ronin Wallet |
aiifbnbfobpmeekipheeijimdpnlpgpp | Station Wallet |
fnnegphlobjdpkhecapkijjdkgcjhkib | Harmony |
aeachknmefphepccionboohckonoeemg | Coin98 |
cgeeodpfagjceefieflmdfphplkenlfk | EVER Wallet |
pdadjkfkgcafgbceimcpbkalnfnepbnk | KardiaChain |
bfnaelmomeimhlpmgjnjophhpkkoljpa | Phantom |
fhilaheimglignddkjgofkcbgekhenbh | Oxygen |
mgffkfbidihjpoaomajlbgchddlicgpn | Pali |
aodkkagnadcbobfpggfnjeongemjbjca | BoltX |
kpfopkelmapcoipemfendmdcghnegimn | Liquality |
hmeobnfnfcmdkdcmlblgagmfpfboieaf | XDEFI |
lpfcbjknijpeeillifnkikgncikgfhdo | Nami |
dngmlblcodfobpdpecaadgfbcggfjfnm | MultiversX DeFi |
表2. 针对Chrome浏览器的扩展程序
Microsoft Edge extension ID | Extension name |
akoiaibnepcedcplijmiamnaigbepmcb | Yoroi |
ejbalbakoplchlghecdalmeeeajnimhm | MetaMask |
dfeccadlilpndjjohbjdblepmjeahlmm | Math Wallet |
kjmoohlgokccodicjjfebfomlbljgfhk | Ronin Wallet |
ajkhoeiiokighlmdnlakpjfoobnjinie | Terra Station |
fplfipmamcjaknpgnipjeaeeidnjooao | BDLT wallet |
niihfokdlimbddhfmngnplgfcgpmlido | Glow |
obffkkagpmohennipjokmpllocnlndac | OneKey |
kfocnlddfahihoalinnfbnfmopjokmhl | MetaWallet |
表3. 针对EDGE浏览器的扩展程序
Mozilla Firefox extension ID | Extension name |
{530f7c6c-6077-4703-8f71-cb368c663e35}.xpi | Yoroi |
ronin-wallet@axieinfinity.com.xpi | Ronin Wallet |
webextension@metamask.io.xpi | MetaMask |
{5799d9b6-8343-4c26-9ab6-5d2ad39884ce}.xpi | TronLink |
{aa812bee-9e92-48ba-9570-5faf0cfe2578}.xpi | |
{59ea5f29-6ea9-40b5-83cd-937249b001e1}.xpi | |
{d8ddfc2a-97d9-4c60-8b53-5edd299b6674}.xpi | |
{7c42eea1-b3e4-4be4-a56f-82a5852b12dc}.xpi | Phantom |
{b3e96b5f-b5bf-8b48-846b-52f430365e80}.xpi | |
{eb1fb57b-ca3d-4624-a841-728fdb28455f}.xpi | |
{76596e30-ecdb-477a-91fd-c08f2018df1a}.xpi |
表4. 针对火狐浏览器的扩展程序
在我们分析的样本中,命令和控制(C&C)通信以下列魔法开始:
图24. HVNC网络通信魔法
下面的片段显示,有些值是硬编码到可执行文件中的,其他的是由MachineGuid生成的或随机生成的。注意图25中看到的字符串 "7.7",这可能是修改后的hVNC版本。
图25. 生成hVNC数据包魔法的代码
总结
OpcJacker的控制者的使用动机看起来是出于经济利益,因为该恶意软件的主要目的是从钱包中窃取加密货币资金。然而,其多功能性也允许OpcJacker作为一个窃密器或恶意软件loader,这意味着它可以在其最初的预期用途之外被使用。
我们在样本中发现的活动ID,如 "test "和 "test_installs",表明OpcJacker可能仍处于开发和测试阶段。鉴于其独特的设计与各种类似虚拟机的功能相结合,该恶意软件有可能广受攻击者欢迎,因此可能在未来的威胁活动中使用。