9月17日,研究人员发现一个名为Kraken 新攻击活动,会将payload 注入Windows Error Reporting (WER,Windows 错误报告)服务中作为绕过机制。
WER 服务(WerFault.exe)一般是在有与操作系统、Windows特征、和应用程序相关的错误产生时才会被调用。当受害者看到WerFault.exe 运行时,会认为有错误产生,实际上在本次攻击事件中是被攻击了。
诱饵文件
9月17日,研究人员发现一起利用鱼叉式钓鱼攻击来传播含有恶意文档的zip文件的攻击活动。恶意文件“Compensation manual.doc” 伪装成含有关于员工赔偿的文档:
图 1: 恶意诱饵文档
文件中含有一个image 标签(“INCLDEPICTURE“)会连接到yourrighttocompensation[.]com,并下载一个文档模板的图像。
图 2: 嵌入文档中的Image tag
图 3: yourrighttocompensation 网站
yourrighttocompensation 网站域名是2020年6月5日注册的,文档的创建时间为2020年6月12日。这表明这是同一攻击的2个部分。事实上,研究人员还发现了一个恶意宏,恶意宏使用修改的CactusTorch VBA模块来执行shellcode。CactusTorch 使用DotNetToJscript 技术来加载.NET 编译的二进制文件到内存中,并从vbscript 执行。
图4就是攻击者使用的宏内容,有AutoOpen(自动打开)和 AutoClose(自动关闭)函数。AutoOpen 负责显示错误消息,而AutoClose 负责执行主要活动。
图 4: 宏内容
如图4所示,十六进制的序列号对象中含有加载到内存中的.NET payload。然后,宏定义了一个记录类(entry class),值为Kraken.Kraken。该值有2个部分,用.隔开:分别是.Net 加载器的名字和目标类的名字。
然后回创建一个序列化BinaryFormatter 对象并使用BinaryFormatter 的反序列号函数将对象反序列化。最后,通过调用DynamicInvoke来加载.Net payload 到内存中并执行。
Kraken加载器
加载的payload是一个名为Kraken.dll 的.Net DLL,编译时间为2020年6月12日。该DLL是一个加载器,会注入嵌入的shellcode到WerFault.exe中。
加载器有2个主类:Kraken 和Loader。
图 5: Kraken.dll
Kraken 类中含有要注入到目标进程的shellcode,目标进程在WerFault.exe中进行了定义。它只有一个功能就是调用Loader 类的Load 函数和目标进程作为参数。
图 6: Kraken class
Loader 类负责调用Windows API来注入shellcode到目标进程中。
图 7: Load函数
执行进程注入的步骤如下:
·StartProcess 函数调用CreateProcess Windows API,其中dwCreateFlags 的值为800000C;
·FindEntry调用ZwQueryInformationProcess 来定位目标进程的基址;
·CreateSection 调用 ZwCreateSection API 来在目标进程中创建一个section;
·调用ZwMapViewOfSection 来绑定该section 到目标进程中,通过调用CopyShellcode 来复制shellcode;
·MapAndStart 通过调用WriteProcessMemory和ResumeThread 来完成进程注入。
ShellCode 分析
研究人员使用HollowHunter复制出了注入到WerFault.exe 的shellcode。该DLL 会在多个线程中执行恶意活动,因此很难分析。
DLL的执行是通过调用“DllEntryPoint”,而“DllEntryPoint”会调用Main 函数。
图 8: Main进程
Main进程会调用DllMain,DllMain会创建一个线程来在同一进程环境下的新线程中执行其他功能。
图9: Dll main
创建的线程首先会执行反分析检查来确保没有运行在沙箱或调试器等分析环境中。
在执行完反分析检查后,会在新线程内创建最后的shellcode。这部分使用的import 调用是经过混淆的,会通过调用“Resolve_Imports” 函数来动态解析。
该函数会使用LoadLibraryEx 获取kernel32.dll 的地址,然后进入循环来提取12个import。
图 14: Resolve_Imports
研究人员使用 libpeconv 库来获取解析的API 调用列表。下面是import的列表:
·VirtualAlloc
·VirtualProtect
·CreateThread
·VirtualAllocEx
·VirtualProtectEx
·WriteProcessMemory
·GetEnvironmentVariableW
·CreateProcessW
·CreateRemoteThread
·GetThreadContext
·SetThreadContext
·ResumeThread
在解析完必须的API 调用后,会使用VirtualAlloc 创建一个内存区域,然后调用“DecryptContent_And_WriteToAllocatedMemory” 来解密final shellcode的内容并写入创建的内存中。
然后,调用VirtualProtect 来修改对分配的内存的保护以确保其可以执行。最后,调用CreateThread 来在新线程内调用final shellcode。
图 15: 解析Imports和创建新线程
Final Shell code
Final shellcode是一个指令集合,用来对硬编码的域名进行HTTP 请求来下载恶意payload 并注入到进程中。
首先,调用LoadLibraryA 来加载Wininet API:
图 16: 加载Wininet
然后,构建发起HTTP 请求所必须的函数调用集,包括InternetOpenA、InternetConnectA、InternetOpenRequestA 和 InternetSetOptionsExA:
图 17: HttpOpenRequestA
然后,创建一个HTTP 请求并通过调用HttpSendrequestExA 来发送。请求的URL 是http://www.asia-kotoba[.]net/favicon32.ico:
图 18: HttpSendRequestExA
然后检查HTTP 请求是否成功。如果HTTP 请求不成功,就调用ExitProcess 来停止该进程。
图 19: 检查HTTP请求成功
如果HTTPSendRequestExA 的返回值是true,也就是说请求是成功的,代码会继续下一步。
然后调用VirtualAllocExA 来分配内存区域,并调用InternetReadFile 来读取数据并写入到分配的内存中。
图 20: InternetReadFile 调用
最后,进入分配的内存区域来执行。
由于URL 已经无法访问,因此无法提取shellcode进行进一步分析。
APT32?
目前还没有关于该攻击所属攻击组织的足够证据。但研究人员发现了一些与APT 32相关联的证据。APT32 以使用CactusTorch HTA来释放Denis Rat 变种而知名。但是因为无法获得final payload因此无法进一步分析。用来保存恶意文件和文档的域名的注册地址为胡志明市,而APT 32也是位于胡志明的。因此,研究人员分析初步判断该攻击活动与APT 32有关联。
图 21: 尝试连接远程站点的诱饵文件
本文翻
转载请注明:IT运维空间 » 安全防护 » Kraken: 无文件APT攻击滥用Windows错误报告服务
发表评论