什么是PowerShell拒绝加载任何本地ps1脚本的目的,当这是微不足道的绕过?
背景:我想进入PowerShell脚本来自动执行一些工作任务。我不是管理员,并且无法运行提升的powershell进程。我倾向于使用批处理脚本通过命令行实用程序以编程方式执行某些任务,但随着我的能力不断增强,它已经达到了明确的地步,那就是PowerShell会是一个更适合该任务的工具。我玩弄了一下直接的窗口,写了一个基本的脚本来看看我能不能做些什么。什么是PowerShell拒绝加载任何本地ps1脚本的目的,当这是微不足道的绕过?
一旦我掌握了一些测试命令,我将它们保存到一个文件中。
Write-Host "Let's do this"
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.MessageBox]::Show("Script Successful")
calc.exe
我很惊讶地发现,虽然我可以在即时窗口中执行任何我想要的,加载的.ps1(我猜是PowerShell中相当于一个.BAT的),它必须被签署,我需要成为一名管理员来改变这种行为。
但是,我的第一个想法是“好吧,好吧,我只是将我的命令从.bat发送到即时窗口”。所以,我看着PowerShell的-help,并写在命令提示符下:
type test.ps1 | powershell -
它的工作原理,并从.bat工作过。 我在这里错过了什么吗?如果您只需要一个名为type harmfulscript.ps1 | powershell -
的.bat文件,并且您很好,那么禁止从立即窗口调用.ps1文件有什么意义?
ExecutionPolicy
(见Get-help Get-ExecutionPolicy
和Get-Help Set-ExecutionPolicy
)被分解为“范围”。
是的,这对于用户绕过是微不足道的;从字面上看,为PowerShell创建一个桌面快捷方式,调用PowerShell.Exe -ExecutionPolicy Bypass
。
要回答你的问题;通过具有通用目的,明显限制范围,防止随机进程执行* .ps1脚本(除非它们在您的情况下是数字签名的)。这使得系统的“攻击面”更小。
更新(澄清):
的“ExecutionPolicy”功能为“安全控制”主要的一点是不预防(因为它很容易绕过),这是认证 - 验证脚本来自哪里(例如:数字签名?)。
首先,这会阻止不知情的用户从未知/不可信来源运行脚本。
这种'安全控制'无处不在;
Java运行时环境(JRE中)将只(默认)负载信任 (如:数字签名)的小程序。
Web浏览器在遇到自签名或过期的 SSL证书时会发出错误。
微软PowerShell团队已与为什么背后更为细节他们所选择的安全性原则blog post。
考虑到这一点,请记住'ExecutionPolicy'具有'范围'(层)。 如果没有为任何范围定义“ExecutionPolicy”,PowerShell将默认为Restricted
。
否则,最上面定义的'范围'胜出。有关更多详细信息,请参见get-help about_Execution_Policies
,例如哪个'范围'优先。
PS C:\> Get-ExecutionPolicy -List | Format-Table -AutoSize
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
PS C:\>
我不是不同意你在这里,我只是想更多地了解这一点。这种行为如何阻止执行ps1脚本的随机进程?任何进程都可以在命令行右键执行本机命令?所以如果你想确实调用脚本,你可以调用命令行代码'type test.ps1 | powershell -'?或者你是否意味着它会阻止偶然执行powershell脚本的随机进程? –
此外,运行'PowerShell.Exe -ExecutionPolicy Bypass'不会改变我的行为:我仍然无法运行未签名的脚本。 –
@Some_Guy创建启动PowerShell“会话”的桌面快捷方式(打开一个窗口)。然后编辑桌面快捷方式属性(特别是“目标”字段)并在末尾附加“-ExecutionPolicy Bypass”。你应该像这样结束一个'目标'; '%SystemRoot%\ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe -ExecutionPolicy Bypass' – Signal15
实际上有现在两个简单的方法可以做到这一点作为一个标准的用户:
从PowerShell中,任何用户都可以使用命令set-ExecutionPolicy -Scope UserPolicy ...
或者,它也现在在“更新和安全”下设置 - >“对于开发者”,在Windows 10此页面的底部相当于:
的Set-ExecutionPolicy -Scope UserPolicy下RemoteSigned
除非你使用定期从网络共享脚本,这是一个开发人员工作站比“无限制”
本
'PS G:\> set-executionpolicy -scope userpolicy remotesigned'给我 Set-ExecutionPolicy:无法设置执行策略。必须通过组策略设置MachinePolicy或UserPolicy范围内的执行策略。' –
@Some_Guy按住左侧的“Shift”并右键单击PowerShell快捷方式,然后单击“以管理员身份运行” - 必须具有*提升的* PowerShell会话为了按照原始问题的规定更改'ExecutionPoicy' – Signal15
@ Signal15,我不是管理员。 *“我很惊讶地发现,虽然我可以在即时窗口中执行任何我想要的操作,但要加载.ps1(我猜是与.bat相当的powershell),但必须签名,而且我需要是一个管理员来改变这种行为。“* –
这是一个很好的问题,我很好奇,答案有什么安全边际默认将GPO停止在我的环境中运行脚本(.ps1文件),我们使用的解决方法是使用一些参数创建指向powershell.exe的快捷方式,但它最终会运行脚本。我们桌面工程师觉得非常有用。 – cet51
@CoryEtmund至少我没有疯狂。我只是这样做了,我一直在盯着屏幕思考“这真的*是必要的吗?”一方面和“这是否真的*工作?”在另一! –
PowerShell的执行策略不是安全功能,而是管理员安全功能(类似于枪支上的安全)。你必须明确地说,“是的,我想运行脚本。”如果有人出于安全原因启用了限制性执行策略,那么IMO就会让合法用户烦恼(有点像阻止用户通过策略运行'cmd.exe',这令人恼火和毫无意义)。 –