深入SleepObfs的检测与绕过
字数 2123 2025-10-01 14:05:44

SleepObfs 技术深度解析:检测与绕过策略

1. 睡眠混淆(Sleep Obfuscation)背景

睡眠混淆技术主要用于规避安全产品对恶意代码睡眠模式的检测,核心目标是掩盖恶意代码的等待/延迟行为。该技术主要源自以下项目:

  • EKKO:最早的睡眠混淆实现之一
  • Nighthawk C2:实现了Sleepobf技术
  • BRC4:商业C2平台,在规避技术方面表现突出
  • C5:在Havoc框架中贡献了相关实现

这些实现大多建立在彼此的基础上,形成了技术演进路径。

2. SleepObfs 实现原理

2.1 APC(异步过程调用)方式

实现机制:

  1. 使用NtCreateThreadEx创建挂起线程(传入THREAD_CREATE_FLAGS_CREATE_SUSPENDED标志)
  2. 通过NtQueueApcThread向线程插入一系列APC
  3. 挂起线程执行APC队列完成睡眠混淆

关键API:

// 创建挂起线程
NtCreateThreadEx(
    &threadHandle, 
    ACCESS_MASK, 
    NULL, 
    processHandle, 
    startAddress, 
    parameter, 
    THREAD_CREATE_FLAGS_CREATE_SUSPENDED, // 挂起标志
    0, 
    0, 
    0, 
    NULL
);

// 队列APC
NtQueueApcThread(
    threadHandle, 
    apcFunction, 
    argument1, 
    argument2, 
    argument3
);

2.2 线程池(ThreadPool)方式

实现机制:

  1. 使用CreateTimerQueue创建计时器队列
  2. 通过CreateTimerQueueTimer将计时器排队运行
  3. 底层实际调用RtlCreateTimerTpAllocTimer

调用链分析:

RtlCreateTimer → TpAllocTimer → RtlpTpTimerCallback → TppStartThreadData

关键特性:

  • 计时器回调和参数存储在堆内存中
  • 整个执行流程在Ring3完成,不进入Ring0
  • 与Cronos(使用CreateWaitableTimerW)有本质区别

3. 检测方法与规避策略

3.1 APC方式检测

3.1.1 Ring3 Hook检测

  • 检测点:Hook NtCreateThreadEx等线程创建函数
  • 示例:SentinelOne EDR在NtCreateThreadEx放置检测hook

3.1.2 内核回调检测

  • 检测点:通过PsSetCreateThreadNotifyRoutineEx注册线程创建回调
  • 特性:在Ring0执行,难以在用户态绕过

3.1.3 Ring0 ETW检测

  • 检测点:ETWTI(ETW威胁情报)记录APC和线程挂起事件
  • 特性:生成内核遥测数据供SOC人工审计

3.1.4 Elastic EDR检测

  • 检测规则:检测通过NtTestAlert触发的内存属性修改
  • 响应:直接终止进程

3.2 线程池方式检测

3.2.1 Hunting-Sleep-Beacon (HSB) 检测

检测点1:可疑计时器回调

  • 规则:检测回调是否指向特定函数(如ntdll!NtContinue
  • 可疑函数列表NtContinue, RtlRestoreContext, SetThreadContext
  • 绕过方法:使用jmp/call gadget间接调用目标函数

检测点2:异常模块间调用

  • 规则:检测调用栈中的模块转换(如kernel32→ntdll)
  • 绕过方法:确保调用栈完全位于ntdll模块内

检测点3:非可执行内存区域

  • 规则:检测睡眠时内存权限变为RW(非可执行)
  • 绕过方法
    • 堆栈欺骗(Stack Spoofing)
    • DeathSleep技术(完全解除线程)

检测点4:RtlpTpTimerCallback阻塞状态

  • 规则:检测栈上存在的计时器回调地址
  • 绕过方法
    • 栈加密(BRC4采用的方法)
    • 调用栈操纵(CallStack Master/Vulcan Raven)
    • 堆栈复制(Stack Duplication)克隆合法线程上下文

3.2.2 TickTock检测器

  • 检测原理:跟踪计时器的堆分配,定位回调和上下文
  • 绕过方法
    1. 将回调函数地址改为call指令地址
    2. 将上下文RIP改为jmp寄存器指令

3.2.3 国内EDR检测

  • 检测方法:对RtlCreateTimerRtlRegisterWait进行inline hook
  • 绕过方法:跳过被hook的指令,用汇编自实现后跳回原流程

4. 高级规避技术

4.1 调用栈操纵

  • 原理:动态计算和重建合法调用栈
  • 实现:使用0截断堆栈,提升堆栈指针,布置伪造栈帧

4.2 上下文克隆

  • 原理:复制合法线程的TEB和NtTib结构
  • 实现:克隆线程池上下文,制造合法线程假象

4.3 混合技术

  • 实践建议:结合多种技术形成深度规避方案
  • 示例:BRC4的栈加密 + Havoc的堆栈复制 + 自定义调用栈

5. 未来趋势

  1. 检测方向:更多依赖Ring0的ETW和内核回调
  2. 规避方向:更精细的上下文操纵和内存欺骗
  3. 对抗升级:从API层对抗转向系统机制层对抗

6. 总结

睡眠混淆技术的对抗是猫鼠游戏的典型代表。当前有效的规避策略需要:

  1. 深入理解Windows线程和计时器机制
  2. 结合多种技术形成深度防御绕过
  3. 关注内核级检测技术的发展趋势
  4. 参考主流C2框架(BRC4、Havoc等)的实现方案

随着安全产品检测能力的提升,未来的规避技术将更加依赖系统底层的精细操纵和对合法系统行为的深度模仿。


本文基于对多种睡眠混淆实现和检测技术的深入分析,旨在提供技术研究参考。请合法合规使用相关技术知识。

SleepObfs 技术深度解析:检测与绕过策略 1. 睡眠混淆(Sleep Obfuscation)背景 睡眠混淆技术主要用于规避安全产品对恶意代码睡眠模式的检测,核心目标是掩盖恶意代码的等待/延迟行为。该技术主要源自以下项目: EKKO :最早的睡眠混淆实现之一 Nighthawk C2 :实现了Sleepobf技术 BRC4 :商业C2平台,在规避技术方面表现突出 C5 :在Havoc框架中贡献了相关实现 这些实现大多建立在彼此的基础上,形成了技术演进路径。 2. SleepObfs 实现原理 2.1 APC(异步过程调用)方式 实现机制: 使用 NtCreateThreadEx 创建挂起线程(传入 THREAD_CREATE_FLAGS_CREATE_SUSPENDED 标志) 通过 NtQueueApcThread 向线程插入一系列APC 挂起线程执行APC队列完成睡眠混淆 关键API: 2.2 线程池(ThreadPool)方式 实现机制: 使用 CreateTimerQueue 创建计时器队列 通过 CreateTimerQueueTimer 将计时器排队运行 底层实际调用 RtlCreateTimer 和 TpAllocTimer 调用链分析: 关键特性: 计时器回调和参数存储在堆内存中 整个执行流程在Ring3完成,不进入Ring0 与Cronos(使用 CreateWaitableTimerW )有本质区别 3. 检测方法与规避策略 3.1 APC方式检测 3.1.1 Ring3 Hook检测 检测点 :Hook NtCreateThreadEx 等线程创建函数 示例 :SentinelOne EDR在 NtCreateThreadEx 放置检测hook 3.1.2 内核回调检测 检测点 :通过 PsSetCreateThreadNotifyRoutineEx 注册线程创建回调 特性 :在Ring0执行,难以在用户态绕过 3.1.3 Ring0 ETW检测 检测点 :ETWTI(ETW威胁情报)记录APC和线程挂起事件 特性 :生成内核遥测数据供SOC人工审计 3.1.4 Elastic EDR检测 检测规则 :检测通过 NtTestAlert 触发的内存属性修改 响应 :直接终止进程 3.2 线程池方式检测 3.2.1 Hunting-Sleep-Beacon (HSB) 检测 检测点1:可疑计时器回调 规则 :检测回调是否指向特定函数(如 ntdll!NtContinue ) 可疑函数列表 : NtContinue , RtlRestoreContext , SetThreadContext 等 绕过方法 :使用jmp/call gadget间接调用目标函数 检测点2:异常模块间调用 规则 :检测调用栈中的模块转换(如kernel32→ntdll) 绕过方法 :确保调用栈完全位于ntdll模块内 检测点3:非可执行内存区域 规则 :检测睡眠时内存权限变为RW(非可执行) 绕过方法 : 堆栈欺骗(Stack Spoofing) DeathSleep技术(完全解除线程) 检测点4:RtlpTpTimerCallback阻塞状态 规则 :检测栈上存在的计时器回调地址 绕过方法 : 栈加密(BRC4采用的方法) 调用栈操纵(CallStack Master/Vulcan Raven) 堆栈复制(Stack Duplication)克隆合法线程上下文 3.2.2 TickTock检测器 检测原理 :跟踪计时器的堆分配,定位回调和上下文 绕过方法 : 将回调函数地址改为call指令地址 将上下文RIP改为jmp寄存器指令 3.2.3 国内EDR检测 检测方法 :对 RtlCreateTimer 和 RtlRegisterWait 进行inline hook 绕过方法 :跳过被hook的指令,用汇编自实现后跳回原流程 4. 高级规避技术 4.1 调用栈操纵 原理 :动态计算和重建合法调用栈 实现 :使用0截断堆栈,提升堆栈指针,布置伪造栈帧 4.2 上下文克隆 原理 :复制合法线程的TEB和NtTib结构 实现 :克隆线程池上下文,制造合法线程假象 4.3 混合技术 实践建议 :结合多种技术形成深度规避方案 示例 :BRC4的栈加密 + Havoc的堆栈复制 + 自定义调用栈 5. 未来趋势 检测方向 :更多依赖Ring0的ETW和内核回调 规避方向 :更精细的上下文操纵和内存欺骗 对抗升级 :从API层对抗转向系统机制层对抗 6. 总结 睡眠混淆技术的对抗是猫鼠游戏的典型代表。当前有效的规避策略需要: 深入理解Windows线程和计时器机制 结合多种技术形成深度防御绕过 关注内核级检测技术的发展趋势 参考主流C2框架(BRC4、Havoc等)的实现方案 随着安全产品检测能力的提升,未来的规避技术将更加依赖系统底层的精细操纵和对合法系统行为的深度模仿。 本文基于对多种睡眠混淆实现和检测技术的深入分析,旨在提供技术研究参考。请合法合规使用相关技术知识。