含有惡意宏的Office附件在APT攻擊、勒索病毒等攻擊事件中被廣泛使用,黑客在製作惡意宏時通常會使用一些技巧來隱藏宏代碼,防止安全人員對宏代碼直接進行分析。雖然可以通過雲沙箱或者是逆向動態調試的方法得到惡意宏的行為數據,但是一方面雲沙箱的數據可能不夠全面,並且也無法對失效的樣本進行調試,所以直接對宏代碼進行分析是最直接有效的方法。
此前在分析APT組織TA505的攻擊活動時,追查到一個魚叉攻擊中含有惡意宏的Word附件樣本,嘗試了很多方法才查看到完整的VBA代碼。在此過程中發現網絡上關於宏代碼的隱藏和破解的內容大多都是對VBA工程密碼的破解,所以在此介紹一些Office宏代碼的隱藏及破解技巧。
背景知識
Office宏
Office宏是微軟為了讓人們在使用Office軟體時,避免一再地重複相同的動作而設計出來的一種功能。人們可以利用簡單的語法,把常用的動作寫成宏,實現一些重複工作的自動化。
微軟最早是在1992年發布的Excel 4.0版本中開始支持宏功能,並在1996年發布的Office 97之後通過VBA(Visual Basic for Applications)將其取代(後續版本還都兼容Excel 4.0宏)。VBA是微軟基於Visual Basic語言設計的一種標準宏語言,可以在微軟所有可編程應用軟體(Word、Excel、PowerPoint、Access、Outlook、Project等)中通用。其支持Windows API、DLL、DDE、OLE、ODBC等技術,可以實現豐富的功能。
複合二進位文檔(CFB)
複合二進位文檔(以下簡稱CFB)是微軟開發的一種實現COM結構化存儲的文件格式,用於把文本、圖像、視頻等多個對象內容存放在一個文件中,Office97–2003文檔(.doc、.xls等)使用的即是此格式。
CFB類似於FAT文件系統結構,將存儲空間劃分為若干個大小(通常為512位元組)相同的扇區,扇區還可以劃分短扇區,並形成一個樹形目錄結構,將數據分成若干個流和短流,無序的存儲在扇區和短扇區中,通過扇區(短扇區)配置表記錄存儲順序(扇區鏈),並通過主扇區配置表記錄扇區配置表的存儲位置,每個流的入口信息存儲在目錄中。在頭扇區中存儲主扇區配置表、短扇區配置表、根目錄入口等基礎信息。
OVBA文件結構中的相關內容
在Office VBA文件結構中定義了一些與VBA工程加密相關的內容,程序在加載VBA工程文件時會校驗相關參數的合法性,有問題就會報錯。
●ID(CLSID,全球唯一標識符),是一組32位16進位數表示的標識符,用於標識VBA工程的類型庫信息。由ole32.dll庫中的CoCreateGuid()函數生成,通過在生成過程中使用網卡MAC地址、納秒級時間、晶片ID碼、隨機數等信息確保CLSID的唯一性。
●CMG(ProjectProtectionState),定義VBA工程的訪問是否被限制,4位元組,前三位分別代表被用戶、VBA宿主程序、VBE限制,其餘為0(在VBA 5.0中為全0)。由加密模塊加密(Length=4),得到22-28位16進位數。
●GC(ProjectVisibilityState),定義VBA工程是否可見,默認值為0xFF,代表工程可見,工程不可見時值為0x00(CMG的第三位必須為1)。由加密模塊加密(Length=1),得到16-22位16進位數。
●DPB(ProjectPassword),定義VBA工程密碼的Hash(基於SHA-1的自定義哈希算法),未設置密碼時值為0x00;設置了密碼時值為密碼的Hash(在VBA 5.0中此值為明文密碼的多字節字符集編碼)。由加密模塊加密(未設置密碼Length=1,設置了密碼Length=29,VBA 5.0中Length=密碼長度)。同時設置密碼以後CLSID的值變為全0。
●加密模塊:使用原始值、Length、CLSID、Seed(隨機數,存儲在返回數據的第一個字節)作為參數的一種可逆加密算法。
宏代碼隱藏技巧
Excel 4.0宏
Excel 4.0的宏代碼寫在工作表中,將宏代碼所在的行、列、工作表隱藏即可。此方法非常簡單,但是由於Excel 4.0宏存儲在Excel 97–2003格式(.xls,複合二進位文檔格式)的Workbook OLE流中,對殺毒軟體的解析檢測能力要求比較高,所以被廣泛使用。
設置VBA工程密碼
為VBA工程屬性設置密碼及查看時鎖定,這是最常見的一種方式。
修改相關參數值
通過修改相關參數的值,使其校驗失敗,導致工程報錯無法查看。
修改ID的值,打開VBA工程時會顯示「工程不可查看」
修改CMG或DPB的值,可以看到VBA工程的結構,但是查看工程時仍然會顯示「工程不可查看」。
修改GC的值,導致內存溢出,並且看不到VBA工程。
修改相關參數值及CFB存儲結構
在修改ID、CMG、DPB、GC值的基礎上,對CFB的存儲結構進行了修改,嚴格限制了CFB中扇區鏈及目錄入口的位置,使之後再替換ID、CMG、DPB、GC值時由於字節數的不一致導致CFB存儲結構錯誤,文檔損壞報錯。
利用控制項屬性標籤隱藏參數
在分析TA505的樣本時,使用oledump提取到的VBA代碼中,我們發現多處對TadaSHC的調用,但是TadaSHC模塊代碼中只包含一些基本的屬性設置,沒有具體的數據。
這是由於oledump等工具只能提取到VBA流的元數據,無法提取到VBA流的屬性標籤數據,於是黑客利用VBA窗體控制項中的一些屬性標籤為字符串類型的特點,將關鍵參數隱藏於此,同時在VBA代碼中通過調用控制項的屬性標籤完成shellcode拼接。
惡意宏代碼破解方法
Excel 4.0宏
對隱藏的Excel 4.0宏代碼,只需對隱藏的行、列、工作表取消隱藏即可。
設置VBA工程密碼
破解方法1:
將加密後文件的「DPB」鍵名修改為任意值,再打開文檔時會提示工程文件包含無效的鍵,繼續加載工程後可以查看VBA代碼。
破解方法2:
用自己加密的VBA工程文件的ID、CMG、DPB、CG參數值替換待破解文件的參數值,待破解文檔的密碼就會變成自己設置的密碼。
修改相關參數值
將ID、CMG、DPB、GC替換為一組合法值,即可恢復。
對於修改了相關參數以及CFB存儲結構的文件,可以使用oledump、OfficeMalScanner、oletools等工具,從CFB中提取到VBA流。
如果黑客將關鍵參數隱藏到了VBA窗體控制項中的一些屬性標籤中,導致使用工具提取不到完整的VBA代碼時,可以打開一個正常的包含VBA工程文檔的VBA編譯環境,再打開經過特殊處理的樣本,即可查看VBA工程。
可以看到窗體控制項Tag屬性標籤中存儲的惡意字符串。
除TA505外,包括摩訶草,蔓靈花,海蓮花,Kimsuky在內的絕大部分APT組織都會在其攻擊活動中使用包含有惡意宏文檔的釣魚郵件作為其攻擊的入口,及時有效的分析惡意宏的代碼行為,能夠更好的掌握攻擊者的動向。