“震网二代”蠕虫Duqu病毒分析
发布时间:2011-11-07   作者:启明星辰

受影响版本:
  

所有windows系统

 

病毒描述及原理简介:

 

几个月前Stuxnet蠕虫(震网)病毒因为定向攻击伊朗核电站而一战成名,这种专门针对西门子SCADA系统的恶意软件因为攻击设备和行业受到广泛关注。最近各大反病毒厂商均宣称发现了震网二代蠕虫病毒,又名Duqu。取此名的原因是该蠕虫会在临时目录下生成一些名为~DQ的随机文件名的文件,用于记录用户的敏感和某些特定信息。与Stuxnet蠕虫相比,该蠕虫目前还未发现有专门针对工业系统漏洞的代码,而且也没有像之前的Stuxnet蠕虫那样利用了多个系统漏洞。传播手段目前来看还比较单一,不会大规模传播,而是针对特定的受害者所定制的一个模板。目前该病毒已经感染了伊朗和苏丹的网络。

  

该病毒主要有三个文件组成,一个驱动程序,一个主要的动态库和一个加密的配置文件。而最初释放这三个文件和注册驱动的母体文件目前还未找到。在该病毒中,驱动程序主要负责在系统初始化过程中感染特定的系统进程,从而让其加载动态库文件。之后动态库文件会解密配置文件并实施下载,更新病毒以及偷窃用户敏感信息等动作。

 

驱动程序JMINET7.SYS
  

该驱动的目的是在系统启动的时候激活病毒。该驱动的被注册为如下服务:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\JmiNET3,而且其启动类型为1。从而保证能够在系统启动的时候负责主要功能的动态库NETP191.PNF注入到系统进程中。


另外,在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\JmiNET3\FILTER子健下存放着一组加密的数据,该组数据记录着要注入的进程名称,动态库的路径等。


该注册表子健下面的值解密后为如下结构:


DWORD control[4]
DWORD encryption_key(解密key)
DWORD sizeof_processname(要注入的进程名称长度)
BYTE processname[sizeof_processname](需要注入的进程名称)
DWORD sizeof_dllpath(动态库路径长度)
BYTE dllpath[sizeof_dllpath](动态库路径)

请注意encryption_key这个域,需要注入的动态库是以加密形式存放在磁盘上的,并且在注入之前需要以该key解密并注入到进程中。在默认情况下,该动态库的路径是%SystemDrive%\inf\netp191.pnf,并且会被注入到services.exe进程中。

另外,该驱动还会检查系统是否运行在安全模式以及调试器是否正在运行。
  

该驱动还会注册一个DriverReinitializationRoutine回调例程,并反复调用该回调例程直到检测到Hal.dll的加载为止。 

 

这样便保证了其能够知道操作系统已经初始化到了使其能够注入一个动态库的时点上。

 

之后该驱动通过注册一个PsSetLoadImageNotifyRoutine通知注入动态库。PsSetLoadImageNotifyRoutine函数会在系统加载一个动态库或者exe的时候被调用通知给对应的驱动。如果加载的是kernel32.dll文件,则该驱动通过名称的哈希值列表去获得kernel32.dll上特定的一些api函数地址。如果加载的是services.exe进程,则该驱动就会修改services.exe的入口点函数以便其会在后面加载一些特定的病毒动态库,成为病毒的傀儡进程。

另外该驱动还会注册两个设备
\DEVICE\Gpd1
\Device\{3093AAZ3-1092-2929-9391}

 

主要的动态库NETP191.PNF:
  

NETP191.PNF是主要的加载其他组件的可执行程序。在资源中其包含一个动态库和一个加密的配置文件。该动态库有8个导出函数,均以数字命名。

 

NETP191.PNF还会解密存储在NETP192.PNF中的配置信息。在配置信息中有一个名为“生存期限”的配置,如果该样本已经运行了超过36天的话,则会调用其2号导出函数,2号导出函数进而调用6号导出函数,执行自动清除操作。
  

该病毒会试图解析Microsoft.com的域名以检测是否连接到了互联网上,如果没成功,则会继续试图解析kasperskychk.dyndns.org的域名。并试图将自身注入到以下进程中的一个:

Explorer.exe
Iexplore.exe
Firefox.exe
Pccntmon.exe

其中的RPC功能主要被用于本地消息传递,并可实现如下7种功能:

 

从解密信息中获得版本信息;加载模块并运行其导出函数;加载指定模块;启动进程;读取文件;写文件;删除文件。

 

NETP191.PNF中的资源Resource 302:
  

Resource 302是NETP191.PNF中的一个资源,它是一个动态库。它的主要功能是注入一段代码到一个进程中。这段代码存在于Resource 302的zdata节中。Zdata段是被压缩加密的,包括需要注入的动态库,配置信息等。
  

Resource 302的主函数就是加载一个文件或者代码到内存中。可以形象的看作是一个Loader(加载器)我们可以把该函数表示为
LoadFile(LoadMethod,ProcessName,String);

 

其中LoadMethod是一个从0到3的数字,从而指代特定的代码注入方式。

 

ProcessName是被注入的进程名称。

 

String是传入resource 302的一个参数,通常被设置为0。

 

三种LoadMethod的方式简要介绍如下:

 

0:为了隐藏自身模块,同时为了达到不释放文件来加载病毒模块的目的,它采取了一个特殊方式。病毒会首先hook ntdll的如下函数:

 

ZwQueryAttributesFile
ZwCloseFile
ZwOpen
ZwMapViewOfSection
ZwCreateSection
ZwQuerySection
  

然后,它会构造一个特殊的并不存在的文件名如“随机文件名.nls”,然后以此为参数调用LoadLibrary,正常情况下,该调用会失败因为该文件并不存在,但是因为病毒已经提前Hook了Ntdll,hook函数会监控对此类特殊文件名的打开操作。如果发现是自身构造的虚假文件名,则会重定向到其他位置,比如另一个文件或者通常情况下是一块已经被病毒解密过的内存,这样,外界看到的是“随机文件名.nls”,而实际该文件并不存在。


1:以Suspend方式启动一个程序,修改其内存,然后恢复其线程,达到加载特定动态库的目的。通常被修改的进程是svchost.exe。

 

2:此方法类似于方法1,但在启动程序之前,它试图提升一些权限:

 

首先,它会试图获得如下权限
SeDebugPribilege
SeAssignPrimaryTokenPrivilege
SeCreateTokenPrivilege
如果此时已经可以创建进程,则接下来的工作类似于方法1
如果还没有相应的权限,则会继续试图获得如下权限:
GetKernelObjectSecurity
GetSEcurityDescriptorDACL
BuildExplicitAccessWithName
MakeAbsoluteSD
SetEntriesinACLW
SetSecurityDescriptorDACL
SetKernelObjectSecurity
如果权限还不够,还会继续试图获得如下权限
SeTcbPrivilege
SeAssignPrimaryTokenPrivilege
SeIncreaseQuotaPrivilege
SeImpersonatePrivilege
之后病毒会调用CreateProcessAsUser启动进程。

 

3:将一个已经存在的进程当作傀儡进程加载其动态库。

 

Zdata节:
  

在zdata节中有两个动态库和一个配置文件。其中一个会执行一些后门工作,我们称之为payload dll。当该payload dll被加载到内存的时候,该加密的配置文件才会被解密。zdata中另一个动态库实际上是resourse 302的一个拷贝,但没有zdata节。

 

Zdata dll
  

该动态库是上面说的那个payload dll。由resource dll加载。该动态库拥有后门的一些远程控制功能,可以执行下载或者执行病毒更新的操作。该动态库的远程控制功能是使用HTTPS和SMB协议实现的。

 

其他后门程序
  

Duqu还会不定时下载一些后门程序,比如接下来要说的这个。该后门程序的资源里面包含一个JPEG图片文件,在该图片文件中包含了一个动态库。当该程序运行的时候,该动态库会被解压出来。该动态库会被注入到winlogon或者svchost进程中,在该动态库中会窃取并记录一些本机的敏感信息,并将这些敏感信息保存在临时文件夹内的名为~DQ的文件中,例如~DQ7.tmp。该文件被bzip2和异或加密。被窃取的敏感信息通常包括:

 

1. 进程列表,账户信息
2. 磁盘信息(包括被共享的磁盘)
3. 截屏信息
4. 网络信息(路由表,共享列表等)
5. 键盘监听信息
6. 打开的窗口名称
7. 驱动器上的文件信息(包括移动设备的)
8. 局域网中的其他机器信息

 

同时,该后门病毒会搜索如下反病毒软件进程
avp.exe
Mcshield.exe
avguard.exe
bdagent.exe
UmxCfg.exe
fsdfwd.exe
rtvscan.exe
ccSvcHst.exe
ekrn.exe
tmproxy.exe
RavMonD.exe
如果找到会以Suspend方式启动该进程,之后会向该进程中写入代码,并恢复线程环境,使得这些进程成为病毒最终的傀儡。

 

本文部分内容参照赛门铁克的相关分析文章,病毒分析过程中,受到安天实验室同仁的大力协助。对此表示感谢!

 

漏洞危害:
  

偷窃用户敏感信息

 

解决方案:
  

更新至启明星辰最新事件库

文章来源:启明星辰
  • 公司总部 | 分支机构 | 法律声明 | 投资者关系 | 400-624-3900 800-810-6038
  • © 启明星辰1996-2015 版权所有 京ICP备05032414号 京公网安备11010802024551号