IcedID银行木马是IBM X-Force研究人员于2017年发现的。当时,它针对的是银行,支付卡提供商,移动服务提供商,工资单,Web邮件和电子商务站点,攻击范围主要集中在美国。从发现到现在,IcedID就一直在不断发展,目前2020版已经投入使用,其中一些功能已经发生了重大更改。
这篇文章将深入研究IcedID版本12(十六进制为0xC)的技术细节,在深入研究技术细节之前,请先了解新版本中已经更改的应用组件:
1. 新的反调试和反VM检查;
2. 修改了感染例程和磁盘上的文件位置;
3. 将加密的有效载荷隐藏在.png文件中(隐写术);
4. 修改代码注入策略;
5. 加密函数的修改。
在本文中,你还将找到有关IcedID命名算法的信息,这些命名算法用于为其各种文件,事件和资源创建名称,另外,我们还会提到如何查找和提取恶意软件的内部版本号。
IcedID的攻击切入点:通过其他恶意软件锁定的目标恶意文档
IcedID通过通常包含Office文件附件的垃圾邮件进行传播,这些文件被恶意宏诱捕,这些宏会启动感染例程,获取并运行有效载荷。
在2020年2月发生的攻击活动中,垃圾邮件中的恶意文档首先删除了OStap恶意软件,然后删除了IcedID。 OStap也是近几个月来TrickBot感染的媒介。自问世以来,IcedID的攻击重点一直放在北美的金融机构,电子商务和社交媒体上。
IcedID加载程序的行为
在研究人员的实验室中首次运行装载机时,他们观察到装载机在决定是否感染设备之前会执行一些操作。首先从资源部分加载加密代码,然后解密并执行。
在执行代码的过程中,加载程序使用了一些新添加的防VM和防调试技术,以检查其是否在VM或沙箱中运行。然后将这些检查的输出以及其他参数发送到攻击者的命令和控制服务器,以确定是否应感染受害者的计算机,如果恶意软件继续感染该计算机,则C2服务器发回执行所需的文件,例如恶意软件的配置文件,实际的恶意有效载荷(保存为加密和封装的.png文件)以及一些其他随附文件。然后,加载程序将自身复制到以下两个位置:
1. C:\ImgContent\
2. %appdata%\local\[user]\[generated_name]\
接下来,为了保持攻击持久性,恶意软件在任务计划程序中创建一个任务,在登录时和每小时触发一次加载程序的运行。
IcedID任务计划程序如下图所示:
将自身复制到这两个位置并创建持久性机制后,它将执行一些反VM和反调试检查,以允许C2“批准”继续感染该计算机。此时,加载程序下载所有必需的文件以执行。
加载程序获取的重要文件之一是恶意载荷,其中包含IcedID的所有逻辑,并且实际上是恶意软件的主要模块。它将此核心模块保存在路径“%appdata%\ local \ user_name \ photo.png”下,该文件最初被加密和封装。
下载的有效载荷的路径和文件名都经过硬编码。
加载程序读取下载的有效载荷,该有效载荷被保存为加密的.png文件,然后对其解密,然后将其注入到新创建的svchost进程中。
加载程序读取IcedID有效载荷
接下来,加载器创建一个新进程svchost,并将解密的IcedID有效载荷注入其中。
IcedID注入的有效载荷
一旦将IcedID的实际有效载荷注入到新创建的svchost进程中,它就会开始执行。
由于注入的IcedID有效载荷最初是封装的,因此首先要对其自身进行封装。
自身解压缩后,核心IcedID模块将执行一些初始化步骤,以使其正常运行。它下载并读取执行流程所需的其他文件,例如配置文件(在本例中为chercrgnaa.dat),证书文件(在本例中为3D8C2D77.tmp)以及其他支持资源。
IcedID模块检查以确保该文件没有其他实例并且尚未运行,获取有关受害系统的信息,检查版本,将信息发送到C2并开始扫描运行浏览器进程,以便将其有效载荷注入并启动它们。浏览器挂钩将允许IcedID检测目标URL并相应地部署网络注入。
通过加载程序和IcedID有效载荷的感染过程:
1. 加载程序与C2通信以获取IcedID有效载荷;
2. 下载名为photo.png *的文件;
3. 装载机运行photo.png;
4. 加载程序创建svchost.exe的新实例;
5. 加载程序将恶意有效载荷注入新的svchost.exe进程。
上面列表中的第二步仅在恶意软件首次运行时发生,或者在更新和下载较新版本的恶意载荷photo.png时发生。发生这种情况的原因是,在下载photo.png文件之后,它将文件保存到磁盘上,以便每次启动恶意软件时,只需将文件从磁盘加载到内存中即可。
反虚拟机和反调试策略
IcedID的新版本已升级,具有附加功能,可以隐藏自身并检测何时在虚拟环境或调试模式下运行。在以前的版本中,此恶意软件不具有这些规避技术。
检查从已编程的加载程序开始,以识别其是否在虚拟环境中或调试器下运行。在下面的图像中,我们可以看到名为“ anti_vm”的函数,该函数检查恶意软件是否在模拟器中运行。
加载程序还使用了一些反调试和反VM指令,例如Read-Time-Stamp-Counter指令(RDTSC),可以帮助其检测研究人员是否正在按照不同的步骤暂停调试器。在调试器下。它使用具有0x40000000的CPUID作为参数来查找虚拟机监控程序品牌,CPUID等。
我们可以在下面的图像中看到,加载器循环运行255次。在循环内部,它在循环的开始和结束时都执行RDSTC指令,在两次循环之间,它以0x01作为参数执行命令CPUID。
通常,以0x01为参数的CPUID指令的输出用于检测VM,但此处忽略输出,仅计算RDSTC的第一次调用和第二次调用之间的时间差。
取决于计算的增量,加载程序将增加相关计数器:
0 < Difference < 250? ++less_250_miliseconds
250 < Difference < 500? ++less_500_miliseconds
500 < Difference < 750? ++less_750_miliseconds
750 < Difference < 1000? ++less_1000_miliseconds
else? ++Big_Gap
接下来,该恶意软件将执行另一项测试,以验证其是否在VM或物理计算机上运行:
它调用带有0x40000000作为参数的CPUID,并且输出是一个值,该值指示在虚拟机内部运行时VM供应商的品牌和类型:
VMM_XEN: ebx = 0x566e6558 and ecx = 0x65584d4d and edx = 0x4d4d566e
VMM_HYPER_V: ebx = 0x7263694D and ecx = 0x666F736F and edx = 0x76482074
VMM_VMWARE: ebx = 0x61774d56 and ecx = 0x4d566572 and edx = 0x65726177
VMM_KVM: ebx = 0x4b4d564b and ecx = 0x564b4d56 and edx = 0x0000004d
所有这些收集的数据随后将发送到C2服务器,以帮助确定恶意软件是否正在VM或调试环境中运行。根据输出,C2服务器决定是否发送感染计算机并运行IcedID核心模块所需的所有文件。
代码注入技术
IcedID有两种代码注入方法:
首次启动恶意软件或在系统启动时使用第一种注入方法,第一种方法将代码注入到生成的svchost.exe进程中。
当恶意软件检测到浏览器进程正在后台运行并将其shellcode注入正在运行的浏览器进程时,将使用第二种注入方法。
IcedID使用少量的代码混淆,使其难以分析。代码混淆通过间接调用Windows API函数来工作,而不是通过动态地将其调用的Windows API函数动态加载到寄存器中来直接调用函数,IcedID有两种代码注入方法。
IcedID的Svchost进程注入方法
在第一种代码注入类型中,恶意软件从创建处于挂起状态的svchost进程开始。
接下来,它在目标进程(svchost.exe)中分配内存,并将其shellcode注入分配的内存中。然后,它将分配的内存空间的保护标志更改为PAGE_READ_EXECUTE。
接下来,它使用注入的进程的主线程和注入的shellcode中的入口地址调用函数“ NtQueueApcThread”。
在注入过程的最后,它调用“ NtResumeThread”,以便在现在注入的过程(svchost.exe)中运行自己的代码。
Svchost –>浏览器注入方法
当恶意svchost进程检测到启动了浏览器进程时,就会使用第二种注入方法。它获得了该进程的句柄,并调用了函数“ Inject_browser”,如下图所示。
在“Inject_browser”内部,它调用三个函数:“ ZwWritevirtualMemory”,“ NtProtectVirtualMemory”和“ ZwAllocatevirtualMemory”,以便将其Shellcode注入浏览器的进程中。
将shellcode注入浏览器进程后,它将调用“CreateRemoteThread”,并在注入的shellcode中输入入口地址。
IcedID的加密选择和技术
IcedID使用一些不同的解密和解码算法来隐藏一些恶意代码,这些恶意代码可以帮助恶意软件研究人员了解其功能和操作流程的上下文。
IcedID创建或注入的所有进程(即svchost和Web浏览器进程)都使用了加密函数。
IcedID的加密函数如下:
1.解码(int a1)
通常与其他解密算法一起使用,例如,在svchost进程中对浏览器事件名称或互斥量进行解码的算法。该函数获取一个参数(一个整数),然后对该参数运行一些按位运算。
图23:IcedID解码函数Decode(int a1)
2.解密(int密钥,字符串encrypted_string)
通常用于对代码中的加密字符串和恶意代码进行解密,以加强反向工程过程。该函数有两个参数:密钥(整数)和要解密的字符串(字符串)。此功能与IcedID的最新版本一致。
3. Decode_by_constant(int密钥,char [] arr)
负责为IcedID设法感染的浏览器进程生成事件名称,该函数有两个参数:constant \ key(整数)和数组(char [])。
4. CreateGlobalKey(字符串sid)
创建一个全局密钥,然后将其用于其他加密和解密算法以及命名算法。此函数有一个参数:被感染用户设备的系统ID(SID),此处使用的算法是Fowler-Noll-Vo哈希。
5. RC4_variant(int [] arr)
此函数负责解密加密文件,例如配置文件,从C2下载的加密有效载荷,加载并注入到svchost进程的代码等。
这种加密/解密算法是RC4密码变体,与以前的版本一样,它继续使用字符串“zeus”作为密钥。
此版本中的RC4密码略有变化,这意味着Python库中的标准RC4解密算法仅对RC4加密的数据无效,因为它是由IcedID的开发人员定制的。必须使用定制或修改的RC4解密器来解密新配置。
该函数会获得一个参数数组,其中包含要解密的加密有效载荷。
6. initKey(int GlobalKey,int常量,int []密钥)
初始化RC4变体解密算法的密钥,它获取三个参数:GlobalKey(整数),常量(整数)和整数/字符数组。
IcedID的命名算法
IcedID使用一些命名算法来为其文件、目录、互斥锁、事件等生成名称。以下是IcedID命名算法的一些不同用法:
1.浏览器事件名称
当恶意软件将自身注入新的浏览器进程时,它会创建一个事件,以便知道此浏览器进程已被注入。它使用函数“ decode_by_constant(int key,char [] arr)”来生成事件名称。对于所有类型的浏览器,事件名称都是相似的。对于在浏览器中创建的事件名称,键被硬编码为值6。
2. Svchost互斥名称
将恶意软件注入其创建的svchost进程后,它还会创建一个互斥锁,以便知道此svchost进程已被注入。
在下图中,我们可以看到“create_mutex_svchost”函数。在函数开始时,它将调用函数“ generate_mutex_name”,并生成将要创建的互斥锁的名称。该函数具有两个参数:key(它是硬编码的值7)和array(它将包含生成的名称)。
函数“ generate_mutex_name”首先调用密钥为7的函数“ mutex_name”和一个空数组,其中将包含用于互斥体名称的字符。
接下来,它使用加密的“mutex_name_format”字符串调用函数“decrypt”。最后,它输出互斥体名称并将其返回到作为参数获取的数组。
函数“ mutex_name”将获得包含结果互斥体名称的键(key = 7)和数组作为参数。它在参数key和globalkey / init_key上运行一些按位操作。
IcedID互斥锁命名技术如下所示:
3.配置文件路径
首先,恶意软件通过使用0x1c作为参数调用函数SHGetFolderPathW来检索“appdata \ local \”路径,如下图33所示(黑色圆圈)。
接下来,它将调用key = 4的函数Decode_by_constant(key,arr)。返回值是文件夹“appdata \ local \”中的名称,如下图33所示(灰色圆圈)。
配置文件夹中有两个配置文件,都带有.dat扩展名。
为了生成文件名,IcedID执行以下步骤:
1.每个文件都有一个初始常数值(0和1),恶意软件对它们进行一些按位运算,结果得到一个整数(5和261),如下图33所示(红色圆圈)。
接下来,它使用生成的值并使用key = Generated_value调用函数Decode_by_constant(key,arr)。返回值是T配置文件的X + 2字母中的前X个字母,如下图33所示(红色圆圈)。
配置文件名称的最后两个字符是通过对与该文件相关的初始值执行按位运算而生成的,如下图33所示(黄色圆圈)。
IcedID的证书文件
我们检查的IcedID版本将与恶意软件相关的证书文件存储在“appdata \ local \ Temp”下,其名称与恶意软件生成的全局密钥相同,证书文件的后缀是.tmp。
IcedID的配置文件
IcedID从C&C下载配置文件,配置文件包含目标银行和零售商,以及将有效载荷注入浏览器进程。
IcedID的代码版本控制
IcedID的开发人员会随着时间的推移不断更新其代码。尽管漏洞修复自然会更加频繁,但我们也偶尔会看到新的主要版本的发布。该恶意软件的版本号经过硬编码,并驻留在加密的photo.png文件中。
通过查看包含恶意软件主要逻辑的函数,我们可以看到恶意svchost进程中的版本号。
在上图中用红色圈出,我们可以看到示例版本:12(十六进制为0xC)。
浏览器挂钩
当IcedID检测到系统中正在运行的浏览器进程时,它将恶意恶意代码注入浏览器进程并挂钩相关功能,一些目标函数是Windows API函数,例如来自kernel32,crypt32,WinINet和ws2_32动态链接库的函数,还有一些与浏览器供应商相关的函数。
总结
IcedID出现于2017年,并将继续发展其功能。尽管它并未位居2019年最流行的银行木马榜榜首,但它始终以银行和零售商为目标,并积极更新功能。
本文翻译自:https://securityintelligence.com/posts/breaking-the-ice-a-deep-dive-into-the-icedid-banking-trojans-new-major-version-release/如若转载,请注明原文地址: