DDE混淆的3種新方法
一、前言
最近一段時間,微軟的Office產品已經成為滋養新型攻擊方法的沃土,從相對比較簡單的數據注入方法(如DDE注入以及CSV注入)到更加復雜的基于嵌入公式對象的攻擊技術,不一而足。反病毒行業很快吸收了這些技術,有許多廠商可以正確檢測并識別大多數攻擊方法。然而萬物都處于演化之中,因此攻擊場景中出現攻擊手段的混淆及變種也只是時間問題。思科Talos以及ReversingLabs曾發表過一篇聯合文章,介紹與CSV DDE注入有關的兩種新技術(一種混淆技術以及一個變種)。本文的目的是為大家解釋這些技術背后的一些“原理”,也會介紹3種新的混淆技術。
二、CSV/DDE代碼注入
盡管網上關于DDE代碼注入技術已經有許多參考資料,但這里我們還可以簡單過一下這種技術的原理。CSV(使用逗號作為分隔符)是一種簡單的數據格式,可以用來存儲結構化數據,也可以作為Excel的數據源(Excel會解析該數據,然后將被分隔符切分的數據填充到單元格中)。實際上,如果文件格式與文件擴展名不匹配,但該文件擴展名可以使用Excel來打開,那么Excel似乎會采用CSV模式來導入數據。
根據微軟的描述,DDE(Dynamic Data Exchange,動態數據交換)是應用之間傳輸數據的一種方法。Excel可以使用這種機制,根據外部應用的處理結果來更新單元格的內容。因此,如果我們制作包含DDE公式的CSV文件,那么在打開該文件時,Excel就會嘗試執行外部應用,這個過程聽起來非常簡單。
三、DDE解析
雖然聽起來簡單,但工作過程卻稍微復雜一些。當打開文件時,Excel會逐個檢查文件的每一行。將該行的的內容分隔并拷貝到對應的單元格之前,Excel會檢查當前行是否以某些命令字符開頭。這些字符可能是內部函數所需的字符,如=、+、-以及@。根據命令的前綴,可能會出現以下兩種情況:
- 如果前綴為為=、+或者-,那么后續數據就會被當成表達式來處理;
- 如果前綴為@,那么Excel會搜索內部函數(比如SUM()),將參數解析成表達式。
到目前為止,前面都是大家可以從網上找到的公開資料,但狀態機如何處理表達式可能參考資料就相對較少。說到DDE時,相應的表達式大致可以表示為:
- command|’arguments’!cell
命令本身也是一種表達式。如果表達式中僅包含可打印字符(甚至包含一些不可打印字符,如0xAA,具體取決于代碼頁),那么緩沖區大小就為256字節。由于命令前綴或者操作符占了1個字符,因此實際上表達式只有255個字節可用。表達式可以是名稱、數字、字符串或者文件名。
即便緩沖區中有足夠大的空間,內部程序的最大文件名長度為8個字符。這可能是MS-DOS文件名的歷史遺留問題,當時系統最大只支持8字節長文件名(不包括擴展名)。
然而,表達式通常采用遞歸定義,可以采用算術及邏輯運算符(如&、^、/、+等等)鏈接起來,甚至還可以使用左括號(表示函數參數的開始)或者冒號(用作單元格分隔符)。雖然命令不應該被當成表達式來處理,但由于null字節會被全部忽略掉,而空格有時候后會被忽略(比如位于命令之前的空格),因此出現這種情況也不足為奇。
換句話說,表達式中可以包含數量不限的null字節。Excel會忽視參數以及單元格中的null字節。重要的是,單元格引用根本不必為有效值。一旦表達式被成功解析及轉換,命令和參數就會傳遞給WinExec() API執行。
四、更多細節
思科Talos在文中提到,攻擊樣本會使用簡單的混淆技術,比如在DDE公式之前或者之后附加文本或者二進制數據。這似乎只是冰山一角,這是因為數據解析規則不僅可以處理前綴(prefix)或后綴(suffix)形式的混淆命令,也能處理中綴(infix)形式的混淆數據。
表達式可以串聯使用,我們也可以在實際命令之前注入任意數量的表達式(每個子表達式最多可以使用255個字符),命令甚至也可以串聯起來使用,這也是命令可以使用混淆前綴的基礎,如下所示:
- =AAAA+BBBB-CCCC&"Hello"/12345&cmd|'/c calc.exe'!A
- =cmd|'/c calc.exe'!A*cmd|'/c calc.exe'!A
- +thespanishinquisition(cmd|'/c calc.exe'!A
- = cmd|'/c calc.exe'!A
目前在實際攻擊中看到的載荷會選擇cmd、msexcel或者msiexec作為可執行目標文件,,但我們可以任意選擇其他外部應用,只要文件名少于8字符即可,而這個條件在實際環境中很容滿足。比如,regsvr32、certutil以及rundll32都滿足文件名長度要求,這為我們打開了后綴混淆攻擊的新世界:
- =rundll32|'URL.dll,OpenURL calc.exe'!A
- =rundll321234567890abcdefghijklmnopqrstuvwxyz|'URL.dll,OpenURL calc.exe'!A
最后,我們可以在各處添加null字節或者空格,達到中綴混淆目的。空格不能嵌入到命令名稱中,一旦嵌入就將拆分命令名,導致命令無法執行。但是命令名之前以及或者參數中的空間還可以為我們所用。當然,命令名不區分大小寫,因此我們可以使用不同的大小寫方案來進行混淆。大家可以訪問此處下載前面我們描述的所有混淆樣例(密碼為infected)。
圖1. A1000十六進制數據中的中綴混淆示例
這些混淆技術當然可以單獨使用,或者可以組合使用。我們已經使用Excel 2013以及Excel 2017測試過本文提到的所有混淆技術,在本文撰寫時沒有任何殺毒軟件廠商能夠檢測到這些技術。為了幫大家防御這類簡單的混淆攻擊,我們同樣發布了匹配的YARA規則,大家可以訪問此鏈接下載。
五、總結
在本文中,我們介紹了混淆DDE載荷的3種新技術:前綴、中綴以及后綴混淆技術。由于Office產品在過去27年中一直在不斷完善,豐富的功能同樣給正常用戶和惡意用戶帶來廣闊的表演舞臺。在接下來的幾年時間內,可以預見的是新的攻擊方法及混淆技術將不斷演化,我們也希望能看到推陳出新的技術用來投遞攻擊載荷。