导语:研究人员发现勒索软件的风头被coin miner挖矿机抢占,这种趋势在2018可能会继续。本文介绍了一种使用Heaven’s Gate技术的挖矿机。

2016和2017无疑是勒索软件之年,勒索软件是最流行的恶意软件,没有之一。但是17年年底,研究人员发现勒索软件的风头被coin miner挖矿机抢占。这种趋势在2018可能会继续。

从受害者的角度看,挖矿机的威胁要比勒索软件小很多。虽然挖矿机会让系统运行速度变慢,但是一旦清除挖矿机,系统运行速度就恢复如初了。也不会有数据被窃或丢失。

从恶意软件研究者的角度看,目前还没有足够的资料来进行深度的分析。因为框架主要是基于著名的开源组件,而这些组件几乎没有使用混淆技术。

最近,研究人员发现挖矿机加入了一些新的技巧,比如矿机使用了一种叫做Heaven’s Gate的技术从32位的加载器中对64位进程进行注入攻击。Heaven’s Gate技术是2009年就有了,但是应用在挖矿机样本中还属首次。

样本

· 7b3491e0028d443f11989efaeb0fbec2 – dropper #1

· ed575ba72ea8b41ac2c31c8c39ce303b – dropper #2

· ca54fa2cf8a7e3e2cd457811f336de44 – loader 32-bit (unpacked first stage)

行为分析

为了复现上面提到的注入,要在64位的操作系统上运行样本。该样本以notepad的实例运行,一些参数用于挖矿。

deployed.png

在ProcessExplorer中可以看到内存中的字符串,从中可以看出这比你更不是一个真正的notepad运行实例,而是xmrig Monero挖矿机:

in_memory_Str.png

所以,应该是notepad的镜像在内存中被替换了,可能使用的是RunPE (Process Hollowing) 技术。

主dropper是32位的,但是可以向64位的notepad注入payload:

loader_and_payload.png

需要注意的是这种类型的注入,官方Windows API是并不支持的。官方支持从64位的应用读写32位进程的内存,反之不行。因此,就有了Heaven’s Gate这样的非官方解决方案。

Heaven’s Gate

Heaven’s Gate技术最早是由一个名叫Roy G. Biv的黑客2009年引入的。之后,对库等进行了适应性修改,比如 Wow64extW64oWoW64。2015年的时候,Alex Ionescu总结了应对这种技术的解决方案(http://www.alex-ionescu.com/?p=300)。

工作原理

在64位的操作系统上运行32位进程

在64位的Windows操作系统上运行的32位进程实际上是在WoW64中运行,WoW64是一个模拟32位环境的特殊子系统。可以理解为64位进程中创建的32位沙箱。所以,首先是创建一个64位的进程,然后在该进程中创建一个32位环境。应用是在32位的环境中运行的,且不能访问64位的部分。

如果通过64位的扫描器扫描这个32位进程,可以看到32位和64位的DLL。最重要的是,有两个版本的NTDLL,分别是从SysWow64中加载的32位NTDLL和从System32目录中加载的64位NTDLL。

modules_list.png

但是,32位的进程看不到64位的部分,且只能使用32位的DLL。要向64位的进程中注入,需要使用一些64位的函数。

代码分段

要访问禁止访问的64位部分,首先要理解隔离的原理。原理也很简单,32位和64位的代码执行有不同的代码段,32位的代码段是0x23,64位的代码段是0x33。如果以特殊的方式访问地址,就可以进行访问禁止访问的部分。

Miner中Heaven’s Gate的实现

关于miner的详细分析参见https://secrary.com/ReversingMalware/CoinMiner/。恶意软件会检查运行环境,如果是64位系统,就会用不同的路径来进行64位进程注入:

run_pe64.png

经过反分析检查,就会创建一个新的64位进程,本例中是notepad:

create_process.png

这是注入的恶意payload

为了向64位的进程中注入payload,需要用一些64位的函数。

首先,加载器会在64位的NTDLL中应用handle:

get_ntdll.png

为了访问64位的进程环境,需要操作分段选择器。下面是恶意软件进入64位模式的原理:

enter_641.png

这段代码来自:https://github.com/rwfpl/rewolf-wow64ext/blob/master/src/internal.h#L26

段选择器 0x33进栈,恶意软件调用下一行(下一行的地址也被送入栈内)。

pushed_addresses1.png

最后调用RETF,与RET相比,RETF是一种far return(远返回)。RETF不仅会指定执行时返回的地址,还有分段。RETF但回到实际地址是0x33:0x402A50。

分段变化后,指定地址开始的代码会被翻译为64位。这样,在32位的编译器中代码是可见的。

code32.png

实际上是64位的。

用PE-bear进行视图的快速转变:

bitmode_change.png

代码被翻译为64位:

back_to_32.png

此处执行的代码负责将R12寄存器中的内容转移到栈内,然后转到32位模式。

64位PEB是寻找64位NTDLL的开始点。这部分用指针指向加载的库函数,这些库函数的PEB结构的一部分。从PEB中,我们得到一个叫做ldr的域:

peb1.png

Ldr 是 _PEB_LDR_DATA的结构,包含记录InMemoryOrderModuleList:

in_memory_order.png

上面的列表中含有所有加载的DLL,从中可以找到要寻找的NTDLL,这就是上面的get_ntdll函数的功能。该函数会调用函数is_ntdll_lib来检查库的名字是否与ntdll.dll一致。

is_ntdll_lib.png

如果名字匹配,库的地址就会以一对寄存器的形式返回。

is_found.png

一旦找到NTDLL,就需要提取这些适当函数的地址。通过浏览DLL的输出表可以查看:

get_export.png

使用的函数有:

NttUnmapViewOfSection
NtGetContextThread
NtAllocateVirtualMemory
NtReadVirtualMemory
NtWriteVirtualMemory
NtSetContextThread

这些函数都是RunPE技术所使用的。首先,NtUnmapViewOfSection用来解除与原来PE文件的映射。然后,分配远程进程的内存,写入新PE中。最后,进程的内容就会变成注入模块执行的开始点。

函数的地址会被保存,等待之后的调用来操作远程进程。

结论

截至目前,挖矿机(恶意软件)的开发人员并没有显示出太多的创意。主要是依赖开源组件来达到目的,Heaven’s Gate技术也出现好多年了,一些恶意软件用来达到静默的目的。但是,对挖矿机来说,开发人员可能更加希望用一个最适应目标架构的payload来达到最大化性能的效果。

源链接

Hacking more

...