通过Elastic EDR看smbexec并进行二次开发Bypass
字数 2104 2025-08-30 06:50:12

Elastic EDR环境下SMBExec横向移动绕过技术研究

前言

本文详细分析在Elastic EDR环境下使用SMBExec进行横向移动时遇到的检测机制,以及如何通过二次开发绕过这些检测。Elastic EDR作为一款开源终端检测与响应解决方案,对SMBExec这类横向移动技术有着较为完善的检测能力。通过深入研究其检测规则并修改SMBExec实现特征,最终实现了在Elastic EDR 8.17版本下的零告警横向移动。

SMBExec原理解析

执行流程分析

  1. 初始化阶段

    • 用户输入参数传入CMDEXEC类初始化
    • 进入run函数设置Pipe命令管道、连接端口和目标主机
    • 默认使用svcctl管道(Windows远程管理服务管道)
    • 初始化RemoteShell类并调用cmdloop函数
  2. RemoteShell初始化

    • 调用rpc.get_dce_rpc获取RPC配置
    • 通过self.__scmr.connect()与服务控制管理器(SCM)建立SMB连接
    • 使用self.__scmr.bind与目标系统SCM建立RPC绑定
    • 调用scmr.hROpenSCManagerW打开目标系统SCM服务句柄
  3. 命令执行准备

    • 调用rpc.get_smb_connection建立SMB文件系统连接
    • 调用self.do_cd获取当前路径(模拟命令提示符)
    • do_cd中调用关键的execute_remote函数

关键函数分析:execute_remote

  1. 命令构造

    • 判断shell_type(默认为cmd)
    • 生成8位随机字符的bat文件名(如%SYSTEMROOT%\xvRHjXzF.bat
    • 构造执行命令示例:
      %COMSPEC% /Q /c echo cd ^> \\%COMPUTERNAME%\C$\__output 2^>^&1 > %SYSTEMROOT%\xvRHjXzF.bat & %COMSPEC% /Q /c %SYSTEMROOT%\xvRHjXzF.bat & del %SYSTEMROOT%\xvRHjXzF.bat
      
  2. 服务操作

    • 调用scmr.hRCreateServiceW创建随机名称服务
    • 服务ImagePath写入构造的command
    • 调用scmr.hRStartServiceW启动服务
    • 调用scmr.hRDeleteService()删除服务
    • 调用scmr.hRCloseServiceHandle关闭服务句柄
    • 通过self.get_output获取命令执行结果

Elastic EDR检测规则分析

  1. Potential Lateral Movement via SMBExec

    • 检测通过SCM在目标系统上执行的SMBExec特征命令
  2. Suspicious Service ImagePath Value

    • 检测服务ImagePath中包含可疑值(如%COMSPEC%
  3. Suspicious Service was Installed in the System

    • 检测系统中安装的可疑服务
  4. System Shells via Services

    • 检测通过服务获取系统Shell的行为
  5. 未命名规则

    • 检测特定模式的命令执行(如cmd.exe /Q

绕过技术实现

第一阶段绕过:基础特征修改

  1. BAT文件处理优化

    • 原实现立即删除BAT文件触发告警
    • 修改方案:
      • 去除立即删除操作(会留下痕迹但减少告警)
      • 或在最后统一执行删除操作
  2. ImagePath特征绕过

    • 原实现使用%COMSPEC%触发检测
    • 修改方案:
      • 直接使用cmd.exe替代%COMSPEC%
      • 或使用PowerShell作为shell类型

第二阶段绕过:服务创建检测

  1. 服务操作优化

    • 原实现创建新服务触发多重告警
    • 修改方案(借鉴SCShell技术):
      • 使用ChangeServiceConfigAAPI修改现有服务ImagePath
      • 避免创建新服务从而绕过"Suspicious Service was Installed"告警
  2. 服务选择策略

    • 大多数Windows版本可使用XblAuthManager服务
    • 低版本Windows可使用defragsvc服务

第三阶段绕过:最终告警消除

  1. 命令特征排除
    • 检测规则中存在排除项NVDisplay.ContainerLocalSystem
    • 修改方案:
      • 在构造命令末尾添加& REM NVDisplay.ContainerLocalSystem
      • 利用REM注释功能满足排除条件

完整绕过实现代码

# 修改后的execute_remote函数关键部分
def execute_remote(self, data):
    # 修改shell类型避免%COMSPEC%检测
    if self.__shell_type == 'powershell':
        command = self.__build_powershell_command(data)
    else:
        # 直接使用cmd.exe避免%COMSPEC%检测
        command = 'cmd.exe /Q /c ' + data
    
    # 使用现有服务而非创建新服务
    service_name = "XblAuthManager"  # 或defragsvc
    scmr.hROpenServiceW(self.__scmr, self.__scManager, service_name)
    
    # 修改服务ImagePath而非创建新服务
    scmr.hRChangeServiceConfigW(self.__scmr, self.__service, 
                               dwStartType=scmr.SERVICE_DEMAND_START,
                               lpBinaryPathName=command)
    
    # 启动服务
    scmr.hRStartServiceW(self.__scmr, self.__service)
    
    # 添加规则排除项
    command += " & REM NVDisplay.ContainerLocalSystem"
    
    # 延迟删除BAT文件(如需)
    if hasattr(self, '_batchFile'):
        self.del_bat()

# 延迟删除BAT文件函数
def del_bat(self):
    command = 'cmd.exe /Q /c del ' + self._batchFile
    # 同样使用服务修改方式执行删除
    scmr.hRChangeServiceConfigW(self.__scmr, self.__service, 
                               lpBinaryPathName=command)
    scmr.hRStartServiceW(self.__scmr, self.__service)

测试效果

经过上述修改后:

  1. 所有5种类型告警均被成功绕过
  2. 成功获取目标主机SYSTEM权限shell
  3. Elastic EDR无任何告警产生

总结与防御建议

攻击方总结

  1. 通过分析EDR检测规则可以找到针对性绕过方法
  2. 修改现有服务比创建新服务更隐蔽
  3. 合理利用规则排除项可以避免触发检测
  4. 不同Windows版本需要选择不同的服务进行操作

防御方建议

  1. 监控服务配置修改而不仅是服务创建
  2. 对"安全"服务的异常修改行为进行检测
  3. 更新排除项规则避免被滥用
  4. 结合多维度行为分析而非单一特征检测

本技术研究展示了在Elastic EDR环境下实现OPSEC安全的SMB横向移动方法,对于红队演练和渗透测试具有实战价值。对于商用EDR产品,需要根据其具体检测规则进行进一步测试和调整。

Elastic EDR环境下SMBExec横向移动绕过技术研究 前言 本文详细分析在Elastic EDR环境下使用SMBExec进行横向移动时遇到的检测机制,以及如何通过二次开发绕过这些检测。Elastic EDR作为一款开源终端检测与响应解决方案,对SMBExec这类横向移动技术有着较为完善的检测能力。通过深入研究其检测规则并修改SMBExec实现特征,最终实现了在Elastic EDR 8.17版本下的零告警横向移动。 SMBExec原理解析 执行流程分析 初始化阶段 : 用户输入参数传入CMDEXEC类初始化 进入run函数设置Pipe命令管道、连接端口和目标主机 默认使用 svcctl 管道(Windows远程管理服务管道) 初始化RemoteShell类并调用 cmdloop 函数 RemoteShell初始化 : 调用 rpc.get_dce_rpc 获取RPC配置 通过 self.__scmr.connect() 与服务控制管理器(SCM)建立SMB连接 使用 self.__scmr.bind 与目标系统SCM建立RPC绑定 调用 scmr.hROpenSCManagerW 打开目标系统SCM服务句柄 命令执行准备 : 调用 rpc.get_smb_connection 建立SMB文件系统连接 调用 self.do_cd 获取当前路径(模拟命令提示符) 在 do_cd 中调用关键的 execute_remote 函数 关键函数分析:execute_ remote 命令构造 : 判断 shell_type (默认为cmd) 生成8位随机字符的bat文件名(如 %SYSTEMROOT%\xvRHjXzF.bat ) 构造执行命令示例: 服务操作 : 调用 scmr.hRCreateServiceW 创建随机名称服务 服务ImagePath写入构造的command 调用 scmr.hRStartServiceW 启动服务 调用 scmr.hRDeleteService() 删除服务 调用 scmr.hRCloseServiceHandle 关闭服务句柄 通过 self.get_output 获取命令执行结果 Elastic EDR检测规则分析 Potential Lateral Movement via SMBExec : 检测通过SCM在目标系统上执行的SMBExec特征命令 Suspicious Service ImagePath Value : 检测服务ImagePath中包含可疑值(如 %COMSPEC% ) Suspicious Service was Installed in the System : 检测系统中安装的可疑服务 System Shells via Services : 检测通过服务获取系统Shell的行为 未命名规则 : 检测特定模式的命令执行(如 cmd.exe /Q ) 绕过技术实现 第一阶段绕过:基础特征修改 BAT文件处理优化 : 原实现立即删除BAT文件触发告警 修改方案: 去除立即删除操作(会留下痕迹但减少告警) 或在最后统一执行删除操作 ImagePath特征绕过 : 原实现使用 %COMSPEC% 触发检测 修改方案: 直接使用 cmd.exe 替代 %COMSPEC% 或使用PowerShell作为shell类型 第二阶段绕过:服务创建检测 服务操作优化 : 原实现创建新服务触发多重告警 修改方案(借鉴SCShell技术): 使用 ChangeServiceConfigA API修改现有服务ImagePath 避免创建新服务从而绕过"Suspicious Service was Installed"告警 服务选择策略 : 大多数Windows版本可使用 XblAuthManager 服务 低版本Windows可使用 defragsvc 服务 第三阶段绕过:最终告警消除 命令特征排除 : 检测规则中存在排除项 NVDisplay.ContainerLocalSystem 修改方案: 在构造命令末尾添加 & REM NVDisplay.ContainerLocalSystem 利用REM注释功能满足排除条件 完整绕过实现代码 测试效果 经过上述修改后: 所有5种类型告警均被成功绕过 成功获取目标主机SYSTEM权限shell Elastic EDR无任何告警产生 总结与防御建议 攻击方总结 通过分析EDR检测规则可以找到针对性绕过方法 修改现有服务比创建新服务更隐蔽 合理利用规则排除项可以避免触发检测 不同Windows版本需要选择不同的服务进行操作 防御方建议 监控服务配置修改而不仅是服务创建 对"安全"服务的异常修改行为进行检测 更新排除项规则避免被滥用 结合多维度行为分析而非单一特征检测 本技术研究展示了在Elastic EDR环境下实现OPSEC安全的SMB横向移动方法,对于红队演练和渗透测试具有实战价值。对于商用EDR产品,需要根据其具体检测规则进行进一步测试和调整。