9月17日,安全研究人员Hossein Jazi 和 Jérôme Segura发现了一种名为“Kraken”的新型攻击,这种攻击将恶意载荷注入到Windows错误报告(WER)服务中,以此来逃避检测。

WerFault.exe通常在与操作系统、Windows特性或应用程序相关的错误时调用,但受害者看到WerFault.exe在机器上运行时,可能并不是发生了什么错误,而是遭受了攻击。

虽然这种技术并不新鲜,但是这次行动很可能是一个APT组织的工作。该组织曾使用工人的赔偿要求网络钓鱼邮件来引诱受害者。攻击者通过攻陷一个网站来托管它的有效载荷,然后使用CactusTorch框架来执行无文件攻击,随后使用了一些反分析技术。

在撰写此文时,研究人员没有明确指出是谁发动了这次袭击,但认为有可能是APT32(又名:OceanLotus、海莲花)攻击组织。

一、恶意引诱:“你的赔偿权”

9月17日,Hossein Jazi 和 Jérôme Segura发现了一种很可能是通过鱼叉式钓鱼攻击传播的新型攻击,该攻击开始于一个包含恶意文档的zip压缩包。

“Compensation manual.doc” 文档包含了假冒的“工人补偿权利”的信息,实际上包含一个图像标签(“INCLDEPICTURE”),该标签连接到“yourrighttocompensation[.]com”(图2)并下载一个图像作为文档模板,具体嵌入位置如图1所示。

图1:嵌入在文档中的图像标签

图2:yourrighttocompensation网站

该域名于2020年6月5日注册,而文档的创建时间是2020年6月12日,这表明它们可能属于同一攻击活动。

在文档内部,Hossein 等人发现了一个恶意的宏,该宏使用修改版本的CactusTorch VBA模块来执行shellcode。CactusTorch利用DotNetToJscript技术,加载了一个.Net编译后的二进制文件到内存,并在vbscript中执行。

如下图3,显示了此次攻击者使用的宏内容。该宏有AutoOpen 和 AutoClose两个函数:AutoOpen 只显示一个错误消息;而AutoClose是执行主活动的函数。并且该宏定义了一个十六进制的序列化对象,其中包含的一个.Net恶意载荷被加载到内存中;然后宏代码中定义了一个名为“Kraken.Kraken”入口类,该名称由两个部分组成,分别表示:.Net加载程序的名称和其目标类名;接下来该宏创建一个序列化BinaryFormatter对象,并使用deseralize函数来反序列化对象;最后通过调用DynamicInvoke将.Net的恶意载荷加载到内存中并执行。

原版CactusTorch 在VBA宏代码中,将恶意载荷注入到指定的进程。而此攻击者修改了宏代码,在.Net载荷中指定了目标进程:

图3:宏

二、Kraken加载器

加载的恶意载荷是一个名为“Kraken.dll”的DLL,使用.Net 开发,编译日期为2020年6月12日,如图4所示。该DLL是一个加载器,它将嵌入的shellcode注入到WerFault.exe中。这并不是第一个用这种技术的案例,在它之前观察到的NetWire RAT,甚至是Cerber勒索软件都曾用到此技术。加载器有两个主要类:“Kraken”和“Loader”。

图4:Kraken.dll

如图5所示,Kraken类包含了shellcode,这些代码将被注入到此类中定义的“email .exe”目标进程中,其中只包含一个用shellcode和目标进程作为参数调用加载器类的加载函数。此shellcode是Cobalt Strike的变种。

图5:Kraken类

如图6所示,Loader类通过调用Windows API将shellcode注入到目标进程中。

图6:Loader函数

下面是执行注入过程的步骤:

(1) StartProcess函数将dwCreationFlags参数的值设置为800000C,调用CreateProcess Windows API。

(2) FindEntry函数调用ZwOueryinformationProcess来定位目标进程的基地址。

(3) CreateSection函数调用ZwCreatesection APl在目标进程中创建一个区段

(4) 调用ZwMapViewOfSection将该区段映射到目标进程,以便通过调用CopyShellcode将shellcode复制进去。

(5) MapAndStart函数通过调用WriteProcessMemory和ResumeThread来完成进程注入

三、ShellCode分析

Hossein 等人使用HollowHunter,将注入到WerFault.exe的shellcode 提取出来进一步分析。如图7所示,该DLL通过调用“Main”函数的“DIlEntryPoint”来执行,同时通过多线程执行恶意活动来增加其分析的困难。

图7:Main进程

主函数调用DLLMain,如图8所示,DLLMain在同一进程上下文中创建了一个新线程来执行它的函数。

图8:DLL main

创建的线程首先执行一些反分析检查,以确保它没有在分析/沙箱环境或调试器中运行,具体操作如下:

(1) 调用CetTickCount检查调试器是否存在:

CetTickCount是一个计时函数,用于测量执行某些指令集所需要的时间,如图9所示。该线程在Sleep指令前后被调用两次,通过计算两者的差值是否等于2来标识是否被调试,即:如果差值不等于2就会标识它正在被调试,程序就会退出。

图9:创建线程

(2) 虚拟机检测

如图10所示,SandBoxDetection函数通过检查显卡驱动注册表项的提供者名称(`SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000′)中是否包含“VMware”或“Oracle”字段,来检查该程序是否运行在VmWare或VirtualBox虚拟机中。

图10:虚拟机检测

(3) IsProcessorFeaturePresent

IsProcessorFeaturePresent API调用用于判断是否支持指定的处理器特性。如下图11所示,当“0x17”作为参数被传递给该API时,意味着它会在立即终止之前检查是否支持_fastfail。

图11:InProcessorFeaturePresent

(4) NtGlobalFlag

Shellcode通过检查PEB结构中的NtClobalFlag来确定它是否正在被调试,并通过将NtClobalFlag值与0x70进行比较来识别调试器。

(5) IsDebuggerPresent

通过调用“IsDebuggerPresent”来检查调试器是否存在,如图12所示。

图12:NtClobatlFlag和IsDebuggerPresent检查

如图13所示,在执行完所有这些反分析检查后,代码进入了一个函数,在一个新线程中创建了最终的shellcode。此部分通过调用“Resolve_Imports”导入函数来进行模糊处理和动态解析,这个函数使用LoadLibraryEx获取“kernel32.dll”地址,然后在一个循环中检索12个导入函数。

图13:Resolve_Imports

使用libpecony库能够获得已解析的API调用的列表,下面是导入列表,Hossein 等人预测这些导入将执行一些进程注入。

  • VirtualAlloc

  • VirtualProtect

  • CreateThread

  • VirtualAllocEx

  • VirtualProtectEx

  • WriteProcessMemory

  • GetEnvironmentVariableW

  • CreateProcessW

  • CreateRemoteThread

  • GetThreadContext

  • SetThreadContext

  • ResumeThread

如图14所示,在解析了所需的API调用之后,代码使用VirtualAlloc创建了一个内存区域;然后调用“DecryptContent_And_WriteToAllocatedMemory”来解密最终shellcode的内容,并将得到的shellcode写入创建的内存中;接下来调用VirtualProtect来更改对已分配内存的区段属性,使其可执行;最后,调用CreateThread在新线程中执行最终的shellcode。

图14:解析导入并创建新线程

四、最后的shellcode

最后的shellcode是一组指令,这些指令向硬编码域名发出HTTP请求,下载恶意载荷并将其注入到进程中。

(1) 加载Wininet

第一步是通过调用LoadLibraryA加载Wininet API,如图15所示:

图15:加载Wininet

(2) HttpOpenRequestA

然后获取到HTTP请求需要用到的API函数,包括:InternetOpenA, InternetConnectA、InternetOpenRequestA和InternetSetOptionsExA,如图16所示:

图16:HttpOpenRequestA

(3) HttpSendRequestExA

在准备好构建HTTP请求的需求之后,创建一个HTTP请求,并通过调用HttpSendrequestExA发送该请求,如图17所示,请求的URL为:http://www.asia-kotoba[.]net/favicon32.ico:

图17:HttpSendRequestExA

(4) 检查HTTP请求

接下来,检查HTTP请求是否成功。如果HTTP请求不成功将调用ExitProcess来结束进程;如果HTTPSendRequestExA的返回值为真,则意味着请求成功。

(5) InternetReadFile

接下来将调用VirtualAllocExA来分配一个内存区域,然后调用InternetReadFile来读取服务器返回的数据,并将其写入到分配的内存中,如图18所示:

图18:InternetReadFile调用

(6) 执行

最后,跳到分配内存开始的地方来执行此shellcode,Hossein 等人发现这里很可能有另一个shellcode托管在被攻击的“asia-kotoba.net”网站上,但由于在编写此文时目标URL已失效,他们无法检索此shellcode进一步分析。

五、更新(2020-10-09)

经过进一步的调查,Hossein 等人意识到该活动与任何APT攻击组织无关,是红队测试(Red Teaming)的一部分。

六、IOC列表

诱饵文件

31368f805417eb7c7c905d0ed729eb1bb0fea33f6e358f7a11988a0d2366e942

包含诱饵文件的压缩包

d68f21564567926288b49812f1a89b8cd9ed0a3dbf9f670dbe65713d890ad1f4

文档模板图片

yourrighttocompensation[.]com/ping

压缩包下载地址

yourrighttocompensation[.]com/?rid=UNfxeHM

yourrighttocompensation[.]com/download/?key=15a50bfe99cfe29da475bac45fd16c50c60c85bff6b06e530cc91db5c710ac30&id=0

yourrighttocompensation[.]com/?rid=n6XThxD

yourrighttocompensation[.]com/?rid=AuCllLU

最终恶意载荷的下载地址

asia-kotoba[.]net/favicon32.ico

本文为CNTIC编译,不代表本公众号观点,转载请保留出处与链接。

原文标题:

Release the Kraken: Fileless injection into Windows Error Reporting service

原文地址:

https://blog.malwarebytes.com/malwarebytes-news/2020/10/kraken-attack-abuses-wer-service/

编译:CNTIC情报组

声明:本文来自国家网络威胁情报共享开放平台,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。