【cobalt strike手册0x06】Sleep Mask
Sleep Mask
Sleep Mask默认执行以下操作
- 在睡眠时混淆内存中的Beacon
- 使用BeaconGate的代理WinAPI
- 特定情况清理内存
https://github.com/Cobalt-Strike/sleepmask-vs
混淆Beacon
- 使用名为
ALLOCATED_MEMORY
的数据结构定义Beacon PE各节区在内存中的位置 - 代码会根据每个节区的信息进行内存数据的掩码/解掩码操作
内存保护属性配置
- 当
stage.userwx
设为true
时:
-
- 所有PE节区设置为RWX(可读可写可执行)权限
- 支持直接进行掩码/解掩码操作
- 当
stage.userwx
设为false
时:
-
- 除".text"代码节区外均设为RW(可读可写)权限
- ".text"节区设为RX(可读可执行)权限
- 对".text"节区操作时需临时修改权限:
-
-
- 掩码前通过
VirtualProtect
API改为RW - 解掩码后恢复为RX
- 掩码前通过
-
堆内存处理
- 通过
BEACON_INFO
数据结构提供堆内存位置信息 - 以连续的
HEAP_RECORD
结构块形式传递 - 内存块以全零的
HEAP_RECORD
条目作为结束标记
UDRL特殊情况
- 使用用户定义反射加载器(UDRL)时
- 节区内存权限完全由UDRL代码定义
- 不受
stage.userwx
设置约束
注:此机制自4.10版本成为默认睡眠掩码功能,早期版本可通过Arsenal Kit实现。
代理WinAPI
代理调用执行流程
- 内存混淆阶段:首先执行混淆逻辑对Beacon进行内存掩码
- API调用阶段:执行目标Windows API调用
- 内存恢复阶段:执行解混淆逻辑恢复Beacon内存
特殊注意事项
- 交互模式豁免:当Beacon被设置为交互模式(任务间隔<3秒)时,将自动禁用内存掩码/解掩码操作,以避免CPU使用率异常波动
- 性能优化:该设计确保高频交互时不会因重复加解密操作影响系统性能
技术实现特点
此机制通过BeaconGate实现API调用的安全封装,在保证隐蔽性的同时维持操作稳定性,特别考虑了交互场景下的性能表现。
退出机制说明
当满足以下配置时,Beacon会话通过exit
命令终止时会调用睡sleep mask函数:
- 退出方法设置为
ExitThread
- 未配置模块踩踏(module stomping)
- Beacon Gate配置为
All
、Cleanup
或ExitThread
清理流程
- API调用:Beacon将通过BeaconGate调用
ExitThread
Windows API - 内存释放:在执行
ExitThread
前,睡眠掩码函数会:
-
- 调用特定清理函数
- 释放
ALLOCATED_MEMORY
数据结构中定义的内存
特殊内存处理
- ALLOCATED_MEMORY_PURPOSE字段:
-
- 当设置为
PURPOSE_SLEEPMASK_MEMORY
时,该内存不会被释放 - 原因:无法安全释放当前正在执行的内存,除非使用定时器等自定义方法
- 当设置为
例外情况
当退出方法设置为ExitProcess
时:
- 直接终止整个进程
- 操作系统会自动释放所有内存
- 无需调用睡眠掩码函数
注:此机制确保Beacon退出时能安全清理内存痕迹,同时处理了不同退出方法的特殊情况。