时提示无法写入npfsys个文件 (npf.sys无法写入)

引言

近期,360安全中心发现,“隐魂”木马再度活跃,并在原有基础上新增蠕虫模块,使用永恒之蓝漏洞利用模块在内网大肆扩散,迅速组建了一个规模庞大的僵尸网络。“隐魂”是迄今为止最为复杂的病毒木马,具有很强的隐蔽性和潜伏性,极强的传播能力,同时具有灵活的拓展性,病毒作者可以随时更新不同的病毒模块。

“隐魂”携带的病毒模块绝大多数都采用自定义的NE,NS文件格式的动态库(均为变异的PE文件格式),在运行过程中多利用系统进程(rundll32.exe,svchost.exe等)作为傀儡进程,通过各种注入技术将动态库注入系统进程进行执行,这种方式使得病毒一旦运行之后就无法通过主动防御来拦截后续的病毒行为。此外,该病毒还采用sstp,sltp等网络协议进行病毒传播和更新,挖矿协议采用stratum+ssl加密协议,而不是传统的http和stratum+tcp协议,能躲避很大一部分安全软件的检测。

在成功感染用户电脑之后,“隐魂”会下发诸多“牟利”的病毒模块,下发的病毒模块由云端控制,且随着配置文件的更新,病毒模块的类型也在持续增多,已经发现的病毒模块有劫持浏览器主页,通过修改UDP网络包实现DNS劫持,盗取QQ,YY,LOL账号密码,挖矿等诸多病毒行为。

“隐魂”采用经典的BootKit三层架构,从病毒感染到病毒启动,涉及到应用层,内核,引导区三个层面,覆盖了磁盘,网络,操作系统等多方面的知识,而且每一层之间的衔接都处理的恰到好处。由此我们推测,在“隐魂”背后,隐藏着一个非常专业的黑客团伙。

利用“永恒之蓝”大肆传播

“隐魂”最早是通过色情播放器进行传播(相关报告参考:史上反侦察力最强木马“隐魂”:撑起色情播放器百万推广陷阱),曾在短短两周内达到上百万次的病毒感染量,已经是迄今为止传播最快的MBR木马,而我们近期发现,最新的隐魂变种新增了永恒之蓝的漏洞利用模块,在原有的传播基础上又增加了内网的横向扩散能力,使隐魂的传播能力更进一步。

如上图所示,当受害者A安装了携带“隐魂”木马的色情播放器时就会被感染,感染后会利用“永恒之蓝”漏洞利用模块攻击与受害者A在同一网段的机器,当这些机器存在“永恒之蓝”漏洞并被成功入侵后,就会被进一步感染,反之,如果有一部分机器已经修复此漏洞或未被成功利用,则不会感染“隐魂”木马。

如上图所示,被隐魂感染的受害者机器A会在本地生成一个电脑WEB服务器,监听本地9000端口,网站目录为000c,目录下会生成一个brp.exe的病毒程序(隐魂从内核开始便使用一种Mixed ROMFS的文件系统格式,并且所有病毒文件均在内存中,在本地文件系统中无法检测到此文件),然后通过永恒之蓝漏洞攻击内网机器,漏洞成功利用之后会执行sc.bin,这部分shellcode会通过WEB服务器下载并执行brp.exe,brp.exe是感染“隐魂”的引导程序,执行后会下载core.sdb感染包进一步感染受害者机器B。

“隐魂”搭建WEB服务器,并生成病毒文件brp.exe到000c目录下(brp.exe文件的shared节保存加密的配置信息),相关逻辑如下:

在本地检测上述WEB服务器:

“隐魂”携带的永恒之蓝漏洞利用模块是由NSA泄露的漏洞利用脚本修改而来,相关代码的相似性比较如下图所示:

电脑

引导区感染流程

在成功利用“永恒之蓝”漏洞入侵内网中的机器后,shellcode(sc.bin)会下载brp.exe到内存执行,brp.exe文件属性如下图所示:

brp.exe执行后会先在内存解密一个NE文件格式的动态库sub_ne.dll并加载,sub_ne.dll会向WEB服务器下载core.sdb后续感染包(CAB压缩格式),解压其中的/bin/i386/core.sdb动态库并通过插APC的方式注入到系统进程%Systemroot%\\system32\\dllhost.exe中。

core.sdb会检测当前运行坏境,若存在内核调试和一些安全分析工具,则会直接退出,反之则通过sltp协议下载并执行后续感染模块setup.bin,代码逻辑如下图所示:

电脑

setup.bin包含两部分病毒代码,preload和coredll.bin,其中preload为公共代码,用于加载后续模块。coredll.bin解压/pkg/sputnik.spk(!rsi压缩文件)中的coredll.bin(后续模块多处出现重复命名,为方便区分,以下简称sputnik_coredll.bin)并将其通过设置线程上下文的方式注入到系统进程中,关键代码如下:

sputnik_coredll.bin有三个分支netscan.api(蠕虫),cloudcompute.api(挖矿)和deepfreeze.api,其中deepfreeze.api负责进一步感染MBR。

deepfreeze.api先加载带有数字签名的病毒驱动:

rdpci21.sys的文件信息,如下图所示:

该驱动是病毒作者精心构造,能够在内核执行任意代码,相关代码如下:

其中func_tbl如下图所示:

其中函数调用关系如下:

第三次调用的shellcode会加载另外一个读写磁盘的驱动NPFDrv2.sys(自定义NS文件格式):

解析并修复NS文件格式,获取驱动入口点地址:

加载驱动:

NPFDrv2.sys驱动创建设备对象\Device\NPF-{0179AC45-C226-48e3-A205-DCA79C824051}与应用层交互,并为驱动注册关机回调:

之后deepfreeze.api会加载kpinst.bin,该模块负责在应用层构造感染MBR相关的数据,并将其发送给内核:

关机回调触发后,NPFDrv2驱动会将这部分数据写入磁盘,MBR感染完成。

“隐魂”木马启动流程

感染后的主引导分区如下图所示,病毒通过patch的方式劫持MBR执行的三处流程,巧妙的引导后续病毒代码执行:

0x7c00地址的病毒代码将自身拷贝到0x600地址执行,将加密的原始MBR拷贝到0x7c00地址并解密,申请高端地址,并将病毒代码拷贝到高端地址执行(这部分流程过于繁琐,基于文章篇幅限制,此处不再赘述),之后会随着windows系统的启动顺序挂钩不同位置的系统函数,以此获得执行权限,各位置挂钩函数及其作用,如下图所示:

下面详解其中几处关键挂钩位置,挂钩INT 13中断:

挂钩startup.com:

挂钩bootmgr.exe,挂钩位置为bootmgr! ImgpLoadPEImage函数调用LdrRelocateImage函数处:

挂钩Winload.exe,挂钩位置同样是ImgpLoadPEImage函数调用LdrRelocateImage位置,并在此处对32位系统和64位系统做了兼容:

挂钩ntosknrl.exe,先在ntosknrl内存中搜索一段可用的空白内存,将病毒代码拷贝到这段内存中备用,之后挂钩IoInitSystem函数调用IopInitializeBootDrivers函数的位置,挂钩此处可以让病毒驱动最先启动,代码逻辑如下:

当nt!IoInitSystem挂钩触发之后,病毒代码获得执行权限,经过多次跳转,最终解压出一个Mixed Romfs文件系统,开始加载病毒底层模块,先加载其中的/bin/amd64/bootmgr模块,bootmgr解析并加载核心模块/bin/amd64/kernel。

内核Rootkit阶段

Kernel是病毒在内核层工作的核心,其主要功能如下:

(1)根据pdb特征和数字签名特征对抗安全软件,相关特征有“WT.OnLine Technology”,“Qihoo 360”,“gmer.pdb”,“Win64AST.pdb”。

(2)注册关机回调,在关机时检查并回写MBR。

(3)Kernel通过注册映像加载回调,监控系统模块加载,并将病毒代码通过KeInsertQueueApc注入到svchost.exe进程内,完成对应用层病毒的引导。相关注入代码,如下图所示:

应用层“牟利”阶段

Stub.bin引导加载应用层核心模块subsystem,该模块使用sstp协议来更新病毒,通过config.js中的配置加载不同的病毒分支:

“隐魂”的拓展性极强,可以通过配置文件随意加载新的病毒模块,以下是我们已经发现的病毒分支:

dataspy.api

该分支通过dataspy.js配置文件对不同的进程注入相应的盗号模块,其中包括多玩YY,腾讯QQ等主流通讯软件。dataspy.js配置信息如下:

我们以“隐魂”盗取YY账号为例,分析其盗号细节。yyd.bin通过LdrRegisterDllNotification注册dll加载通知,当yy.exe进程首次加载appmain.dll,qtgui4.dll,duifw.dll几个模块时,该回调函数被调用,代码逻辑如下图所示:

首先定位挂钩位置,从动态库的可执行节开始,搜索对??0QString@@QAE@PBD@Z函数的调用,然后向上搜索特征码0x68(push指令),判断push的变量是否为passwordLineWidget,如果是,则会进一步调用反汇编引擎判断当前指令长度是否为6(FF 15 C4 D5 0C 30),若是,则定位完成,之后挂钩该位置,相关代码,如下图所示:

下图是“隐魂”搜索YY各模块的挂钩位置时使用的特征:

挂钩的病毒函数会安装键盘钩子,监视用户的击键记录,盗取用户YY账号和密码。

resetid.api

该分支会通过读取用户配置文件的方式,窃取用户的QQ账号,YY账号等,判断用户安装的QQ版本:

从Registry.db中窃取相关数据:

盗取YY账号:

browser.api

该模块通过挂钩CreateProcessW函数,在浏览器进程创建时,通过添加命令行的方式将浏览器主页劫持到http://site.2017nav.com,相关代码,如下图所示:

dnshijack.api

该模块通过挂钩sendto,recvfrom函数,实现DNS流量的劫持,篡改域名与IP地址的对应关系,牟取流量利益,相关代码如下图所示:

劫持的网站多为导航站,数量多达85个,都被劫持到43.229.113.51这个IP地址上。被劫持的网址列表如下图所示:

cloudcompute.api

该模块为挖矿模块,且已于2018年6月被友商披露,详细分析请参考“隐蜂”相关报告。最新挖矿相关的配置信息如下图所示:

小彩蛋

之所以称之为“彩蛋”,是因为我们在分析过程中发现一个kernelbase.bin的动态库,该动态库集成了开源远程控制软件MeshAgent的部分代码,功能还比较单一,应该还处于开发阶段,但是随着“隐魂”的更新,该模块必将成为“隐魂”幕后的黑客团伙控制僵尸主机的一大利器。

MeshAgent 是MeshCentral 的节点代理程序(background management agent),运行后会连接到MeshCentral 控制中心,在MeshCentral 控制界面,可以点击桌面,终端和文件选项,在计算机上执行远程控制。MeshCentral控制界面如下图所示:

相关代码的相似性比较,如下图所示(左图为“隐魂”的kernelbase.bin模块,右图为MeshAgent项目在github网站上的源码):

总结与建议

“隐魂”木马是迄今为止最为复杂的木马病毒,隐藏在其背后的黑客团队专业程度很高, 在潜伏了近一年之后,在利益的驱使下,再次悄无声息的利用病毒兴风作浪,就如它的名字一样,像一个隐藏于黑夜之中的幽魂,随时可能因为自身利益而剥夺他人利益。

“隐魂”木马隐蔽性很强,查杀难度很高,目前能查杀此类木马的杀毒软件极少。360安全卫士支持查杀此类病毒,并能完美修复被病毒篡改的MBR分区,如有中毒用户请下载查杀。

下载地址:http://dl.360safe.com/inst.exe

IoCs:

参考报告:

1,《史上反侦察力最强木马“隐魂”:撑起色情播放器百万推广陷阱》

2,《“隐魂”木马篡改主页分析:史上反侦察力最强木马的犯罪素描》

3,“永恒之蓝”漏洞利用脚本:

https://github.com/worawit/MS17-010/blob/master/eternalblue_exploit7.py

4,MeshAgent源码:

https://github.com/Ylianst/MeshAgent


电脑