利用SMBGhost (CVE-2020-0796)实现本地权限提升
字数 1464 2025-08-25 22:58:29
SMBGhost (CVE-2020-0796)漏洞分析与利用技术详解
漏洞概述
CVE-2020-0796是Windows SMBv3.1.1协议压缩机制中的一个严重漏洞,也被称为"SMBGhost"。该漏洞影响Windows 10的1903和1909版本,微软已发布补丁修复。漏洞最初被认为可导致远程拒绝服务(DoS),但进一步研究发现它还可实现本地权限提升(LPE)和潜在的远程代码执行(RCE)。
技术分析
漏洞根源
漏洞存在于SMB服务器驱动程序srv2.sys的Srv2DecompressData函数中,是一个整数溢出漏洞。以下是关键数据结构:
typedef struct _COMPRESSION_TRANSFORM_HEADER {
ULONG ProtocolId;
ULONG OriginalCompressedSegmentSize; // 可控字段
USHORT CompressionAlgorithm;
USHORT Flags;
ULONG Offset; // 可控字段
} COMPRESSION_TRANSFORM_HEADER;
typedef struct _ALLOCATION_HEADER {
PVOID UserBuffer; // 可被覆盖的关键字段
// ... 其他字段
} ALLOCATION_HEADER;
漏洞函数分析
Srv2DecompressData函数的主要流程:
-
内存分配:使用
SrvNetAllocateBuffer分配缓冲区Alloc = SrvNetAllocateBuffer((ULONG)(Header->OriginalCompressedSegmentSize + Header->Offset), NULL);这里
OriginalCompressedSegmentSize + Header->Offset可能整数溢出 -
解压缩数据:调用
SmbCompressionDecompressSmbCompressionDecompress(Header->CompressionAlgorithm, ...); -
数据复制:如果Offset>0,复制原始数据
memcpy(Alloc->UserBuffer, (PUCHAR)Header + sizeof(COMPRESSION_TRANSFORM_HEADER), Header->Offset);
漏洞触发条件
通过精心构造的OriginalCompressedSegmentSize和Offset值:
- 使用极大的
OriginalCompressedSegmentSize和有效的Offset值 - 导致分配缓冲区时整数溢出,分配的缓冲区小于实际需要
- 解压缩时发生越界写入
内存分配机制
SrvNetAllocateBuffer的分配策略:
-
16MB:分配失败
- 1MB-16MB:使用
SrvNetAllocateBufferFromPool - <1MB:从后备列表(Lookaside List)分配
后备列表大小:[0x1100, 0x2100, 0x4100, 0x8100, 0x10100, 0x20100, 0x40100, 0x80100, 0x100100]
利用原理
- 越界写入:通过解压缩阶段的溢出覆盖
ALLOCATION_HEADER结构 - 控制UserBuffer:覆盖
Alloc->UserBuffer指针 - 任意内存写入:后续的
memcpy操作实现任意地址写入
本地权限提升(LPE)利用
利用技术
采用"令牌权限滥用"技术:
- 使用
NtQuerySystemInformation(SystemHandleInformation)泄露进程令牌地址 - 覆盖当前进程令牌,提升权限
- 注入DLL到
winlogon.exe启动特权cmd
利用步骤
- 构造恶意SMB数据包触发漏洞
- 覆盖关键内核数据结构
- 泄露并修改进程令牌
- 提升当前进程权限
- 注入代码到高权限进程
限制条件
- 当前实现需要中等完整性级别
- 依赖特定API调用,在低完整性级别可能不可用
防御与修复
- 立即更新:安装微软官方补丁
- 临时缓解:
- 禁用SMBv3.1.1压缩功能
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" DisableCompression -Type DWORD -Value 1 -Force- 关闭445端口
- 网络隔离:限制SMB端口的网络访问
研究展望
进一步研究方向:
- 实现从LPE到RCE的利用
- 探索其他可覆盖的内核数据结构
- 研究在低完整性级别下的利用方法
总结
CVE-2020-0796是一个严重的SMB协议漏洞,通过精心构造的压缩数据包可导致本地权限提升。虽然当前公开的PoC主要展示LPE能力,但该漏洞理论上也可实现远程代码执行。系统管理员应立即应用补丁并采取缓解措施,研究人员可继续深入探索其完整利用潜力。