01 Qakbot简介
Qakbot是一种自2007年以来一直活跃的复杂恶意软件,具有自我复制和传播的蠕虫特性。其主要攻击目标为银行业和金融机构,旨在窃取受感染系统中的敏感信息和凭证。Qakbot通过多种手段获取访问权限,包括社会工程和漏洞利用。该恶意软件还具备高度定制化的C&C通信,可用于获取其他恶意软件模块和执行数据外泄等功能。
Qakbot的特点在于其高度隐蔽性和逃避技术,例如反沙箱和反虚拟机检测等。它主要通过钓鱼电子邮件和恶意附件进行传播,但最近通过利用OneNote文档进行传播的情况数量有所增加。此外,Qakbot的恶意代码经常更新,以逃避杀毒软件的检测和清除。
▶ 1.1 攻击流程
02 样本分析
▶ 2.1 OneNote样本
▶ 2.1.1样本概述
OneNote文件利用hta脚本下载QakBot Loader文件,通过QakBot Loader解密出真正的shellcode代码。
▶ 2.1.2详细分析
病毒名称 | 151360.one |
MD5 | a00d9fbe0d08a7cc8ac61a793f966517 |
SHA-1 | 8dc6c41573a480d0bcb80fd36112daecb4d61a92 |
SHA-256 | ef609ae7ef5d32d18bdecac1ed59fcce6ce766e27fe0b9e3a8f208b8e2d0c8ba |
文件大小 | 168.52 KB (172568 bytes) |
文件格式 | one |
文件类型(magic) | data |
OneNote中的HTA脚本
通过开源工具OneNoteAnalyzer对OneNote文件进行分析,得到OneNote文件中释放的hta脚本文件。hta脚本如下所示:
HTA下载shellcode文件
对hta脚本中的代码进行去混淆,得到以下代码。该代码的主要功能是使用curl程序下载QakBot Loader文件,名字为512.png。
▶ 2.2 Qakbot Leader分析
▶ 2.2.1样本概述
QakBot Loader为DLL文件,DLL文件中的入口点 "Wind" 使用各种规避技术进行混淆,如直接跳转和条件跳转(jmp、jz、jnz)。使用异或解密出第一个shellcode,然后在内存中执行。此shellcode进一步解密出主Qakbot Core DLL文件并从内存中释放,最后执行核心DLL文件。
▶ 2.2.2 详细分析
病毒名称 | 512.png |
MD5 | 891c7d5050fe852a032eeda9311498e8 |
SHA-1 | 52975754a7e3048c5b587e4926e99cb5c8123929 |
SHA-256 | e16e0faae0e9851a782d026f6692e34a9c7bae14c545aa8ac1e1ef033dfd06a8 |
处理器结构 | PE32 executable for MS Windows (DLL) (console) Intel 80386 32-bit |
文件大小 | 307.00 KB (314368 bytes) |
文件格式 | Win32 DLL |
数字签名 | 无 |
是否加壳以及加壳类型 | 无 |
编译语言 | Microsoft Visual C++ vx.x DLL |
QakBot Loader包含多个节数据(如下图所示),根据hta脚本描述,恶意活动通过名称为 "Wind "的函数执行。
解密第一层shellcode
加密的第一个shellcode代码。
解密后的shellcode代码。
解密Qakbot Core DLL文件
利用解密的shellcode执行解密Qakbot Core DLL代码。Qakbot Core DLL解密算法:使用加密数据的前一个字节和经过计算的字节进行XOR,然后再和800000FF进行and运算。例如:X xor Y and 800000FF
解密后的Qakbot Core DLL如下图所示。
修复Qakbot Core DLL文件
从内存中Dump的Qakbot Core DLL文件存在部分节对齐问题,需要将部分节地址和大小进行修正。比如.rsrc节中的VA。
▶ 2.3 Qakbot Core DLL分析
▶ 2.3.1 样本概述
Qakbot Core DLL主要功能大致分为环境检查、持久化以及C&C通信。
▶ 2.3.2 详细分析
病毒名称 | Qakbot Core DLL |
MD5 | 25a014eda9b2a5f325336f9abef7f558 |
SHA-1 | afe26e6333a0ac52494a89bf70c7fd7fa5122373 |
SHA-256 | 10fe7c6c5b033386b2ac17ffd5cedc3974a9bb7852b854408372254066647861 |
处理器结构 | x64 |
文件大小 | 32.50 KB (33280 bytes) |
文件格式 | Win32 EXE |
时间戳 | 2022-10-29 10:20:35 UTC |
数字签名 | 无 |
是否加壳以及加壳类型 | 无 |
编译语言 | PE64 Compiler: FASM (1.73) [GUI64] |
环境检查
1、检查是否存在C:\\INTERNAL\\__empty特定子目录,如果存在则直接终止执行
2、检查 SELF_TEST_1 标志,以检查机器是否已经被感染
3、如果此标志被设置就会终止执行
4、如果机器未曾感染则创建一个新的线程并开始执行
5、检查键盘类型
重构IAT表
获取以下DLL地址并根据DLL地址获取相应的函数地址。
Kernel32.dll、Ntdll.dll、User32.dll、Netapi32.dll、Advapi32.dll、Shlwapi.dll、Shell32.dll、Userenv.dll、w32_32.dll
收集系统信息
1、使用GetTickCount64函数进行的反沙箱检查
2、获取系统信息,如计算机名称、卷的信息、用户账户名称、模块名称、进程类型和操作系统版本信息。
反AV检测
通过进程快照枚举正在运行的进程,以检测机器上是否运行防病毒(AV)产品。
反调试
通过遍历进程列表,查找有无异常进程。如果遍历到被硬编码的进程列表就会在注册表中设置标志位,从而使程序终止执行。
进程注入
进程注入的主要程序如下:
C:\Windows\SysWOW64\wermgr.exe
C:\Windows\SysWOW64\msra.exe
C:\Program Files (x86)\Internet Explorer\iexplore.exe
1、新建线程用来调用进程注入,首先会判断操作系统版本,如果是Windows Vista或更高版本则执行threadFuncAddrOut函数,否则执行threadFuncAddrOut2函数。
2、循环调用进程注入函数CreateProcessCommandLine函数主要是使用目标程序地址作为命令行参数来创建进程ResumeThreadOut函数主要作用是在完成进程注入后恢复目标进程的运行
3、该函数主要作用是实现远程代码注入,将恶意代码注入到目标进程 判断当前操作系统的版本,获取相对应ntdll.dll中的函数地址
- 利用ProcessInjectionAllocMem函数向目标进程申请一段内存空间,用于存放待注入的代码,并返回该内存地址- 使用GetThreadContext函数获取目标进程的线程上下文信息,并修改EIP寄存器的值为注入的代码处,使得线程恢复执行后可以跳转到注入的代码并执行- 修改的内存属性,然后写入shellcode代码,最后恢复内存属性- 修改目标进程中被注入内存区域的属性为可写,向该内存区域写入待注入的代码,然后恢复内存区域的原始属性- 如果进程注入成功,则返回非零值;否则,返回0
ProcessInjectionAllocMem函数的主要执行流程
- 检查当前系统版本是否符合要求。如果不符合要求,则会调用out_threadFuncAddr3()函数另起线程调用MessageBoxA函数。
- 获取当前进程的进程句柄,分别把目标进程和自身进程映射进内存空间
- 调用AllocMemcpy函数申请一段内存空间,大小为6852字节,并使用VirtualAllocEx函数为目标进程分配一段内存空间
持久化
主要还通过以下步骤进行持久化:- 将自身复制到指定的文件夹%AppData%\Roaming\Microsoft\{RandomStrings},文件夹名字随机生成- 利用上述文件夹创建注册表项- 执行计划任务来启动1、将QakBot所需要的配置文件写入到注册表中配置文件写入到注册表中
使用XOR加密(加密和系统相关)要写入的注册表地址并作为返回值返回,保存在全局变量中。之后通过读取注册表来获取相应的配置信息,例如加密密钥等信息。
对注册表中加密的配置信息进行解密,其中包括RC4 Key、恶意软件自我复制的文件目录等信息,其中感染的类型是tok01。
2、恶意软件自身复制到指定文件夹
3、获取资源中的数据,恶意软件嵌入了不同的资源。常见的是配置和IP地址列表,资源以相同的方式加密
4、计划任务和开机自启动
把释放的恶意文件路径写入到开机自启注册表中,同时也会写入到计划任务中。
C&C通信
在Qakbot加密/解密过程中,核心DLL有两种资源——一种用于加密配置,一种用于加密C&C IP列表。为了解密这些资源,根据每个 Qakbot 样本特定的字符串计算 SHA1 哈希,并将该哈希用作 RC4 算法的密钥进行解密操作。
使用密钥bUdiuy81gYguty@4frdRdpfko(eKmudeuMncueaN对RC4加密的数据进行解密
解密后 Qakbot 的活动ID是tok01,时间戳是1676453967,对应时间是2023-02-15 17:39:27
解密出来的C&C IP地址
使用HTTP进行通信,使用POST或者GET方式发送数据包进行数据交互,发送的数据内容经过base64编码
03 相关性分析
自 2023 年 1 月底以来,Qakbot银行木马借助于 OneNote 文档进行恶意软件分发的活动数量激增,并且版本不断更新,下面是一些其他版本的变种信息。
感染ID | 时间戳 | 感染时间 |
bb12 | 1675417198 | 2023/2/3 17:39:58 |
bb15 | 1676367197 | 2023/2/14 17:33:17 |
tok01 | 1676453967 | 2023/2/15 17:39:27 |
bb22 | 1680686988 | 2023/4/5 17:29:48 |
04 结论
本文对Qakbot恶意软件新的传播方式进行分析,包括对OneNote恶意文件、加载器Qakbot DLL及其主要的Core DLL的详细分析。详细分析了Qakbot的反调试、反检测技术、进程注入和通信方式等技术,并且从样本中提取了关键配置信息,比如写入注册表的加密配置信息、C&C通信地址等。
05 加固建议
拦截带有不常见文件扩展名(.one、.hta、.vbs、.js、.wsf、.iso、.vhd、.img)附件的电子邮件;
拦截被滥用的系统程序(例如 MSHTA.exe、RunDll32.exe、cmd.exe)启动的网络连接;
修改环境中不常见脚本文件格式的默认文件关联(例如:.wsf、.js、.hta、.vba、.chm、.cmd),以便于阻止脚本的执行;
拦截在恶意软件常用的路径上创建 PE 文件(例如:%PROGRAMDATA%);
在安全防护产品上拦截已知恶意软件外联IP和域名地址。