SMBGhost漏洞技术分析与防御方案

2024-03-03 12:52

本文主要是介绍SMBGhost漏洞技术分析与防御方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事件分析

最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告,笔者利用周末休息时间也研究了一下,就算是做一个笔记了,分享给大家一起学习下,目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出之后导致系统Crash,基本也没啥用,估计现在各大厂商的漏洞研究人员和一些技术成熟的黑客组织都在加紧研究RCE完整利用程序吧,这个漏洞能不能完整利用,会不会像永恒之蓝那样,还需要持续研究跟踪,同时也需要关注后面会不会抓到一些利用这个漏洞的在野攻击样本。

漏洞简介

3月12日晚,微软发布安全公告披露了一个最新的SMB远程代码执行漏洞(CVE-2020-0796),该漏洞主要是因为在最新的Windows 10系统中,处理SMB3.1.1协议的压缩消息时,对头部数据没有做任何安全检查,从而引发内存破坏漏洞,黑客利用此漏洞,可无须任何权限的情况下,即可实现远程内核代码执行。

漏洞成因

从Windows10 v1903/Windows Server v1903开始,微软在协议SMB3.1.1中开启了对数据压缩传输的支持,但是由于SMB没有正确处理压缩的数据包,在客户端/服务端解压数据的时候,没有对COMPRESSIN_TRANSFORM_HEADE结构进行安全校验,导致后续代码发生一连串整形溢出、越界读写等漏洞。

影响版本

Windows10 Version 1903 for 32-bit Systems

Windows10 Version 1903 for x64-based Systems

Windows10 Version 1903 for ARM64-based Systems 

Windows Server, Version 1903 (服务器核心安装)

Windows10 Version 1909 for 32-bit Systems

Windows10 Version 1909 for x64-based Systems

Windows10 Version 1909 for ARM64-based Systems 

Windows Server, Version 1909 (服务器核心安装)

漏洞捕获

从事漏洞分析与研究的朋友都会时刻关注各大厂商公布的漏洞或补丁信息,从公布的这些漏洞信息与补丁,就可以定位到相应的模块进行分析调试,此前微软发布了各个版本操作系统的CVE-2020-0796的补丁包,如下所示:

查看这个漏洞的细节信息,包含漏洞简介,如下所示:

影响范围,以及相应的补丁下载,如下所示:

缓解措施,如下所示:

漏洞分析

1.分析SMB漏洞,需要对SMB漏洞的结构数据比较熟悉,SMB数据结构,可参考微软的官网,里面有SMB的详细数据结构信息,如下所示:

下载文档之后,查看文档目录中关于对SMB传输压缩数据包头的处理,如下所示:

可以找到COMPRESSION_TRANSFORM_HEADE数据结构,如下所示:

里面各个字段的含义,如下所示:

上面这些信息是分析这个漏洞的基础,一定要弄清楚!

2.漏洞的成因在于SMB在处理接收的压缩数据包时出现的错误,先定位到接收压缩数据后处理函数srv2!Srv2ReceiveHandler,通过上面的分析,我们可以利用COMPRESSION_TRANSFORM_HEADE的结构体中的ProtocolId字段定位到相关的代码处,如下所示:

如果传输的数据为压缩数据,则跳转到解压缩数据处理函数Srv2DecompressData,如下所示:

在Srv2DecompressData函数中,使用SrvNetAllocateBuffer进行内存分配时,未对传入的数据进行校验,会导致整数溢出,然后调用SmbCompressionDecompress函数进行数据解压操作,如下所示:

打过补丁之后,微软修改了这个函数,对传入的值进行三次校验,如下所示:

对比补丁前后的文件中对应的函数,如下所示:

漏洞检测

发送SMB数据包,检测返回的流量数据包特征,如下所示:

构造SMB压缩数据包,SMB数据包头数据,如下所示:

附加上数据压缩算法,如下所示:

检测返回的流量数据包中SMB压缩版本,如下所示:

以及数据包最后的数据,如下所示:

这种检测方法很弱,可能会有误报,目前各厂商的检测方案和工具都没有公布,不然可以逆向分析看看。

防御方案

1.windows自动更新

设置->更新和安全->Windows更新,点击“检查更新”,如下所示:

2.手动安装补丁包

查看自己的电脑Win10操作系统版本,可以按Win+R键,然后键入WINVER命令,如下所示:

确定之后会弹出Win10操作系统版本,我的版本为1809,如下所示:

如果操作系统版本为Windows 10 1903之后,可以根据自己操作系统的版本安装微软提供的对应补丁包程序,下载地址:

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796

3.可以手动修改注册表,防止被黑客远程攻击:

按Win+R键,然后键入WINVER命令,打开注册表编辑器,如下所示:

HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters建立一个名为DisableCompression的DWORD,值为1,禁止SMB的压缩功能,如下所示:

普通用户只要用方法二去微软官网下载相应的补丁包,安装补丁包就可以了

参考链接:

1. https://github.com/ClarotyICS/CVE2020-0796

2.https://syntricks.com/cve-2020-0796-aka-smbghost-vulnerability/

3.https://www.synacktiv.com/posts/exploit/im-smbghost-daba-dee-daba-da.html

4.https://github.com/eerykitty/CVE-2020-0796-PoC

5.https://github.com/ioncodes/SMBGhost

这篇关于SMBGhost漏洞技术分析与防御方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/769678

相关文章

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri