DDE混淆的3種新方法
一、前言
最近一段時間,微軟的Office產品已經成為滋養新型攻擊方法的沃土,從相對比較簡單的資料注入方法(如 ofollow,noindex" target="_blank">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會檢查當前行是否以某些命令字元開頭。這些字元可能是內部函式所需的字元,如 =
、 +
、 -
以及 @
。根據命令的字首,可能會出現以下兩種情況:
1、如果字首為為 =
、 +
或者 -
,那麼後續資料就會被當成表示式來處理;
2、如果字首為 @
,那麼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位元組或者空格,達到中綴混淆目的。空格不能嵌入到命令名稱中,一旦嵌入就將拆分命令名,導致命令無法執行。但是命令名之前以及或者引數中的空間還可以為我們所用。當然,命令名不區分大小寫,因此我們可以使用不同的大小寫方案來進行混淆。大家可以訪問 3600" rel="nofollow,noindex" target="_blank">此處 下載前面我們描述的所有混淆樣例(密碼為 infected
)。
圖1. A1000十六進位制資料中的中綴混淆示例
這些混淆技術當然可以單獨使用,或者可以組合使用。我們已經使用Excel 2013以及Excel 2017測試過本文提到的所有混淆技術,在本文撰寫時沒有任何防毒軟體廠商能夠檢測到這些技術。為了幫大家防禦這類簡單的混淆攻擊,我們同樣釋出了匹配的YARA規則,大家可以訪問 此連結 下載。
五、總結
在本文中,我們介紹了混淆DDE載荷的3種新技術:字首、中綴以及字尾混淆技術。由於Office產品在過去27年中一直在不斷完善,豐富的功能同樣給正常使用者和惡意使用者帶來廣闊的表演舞臺。在接下來的幾年時間內,可以預見的是新的攻擊方法及混淆技術將不斷演化,我們也希望能看到推陳出新的技術用來投遞攻擊載荷。