Eternal Champion漏洞分析
概述
Eternal Champion是一个针对Windows XP至Windows 8系统的认证后SMB v1漏洞利用工具。分析显示,该漏洞利用依赖于自Windows 8起已被缓解的技术,并在Windows 10中得到进一步加固。本文重点分析针对Windows 7 x64 RTM的利用过程。
漏洞原理
漏洞本质是SMBv1处理事务时存在的竞态条件。事务是一种可能跨多个数据包的请求类型:
- 当事务主请求包含所有预期数据时,事务不会被标记为"正在执行",但仍会被放入事务列表并发送到ExecuteTransaction函数
- 这使得竞态成为可能:次级请求(在单独线程处理)可以在ExecuteTransaction执行期间修改事务数据
- ExecuteTransaction未预料到此情况,结合宽松的参数验证,会导致访问违规
利用过程
信息泄露阶段
通过越界读取实现池信息泄露:
- 发送包含多个SMB的单个数据包
- 主事务请求使用NT RENAME功能(包含所有预期数据)
- 次级事务请求触发竞态条件
- 通过池喷洒使TRANSACTION结构在内存中连续布局
- 利用DataCount字段被恶意递增的特性,读取相邻TRANSACTION结构中的Connection指针
远程代码执行阶段
使用Transaction2/Transaction2Secondary请求:
- 创建包含shellcode的事务(存储第二阶段载荷)
- 发送包含多个SMB的数据包触发竞态
- 利用SrvSmbQueryPathInformation中的关键代码行:
transaction->InData = (PVOID)&objectName;
- 通过竞态使InData指针指向主请求处理线程的栈空间
- 精确覆盖栈上的返回地址实现控制流劫持
载荷机制
攻击者通过以下步骤执行自定义shellcode:
- 利用泄露的CONNECTION对象地址定位ClientOSType字段
- 构造特殊的UNICODE_STRING结构(MaximumLength=0x15ff)
- 覆盖返回地址指向CONNECTION->ClientOSType.MaximumLength
- 通过call指令跳转到攻击者控制的缓冲区执行stage1 shellcode
- stage1代码搜索事务列表找到包含stage2 shellcode的事务并执行
缓解措施影响
- Windows 8 x64+:内核虚拟地址空间(包括分页/非分页池)设置为不可执行,阻断池中代码执行
- Windows 10:
- HVCI(Hypervisor-enforced Code Integrity)阻止未签名内核页执行
- 完整的64位内核ASLR(1607版本随机化所有区域除外HAL堆,1703版本随机化HAL堆)
- 32位Windows 8仍存在可执行分页池,因此仍受影响
shellcode分析
Stage 0
通过UNICODE_STRUCTURE结构实现初始跳转:
|
|
Stage 1
- 定位CONNECTION结构并遍历TransactionList
- 查找带有特殊标识符的事务记录
- 从事务中复制stage2 shellcode并执行
Stage 2
- 执行完整性检查
- 执行用户提供的自定义shellcode(通过fuzzbunch)
- 包含清理和恢复正常线程执行的逻辑
技术细节
漏洞利用涉及多个精巧的内存操作:
- 精确的池布局控制通过TRANSACTION结构喷洒实现
- 利用UNICODE_STRING结构特性构造代码指针
- 多线程同步确保竞态条件可靠触发
- 通过ETHREAD结构分析实现可靠的线程恢复
该漏洞利用展示了即使在内核环境中,结合恰当的时序和内存操作,也能实现可靠的代码执行。现代Windows系统的安全增强显著提高了此类利用的技术门槛。