NrsMiner:一个构造精密的挖矿僵尸网络
0x1 前言
近日,360互联网安全中心发现一个利用“永恒之蓝”漏洞攻击武器传播的挖矿僵尸网络,该僵尸网络通过占用僵尸机的CPU和GPU算力挖取门罗币获利。该僵尸网络的重要组成部分都由一个名为NrsDataCache的文件下发到每台僵尸机中,因此我们将其命名为“NrsMiner”。
经过上次WannaCry事件,很多机器已经修补或免疫了“永恒之蓝”漏洞,该漏洞攻击武器的威力已大不如前,但NrsMiner构造精密,能够有效完成持久化、集中管理、自更新等多种功能,其危害仍不容小觑。
本文将对NrsMiner的结构进行详细分析,并梳理NrsMiner僵尸网络的发展过程。
0x2 NrsMiner分析
NrsMiner由主控模块、更新模块、攻击模块和挖矿模块四部分组成。每个模块所涉及到的PE文件都包含32位和64位两个版本以适应不同架构的操作系统。图1展示了NrsMiner的整体结构。
图1 NrsMiner整体结构
在NrsMiner中,主控模块以服务的形式存在,负责其他模块的启动;更新模块从控制端下载更新包NrsDataCache.tlb并对其他模块进行更新;攻击模块负责对内网中的其他计算机和与本计算机进行连接的其他计算机进行“永恒之蓝”漏洞攻击;挖矿模块负责挖取门罗币。下文将逐一分析每个模块。
(1) 主控模块
主控模块是僵尸网络的根基,负责调度其他模块工作。NrsMiner的主控模块vmichapagentsrv.dll作为服务“Hyper-V Access Protection Agent Service”的ServiceDll存在,同时该服务被加入netsvcs服务组中借助svchost.exe启动。图2展示了“永恒之蓝”32位payload x86.dll创建该服务并指定ServiceDll的代码片段。
图2 x86.dll创建该服务并指定ServiceDll的代码片段
主控模块每次执行时会删除计算机中存在的NrsMiner的组成部分并结束相应进程,之后通过更新模块下载新的文件并启动相应进程,以使NrsMiner时刻保持最新状态。图3展示主控模块删除旧的NrsMiner组件并结束相应进程的代码片段。
图3 主控模块删除旧的NrsMiner组件并结束相应进程的代码片段
完成旧组件的清理之后,主控模块开始其主要工作。工作的第一步就是向控制端发送本机的打点数据,打点数据包括本机MAC地址、ip地址和计算机名称,打点服务器域名为vpp.jdi1diejs.club。图4展示了主控模块进行打点的代码片段。
图4 主控模块进行打点的代码片段
完成打点后,主控模块从NrsDataCache.tlb中解压提取出挖矿机程序hash,将其复制到system32或SysWOW64目录下命名为TaskSyncHost.exe并启动该程序进行挖矿。主控模块根据处理器数目决定挖矿机所使用的线程数。表1展示了不同处理器数目对应的挖矿机所使用的线程数。
表1 不同处理器数目对应的挖矿机所使用的线程数
处理器数目 |
线程数 |
8 |
3 |
12 |
4 |
16 |
6 |
其他 |
等于处理器数目 |
表1
可见,NrsMiner有意压低多核处理器环境下挖矿线程的数目,以此降低计算机出现异样的可能性。NrsMiner的严谨不仅体现在这,同样体现在其对挖矿机状态的实时记录和回传。主控模块会在启动挖矿机时记录挖矿机的状态并回传至控制端。表2展示了NrsMiner记录挖矿机状态时使用的状态码。
表2 NrsMiner记录挖矿机状态时使用的状态码
挖矿机状态 |
状态码 |
结束旧挖矿机进程成功 |
0 |
启动新挖矿机进程成功 |
1 |
结束旧挖矿机进程失败 |
2 |
挖矿机程序文件不存在 |
3 |
启动新挖矿机进程失败 |
4 |
表2
除了挖矿机外,主控模块从控制端下载更新模块组件taskhostex.exe,下载地址为dlr.noilwut0vv.club/d/msdownload/others/BtnProtocol.exe。关于更新模块内容将在下文详细说明。同样,主控模块还负责攻击模块的获取和启动,其从 NrsDataCache.tlb中提取出攻击模块程序文件spoolsv.exe并执行。
除了上述的功能外,我们还发现了主控模块一个有趣的功能—主控模块中嵌入一个基于mongoose的轻量级WebServer。局域网中其他计算机的主控模块可以通过访问该WebServer下载相应的组件。图5展示了主控模块中嵌入的WebServer初始化代码片段,该`WebServer绑定的端口为26397。
图5 主控模块中嵌入的WebServer初始化代码片段
WebServer主要提供下载NrsDataCache.tlb的功能。局域网中的其他计算机可以通过HTTP协议访问WebServer进而下载NrsDataCache.tlb,而WebServer将处理来自其他计算机的HTTP请求。当NrsDataCache.tlb不存在时,WebServer将返回404状态码。通过将僵尸机转化成为WebServer能够方便局域网中不同计算机之间的文件传输与更新,下文提到的更新模块就通过该方式进行僵尸网络组件的更新。图6展示了WebServer处理HTTP请求的代码片段。
图6 WebServer处理HTTP请求的代码片段
主控模块以启动器的身份指挥其他模块进行工作,可以称之为“僵尸网络的主心骨”。一个稳定、灵活的主控模块是僵尸网络稳固自身并持续扩张的根本,而NrsMiner的主控程序就通过实时打点、新旧文件替换、模块状态反馈保证僵尸网络的稳定性,通过嵌入WebServer提高僵尸网路的灵活性。
(2) 攻击模块
攻击模块由两部分组成,一部分是发起攻击的spoolsv.exe,另一部分是执行攻击的“永恒之蓝”payload x86.dll和x64.dll。spoolsv.exe进行攻击的流程如图7所示。
图7 spoolsv.exe进行攻击的流程
攻击执行前spoolsv.exe还会进行一次打点,打点内容包括本机ip地址,计算机名以及GPU型号。打点过后,spoolsv.exe从NrsDataCache.tlb提取“永恒之蓝”攻击组件crypt,该组件同样是个压缩包,解压后是一套完备的“永恒之蓝”漏洞攻击武器。图8展示了crypt解压后的内容。
图8 crypt解压后的内容
其中,x86.dll和x64.dll就是“永恒之蓝”漏洞攻击payload的两个版本。spoolsv.exe并不关注目标计算机中是否存在漏洞,而是直接启动攻击程序svchost.exe对局域网中的其他计算机和与本机连接的其他计算机进行攻击。攻击成功后将在目标计算机执行相应payload。
为了尽量减小payload的体积,NrsMiner并没有直接将功能的执行交给payload,而是将payload绑定计算机的57220端口并监听该端口。图9展示了相应的代码片段。
图9 payload绑定端口并监听该端口的代码片段
而spoolsv.exe会向目标计算机57220端口发送NrsDataCache.tlb,目标计算机接收到NrsDataCache.tlb之后对其进行解压,提取其中名为srv的文件,也就是主控模块文件vmichapagentsrv.dll安装服务,至此整个攻击完成。图10展示了spoolsv.exe向目标计算机57220端口发送文件的代码片段。
图10 spoolsv.exe向目标计算机发送文件的代码片段
在进行攻击时,攻击模块会结束掉任务管理器进程以减少自身被发现的可能。图11展示了攻击模块结束任务管理器进程的相关代码片段。
图11 攻击模块结束任务管理器进程的相关代码片段
攻击模块还会从log.oiwcvbnc2e.stream下载名为TaskhostServices.exe的文件并运行该文件。不过log.oiwcvbnc2e.stream已无法访问,攻击模块无法成功下载该文件。
(3) 更新模块
更新模块负责NrsMiner组件的更新。NrsMiner从多个不同的地址下载不同的文件,而更新模块的重要组件taskhostex.exe就是主控模块从dlr.noilwut0vv.club/d/msdownload/others/BtnProtocol.exe下载的。
taskhostex.exe是个加载器,用于加载更新模块其他组件,在加载的同时会根据情况进行BypassUAC操作。taskhostex.exe会通过是否能够成功地在system32目录下释放tcpiplocationviews.dll文件判断UAC级别是否为最低。当UAC级别不为最低时,往system32目录下写入文件会触发弹窗,在不存在用户交互时无法成功。计算机的UAC级别会和网络状态以及GPU型号一起传回打点服务器。
若UAC级别不为最低,则taskhostex.exe会借助spoolsv.exe启动更新组件TrustServicesHost32/64.exe。由于spoolsv.exe进程源头来自于“永恒之蓝”payload,进程权限为system,借此可以BypassUAC。图12展示了taskhostex.exe byPassUAC的代码片段。可以发现,taskhostex.exe将做45次BypassUAC尝试。
图12 taskhostex.exe byPassUAC的代码片段
taskhostex.exe启动更新模块组件TrustServicesHost32/64.exe(32位和64位版本文件名不同,以下称TrustServicesHost)。TrustServicesHost通过LocalDown或vps两种下载方式中的其中一种下载更新包NrsDataCache.tlb。两者中优先选择LocalDown。
LocalDown指的是通过局域网中已经受感染的计算机所搭建的WebServer下载更新包。TrustServicesHost.exe通过访问WebServer的26397端口下载更新包NrsDataCache.tlb。图13展示了LocalDown的代码实现。
图13 LocalDown的部分代码
vps指的是通过作者部署的远程服务器下载更新包,下载链接为http://vpp.jdi1diejs.club/NrsDataCache.tlb。图14展示了vps的代码实现。
图14 vps的代码实现
下载更新包之后TrustServicesHost.exe会用更新包中的文件替换掉计算机中存在的旧文件,并重新启动主控模块的服务。图15展示了NrsDataCache.tlb解压后的内容。
图15 NrsDataCache.tlb解压后的内容
值得一提的是,TrustServicesHost.exe中硬编码了一些通过异或加密过的字符串,异或key为0x33。TrustServicesHost.exe运行过程中会解密这些字符串并对其编码后存储在注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServicesPixels中。图16展示了解密后未编码的字符串内容,这些字符串可能做为备用矿池地址在挖矿模块中将和其他字符串拼接构成挖矿机命令行。图17展示了写入注册表项的字符串内容。
图16 解密后未编码的字符串内容
图17 写入注册表项的字符串内容
(4) 挖矿模块
挖矿是NrsDataCache僵尸网络的最终目的,NrsDataCache所挖的币种为门罗币。NrsDataCache的挖矿功能由TaskSyncHost.exe完成,该文件由NrsDataCache.tlb解压提取得到,原文件名为hash或hash64。
不同于其他挖矿僵尸网络使用例如minexmr,supportxmr等知名矿池,NrsDataCache使用自建的矿池,首选矿池地址为mg.jdi1diejs.club:45560.该地址以字符串的形式硬编码在主控模块中,并与其他字符串拼接成挖矿机命令行。图18展示了挖矿机命令行的内容。
图18 挖矿机命令行
从上文可以得知,更新模块通过注册表项存储了一些包含矿池地址的字符串,这些可能是挖矿机的备用矿池地址和登陆账户名,不过这些矿池和帐户名并未启用。根据存储的字符串我们整理出挖矿模块使用或待使用的矿池地址和帐户组合,如表3所示。
表3 挖矿模块使用或待使用的矿池地址和帐户组合
矿池地址 |
帐户 |
mg.jdi1diejs.club:45560 |
a3raf3ea@protonmail.com |
mg.jdi1diejs.club:45560 |
wb333@protonmail.com |
p2.jdi1diejs.club:45560 |
akiofe1a@protonmail.com |
p3.jdi1diejs.club:45560 |
toyetrqw@protonmail.com |
P4.jdi1diejs.club:45560 |
s50ghksf@protonmail.com |
p5.jdi1diejs.club:45560 |
a4gqr09i@protonmail.com |
p6.jdi1diejs.club:45560 |
fa09efka@protonmail.com |
p7.jdi1diejs.club:45560 |
dske59jg@protonmail.com |
p8.jdi1diejs.club:45560 |
fgk9w4fk@protonmail.com |
表3
除了TaskSyncHost.exe之外,NrsDataCache.tlb中还有另一个名为gpu的挖矿机,该挖矿机使用GPU进行挖矿。不过在捕捉到的样本中并未发现与该挖矿机相关的行为。
0x3 NrsMiner发展过程
NrsMiner变种的最早出现可追溯到2017年5月,与“WannaCry”爆发时间相近。也就是在“永恒之蓝”漏洞攻击武器出现一个月之后,NrsMiner就开始利用其进行攻击。最初的NrsMiner变种并不具备挖矿功能,而是通过泄露的“永恒之蓝”漏洞攻击工具与后门DoublePulsar将目标计算机变成“肉鸡”。图19展示了2017年5月-2017年6月NrsMiner变种控制的计算机趋势。
图19 2017年5月-6月NrsMiner变种控制的计算机趋势
从2017年7月起,NrsMiner开始在受害计算机中植入挖矿机,被NrsMiner控制的计算机也越来越多。图20展示了自2017年7月起被NrsMiner植