Win32 UAC使用者賬戶控制(提權 降權)

2021-07-03 22:36:28 字數 3240 閱讀 8979

首先必須澄清一下:uac不是vista才有的東西!我反正知道xp就有了,2000不知道,xp上也有uac,只不過預設沒有開啟,你要是願意可以自己開啟,只不過太不人性化了,和linux上的switch user一樣不人性化,沒次提權必須輸入管理員使用者的密碼。(見下面圖)

所以vista的uac根本就不是什麼新鮮玩意,如果當時完全按照微軟的規範程式設計,公升級到vista以後uac帶來的相容性問題雖然有但不會這麼大。至少不會出現程式執行後什麼也幹不成,程式也沒提權,使用者也不知道要右鍵管理員身份,至少程式可以彈乙個框「請切換到管理員使用者再使用本程式」或者「本程式必須由管理員使用者執行」之類的。

說起uac,真是個讓人又愛又恨的東西,愛他能給系統帶來很大的安全性,恨他讓我們的程式不能輕易獲得管理員許可權來盡情的做一些見不得光的事。

基本概念:

1。程序的許可權是繼承的,也就是說,有管理員許可權的程式建立的程序也有管理員許可權,沒有管理員許可權的程式建立程序就沒有管理員許可權(但高許可權程序建立程序必須是高許可權不是絕對的)

2。windows shell程序explorer本身沒有管理員許可權,如果explorer有管理員許可權,大家可以想一下,那麼它建立的程序都有管理員許可權,那uac不就形同虛設了嗎

3。沒有許可權的程序不能建立有許可權的程序

來看看如何通過uac讓程式獲得管理員許可權吧:

方法1。利用manifest,vs工程屬性裡面可以直接設定:

編譯後程式圖示會出現乙個uac盾牌,就像這一樣:

執行時uac會彈出乙個框,使用者點是就可以獲取管理員許可權執行了。

方法2。動態提權(推薦)

所謂動態提權,就是乙個沒有管理員許可權的程式程序在他認為合適的時候建立乙個有管理員許可權的程式程序,**很簡單:

shellexecute(0,"runas",程式路徑,"命令列(可空)","工作目錄(可空)",sw_shownormal);
同樣這麼做會彈出提權確認框

xp下:不管當前程式是否擁有管理員許可權,都彈出以下框:

返回值:返回值大於32表示執行成功,返回值小於32表示執行錯誤(2或者3表示是檔案不存在)

方法3。利用提權漏洞直接提權

判斷是否有管理員許可權:

很簡單,只需要呼叫isuseranadmin即可。

再看看如何降權:

其實微軟沒有提供方法可以讓乙個有管理員許可權程式建立乙個沒有管理員許可權的程式。不過我想的了幾種方法,理論上是可行的:

1。開啟 explorer 的令牌

uac開啟時,explorer之所以建立管理員許可權的程式時系統會彈框警告使用者,是因為explorer本身就沒有管理員許可權!我們可以使用 openprocesstoken 開啟explorer的令牌,然後用這個令牌建立程序(createprocessasuser)。

當然,我們還可以把dll遠端注入到explorer中,再建立的程序就沒有管理員許可權了。但有乙個致命缺點:因為注入explorer這乙個動作本身就是病毒木馬經常幹的事,所以我們要注入的時候,那些殺軟就彈框了「發現程式正在遠端執行緒注入」。。

但不管開啟explorer的令牌還是把dll遠端注入到explorer中,都有嚴重缺陷,那就是,explorer不存在的問題。windows 的 shell 可以是自定義的,這些第三方 shell 不一定能符合標準,極端情況下使用者會話中沒有 shell 程式工作。

但我想這應該是最好的方法。

2。守護程序法

程式執行時動態提權,然後沒有許可權的程式一直後台執行,建立沒有許可權的程式時通過程序通訊告知沒有許可權的程式建立程序。

缺點:一旦守護程式被關閉了,就全玩完了。這還好解決,直接彈框說錯誤就是了。關鍵是如果使用者執行程式時直接右鍵->管理員身份執行 就操蛋了,建立的守護程序也是有許可權的,這招就失靈了。

3。建立低許可權令牌

自己建立乙個低許可權的令牌,然後用這個令牌建立程序(createprocessasuser)。

缺點:麻煩。同時可能有一些**的問題或將來的相容性問題。

關於降低完整性「降權」:(錯誤的方法)

網上有的人說是可以開啟、複製自身的令牌,然後修改完整性級別,再用這個令牌建立程序。雖然說包括核心程式設計在內的主流資料都說了管理員許可權的程式完整性為高,管理員以標準使用者身份執行時和標準使用者許可權的程序完整性為中或低,但這個弄顛倒了(用到的api:openprocesstoken、duplicatetokenex、settokeninformation、getlengthsid等)。但經過我的測試後,這樣做雖然程式並不能做一些特權的操作,但是程序的許可權依舊是高!!在任務管理器中仍然可以看到特權為高,uac虛擬化被禁用!!因此這種方法是完全錯誤的!!

這種方法只降低了完整性,並沒有降低許可權,一定不易這麼做,切記!特別是目的是為了降權執行第三方程式,極易引起程式工作不正常!

這就是這樣做的結果,我想我不用多說什麼了:

4。計畫任務降權

利用計畫任務啟動程式,可以設定許可權。

缺點:計畫任務服務被禁用後(或者沒有執行時)是不能工作的。

5。使用 safer api

我從stackoverflow上看到的,並沒有做驗證

6。用 wtsqueryusertoken 得到低許可權令牌

這種方法只能在服務程式中使用。因此需要編寫、安裝、執行服務

Windows 中的 UAC 使用者賬戶控制

閱讀本文,你可以初步了解 windows 上的 uac 使用者賬戶控制機制。本文不會涉及到 uac 的底層實現原理和安全邊界問題。在 windows 中有多種不同的賬戶 users 使用者組 我們需要將這些賬戶列舉出來是因為在解釋 uac 賬戶控制的時候,會與此相關。system 在系統中擁有最高許...

Windows 中的 UAC 使用者賬戶控制

2019 05 05 09 02 07 walter lv 閱讀數 397 閱讀本文,你可以初步了解 windows 上的 uac 使用者賬戶控制機制。本文不會涉及到 uac 的底層實現原理和安全邊界問題。在 windows 中有多種不同的賬戶 users 使用者組 我們需要將這些賬戶列舉出來是因為...

Win10 檢視和儲存全部使用者賬戶資訊

wmic useraccount list full 此時會列出所有使用者賬戶的各種資訊,但只是顯示在螢幕上,如果想儲存的話,還需要執行如下命令 wmic useraccount list full userprofile desktop ithome.txt 命令提示符 無需管理員許可權 上述命令...