2.1 运行环境
Stuxnet蠕虫在下列操作系统中可以激活运行:
Windows 2000、Windows Server 2000
Windows XP、Windows Server 2003
Windows Vista
Windows 7、Windows Server 2008
当它发现自己运行在非Windows NT系列操作系统中,即刻退出。
被攻击的软件系统包括:
SIMATIC WinCC 7.0
SIMATIC WinCC 6.2
但不排除其他版本的WinCC被攻击的可能。
2.2 本地行为
样本被激活后,典型的运行流程如图1所示。
样本首先判断当前操作系统类型,如果是Windows 9X/ME,就直接退出。
接下来加载一个主要的DLL模块,后续要执行的代码大部分都在其中。为了躲避反病毒软件的监视和查杀,样本并不将DLL模块释放为磁盘文件,而是直接拷贝到内存中,然后模拟正常的DLL加载过程。
具体而言,样本先申请一块内存空间,然后Hook ntdll.dll导出的6个系统函数:
ZwMapViewOfSection
ZwCreateSection
ZwOpenFile
ZwClose
ZwQueryAttributesFile
ZwQuerySection
为此,样本先修改自身进程内存映像中ntdll.dll模块PE头的保护属性,然后将偏移0x40字节处的一段数据改写为跳转代码表,用以实现对上述函数的hook。
进而,样本就可以使用修改过的ZwCreateSection在内存空间中创建一个新的PE节,并将要加载的DLL模块拷贝到内存中,最后使用LoadLibraryW来获取模块句柄。
图1 样本的典型运行流程
此后,样本跳转到被加载的DLL中执行,衍生下列文件:
%System32%\drivers\mrxcls.sys
%System32%\drivers\mrxnet.sys
%Windir%\inf\oem7A.PNF
%Windir%\inf\mdmeric3.PNF
%Windir%\inf\mdmcpq3.PNF
%Windir%\inf\oem6C.PNF
其中有两个驱动程序mrxcls.sys和mrxnet.sys,分别被注册成名为MRXCLS和MRXNET的系统服务,实现开机自启动。这两个驱动程序都使用了Rootkit技术,并使用了数字签名。
mrxcls.sys负责查找主机中安装的WinCC系统,并进行攻击。具体地说,它监控系统进程的镜像加载操作,将存储在%Windir%\inf\oem7A.PNF中的一个模块注入到services.exe、S7tgtopx.exe、CCProjectMgr.exe三个进程中,后两者是WinCC系统运行时的进程。
mrxnet.sys通过修改一些内核调用来隐藏被拷贝到U盘的lnk文件和DLL文件(图2)。

图2 驱动程序隐藏某些lnk文件
2.3 传播方式
Stuxnet蠕虫的攻击目标是SIMATIC WinCC软件。后者主要用于工业控制系统的数据采集与监控,一般部署在专用的内部局域网中,并与外部互联网实行物理上的隔离。为了实现攻击,Stuxnet蠕虫采取多种手段进行渗透和传播,如图3所示。

图3 样本的多种传播方式
整体的传播思路是:首先感染外部主机;然后感染U盘,利用快捷方式文件解析漏洞,传播到内部网络;在内网中,通过快捷方式解析漏洞、RPC远程执行漏洞、打印机后台程序服务漏洞,实现联网主机之间的传播;最后抵达安装了WinCC软件的主机,展开攻击。
1. 快捷方式文件解析漏洞(MS10-046)
这个漏洞利用Windows在解析快捷方式文件(例如.lnk文件)时的系统机制缺陷,使系统加载攻击者指定的DLL文件,从而触发攻击行为。具体而言,Windows在显示快捷方式文件时,会根据文件中的结构信息寻找它所需的图标资源,并将其作为文件的图标展现给用户。如果图标资源在一个DLL文件中,系统就会加载这个DLL文件。攻击者可以构造一个这样快捷方式文件,使系统加载他指定的恶意DLL文件,从而触发后者中的恶意代码。快捷方式文件的显示是系统自动执行,无需用户交互,因此漏洞的利用效果很好。
Stuxnet蠕虫搜索计算机中的可移动存储设备(图4)。一旦发现,就将快捷方式文件和DLL文件拷贝到其中(图5)。如果用户将这个设备再插入到内部网络中的计算机上使用,就会触发漏洞,从而实现所谓的“摆渡”攻击,即利用移动存储设备对物理隔离网络的渗入。

图4 查找U盘

图5 拷贝文件到U盘
拷贝到U盘的DLL文件有两个:~wtr4132.tmp和~wtr4141.tmp。后者Hook了kernel32.dll和ntdll.dll中的下列导出函数:
FindFirstFileW
FindNextFileW
FindFirstFileExW
NtQueryDirectoryFile
ZwQueryDirectoryFile
实现对U盘中lnk文件和DLL文件的隐藏。因此,Stuxnet一共使用了两种措施(内核态驱动程序、用户态Hook API)来实现对U盘文件的隐藏,使攻击过程很难被用户发觉,也能一定程度上躲避杀毒软件的扫描。
2. RPC远程执行漏洞(MS08-067)与提升权限漏洞
这是2008年爆发的最严重的一个微软操作系统漏洞,具有利用简单、波及范围广、危害程度高等特点。

图6 发动RPC攻击
具体而言,存在此漏洞的系统收到精心构造的RPC请求时,可能允许远程执行代码。在Windows 2000、Windows XP和Windows Server 2003系统中,利用这一漏洞,攻击者可以通过发送恶意构造的网络包直接发起攻击,无需通过认证地运行任意代码,并且获取完整的权限。因此该漏洞常被蠕虫用于大规模的传播和攻击。
Stuxnet蠕虫利用这个漏洞实现在内部局域网中的传播(图6)。利用这一漏洞时,如果权限不够导致失败,还会使用一个尚未公开的漏洞来提升自身权限(图1),然后再次尝试攻击。截止本报告发布,微软尚未给出该提权漏洞的解决方案。
3. 打印机后台程序服务漏洞(MS10-061)
这是一个零日漏洞,首先发现于Stuxnet蠕虫中。
Windows打印后台程序没有合理地设置用户权限。攻击者可以通过提交精心构造的打印请求,将文件发送到暴露了打印后台程序接口的主机的%System32%目录中。成功利用这个漏洞可以以系统权限执行任意代码,从而实现传播和攻击。

图7 利用打印服务漏洞
Stuxnet蠕虫利用这个漏洞实现在内部局域网中的传播。如图7所示,它向目标主机发送两个文件:winsta.exe、sysnullevnt.mof。后者是微软的一种托管对象格式(MOF)文件,在一些特定事件驱动下,它将执行winsta.exe,也就是蠕虫自身。
2.4 攻击行为
Stuxnet蠕虫查询两个注册表键来判断主机中是否安装WinCC系统(图8):
HKLM\SOFTWARE\SIEMENS\WinCC\Setup
HKLM\SOFTWARE\SIEMENS\STEP7

图8 查询注册表,判断是否安装WinCC
一旦发现WinCC系统,就利用其中的两个漏洞展开攻击:
一是WinCC系统中存在一个硬编码漏洞,保存了访问数据库的默认账户名和密码,Stuxnet利用这一漏洞尝试访问该系统的SQL数据库(图9)。
二是在WinCC需要使用的Step7工程中,在打开工程文件时,存在DLL加载策略上的缺陷,从而导致一种类似于“DLL预加载攻击”的利用方式。最终,Stuxnet通过替换Step7软件中的s7otbxdx.dll,而将原来的同名文件修改为s7otbxsx.dll,并对这个文件的导出函数进行一次封装,从而实现对一些查询、读取函数的Hook。

图9 查询WinCC的数据库
2.5 样本文件的衍生关系
本节综合介绍样本在上述复制、传播、攻击过程中,各文件的衍生关系。
如图10所示。样本的来源有多种可能。
对原始样本、通过RPC漏洞或打印服务漏洞传播的样本,都是exe文件,它在自己的.stud节中隐形加载模块,名为“kernel32.dll.aslr.<随机数字>.dll”。
对U盘传播的样本,当系统显示快捷方式文件时触发漏洞,加载~wtr4141.tmp文件,后者加载一个名为“shell32.dll.aslr.<随机数字>.dll”的模块,这个模块将另一个文件~wtr4132.tmp加载为“kernel32.dll.aslr.<随机数字>.dll”。
模块“kernel32.dll.aslr.<随机数字>.dll”负责实现后续的大部分攻击行为,它导出了22个函数来完成恶意代码的主要功能;在其资源节中,包含了一些衍生文件,它们以加密的形式被保存。
其中,第16号导出函数用于衍生本地文件,包括资源编号201的mrxcls.sys和编号242的mrxnet.sys两个驱动程序,以及4个.pnf文件。

图10 样本文件衍生的关系
第17号导出函数用于攻击WinCC系统的第二个漏洞,它释放一个s7otbxdx.dll。
第19号导出函数负责利用快捷方式解析漏洞进行传播。它释放多个lnk文件和两个扩展名为tmp的DLL文件。
第22号导出函数负责利用RPC漏洞和打印服务漏洞进行传播。它释放的文件中,资源编号221的文件用于RPC攻击、编号222的文件用于打印服务攻击、编号250的文件用于提权。 |