Unit 42最近发现了一个针对葡语用户的恶意软件活动,旨在将加密货币从合法用户的钱包中转移到由攻击者控制的钱包中,该活动使用了一种被称为CryptoClippy(加密货币剪辑器)的恶意软件,它可以监控受害者的剪贴板,寻找加密货币钱包地址被复制的踪迹,以此来发起攻击并窃取加密货币。
攻击时,CryptoClippy会将实际钱包地址替换为攻击者自己的地址。为了将恶意软件植入到用户的计算机,该活动中的攻击者使用谷歌广告和流量分发系统(TDS)将受害者重定向到假冒WhatsApp Web应用程序的恶意域名。他们借此来确保受害者是真正的用户,而且他们是葡语使用者。对于被发送到恶意域的用户,攻击者试图诱骗他们下载恶意文件,包括.zip或.exe文件,从而获得最终的有效负载。
CryptoClippy旨在将加密货币资金从合法用户的钱包转移到由攻击者控制的钱包。当计算机CryptoClippy时,恶意软件会不断检查受害者的剪贴板,看看他们是否复制了加密货币钱包地址,其攻击逻辑是,如果一个人将钱包地址复制到剪贴板,这表明他们可能正在将加密货币从一个钱包转移到另一个钱包。
CryptoClippy使用正则表达式来识别地址属于哪种类型的加密货币。然后,它将剪贴板条目替换为攻击者的钱包地址。由于钱包地址通常很长,有时超过40个字符,粗心的用户是不会注意到地址的变化。
CryptoClippy利用的是SEO攻击,因此当一个人搜索“WhatsApp Web”时,搜索结果的前几天就会显示一个虚假结果。一旦进入该网页,受害者就会被提示下载一个.zip文件,该文件包含一个由恶意脚本组成的.lnk文件。这些脚本引发了一系列安装CryptoClippy的事件。各种CryptoClippy变体具有多种额外功能,可以帮助攻击者完成他们的加密窃取活动。这包括能够通过执行RC4加密的PowerShell脚本来建立远程桌面协议(RDP)后门。
此脚本包含Windows Management Instrumentation(WMI)、终端服务注册表操作、icacls、net命令和日志清除的元素。这些漏洞使攻击者能够在内存有效负载之外进行访问。
此外,该变体还具有针对以太坊和比特币加密货币钱包的功能。鉴于数字货币在拉丁美洲越来越受欢迎,这并不奇怪。
撰写本文时,攻击者控制的比特币地址显示收到0.039954比特币,大致相当于982.83美元,以太坊(ETH)地址也显示了收到资金,其中0.110915556631181819 ETH(约等于186.32美元)是从三个不同的ETH地址发送的。
此活动中的攻击者采用了多阶段的方法,试图绕过基于签名和启发式的安全防护。这种方法包括使用模糊化的PowerShell脚本和编码的有效负载来逃避检测,目前似乎只有少数安全程序可以在VirusTotal中检测到这种恶意软件。
攻击会从传播一个.zip文件开始,该文件包含一个模糊化的PowerShell命令行脚本组成的.lnk文件。受害者双击.lnk文件后,就会执行PowerShell脚本,该脚本将下载第二阶段和几个模糊/加密的有效负载。当执行第二阶段PowerShell脚本时,它会对CryptoClippy加载程序进行解混淆/解密并执行它。然后加载程序会将其窃取程序组件注入svchost.exe中。
CryptoClippy将在剪贴板API中设置基于用户模式事件的挂钩和回调函数,在将受害者的以太坊/比特币加密钱包复制到剪贴板时,将其替换为攻击者的加密钱包。它还包含与C2服务器通信的功能。
CryptoClippy攻击流程如下所示:
通过LNK文件攻击
受害者最初下载的.zip文件中的.lnk文件包含一个截取的命令,如下图所示。双击该文件将执行一个模糊命令,该命令位于快捷方式的目标字段中,负责检查攻击者控制的域。
LNK文件的目标字段包含要运行的命令
.lnk文件使用了几种不同的字符填充方法进行混淆,其中包括以下字符集:
^
!!
:~
下图显示了如何在.lnk文件中使用这种方法。
LNK字符混淆
反混淆后,LNK得到以下PowerShell命令,该命令将通过HTTP协议将字符串uiPX上传到攻击者控制的域tunneldrive[.]com。
PowerShell命令将字符串上载到攻击者域
需要注意的是,在目前观察到的示例中,攻击流程可以追溯到扩展名为.lnk的文件。这些文件通常包含在.zip中。然而在分析中,研究人员观察到另一种变化,其中初始有效负载是一个.exe文件,该文件出自前面提到的域mydigitalreversion[.]com。
当WhatsApp Web的.exe文件一旦执行,它就会联系前面提到的tunneldrive[.]com域。然后,它将释放并执行一个.bat文件来自我删除。
这个.bat文件(如下图所示)使用了一种模糊处理来构建其有效负载。
BAT文件在第一阶段被释放
第一个PowerShell脚本加载程序Ricoly.ps1由Ricoly.bat批处理文件启动并执行。Ricoly.ps1脚本的目的是解密同样位于C:\Users\\AppData\Roaming\Ricoly中释放的第二阶段模糊/加密脚本ps。
Ricoly.ps1脚本使用的XOR密钥大部分是静态设置的硬编码,而XOR密钥的一部分是从计算机的处理器ID动态派生的。这将锁定有效负载,如下图所示。
研究人员使用以下CyberChef XOR秘钥来解密第二阶段的有效负载:
CyberChef用于解码第二阶段PowerShell脚本文件ps的内容
在第一阶段下载时,会将名为sc的加密EXE文件写入文件系统。这个EXE文件将成为第二阶段ps脚本的目标。
第二阶段PowerShell脚本ps的功能是充当反射PE加载程序。它使用.NET方法和D/invoke来处理.NET委托,以逃避检测和动态解析。
ps脚本将确定操作系统是32位还是64位。它还将确定kernel32.dll作为反射加载程序所需的API功能,通过使用GetDelegateForFunctionPointer解析所需的API(如VirtualAlloc和CreateThread)来实现这一点。
然后,ps脚本将对有效负载进行XOR解密,并调用EXE文件sc。
使用D/invoke方法和XOR操作的第二阶段PowerShell脚本
反射加载到内存中的EXE文件sc充当主加载程序,使用系统调用将代码注入另一个新创建的进程。新创建的svchost.exe进程包含CryptoClippy。
窃取程序的前几个函数将首先映射出文件系统,以创建要使用的文件夹。这是通过使用API GetWindowsDirectoryA、GetVolumeInformationA和SHGetFolderPathA来实现的。
窃取程序包含一个函数,它将创建字母数字字符串。此字符串生成器用于主程序中的多个位置。它首先用于在AppData路径下创建一个唯一的文件夹名称。为此,使用一个常量值作为字符串生成器的参数。
在本示例中,常量是0x79FE6D,它将在字符串生成器函数中使用,并映射到格式字符串%08x-%08x。
常量引用和函数字母数字生成器的xref
字符串生成函数将使用提供给函数的常数值和从受害者系统查询的卷序列号。它将创建以下字符串作为示例:079fe6d-de786dd1。
常量值和卷序列号连接成格式字符串
该算法将按每个字符拆分,以此来打乱字符串079fe6d-de786dd1。第一个操作将是由字符串的第一个字符执行的对FFFFFFFF值的异或。
然后,所得到的运算将被右移1,并被常数0x82F63B78异或。结果异或操作将遵循相同的操作集,在16个字符示例字符串079fe6d-de786dd1中,每个字符总共执行8次。
算法完成后,返回要添加到AppData目录的文件夹名称。本例中的文件夹名称为55abf82d,完整路径为C:\Users\xxx\AppData\Roaming\55abf82d。这将根据作为输入提供的常量和卷序列号而变化,以创建唯一的字母加数字字符串。
使用的算法的结果,即要创建的文件夹名称
攻击者的互斥锁的创建也使用字符串生成器函数,该函数作为参数提供了一个不同的常量值。在本例中,值为0x24F2D5。
用于创建带有卷序列号的互斥锁的常量值
用户模式事件挂钩设置
为了便于窃取者剪切剪贴板的加密钱包地址,并将其替换为二进制文件中包含的硬编码钱包,它将首先调用API SetWinEventHook来设置事件挂钩,以便在触发特定事件时调用负责与剪贴板数据交互的函数。
EVENT_OBJECT_FOCUS
EVENT_OBJECT_VALU
ECHANGEEVENT_SYSTEM_FOREGROUND
事件挂钩设置将具有一个从所有进程以及所有现有线程接收事件的进程范围,然后跳过连接负责创建挂钩的所属进程。在设置事件挂钩之后,创建一个Windows事件对象。它通过调用用于同步的Windows API CreateEventA来实现这一点,当特定事件发生并完成时,它将向线程发出信号。
windows事件钩子和注册类的反编译视图
创建Windows对象事件之后,窃取程序将使用API RegisterClassExA。此API提供了一个指向WNDCLASSEX结构的指针,该结构包含wcbClass和各种结构字段。
在此之后,调用CreateWindowExA,它将创建一个具有前面API所指向的结构的窗口。在这个结构中,我们分析的重要字段是lpfnWndProc字段,它指向恶意软件开发者的剪贴板函数。
在CryptoClippy执行期间,此威胁将解密并写入文件Tozzia.bat和Tozzia.ps1到文件系统,这些文件系统嵌入到文件系统中。执行批处理文件Tozzia.bat,然后执行Tozzia.ps1。
Tozzia.bat文件内容
下图显示了Tozzia.ps1 被写入文件系统并执行,从而进行持久性攻击。
Tozzia.ps1 内容
下图显示了Tozzia.ps1 通过创建计划任务来获得持久性。
执行Tozzia.bat的计划任务
在Tozzia脚本解密后,另外两个脚本Giddia和Knowledgeprojects也被解密,但没有被执行或写入文件系统。从内存中提取Giddia和Knowledgeprojects这两个脚本,可以看到几百行额外的脚本代码。
Giddia脚本包含执行与终端服务相关的注册表属性值的功能,目的是削弱它们。它还包含网络命令和本地帐户相关操作的功能。
PowerShell脚本名Giddia
Giddia功能
名为Knowledgeprojects的PowerShell脚本
Knowledgeprojects脚本包含使用PowerShell清除日志的功能。
通过恶意广告(Malvertising)传播
研究人员观察到这种利用谷歌广告和TDS的恶意软件活动。当用户搜索“WhatsApp网络”时,攻击者使用了出现在搜索结果中的谷歌搜索广告。这使他们能够诱骗受害者打开并下载他们的恶意压缩.zip文件。在2022年初收到这一攻击的警报后,谷歌实施了额外的保护措施,并表示,其系统在检测和防止再次攻击方面有所改进。
此外,攻击者使用TDS过滤恶意登录页面上的真正用户和机器人。TDS过滤器通过使用各种标准来确定客户端设备是否是真实用户以及葡语使用者,从而排除机器人和互联网爬虫。
首先,TDS检查连接设备是否来自虚拟专用网络(VPN)IP地址。使用VPN会使攻击者难以确定受害者设备的位置和特征,也会使其更难传播恶意内容。
接下来,TDS进行用户代理检查。用户代理是网络浏览器发送到网站以识别其自身及其功能的文本字符串。通过检查客户端设备的用户代理,TDS通过检查接受语言(Accept-Language) 标头来确定首选浏览器语言是否为葡语。TDS还可以检查其他信息,如设备类型、操作系统、浏览器版本和地理位置。
最后,TDS遵循超文本传输协议(HTTP)GET标头标准。HTTP GET标头是由web浏览器发送到服务器以检索资源的请求消息。标头可以包含各种信息,例如请求的URL、用户代理、Accept-Language标头和referer标头。检查HTTP GET标头中的条件是TDS确定浏览器的首选语言是否为葡语的另一种方法。
如果TDS确定连接不符合上述标准,受害者将被重定向到另一个登录页(如下图所示),并被提示点击“继续到WhatsApp Web”。这将重定向到合法的WhatsApp Web域,而不会有任何进一步的恶意活动,有效地逃避了受害者和安全软件的检测。
恶意域名的内容
但是,如果TDS确定该连接满足上述条件,受害者将被重定向到恶意登录页面,并提示他们下载恶意的.zip文件
这个网站伪装成WhatsApp的官方网站,提供WhatsApp桌面。从 mydigitalrevival[.]com下载此文件就会下载所谓的WhatsApp.zip。
研究人员发现的属于本次活动的其他域名还有preflightdesign[.]com和pickconferences[.]com,它们的葡语版本也有同样的内容。
当受害者成功加载恶意网页并下载所提供的.zip文件时,其中包含一个.lnk文件,如下图所示。
在执行.lnk文件后,研究人员观察到下载到C:\Users\\AppData\Roaming\Ricoly中的以下文件:
Ricoly.bat;
Ricoly.ps1;
两个混淆的加密文件(ps,sc);
一个混淆的加密辅助配置文件(pf);
第一个PowerShell脚本加载程序Ricoly.ps1由Ricoly.bat批处理文件启动并执行。Ricoly.ps1脚本的目的是解密第二阶段的模糊化/加密的脚本ps。
第二阶段PowerShell脚本ps的功能是充当反射PE载入程序。ps文件将以写入文件系统的名为sc的加密EXE文件为目标。sc文件是反射加载的,最终用作CryptoClippy的载入程序。
在执行.lnk文件和两个后续的PowerShell脚本之后,CryptoClippy操作由一个可执行载入程序和主要可执行文件组成。CryptoClippy的载入程序是一个64位的EXE文件,其中主窃取程序EXE文件嵌入在.data部分中。载入程序使用系统调用,在执行时似乎与SysWhispers2实现重叠。
SysWhispers2是一个更隐蔽的代码执行实现,用于绕过对用户模式API的检查。这种绕过是可能的,因为用户模式API通常由应用程序使用,包括AV/EDR产品通过用户模式挂钩进行内省。
CryptoClippy的主要可执行文件是用C编写的,它是用传输层安全性(TLS)库Mbed-TLS静态编译的。可执行文件的主要功能包括它自己的名称生成算法即文件路径、互斥对象和事件对象。主可执行文件还广泛使用了一个名为pf的本地辅助文件,该文件包含一个加密的证书。CryptoClippy使用它自己的算法从辅助文件中消除字符查找表的混淆,从而从查找表中指向值的指针构建明文证书。
该威胁还使用两个不同的RC4密钥进行各种字符串解密。字符串解密例程将使用内存中内置的结构,用于结构中的索引位置、字符串偏移量和字符串大小。这些字符串与对象名称、域、加密钱包和持久性脚本有关。
RC4 Key: 1b43233d5a054808061c190336320e46
RC4 Key: 4646070B47445451604F291809444703
CryptoClippy的主要目标是识别正在复制到剪贴板中的加密钱包字符串。CryptoClippy设置用户模式事件挂钩,并使用回调函数执行将复制到Windows剪贴板中的以太坊或基于比特币的钱包替换为攻击者拥有的硬编码钱包值。下图显示了捕获剪贴板输入的窗口。根据载入程序的执行流程,这个特定的应用程序通常是不可见的。
CryptoClippy剪贴板函数的反编译视图(如下图所示)显示,攻击者使用的钱包地址将被RC4解密,以便稍后在任何加密钱包的替换中使用。
CryptoClippy将对被填入剪贴板的数据执行字符串检查。它将检查与以太坊或比特币相关钱包相关的常见前导字符。复制到剪贴板中的字符串将循环确定字符数。在下图的第27行,从总字符数中减去25并进行比较,看看它是否小于或等于9。
此字符串检查操作适用于以1开头的比特币地址。否则,代码路径将被跳过,下图所示的调试视图显示了API GetClipboardData和API的返回值,其中包含复制的以太坊钱包地址。
以太坊钱包地址0xdB055877e6c13b6A6B25aBcAA29B393777dD0a73
一旦获得剪贴板数据,将执行上面反编译视图中指出的字符串检查,查找使用的特定加密钱包类字符。下图就是一个以太坊钱包,随后检查起始字符值0x。
使用的以太坊钱包0xB49eae711FBa241f657dA46A998833A6591848b
负责操作剪贴板的函数将使用API SetClipboardData将用户以太坊钱包地址替换为0xB49aeae711FBa241f657dA46A998833A6591848b。
上图是钱包地址的一小部分。下表包含用户提供的值,这些值被之后就会被攻击者发现并被替换。
复制钱包和替换钱包的示例
为了保持对受害者计算机的访问,CryptoClippy将Ricoly.link添加到Startup文件夹(\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Ricoly.lnk)来获得持久性。Ricoly.nk将在用户登录时启动,它将执行Ricoly.bat脚本,然后执行Ricoly.ps1。
维护访问权限的其他工作包含在rc4加密的PowerShell脚本Tozzia.ps1中,注入svchost.exe的CryptoClippy有效负载提取Tozzia.bat和Tozzia.ps1 文件。Tozzia.ps1脚本包含与终端服务的注册表修改、本地帐户创建、网络命令和事件日志清除相关的各种功能。
过去几年,窃取加密货币的攻击越来越多。大概的攻击手段有:
· 使用TDS;
· 针对特定目标范围;
· 将有效负载与环境相匹配;
· 采用更复杂和更隐蔽的技术来隐藏加载程序和剪辑功能;
· 创建操作所需的自定义算法;
我们经常看到传播这种威胁的两种特殊方法,一是使用僵尸网络(如Laplas Clipper和Smokeloader),二是可能存在底层恶意软件即服务(MaaS)功能(如Eternity Clipper)。
参考及来源:https://unit42.paloaltonetworks.com/crypto-clipper-targets-portuguese-speakers/