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嵌套加载

  1. 创建合法DLL加载器(Program.dll)
  2. 通过反射加载:
[void][System.Reflection.Assembly]::UnsafeLoadFrom("Program.dll")
[Math.methods]::loaddll()

注意:虽然Program.dll未被拦截,但恶意dll仍会被检测

方法3:PowerShell反射加载C# ShellcodeLoader DLL

完整流程

  1. 生成C#格式shellcode并硬编码
  2. 将ShellcodeLoader编译为DLL
  3. 通过PowerShell反射加载:
[void][System.Reflection.Assembly]::UnsafeLoadFrom("SysCall_ShellcodeLoad.dll")
[SysCall_ShellcodeLoad.Loader]::Execute()

3. 关键技术原理分析

3.1 PowerShell反射调用DLL绕过原理

  1. 执行上下文差异

    • 直接调用被视为可疑行为
    • Reflection.Assembly被视为正常.NET程序行为
  2. 安全策略差异

    • 对命令行工具严格监控
    • 对.NET应用程序内部动态加载行为较宽松
  3. 信任级别

    • .NET应用程序被视为更可信

3.2 SysCall_ShellcodeLoad技术

核心组件:

  • Auto_NativeCode.cs
  • Program.cs

关键步骤:

  1. 获取系统调用号
public static uint GetSyscallID(string SysFunName) {
    IntPtr hModule = GetModuleHandle("ntdll.dll");
    IntPtr FunAddr = GetProcAddress(hModule, SysFunName);
    IntPtr CallAddr = FunAddr + 4;
    // 读取Syscall ID
}
  1. 动态执行系统调用
byte[] sysfinal = syscall1.Concat(syscallid).Concat(syscall2).ToArray();
fixed (byte* ptr = sysfinal) {
    VirtualProtectEx(...);
    // 将字节数组转换为函数指针并执行
}
  1. 内存分配与执行
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

关键步骤:

  1. 获取模块和函数地址
public static IntPtr GetLoadedModuleAddress(string DLLName) {
    foreach (ProcessModule Mod in ProcModules) {
        if (Mod.FileName.ToLower().EndsWith(DLLName.ToLower())) {
            return Mod.BaseAddress;
        }
    }
}
  1. D/Invoke调用流程
// 获取函数地址
func_ptr = DInvokeFunctions.GetLibraryAddress("kernel32.dll", "VirtualAlloc");
// 转换为委托
DELEGATES.VirtualAllocRx VirtualAllocRx = Marshal.GetDelegateForFunctionPointer(...);
// 调用函数
IntPtr rMemAddress = VirtualAllocRx(0, (uint)codepent.Length, 0x1000 | 0x2000, 0x40);
  1. 线程创建与执行
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 企业防御措施

  1. 多层次监控

    • 结合EDR、AV、网络监控
    • 特别关注PowerShell异常行为
  2. 增强策略

    • 限制System.Reflection.Assembly使用
    • 监控非常规DLL加载行为
  3. 其他措施

    • 定期安全审计
    • 员工安全意识培训
    • 漏洞评估与管理

5.2 检测建议

  1. 监控异常PowerShell活动
  2. 检测非常规DLL加载模式
  3. 分析.NET应用程序异常行为
  4. 建立Syscall调用基线

6. 参考资源

  1. SysCall_ShellcodeLoad_Csharp
  2. DInvoke_shellcodeload_CSharp
  3. D/Invoke技术原理文档
  4. Syscall技术分析文章

7. 总结

本研究展示了在极端白名单环境下,通过PowerShell反射加载结合SysCall或D/Invoke技术,可以有效绕过Carbon Black和Symantec的组合防护。这为红队提供了有价值的绕过思路,同时也为企业安全建设提供了防御参考,强调了多层次防御的重要性。

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 原理 :利用.NET Framework的反射机制加载看似合法的DLL,执行无害函数 方法2:PowerShell + Dll Loader嵌套加载 创建合法DLL加载器(Program.dll) 通过反射加载: 注意 :虽然Program.dll未被拦截,但恶意dll仍会被检测 方法3:PowerShell反射加载C# ShellcodeLoader DLL 完整流程 : 生成C#格式shellcode并硬编码 将ShellcodeLoader编译为DLL 通过PowerShell反射加载: 3. 关键技术原理分析 3.1 PowerShell反射调用DLL绕过原理 执行上下文差异 : 直接调用被视为可疑行为 Reflection.Assembly被视为正常.NET程序行为 安全策略差异 : 对命令行工具严格监控 对.NET应用程序内部动态加载行为较宽松 信任级别 : .NET应用程序被视为更可信 3.2 SysCall_ ShellcodeLoad技术 核心组件: Auto_ NativeCode.cs Program.cs 关键步骤: 获取系统调用号 : 动态执行系统调用 : 内存分配与执行 : 3.3 D/Invoke_ shellcodeload技术 核心组件: DInvokeFunctions.cs Program.cs 关键步骤: 获取模块和函数地址 : D/Invoke调用流程 : 线程创建与执行 : 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的组合防护。这为红队提供了有价值的绕过思路,同时也为企业安全建设提供了防御参考,强调了多层次防御的重要性。