一、 概述
经火绒安全实验室截获、分析、追踪并验证,当用户从百度旗下的和 这两个网站下载任何软件时,都会被植入恶意代码。该恶意代码进入电脑后,会通过加载驱动等各种手段防止被卸载,进而长期潜伏,并随时可以被“云端”远程操控,用来劫持导航站、电商网站、广告联盟等各种流量。
火绒实验室近期接到数名电脑浏览器被劫持的用户求助,在分析被感染电脑时,提取到多个和流量劫持相关的可疑文件:HSoftDoloEx.exe 、bime.dll 、MsVwmlbkgn.sys、LcScience.sys、WaNdFilter.sys,这些可疑文件均包含百度签名。
这些包含恶意代码的可疑文件,被定位到一个名叫nvMultitask.exe的释放器上,当用户在和 这两个下载站下载任何软件时,都会被捆绑下载该释放器,进而向用户电脑植入这些可疑文件。需要强调的是,下载器运行后会立即在后台静默释放和执行释放器nvMultitask.exe,植入恶意代码,即使用户不做任何操作直接关闭下载器,恶意代码也会被植入。
根据分析和溯源,最迟到2016年9月,这些恶意代码即被制作完成。而操纵流量劫持的“远程开关”于近期被开启,被感染的电脑会被按照区域和时段等条件,或者是随机地被“选择”出来,进行流量劫持——安全业界称之为“云控劫持”。
图 1、下载器向用户计算机植入恶意代码
被植入的恶意代码没有正常的用户卸载功能,也没有常规启动项,电脑每次开机时都会启动和更新恶意代码,恶意代码接收C&C服务器指令,行为受云端控制,并且会通过加载驱动,保护相关的注册表和文件不被删除。
因此,这些植入恶意代码的用户电脑成为长期被远程控制的“肉鸡”。
该恶意代码被远程启动后,会劫持各种互联网流量,用户的浏览器、首页、导航站都会被劫持,将流量输送给hao123导航站。同时,还会篡改电商网站、网站联盟广告等链接,用以获取这些网站的流量收入分成(详情在本报告第二章)。
综上所述,该恶意代码本身以及通过下载器植入用户电脑的行为,同时符合安全行业通行的若干个恶意代码定义标准,因此,火绒将这一恶意代码家族命名为“Rogue/NetReaper”(中文名:流量收割者)。升级到“火绒安全软件”最新版本,即可全面查杀、清除该类恶意代码。
图 2、火绒安全软件检测结果
火绒安全软件4.0下载地址:
火绒专杀工具下载地址:
二、 主要劫持行为描述
用户在这两个下载站下载软件后,电脑即被植入“Rogue/NetReaper”恶意代码,在长期的潜伏期过程中,电脑可能发生如下流量劫持情况(按地域和时间等因素云控劫持,或者随机劫持):
1. 导航站劫持:当用户访问其他导航站时,会被劫持到百度hao123导航站。
包括360、QQ、2345、搜狗、猎豹、114la、瑞星……等导航站都会被劫持,劫持后的hao123网址带有百度联盟的推广计费名。
图 3、常见导航站被直接为hao123
2. 首页劫持:把用户电脑首页修改为hao123导航站。
使用IE浏览器的用户,其首页被修改为hao123导航站,并通过百度联盟计费名统计流量。
3. 浏览器劫持:360浏览器替换成IE浏览器或者假IE浏览器。
当发现用户使用360安全浏览器或360极速浏览器时,默认浏览器被修改为IE浏览器,或者修改为假IE浏览器,以躲避安全软件的浏览器保护。无论怎样,被替换后首页都会变成hao123导航站,并通过百度联盟计费名统计流量。
4. 网盟广告劫持:将百度网盟其他渠道计费名换成渠道商猎豹(金山毒霸)。
百度网盟有许多渠道商,这些渠道商都将流量售卖给百度网盟,这个劫持行为是将其他渠道商的推广计费名换成金山的,这样的话,本来应该属于其他渠道的百度网盟推广费用,就被猎豹获得,猎豹再向恶意代码制作者分钱。
图 4、替换百度网盟广告
5. 电商流量劫持:使用IE浏览器访问京东等电商网站时,先跳转到电商导流网站站,然后再跳转回该电商网站。
先跳转到电商导流网站妖猴网(),再返回原购物网站之后,电商网站链接就加上了妖猴网的计费名,电商网站就会按照流量向妖猴网支付推广费用,妖猴网再向恶意代码制作者分钱。
图 5、访问电商网站时会跳转到电商导流网站
三、 概要分析
执行任意从下载到的下载器,不需要进行任何操作,恶意代码就会植入用户计算机。使用火绒剑可以监控植入恶意代码的整个过程,如下图:
图 6、恶意代码首次植入用户计算机流程
恶意代码首次植入用户计算机流程:
1. 下载器执行释放的nvMultitask.exe。目前下载器包含的nvMultitask.exe是0.2.0.1版本,该版本仅会在用户计算机上植入部分恶意代码,如下:
a) 3.2.0.1版的HSoftDoloEx.exe
b) 1.7.0.1版的bime.dll
c) 0.4.0.130 版的LcScience.sys
d) 0.5.30.70 版的WaNdFilter.sys
e) 1.0.0.1020版的npjuziplugin.dll
2. 植入恶意代码成功后nvMultitask.exe使用命令行参数“-inject=install”执行HSoftDoloEx.exe
3. 启动的HSoftDoloEx.exe链接C&C服务器()进行更新,更新的恶意组件将在下次计算机启动后被激活
每次计算机重启,恶意代码都会启动和检查更新:
经过几次更新之后,nvMultitask.exe的会升级到当前最新版本3.2.0.4,后续分析将会以这个版本展开。
最新版本的恶意组件在用户每次开机后都会执行以下流程:
1. LcScience.sys注册进程和映像加载回调将bime.dll分别注入services.exe、explorer.exe、iexplore.exe和其他第三方浏览器进程。
2. 注入services.exe中的bime.dll负责启动HSoftDoloEx.exe
1) HSoftDoloEx.exe链接C&C服务器()检测更新。
2) HSoftDoloEx.exe链接C&C服务器(),获取流量劫持指令。(后续章节进行详细分析)
3. 注入explorer.exe中的bime.dll负责在执行5分钟后链接C&C服务器()下载并加载恶意代码svcprotect.dat到explorer.exe。
4. svcprotect.dat(1.0.0.11)加载后释放两个全新的流量劫持模块:
1) 5.0.0.1版的iexplorer_helper.dat
2) 1.5.9.1098版的iexplore.exe
图 7、恶意代码植入用户计算机流程
1.5.9.1098版的iexplore.exe是一个伪装系统名称的假IE浏览器,我们把这个文件上传到VirusTotal后发现,很多安全软件检测此文件是病毒,如图:
图 8、Virustotal检测的结果
图 9、恶意代码包含百度签名
最终在用户计算机中所有包含恶意代码的文件如下:
四、 详细分析
1. 启动、保护和更新模块分析
1.1 启动
恶意代码有两个重要的启动模块HSoftDoloEx.exe和bime.dll。这两个文件是整组恶意代码的关键项,驱动文件LcScience.sys负责每次开机启动它们。
LcScience.sys(0.4.0.130)注册映像加载通知,排队一个工作例程,如下图:
图 10、排队注入例程
该工作例程会判断启动进程是否需要注入,完整的注入列表如下:
如果满足注入条件,就会注入bime.dll(1.7.0.5)到指定进程。LcScience.sys实现了两种注入方式:一种通过patch系统动态库ntdll.dll的入口将动态库bime.dll注入到制定进程;另一种则是通过patch系统动态库ntdll.dll的NtTestAlert函数实现注入bime.dll到指定进程,相关代码如下图:
图 11、选择注入方式
bime.dll(1.7.0.5)注入到services.exe、explorer.exe、iexplorer.exe和其他浏览器进程后,会根据宿主进程名称不同,会执行不一样的流程。
注入到services.exe系统进程bime.dll,在系统开机运行services.exe后,以"-inject=start"参数执行HSoftDoloEx.exe。在explorer.exe中的bime.dll(1.7.0.5)也会随着“桌面”程序的启动,一同被激活。bime.dll还会随着用户启动的浏览器一并启动,如下图:
图 12、恶意代码启动流程图
1.2 保护
WaNdFilter.sys(0.5.30.70)同LcScience.sys(0.4.0.130)都使用了注册表回调保护自己的注册表启动项不被删除,除此以外WaNdFilter.sys(0.5.30.70)还有两个保护点,如下图所示:
图 13、文件保护逻辑
图中标明file_needs_protect_1 函数负责保护“WaNdFilter.sys”、“LcScience.sys”和“MsVwmlbkgn.sys”这几个文件不被删除,标明file_needs_protect_2 函数会阻止特定进程不能访问恶意代码指定的文件列表。
WaNdFilter.sys阻止的特定进程如下表:
恶意代码指定的文件列表的在我们的实验环境中并未得到。
1.3 更新
不同版本nvMultitask.exe释放的恶意代码在功能上存在差异。本文分析的是当前最新版本3.2.0.4。每次计算机重启恶意代码都会执行更新,升级到最新版本需要经过以下流程。
1. 开机后执行HSoftDoloEx.exe,HSoftDoloEx.exe会向服务器发送升级请求,每次请求返回的都不是最新版本,一般来说从下载器自带的0.2.0.1版本需要至少重启三次计算机 ,才可以更新到3.2.0.4版本。
图 14、恶意代码释放器升级流程
2. 除了HSoftDoloEx.exe会向服务器发送请求更新以外,3.2.0.4版的nvMultitask.exe中包含的1.7.0.5版的bime.dll ,会在注入系统进程Explorer.exe之后,也会向服务器发送请求。
3. 请求得到的数据是一段Base64编码后的字符串,解码后可以得到win_32_1.0.0.11.dat的下载地址后开始下载。这是一个新出现的恶意代码。
4. win_32_1.0.0.11.dat是加密的32位版本的svcprotect.dat(1.0.0.11)。
5. bime.dll解密后调用svcprotect.dat名为“Run”的导出函数,释放恶意代码“iexplorer_helper.dat” (5.0.0.1)
6. svcprotect.dat还会检查当前系统中是否存在“C:\ProgramData\userdata\data.dat”这个文件,如果不存在或者该文件最后写入时间距今相差30天以上,svcprotect.dat就会在“%HOMEPATH%\AppData\Roaming\{E233850D-5D6E-48E3-98B5-8049F7E9FC68}”目录中释放假iexplore.exe(1.5.9.1098)。“C:\ProgramData\userdata\data.dat”是一个0字节文件,会在svcprotect.dat第一次释放iexplore.exe后被svcprotect.dat创建。
svcprotect.dat释放的文件都包含在它的PE资源中,如图:
图 15、svcprotect.dat中包含的二进制资源
FILE_0068_0804对应iexplore.exe(1.5.9.1098),FILE_0069_0804对应iexplorer_helper.dat(5.0.0.1)。至此所有恶意代码已经全部植入用户计算机了。
如果升级服务器不返回请求数据(此处由云端控制),也可以在安装了nvMultitask.exe 0.2.0.1版本计算机上,直接运行nvMultitask_3.2.0.4.exe的安装包(MD5: 4bf77866e8a851a2fa7d4088b85be126),同样会更新到最新版的恶意代码。但是会缺少两个关键组件iexplorer_helper.dat(5.0.0.1)和svcprotect.dat(1.0.0.11)。
HSoftDoloEx.exe和C&C服务器通信的请求升级流程如下表:
图 16、HsoftDoloEx和C&C服务通信流程
图 17、C&C服务器返回的base64解码后数据
2. 用户态流量劫持模块
bime.dll会被注入到explorer.exe进程,在其等待5分钟之后会加载恶意模块svcprotect.dat。svcprotect.dat会释放另一个恶意模块iexplorer_helper.dat和一个假iexplore.exe,二者分别实现不同流量劫持功能:
1. 针对用户浏览器首页的劫持:
在Explorer.exe中的svcprotect.dat Hook了的CreateProcessW劫持浏览器首页流量,此外svcprotect.dat还会直接启动假iexplore.exe替换用户运行的浏览器完成首页劫持。
2. 针对用户访问购物网站做流量劫持:
svcprotect.dat释放的出来的iexplorer_helper.dat会针对系统IE浏览器劫持某购物网站流量。
负责用户态流量劫持的模块列表:
负责用户态流量劫持的C&C服务器
C&C服务器
2.1 svcprotect.dat劫持模块分析
加载到explorer.exe中的svcprotect.dat会向服务器发送请求获取控制指令。
svcprotect.dat和C&C服务器通信流程如下表:
图 18、svcprotect.dat和C&C服务器通信流程
图 19、解码服务器返回的数据为二进制格式
图 20、通过XOR 0x29得到的JSON格式的控制指令
图 21、控制指令的完整列表
通过C&C服务器得到的JSON各键名含义:
svcprotect.dat根据接收到的云控指令,判断用户启动的浏览器是否匹配劫持条件,如果匹配则会选择对应的劫持方法。其流量劫持的手法一共分为三种:
1. 将用户启动的浏览器劫持为假IE:
在用户双击浏览器快捷方式(包括带网址参数和不带网址参数两种)或者通过explorer直接启动浏览器时(当前只劫持通过“Win+R”方式启动的浏览器,直接启动浏览器的可执行文件不会被劫持),只要配置文件中对应的概率命中,就会将当前启动浏览器替换为假IE。当然这样的劫持手法过于明显,很容易引起用户警觉,所以劫持为假IE的概率很低。
图 22、假IE访问其默认首页
2. 劫持浏览器的命令行启动参数:
在用户启动无命令行参数的浏览器快捷方式时,如果配置文件中对应的概率命中,则会添加带有自己计费号的百度搜索网址参数,如果启动的浏览器是系统IE,劫持网址就是带有计费号的hao123链接。针对360安全浏览器和360极速浏览器这种当启动参数为其他导航站时,就会跳转到的浏览器,劫持网址就是带有计费号的百度搜索链接。
图 23、劫持浏览器参数
3. 将启动的第三方浏览器替换为系统IE:
用户双击浏览器快捷方式(包括带网址参数和不带网址参数两种)或者通过explorer.exe直接启动时,如果“per”键值中的概率没有命中,则会继续使用“perie”键值中的概率进行第二次随机。如果命中第三方浏览器替换为系统IE。这种手法主要用于当第三方浏览器启动参数为hao123导航时,为了保住这些流量不会因为使用其他第三方浏览器而跳转到其他导航站(如:),所以将第三方浏览器替换为系统IE,从而保护其固有流量。
图 24、劫持逻辑流程图
svcprotect.dat 释放的假IE
因为当360安全浏览器和360极速浏览器的启动参数为时,会默认打开,所以为了更加彻底地劫持流量,svcprotect.dat中的恶意代码会将这两款浏览器替换为假IE,从而达到其劫持目的。除了启动后会默认打开hao123导航外,当假IE的启动参数为百度搜索时,其实际使用的计费号依然为自己的计费号(如下图,在访问网址时我们可以看到上述网址在浏览器标题栏中一闪而过)。
图 25、假IE访问百度搜索
2.2 iexplorer_helper.dat劫持模块分析
注入浏览器的bime.dll会加载iexplorer_helper.dat组件,调用iexplorer_helper.dat动态库的"Run"导出函数后执行以下操作:
1. 启动rundll32.exe,加载iexplorer_helper.dat,调用参数为Init
图 26、rundll32.exe启动的iexplorer_helper.dat
2. 向C&C服务器发送获取控制指令,一共发送三个请求:
1) 请求获取的云控指令,我们命名为hijack_cmd1。
2) 请求获取云控指令,我们命名为hijack_cmd2。
3) 请求获取云控指令,我们命名为hijack_cmd3。
+
图 27、iexplorer_helper.dat和C&C服务器通信
iexplorer_helper.dat和C&C服务器通信流程如下表:
图 28、iexplorer_helper.dat和C&C服务器通信流程
图 29、解码服务器返回的数据为二进制格式
图 30、通过XOR 0x9C得到的JSON格式的控制指令
图 31、控制指令的完整列表
图 32、iexplorer_helper.dat和C&C服务器通信流程
图 33、解码服务器返回的数据为二进制格式
图 34、通过XOR 0x9C得到的JSON格式的控制指令
图 35、控制指令的完整列表
图 36、iexplorer_helper.dat和C&C服务器通信流程
图 37、通过XOR 0x9C得到的JSON格式的控制指令
hijack_cmd3没有请求后没有得到对应数据,但是会保存从服务器请求到的base64编码指令到%HOMEPATH%\AppData\Local\ProgramData\iehlp.dat。其余两组的指令保存在内存没有在本地保存,对应的含义如下:
通过C&C服务器得到hijack_cmd1的JSON各键名含义:
通过C&C服务器得到hijack_cmd2的JSON各键名含义:
每个浏览器都会加载中iexplorer_helper.dat启动rundll32.exe执行iexplorer_helper.dat的Init函数。但是如果启动的进程是iexplorer.exe。注入iexplorer_helper.dat会和rundll32.exe进程通信,将IE地址栏的访问地址劫持交给rundll32.exe进行分析,如果满足劫持条件跳转网址发送给iexplorer。进行劫持。
图 38、进程通讯流程图
图 39、劫持jd.com添加推广号
3. 内核态流量劫持模块
HSoftDoloEx.exe接收C&C服务器云控指令发送给MsVwmlbkgn.sys进行HTTP收发包的流量劫持。从C&C服务器接收到的云控指令包含了普通导航站的劫持和百度网盟广告的劫持。
在x64系统zethelpEx64.exe(3.2.0.3)负责发送云控指令给MsVwmlbkgn.sys。
内核态负责流量劫持的模块列表:
内核态负责流量劫持的云控指令文件:
内核态负责流量劫持的C&C服务器指令接口:
3.1 云控指令获取
HSoftDoloEx.exe连接C&C服务器()得到的加密的云控指令,解密后通过API函数DeviceIoControl,发送给设备“\\.\{D87A9329-ED85-49C3-A8D2-534474363333}”对应的驱动程序”MsVwmlbkgn.sys“。
HSoftDoloEx.exe通过C&C服务器获取运控制令流程:
图 40、HSoftDoloEx.exe和C&C服务器通信流程
请求格式如下:
3.2 云控指令解密
从C&C服务器返回的http:\\d.qyllq.net\DB\iecomv2.7z"下载地址是一个压缩文件。HSoftDoloEx.exe下载后解压文件到%HOMEPATH%\AppData\Roaming \Internet Explorer目录,一共三个文件分别是cfg.dat、iecompa.dat和iecompb.dat。
除cfg.dat是明文保存云控指令版本外。其余的iecompa.dat和iecompb.dat都是加密过的二进制数据。
iecompa.dat(后文简称指令A)和iecompb.dat(后文简称指令B)的格式如下:
图 41、iecompa.dat XOR 0xB5后得到的控制指令
图 42、iecompb.dat XOR 0xB5后得到的控制指令
图中前0x16个字节中蓝色框中内容和版本相关,绿色是指令长度,黄色是校验和。在0x16字节后面的数据XOR 0xB5,就可以得到为被加密的具体指令。
指令A(iecompa.dat)
图 43、控制指令的完整列表(指令A)
指令B(iecompb.dat)
图 44、控制指令的完整列表(指令B)
获取云控指令后的HSoftDoloEx.exe使用DeviceIoControl函数和MsVwmlbkgn.sys进行通信。一共有三组控制码(HSoftDoloEx.exe版本3.2.0.4,MsVwmlbkgn.sys版本0.6.60.70),分别是:
a. 222000 发送指令A的内容给MsVwmlbkgn.sys
b. 222004 发送指令B的内容给MsVwmlbkgn.sys
c. 222008 控制流量劫持功能的开关
目前3.2.0.4版HSoftDoloEx.exe还没有使用222008这个控制码, 因为在0.6.60.70版本的MsVwmlbkg.sys中,流量劫持功能默认为开。
“指令A”和“指令B” 分工合作, 在指令A中不同的劫持类型对应指令B给出不同处理劫持方案,根据具体的劫持内容可以分为三种情况,不同的劫持方案在下文会有详细分析:
图 45、劫持指令说明
3.3 劫持流程
MsVwmlbkgn.sys是一个WFP驱动程序,该驱动会向WFP FWPM_LAYER_STREAM_V4和FWPM_LAYER_STREAM_V6注册Callout(我们标记为wfp_classify_callout)来分别过滤IPv4和IPv6的TCP数据流:
图 46、注册IPv4和IPv6数据流过滤Callout
wfp_classify_callout中会调用http_hijack函数对TCP发送和接收的数据进行协议分析并按照一定的逻辑进行劫持:
图 47、wfp_classify_callout函数
http_hijack函数中,根据HSoftDoloEx.exe接收C&C服务器云控指令对收发数据有选择地进行劫持,具体劫持流程如下:
图 48、内核态劫持流程图
3.3.1 发包流程
MsVwmlbkgn有一个全局开关决定是开启劫持功能,这个全局开关在MsVwmlbkgn中由控制码222008进行控制(70版本默认是打开的,上层没有对应控制的流程)。
除了全局开关以外,MsVwmlbkgn还会根据请求包中“Host”字段的网址,在C&C服务器给出的指令中查找,根据指令有不同的处理方式,C&C给出的指令包含:需要劫持的网站、劫持概率、使用何种方式劫持和浏览器名称。
图 49、发包流程判断逻辑1
如果请求的URL在C&C服务器返回的劫持列表中,接下来驱动还会对当前发起进程进行判断,最后再计算C&C服务器返回的对当前URL的劫持概率。
图 50、发包流程判断逻辑2
如果上述判断逻辑均通过,则会根据C&C服务器返回的针对当前请求URL的劫持类型,有选择地分别执行两类劫持逻辑:
标记为“2”的劫持方式:
首先将要劫持到的目标URL保存在redir_url。接下来,将当前HTTP Flow的句柄保存在flowHandle_lo/hi,在收包劫持流程中做判断使用。
图 51、保存收包劫持所需数据
MsVwmlbkgn会保留请求包中原始”Host“地址,在地址前添加“http://”子串后进行base64编码,在编码后的字符串前添加"&s=",构成一个新的字符串,结果保存在url_from_http_get_request。恶意代码制造者会通过该字符串统计截取流量的来源。
以“http://hao.qq.com/ ”为例,转换后”&s=aHR0cDovL2hhby5xcS5jb20vIA==“,保存该字符串在对应的应答包中使用,用于服务器后台统计。
图 52、分析HTTP发送请求完整URL
图 53、拼接劫持来源统计信息
标记为“8”的劫持方式:
如果是方式“8”直接添加插入一个请求数据包,在”Host“地址后面修改推广号,具体实现在construct_send_hijack_packet中完成。
图 54、发包劫持流程
3.3.2 收包流程
如果当前HTTP Flow为发包时记录下的需要被劫持的Flow (flowHandle_lo/hi与当前句柄相同),则表示这个收到的HTTP数据是需要被劫持的。这时,则会在应答流程中插入一个302重定向应答包,并将重定向地址指向redir_url,且将劫持来源统计信息(url_from_http_get_request)同时拼接到重定向URL中。
图 55、收包劫持流程
图 56、拼接302重定向应答包
以用户访问“http://hao.qq.com/ ”为例,经过内核态劫持后,真正的访问链接就变成了“https://www.hao123.com/?tn=70000000_o2_hao_ss&s=aHR0cDovL2hhby5xcS5jb20vIA==”
3.3.3 百度网盟广告劫持
通过云控指令一节中可以看到,指令A中劫持的网站列表中绝大多数都是导航站,但是最后两个却是百度网盟的广告js脚本,劫持关系如下表:
用户访问有投放百度广告的网站时,恶意代码会劫持百度广告,具体流程如下:
1. 和是用于展示从百度网盟获取广告的js脚本。
2. 访问带有百度广告脚本的网站时,步骤1的“c.js”脚本被劫持替换成或。
3. 步骤2的PHP页面会继续跳转到,得到”c3w.js”脚本。
4. 继续跳转到,得到”cw3.js”脚本。
5. ”cw3.js”脚本就是最终得到负责劫持的百度网盟广告的js脚本。
图 57、百度网盟广告劫持流程图
“cw3.js”脚本劫持百度网盟广告的流程如下:
1. 首先拼接劫持到的目的网址,这些网址都是跳转链接:
跳转后的广告页面为带有计费号的“http://duba.com/union2.html“:
图 58、劫持后的广告链接
2. 查找页面中的iframe标签,判断链接是否是”pos.baidu.com”并且不是”duba”:
for (var M = 0; M < H.length; M++) {
var D = H[M].id;
if (D == null
(网视站,专业提供浏览器下载)