Eternal Synergy漏洞分析:SMBv1认证漏洞的深度剖析

本文深入分析了CVE-2017-0143漏洞的技术细节,该漏洞存在于SMBv1协议的TRANSACTION机制中,攻击者可利用数据包混淆实现内核内存读写,最终通过篡改SMB消息处理函数指针实现远程代码执行。

漏洞背景

2017年4月ShadowBrokers泄露的Eternal Synergy是利用SMBv1协议认证漏洞(CVE-2017-0143)的攻击工具,该漏洞影响Windows 8及以下系统,微软在MS17-010补丁中修复。与常规漏洞不同,该漏洞主要通过数据包层面的操作实现利用。

漏洞原理

核心问题在于SMB协议处理TRANSACTION时未严格校验消息类型:当存在SMB_COM_WRITE_ANDX事务时,若后续收到MID等于该事务FID的SMB_COM_TRANSACTION_SECONDARY消息,系统会错误地将后者纳入当前事务。由于WRITE_ANDX会动态更新InData指针(指向缓冲区末尾),而TRANSACTION_SECONDARY直接使用该指针写入数据,导致缓冲区越界写入。

1
2
3
4
5
6
// srv.sys中的关键判断逻辑
if (Header->Command == SMB_COM_WRITE_ANDX) {
    targetOtherInfo = Fid;  // WRITE_ANDX使用FID作为标识
} else {
    targetOtherInfo = SmbGetAlignedUshort(&Header->Mid); // 其他消息使用MID
}

利用技术

1. 事务劫持

攻击者通过以下步骤控制事务结构:

  1. 创建常规TRANSACTION作为控制事务(InData=0xfffff8a00167f110)
  2. 发送特制WRITE_ANDX消息使InData偏移0x200字节(变为0xfffff8a00167f310)
  3. 通过TRANSACTION_SECONDARY消息(dataDisplacement=0x5020)覆盖相邻事务的OtherInfo字段

2. 内存读写原语

写原语

  • 劫持受害事务的InData指针指向目标地址
  • 发送数据包时,内核会将包内容写入被篡改的地址

读原语

  1. 修改受害事务的OutData指针(偏移0x88)
  2. 设置关键字段:SetupCount=4, MaxSetupCount=0, MaxDataCount=0x20000
  3. 触发事务响应时,内核会将目标内存内容通过SMB响应返回

3. 代码执行

  1. 泄露srv!SrvTransaction2DispatchTable地址
  2. 覆盖TRANS2_SESSION_SETUP处理函数指针(dispatchTable[0xe])
  3. 发送TRANSACTION2消息触发shellcode执行

现代系统防护

该漏洞利用技术受以下防护机制制约:

  • HVCI:阻止执行未签名内核代码
  • CFG:防止通过篡改函数指针劫持控制流

技术亮点

  1. 纯数据包层面的漏洞利用,无需本地shellcode
  2. 通过事务结构泄露实现内核地址嗅探
  3. 利用ntoskrnl.exe的RWX段(0x271000偏移处)作为暂存区
1
2
3
4
; 攻击使用的shellcode片段
mov rax,qword ptr gs:[20h]  ; 获取_KPRCB
add rax,8B0h                ; 定位PPNxPagedLookasideList
call qword ptr [rax]         ; 调用nt!ExAllocatePoolWithTag

结论

Eternal Synergy展示了协议状态机漏洞的复杂利用方式,其创新性的纯数据包攻击模式为后续SMB协议安全设计提供了重要参考。微软通过增强事务验证机制和引入硬件级防护有效遏制了此类攻击。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计