惡意軟件通常需要計算機上的完全管理權限來執行更有影響的操作,如添加逃避防病毒軟件檢測、加密安全文件或向感興趣的系統進程中註入代碼。即使目標用戶擁有管理權限,用戶帳戶控制(UAC)的流行也意味著惡意應用程序通常默認為中等完整性,從而阻止對具有較高完整性級別的資源的寫入訪問。要繞過這個限制,攻擊者將需要一種無需用戶交互(無UAC 提示)靜默提升完整性級別的方法。這種技術被稱為繞過用戶帳戶控制,它依賴於各種原語和條件,其中大部分基於搭載提升的Windows 功能。
以Medium 身份運行的cscript.exe 示例通過UAC 繞過生成具有高完整性的cmd.exe 實例:
大多數UAC 驗證邏輯是在應用程序信息(AppInfo) 服務中實現的。我們將在本文介紹一組UAC 繞過,調查它們所依賴的一些關鍵原語以及對應的檢測方式。
UAC 繞過方法UAC 繞過方法通常會通過生成惡意子進程或加載繼承目標應用程序提升的完整性級別的惡意模塊來劫持提升的應用程序的正常執行流程。
還有一些其他極端情況,但最常見的劫持方法是:
註冊表鍵操作操作註冊表鍵的目的是將提升程序的執行流程重定向到受控命令。最常被濫用的鍵值與特定擴展的shell 打開命令(取決於目標程序)或windir/systemroot 環境變量操作有關:
HKCU\\Software\\Classes\\\shell\\open\command(默認或DelegateExecute值);
HKCU\\Environment\\windir;
HKCU\\Environment\\systemroot;例如,當fodhelper(一個Windows二進製文件,允許提升而不需要UAC提示)被惡意軟件作為Medium完整性進程啟動時,Windows會自動將fodhelper從Medium完整性進程提升到High完整性進程。然後,高完整性fodhelper嘗試使用其默認的處理程序打開ms-settings文件。由於中等完整性的惡意軟件已經劫持了這個處理程序,被提升的fodhelper將執行攻擊者選擇的一個命令作為一個高完整性進程。
下面是一個Glupteba 惡意軟件的示例,它利用這種方法首先從中等完整性進程提升到高完整性過程,然後通過令牌操縱(令牌竊取)從高完整性進程提升到系統完整性:
操縱Windows 環境變量註冊表鍵的UAC 繞過示例是byeintegrity5。為了說明這一點,此繞過使用此原語重定向CDSSync 計劃任務的正常執行流程(設置為以最高權限運行),並提升完整性級別,如下所示。
當CDSSync 計劃任務運行時,taskhostw.exe 會嘗試從%windir%\System32 文件夾加載npmproxy.dll,但因為惡意軟件控制了%windir%,它可以重定向taskhostw.exe從它控制的路徑加載一個名為npmproxy.dll的DLL,如下所示。
當UAC 設置為Always Notify(最高UAC 級別)時,基於環境變量操作的UAC 繞過通常會起作用,因為它們通常不涉及將文件寫入安全路徑或啟動自動提升應用程序。從當前用戶註冊表更改SystemRoot 或Windir 到非預期值是非常可疑的,應該是檢測的高置信度信號。
DLL 劫持DLL劫持方法通常包括找到一個丟失的DLL(通常是一個丟失的依賴項),或者通過將一個惡意的DLL加載到一個提升進程中來贏得DLL文件寫入進程。如果UAC 已啟用但未設置為Always Notify,則惡意軟件可以執行提升的IFileOperation(無UAC 提示)來創建/複製/重命名或將DLL 文件移動到受信任的路徑(即System32),然後觸發提升的程序加載惡意DLL 而不是預期的。
IFileOperation 由dllhost.exe(COM 代理)執行,其中process.command_line 包含classId {3AD05575-8857-4850-9277-11B85BDB8E09}。
我們可以使用以下EQL 關聯來鏈接dllhost.exe 的任何文件操作,然後將一個非microsoft簽名的DLL加載到一個運行系統完整性的進程中:
這是一個檢測UACME 30將wow64log.dll側載到作為系統運行的WerFault.exe實例的示例(它提供了一個很好的從Medium到System完整性的直接跳轉),如下所示。
如果UAC 設置為Always Notify,則查找丟失的DLL 或贏得文件寫入競爭條件到可由中等完整性進程寫入的路徑是一個有效選項。這是UAC 繞過劫持SilentCleanup 計劃任務(通過文件寫入競爭條件)的示例,該任務會產生從AppData 子文件夾(可由中等完整性寫入)執行的高完整性後代進程DismHost.exe,這是另一個濫用相同的變體任務,但缺少依賴項api-ms-win-core-kernel32-legacy-l1.dll。
另一個可以實現相同目標的DLL 劫持原語是使用DLL 加載重定向,方法是在目標提升程序的同一目錄中創建一個文件夾(例如target_program.exe.local 並在其中放置一個將被加載而不是預期的DLL )。
此技術也可用作本地權限提升的原語,以防漏洞允許創建文件夾(具有許可的訪問控制列表)到受控位置,例如Jonas Lykkegård 在本文中描述的從directory deletion到SYSTEM shell的內容。
此查詢與UACME 方法22 匹配,該方法針對consent.exe(作為系統執行),欺騙它從SxS DotLocal目錄加載comctl32.dll,而不是System32:
值得一提的是,大多數通過DLL 劫持繞過UAC 對持久性也很有用,並且可能會繞過基於自動運行(已知文件和註冊表持久性位置)的檢測。
提升的COM 接口此方法與前面的方法稍有不同,這意味著不涉及直接操作重定向。相反,它依賴於找到一個提升的COM 接口,該接口公開了某種形式的執行能力(即CreateProcess/ShellExec 包裝器),可以調用它來啟動一個通過中等完整性進程的參數傳遞的特權程序。
從操作的角度來看,通常這些COM 接口將在dllhost.exe(COM 代理)的上下文中執行,其中process.command_line 包含目標COM 對象的classId,這通常會導致創建高完整性子進程。
以下是不同的惡意軟件家族採用這種方法進行UAC繞過的例子(如DarkSide和LockBit勒索軟件家族),在啟動加密和逃避能力之前提高完整性水平,很難預防:
令牌安全屬性James Forshaw 對利用進程令牌安全屬性來識別作為自動提升應用程序的後代啟動的進程的可能性進行了深入的觀察。
ProcessHacker 也捕獲此類信息。下面是通過fodhelper UAC 繞過啟動的notepad.exe 實例的令牌屬性示例。
LUA://HdAutoAp屬性意味著它是一個自動提升的應用程序(也為提升的COM對象和AppInfo硬編碼的白名單進程填充)。 DecHdAutoAp意味著它是一個自動提升應用程序的後代,這在跟踪通過UAC繞過生成的進程樹時非常有用。
Elastic Endpoint 安全7.16 及更高版本通過流程執行事件(process.Ext.token.security_attributes) 捕獲此信息,這為在沒有先驗知識的情況下尋找和檢測UAC 繞過劫持自動提升程序或COM 接口的執行流提供了機會繞過細節(目標二進制、COM 接口、重定向方法和其他重要細節):
可疑的自動提升程序子進程:
上面的查詢還匹配UAC旁路的所有後代進程,而不僅僅是直接子進程。
我們可以看到這種方法通過註冊表鍵操作檢測fodhelper 執行流劫持:
這是通過模擬受信任目錄的匹配UAC 繞過的示例:
以下是通過Elevated COM 接口匹配3 種不同UAC 旁路的示例:
逃避檢測有研究人員發表了一篇文章,討論了許多不限於繞過UAC 的逃避技術,例如重命名文件夾或註冊表鍵、註冊表符號鏈接以基於特定文件路徑/註冊表鍵更改或不同的關聯來破壞檢測邏輯同一過程的事件。不過大多數惡意軟件家族都不會費心修改和調整這些技術。
下面是一個通過目錄重命名(UACME 22)逃避文件監控的示例。
下面是一個通過鍵重命名(byyeintegrity8)來監控註冊表鍵路徑逃避的示例。
最近添加到UACME v.3.5.7 的另一個有趣的逃避技巧是CurVer 子鍵,可用於重定向shell 默認處理程序。這有效地繞過了尋找硬編碼可疑註冊表路徑/值的檢測:
對於與DLL劫持相關的基於文件的檢測,最好使用DLL加載事件(Elastic Endpoint Security 7.16日誌非microsoft簽名的DLL)。對於註冊表來說,需要混合註冊表。字符串和值名應該比完整的鍵路徑更有彈性。
下面的EQL相關示例展示瞭如何檢測偽裝成System32 的目錄中的DLL 加載(即作為windir/systemroot 環境變量修改的結果):
此示例顯示了兩種不同的匹配技術(註冊表鍵操作和通過虛假Windir劫持DLL):
下一個示例結合了註冊表符號鏈接和註冊表鍵重命名,以逃避基於註冊表鍵更改監視(ms-settings 或shell\open\command)的fodhelper UAC 繞過檢測:
UACME v.3.5及以上版本實現了對涉及註冊表鍵操作的方法的這種逃避。
你可以使用Elastic Endpoint或Sysmon日誌查找註冊表符號鏈接的創建,方法是查找值名稱等於SymbolicLinkValue的註冊表修改。
用於檢測此逃避的示例KQL 查詢是:registry.value :'SymbolicLinkValue' 和registry.key :S-1-5-21-15Classes\\*`:
最常見的UAC 繞過在野外使用的惡意軟件家族回不斷變化和迭代。以下是惡意軟件家族常用的UAC繞過方法:
通過UAC 繞過最常見的執行命令是惡意軟件以高完整性重新執行自身或防禦逃避技術,例如:
篡改AV 防禦策略;
寫入受HKLM 保護的註冊表鍵;
篡改系統恢復設置;
總結在這篇文章中,我們介紹了UAC繞過的主要方法,以及如何檢測它們,以及如何用令牌安全屬性豐富流程執行事件,使我們能夠創建一個更廣泛的檢測邏輯,以匹配未知的繞過。