恶意软件常用的感染技术。通过“横向运动”,恶意软件可以进一步扩大其战果:从原始受感染设备传播到同一网络内的其他设备。
最近,勒索软件已经开始使用这种传播方式:包括CryptoWall [1]、CryptoFortess [2]、DMA-Locker [3]和CryptoLuck [4]在内的许多著名的勒索软件家族,不仅对受害者机器上的文件进行加密,而且对已经映射和未映射的文件共享进行了"横向运动", 对这些共享中的文件进行加密,从而造成更大的危害。当然,对于许多针对性和非针对性攻击中使用的恶意软件来说,也有许多会进行"横向运动"的。本文将为读者深入介绍恶意软件最常见的传播技术,其中包括网络内部传播技术和网络间传播技术。
横向运动至未映射的驱动器
通过映射驱动器,软件就能读写可通过该驱动器访问的共享存储区中的文件了。映射驱动器通常分配一个盘符,可以像操作本机的其它硬盘驱动器一样使用它。要访问未映射的驱动器,需要执行以下步骤:首先,必须枚举网络以获取文件共享的列表,然后,在获得文件共享的访问凭证后,需要使用其用户名和密码来装载未映射的驱动器。一旦安装了驱动器,就可以访问来自未映射驱动器的文件了。
图1显示了用于访问未映射驱动器的代码,并且它已经被勒索软件(例如DMA-Locker,Locky和CryptoLuck)广泛用于访问未映射的文件共享中的文件了。该代码首先会调用WNetOpenEnumW [5]函数,并以无符号整数2('2u')和1('1u')作为其前两个参数。参数“2u”能够确保网络中的所有连接都在范围内,而“1u”则确保只打开磁盘资源进行枚举。图1:用于演示向未映射驱动器横向运动的代码
一旦连接打开,将不断调用WNetEnumResourceW以枚举这些资源。
函数WNetOpenEnumW的第四个参数是变量NetResource,它用来接收NetResource结构数组形式的枚举结果。该结构的格式如图2所示。
typedef struct _NETRESOURCE {DWORD dwScope;
DWORD dwType;
DWORD dwDisplayType;
DWORD dwUsage;
LPTSTR lpLocalName;
LPTSTR lpRemoteName;
LPTSTR lpComment;
LPTSTR lpProvider;
} NETRESOURCE;
一旦枚举完网络,该代码就会调用指令'if(NetResource.dWUsage&2)',它用来检查该资源是否为容器资源[6]。如果是,则该函数在后续指令“sub_407919(a1,&NetResource)”中递归调用自身,以确保将lpRemoteName成员指向的名称传递给WNetOpenEnumW函数,来继续枚举容器中的资源。
如果资源是可连接的,那么就会调用函数WNetAddConnection2W,该函数可以用来建立到该网络资源的连接,同时还可以将本地设备重定向到网络文件共享。传递给函数WNetAddConnection2W的第二个和第三个参数分别是用户名和密码。如图1中的代码所示,如果第二和第三参数的值都是0,那么,它就会使用默认的密码和用户名。在WNetAddConnection2W函数之后的指令“if(NetResource.dwType)== 1”用于检查资源是否为磁盘资源。如果是的话,在下一个指令中,共享资源的名称NetResoure.lpRemoteName就会被传递给函数a1,然后生成一个线程来加密共享驱动器中的文件。
USB驱动器&映射驱动器
除了访问未映射的文件共享,恶意软件还能访问连接到受感染机器的可移动驱动器以加密这些驱动器中的文件。图3中的代码展示了如何使用GetDriveTypeW来确定驱动器的类型,随后的表达式“result == 3”可以检查驱动器是否为固定类型的,而“result == 2”用来检查驱动器是否是可移动的,最后, 'result == 6'表示它是一个RAM磁盘。对于这些类型的驱动器,只要找到其中的任何一个,就会调用“sub_402CFB”例程,然后生成一个线程来加密这些驱动器中的文件。
GetDriveTypeW函数也可用于访问远程映射网络驱动器。如果函数GetDriveTypeW返回的值为4,则表示这是一个远程映射驱动器。
图3:利用GetDriveType函数进行横向运动的代码
基于电子邮件的横向运动
电子邮件早已成为恶意软件广泛使用的传播手段了。图3展示的VBA代码,就是由蠕虫病毒通过Outlook进行传播的。如图4所示,指令'loc_00402FB0'调用了CreateObject函数,以便作为对象访问Outlook应用程序。在创建对象之后,指令'loc_00403021'会调用AddressLists函数,从该对象中获得地址列表,随后指令'loc_004030CC'调用了AddressEntries函数,这样就能访问该列表中的内容了。在访问所有列表项之后,指令'loc_005032D2'会调用AddressEntry.Address来提取确切的电子邮件地址。一旦提取了电子邮件地址,指令“loc_004032BA”会调用Application.CreateItem函数来创建新的电子邮件。之后,指令'loc_0040345B'将恶意文件作为附件添加到电子邮件中,并通过指令'loc_0040353D'来发送电子邮件。当受害者收到电子邮件并打开附件时,就会被感染。
图4:使用电子邮件作为传播手段
使用文件感染器作为传播手段
除了使用SMB、电子邮件和驱动器之外,攻击者还可以通过感染机器上的其他文件进行横向运动。图5显示了HTML文件被感染后由Ramnit插入的代码。被感染的HTML文件含有一个VBScript代码,它会创建一个名为svchost.exe的文件。该代码首先会调用CreateObject(“Scripting.FileSystemObject”),它在变量FSO中返回一个TextStream对象,该对象可以进行读取或写入操作。然后,对象FSO会调用CreateTextFile方法,创建一个文件,并在其中写入变量WriteData的内容,即恶意代码。然后,会调用Close方法来刷新缓冲区并关闭该恶意文件。文件关闭后,该函数会调用WSHshell.Run来执行恶意文件。
图5:使用文件感染器作为传播手段
结束语
一旦恶意软件绕过了边界或内联设备,它就可以通过各种方法渗入到内部系统。其中,未映射的驱动器、映射驱动器、电子邮件和感染其他文件是最常用的手段。检测恶意软件的确很重要,与此同时,防止恶意软件的扩散以限制其破坏范围同样也很重要。