[Windows] 惡意利用配置錯誤資訊清單(manifest)達成劫持與特權提升

 前言

這篇技巧是我在校稿最近剛出版的書《Windows APT Warfare:惡意程式前線戰術指南》正好看到 github.com/L3cr0f/DccwBypassUAC 這份 PoC 提及的 WinSxS 配置錯誤允許駭客劫持達成 UAC 特權提升看到比較有意思的事情所以寫一篇作為筆記。

不過這篇技巧目前在 Windows 10 上除非出現了配置錯誤的 DACL 可被寫入、否則新型的作業系統利用的可能性比較小XD 如果對 UAC 特權提升有興趣的讀者可以參考對岸這篇 BypassUAC原理及方法汇总 我覺得寫得還不錯、或者是看看我的書(?)

 WinSxS

 Windows 為了原生支援 WinSxS 多重系統模組功能——即同一個系統中可能會有新舊程式使用到同個系統模組但不同版本號的狀況。因此可以見到 C:\Windows\WinSxS\ 下有很多不同版本的資源包:


開發者能在編譯時期在純文字的資訊清單 *.manifest 記錄特定系統模組要從特定系統路徑、版本來裝載使用。而這邊引自上述對岸文章一段描述,其中提及了在資訊清單中還有一個特性可以使用:
在Windows中有些可执行程序没有内置的manifest,假设这个程序叫test.exe,如果攻击者在该可执行程序目录下新建一个test.exe.manifest并在manifest文件中指定file元素,则test.exe执行时会加载file元素中loadFrom属性指定的DLL(loadFrom的dll不能在KnownDlls中)
這是一個我覺得蠻有趣的特性,可以解釋為什麼系統槽下會有那麼多純文字保存的資訊清單 *.manifest 文件(我以前一直誤以為是開發者編譯完忘記刪掉XD)這描述說明了兩點:
  1. 除了開發者相當熟悉的嵌入式資訊清單,還有導出式資訊清單——在同層資料夾中保存與程式名同名的 *.manifest 文件即可被程式裝載器正確識別
  2. 無論嵌入或導出式資訊清單:使用 loadFrom 標籤可以指示程式裝載器在「裝載特定 DLL 模組」時便會被 redirect 去裝載另一個特定的 DLL 模組
總而言之當程式裝載器正在初始化一支靜態程式文件、發現其不具嵌入式資訊清單時,那麼就會同層目錄確認是否有同名的 *.manifest 清單文件進行解析並初始化,以下做個舉例:




桌面上現在有一皮卡丘打排球程式(picaball.exe)是一個不具嵌入式資訊清單的老舊程式、並且其引入函數表顯示出執行階段會需要使用到 DirectX 的模組 dsound.dll 作為遊戲引擎聲音輸出。

因此,在同層資料夾(即桌面)放置一個 picaball.exe.manifest 便會在遊戲程式被程式裝載器初始化時視為導出式資訊清單文件進行讀取;而在該資訊清單中第十行可見 loadFrom 的屬性,其指示了 dsound.dll 被裝載時將會被 redirect 去裝載 30cm_tw.dll 文件,因此一旦遊戲程式被執行便會裝載我們的惡意模組 30cm_tw.dll 並彈出視窗。

WinSxS重導向

在微軟官方文獻 Dynamic-Link Library Redirection 提及了若資訊清單中指定要裝載特定版本的 WinSxS 系統模組、但如果你不希望裝載 C:\Windows\WinSxS 下的那套 DLL 模組;那麼你也可以創建與程式同名的 *.local 資料夾其會被作為該程式應採用的 WinSxS 模組之基礎路徑。


如上圖所示系統高權服務 dccw.exe 會使用到 C:\Windows\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.17763.1935_none_570899e8c25aaf4a 中的 GdiPlus.dll

因此我們可以在 dccw.exe 同層目錄創建 dccw.exe.local 資料夾作為新的 WinSxS 參考路徑、並在其內部創建 x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.17763.1935_none_570899e8c25aaf4a 子目錄、並在此目錄中放入惡意的 GdiPlus.dll 便會發現當 dccw.exe 被執行起來後就會自動裝載 dccw.exe.local 子目錄中的惡意 GdiPlus.dll 模組

DCCW 本地提權

上面講完了這個有趣的小技巧後便可以回頭來提 github.com/L3cr0f/DccwBypassUAC 這份 PoC。

主要就是在 Win8.1 以前的 Windows 版本可以利用 CIA Vault 7 被揭露過的 iFileOperation COM 接口來任意「創建資料夾」在 C:\Windows\System32\dccw.exe 同層目錄中創建 C:\Windows\System32\dccw.exe.local 資料夾並投放惡意模組達成本地提權,細節部分大家自己看就好惹XD

留言

這個網誌中的熱門文章

[C#] Lambda花式應用噁爛寫法(跨UI委派秒幹、多線程處理...etc)

[Black Asia Arsenal] puzzCode: 專注開發後門的編譯器, 自帶反逆向、對抗病毒特徵碼定位技術

[Windows] 逆向工程 C++ 中入口函數參數 main(argc, argv) 與如何正確的進行參數劫持