PowerShell.exe -ExecutionPolicy绕过-脚本头

问题描述

我正在尝试轻松地ByPass PowerShell ExecutionPolicy。我知道一个简单的解决方法是创建runme.ps1script.ps1,然后在runme.ps1Bypass ExecutionPolicy调用script.ps1。有什么方法可以将其放在脚本的“标头”中,并在Bypass插入ExecutionPolicy调用它自己吗?

runme.ps1:

PowerShell.exe -ExecutionPolicy Bypass -File "C:\tmp\script.ps1"

script.ps1:

Write-Host "Hello World"
PAUSE

我目前正在研究“ flag”或“ tmpfile”逻辑,并自行调用脚本,但我想知道是否存在已知/更好的方法,甚至可能将其作为标头我所有的脚本,因此最终用户可以在没有提示的情况下“运行w / powershell”。

欢迎对附录进行解答,并详细说明ExecutionPolicy,但让我们集中讨论这个问题。

关于ExecutionPolicy的讨论应集中在“安全堆栈交换”上,相关文章链接在此处:

https://security.stackexchange.com/questions/118553/whats-the-purpose-of-executionpolicy-settings-in-powershell-if-the-bypass

https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/

但是,重要的是要了解该设置从未意味着 成为安全控制。相反,它旨在防止 管理员避免开枪射击自己。

解决方法

您可以创建某种受信任的启动器(cmd文件或exe文件),该启动器将使用--ExecutionPolicy ByPass标志运行powershell。或者甚至您可以更改double-click操作的行为以始终通过Bypass策略标志运行PowerShell。

但是,系统管理员可以在MachinePolicy\ExecutionPolicyUserPolicy\ExecutionPolicy中加固计算机上的设置,您将无法以常规方式覆盖它。

ExecutionPloicy配置为4 + 1级别,优先级从高到低:

> Get-ExecutionPolicy -List

MachinePolicy (Group Policy)
   UserPolicy (Group Policy)
      Process (Configured using powershell -ExecutionPolicy flag for new process only)
  CurrentUser (User settings)
 LocalMachine (Computer settings)

在运行带有Bypass标志的PowerShell时,实际上设置了Process级的ExecutionPolicy来覆盖CurrentUserLocalMachine的设置,但可以在UserPolicy或{{ 1}}级别由本地或域组策略管理。


更好的方法是使用组策略配置用户策略,以仅允许运行MachinePolicyAllSigned脚本,生成证书RemoteSigned 100年,并使用GPO作为{{1 }},并使用New-SelfSignedCertificate -Type CodeSigning对部署到用户的每个脚本进行签名。

,

TLDR;

PowerShell.exe -ExecutionPolicy Bypass -File "C:\circumvent\industry\standard.ps1" 2>&1>$null

我想共享脚本,并且能够说“右键单击并运行powershell”,这比批处理脚本要糟糕得多,在批处理脚本中我说“双击文件”(人们总是会得到那个!)。

解决方案之所以出现,是因为我的主脚本中有一个PAUSE来读取控制台输出,并且我注意到在我的主脚本调用script.ps1之后,我还收到了另外一个PAUSE提示。从“主/父”脚本中。这让我意识到,调用子脚本后,父脚本可以继续运行。 Ergo,call nonexistent script and pipe output to null!,然后继续快乐。

示例方案:

重新启动后,以下脚本将无法通过“右键单击,运行w / PowerShell”运行,并且我得到了标准的“执行策略提示”:

script.ps1

Write-Host "Calling Scripts? No Problem!"
PAUSE

重新启动后,以下内容有效:

PowerShell.exe -ExecutionPolicy Bypass -File "C:\circumvent\industry\standard.ps1" 2>&1>$null
ECHO "This Script Won't Run Without Line 1" 
ECHO "I had fun to try to circumvent an industry standard" 
ECHO "I Learned a lot about PowerShell ExecutionPolicy"
C:\tmp\script.ps1
PAUSE

结果:

This Script Won't Run Without Line 1
I had fun to try to circumvent an industry standard
I Learned a lot about PowerShell ExecutionPolicy
Calling Scripts? No Problem!
Press Enter to continue...:

基于@BACON的注释进行更新,这实际上仅可以通过“上下文菜单”通过“运行w / powershell”来实现。我尝试将“ powershell”设置为.ps1的默认应用程序,不仅不起作用,而且上下文菜单中删除了“运行w / powershell”选项!

幸好,最终用户将拥有默认设置,并且/或者系统管理员将已经知道如何解决问题。

我最初没有进行测试,但是想知道此解决方案实际上是如何“规避”的方法是尝试仅在标题中使用PowerShell.exe -ExecutionPolicy Bypass。这导致脚本无法运行,因此必须为其分配一个-File,但是如果File不存在并允许脚本继续执行,则该脚本无效。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...