打開文件夾就運行?COM劫持利用新姿勢
打開文件夾就能運行指定的程序?這不是天方夜譚,而是在現(xiàn)實世界中確實存在的。利用本文探討的COM劫持技術(shù),可以輕松實現(xiàn)出打開文件夾就運行指定代碼的功能。對于COM劫持技術(shù),國內(nèi)很少有資料進行原理闡述,本文結(jié)合自身分析經(jīng)驗對COM劫持技術(shù)進行歸納總結(jié)。同時,希望各大安全廠商針對此類利用做好防護,保護用戶信息安全。
前言
所謂“罵人先罵娘,擒賊先擒王”,首先給出讀者最最關(guān)心的劫持文件夾的利用方法的效果展示:
為了理解本文內(nèi)容,我們首先要了解COM的一些基本的概念:
接口:一組函數(shù)的總稱,這些函數(shù)也被稱為”方法”,通常情況下,接口的名稱都是以“I”開關(guān),例如:”IShellFolder”.接口可以繼承。
Component object class(coclass):也就是組件,組件包含在一個DLL或者exe文件中,它包含了一個或多個接口的實現(xiàn)代碼。組件實現(xiàn)了它包含的所有接口。
COM object:是組件的一個實例。
COM server:一個dll或者exe文件,包含了一個或者多個組件。
COM library:是操作系統(tǒng)的一部分,負責(zé)響應(yīng)用戶程序。
GUID:唯一的、128位的標(biāo)識對象的標(biāo)識. 全局唯一標(biāo)識符,是唯一的一個ID,類似于物理網(wǎng)址那樣。
CLSID:class id,唯一的標(biāo)識組件。
IID:interface id,用來標(biāo)識接口。
此外,對于windows操作系統(tǒng),存在著虛擬文件夾,控制面板,我的電腦等都是系統(tǒng)中的虛擬文件夾。這種虛擬文件夾在注冊表中都會有一個CLSID與之對應(yīng),例如,我的電腦對應(yīng)的CLSID是{20D04FE0-3AEA-1069-A2D8-08002B30309D},控制面板的CLSID是{21EC2020-3AEA-1069-A2DD-08002B30309D}。
那么怎樣可以看到這些虛擬文件夾呢?以“我的電腦”虛擬文件夾為例,在開始–運行中輸入”:: {20D04FE0-3AEA-1069-A2D8-08002B30309D”就可以打開我的電腦。但需要注意的是,在WIN7下,輸入::{21EC2020-3AEA-1069-A2DD-08002B30309D}可以打開控制面板,但在xp系統(tǒng)下,打開控制面板需要輸入的命令為:”::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}”。
利用方法
作為演示,我們執(zhí)行代碼的功能為,彈出一個類似與下圖的對話框,其中顯示出了調(diào)用這個DLL的進程路徑及PID信息。
把大象裝進冰箱里需要三步,我們的利用也分為三步:
1.精選CLSID,盡量選擇系統(tǒng)應(yīng)用范圍廣的CLSID,這樣的模塊可以保證系統(tǒng)在進行很多功能時都會加載dll。我們選擇的CLSID為:{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7},其對應(yīng)著CAccPropServicesClass類。
修改注冊表,將CLSID對應(yīng)的DLL文件修改成實現(xiàn)了某些待定功能的文件(這個文件是由我們精心構(gòu)造的,不然無法利用成功)。
可通過將下列數(shù)據(jù)導(dǎo)入到注冊表實現(xiàn)
- Windows RegistryEditor Version 5.00
- [HKEY_CLASSES_ROOT\CLSID\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}]
- [HKEY_CLASSES_ROOT\CLSID\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}\InProcServer32]
- @="freebuf.dll"
- "ThreadingModel"="Apartment"
2. 新建文件夾,以CLSID做為后綴名,同時將我們的利用dll拷貝到系統(tǒng)目錄下:
這里的文件名可以充分發(fā)揮想象力(騙術(shù)),利用社會工程學(xué),起個誘惑的文件夾名,比如,目標(biāo)喜歡日本姑娘,文件夾就叫做” 小澤にほんごかなニホンゴ(カナ).{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}”
3. 打開文件夾,成功利用
利用的步驟很簡單,其中最為關(guān)鍵是我們實現(xiàn)代碼的dll以及CLSID的選擇,這不是一個普通的dll,而是dll中的”戰(zhàn)斗dll”,這是一個實現(xiàn)了COM接口的dll,并且在dll的導(dǎo)出函數(shù)的返回值有特殊要求。具體可以參見文末附件中的代碼。
背后的故事
通過上面的圖,可以看出,我們的DLL實際上是由verclsid.exe加載的。而verclsid.exe是通過shell32.dll中的函數(shù)調(diào)用起來的。在shell32.dll中SHExtCoCreateInstance函數(shù)成功調(diào)用后,verclsid.exe才會被加載。
而SHExtCoCreateInstance只是對_SHExtCoCreateInstance2的封裝
而通過ida看到_SHExtCoCreateInstance2調(diào)用了_ShouldLoadShellExt,所有_ShouldLoadShellExt成功返回(返回非0值),才能加載verclsid.exe.
_ShouldLoadShellExt在對注冊表Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked和Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved進行判斷后,調(diào)用了_QueryClassInterface,而要求_QueryClassInterface返回一個非0值,就只能是下圖中的 v17=ExitCode==0代碼的地方。
綜全上面的過程,要想成功利用,只要使CreateProcessW函數(shù)調(diào)用verclsid.exe結(jié)束時的exitcode等于0。
對verclsid.exe分析
調(diào)用verclsid.exe傳遞的參數(shù)有:
/S:隨后調(diào)用OLE32!CoInitializeEx函數(shù)時的參數(shù);
/C : CLSID;
/I :Interface id;
/X:調(diào)用OLE32!CoCreateInstance函數(shù)時所需要的參數(shù)值;
隨后,通過下面的函數(shù)調(diào)用com組件
調(diào)用OLE32!CoCreateInstance
調(diào)用ppv->QueryInterface
隨后會調(diào)用
ppv->Release()
CoUninitialize()
然后,函數(shù)就正常返回,當(dāng)函數(shù)正常返回時,verclsid.exe的exitcode等于0。這就保證了我們的dll能夠被加載成功。
所以,我們只需要寫一個COM服務(wù)dll,使verclsid.exe調(diào)用這個服務(wù)dll的接口時,返回S_OK就OK了。具體關(guān)于COM服務(wù)dll的編寫,請參考附件鏈接。
附件下載:鏈接:http://pan.baidu.com/s/1ckPWDo 密碼:pniu
總結(jié)
這種COM劫持技術(shù)最大的優(yōu)點在于,不需要進行動態(tài)的dll注入等操作,可以繞開主動防御,此外,這種利用的加載進行為操作系統(tǒng)的verclsid.exe,宿主進程是天生的白進程,也可以繞開白名單機制。而且劫持dll的加載是由系統(tǒng)底層機制決定的。另外,這種技術(shù)很可能被用于網(wǎng)絡(luò)黑產(chǎn),這也要求安全廠商提高對這種劫持行為的識別與檢測。