热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cve20200796_微软SMBv3Client/Server远程代码执行漏洞简单分析(CVE20200796)

本文为看雪论坛优秀文章看雪论坛作者ID:有毒北京时间2020年03月11日,互联网中泄漏了关于CVE-2020-0796的相关信息。在此前的微软3月份例
6809a26438e20815cb20a013be7b9176.png本文为看雪论坛优秀文章看雪论坛作者ID:有毒北京时间2020年03月11日,互联网中泄漏了关于CVE-2020-0796的相关信息。在此前的微软3月份例行补丁日更新中,无意中泄漏了该漏洞的存在。该漏洞影响组件为SMBv3,在Windows 10 1903和Windows Server 1903之后的版本中存在,影响范围较广。目前尚未发现可利用EXP,但已有crash的PoC,需要积极应对。此外,该漏洞具有蠕虫传播特性,可以轻松进行蠕虫传播,需要高度重视。一、SMBv3组件介绍SMB,服务器消息块,是一个网络通信协议,用于提供共享访问到文件、打印机和串行端口的节点之间的网络上。它还提供了经过身份验证的进程间通信机制。SMB的大多数用法涉及运行Microsoft Windows的计算机,在引入Active Directory(https://en.wikipedia.org/wiki/Active_Directory)之前被称为“ Microsoft Windows网络” 。相应的Windows服务是用于服务器组件的LAN Manager服务器和用于客户端组件的LAN Manager工作站。Windows 10和Windows Server 2016引入了SMB 3.1.1 。除了在SMB3中添加的AES-128 CCM加密外,该版本还支持AES-128 GCM加密,并使用SHA-512哈希实现预认证完整性检查。当使用SMB 2.x和更高版本连接到客户端时,SMB 3.1.1还添加了必须进行的安全协商步骤。在SMBv3中,有一项数据压缩功能,可以通过SMB进行压缩数据的传输。此次漏洞触发点就位于压缩数据的过程中。二、漏洞信息和描述

>>>>

1、漏洞文件

漏洞存在于srv2.sys文件中。

>>>>

2、漏洞函数

该漏洞涉及到了多个函数:
  • Srv2DecompressMessageAsync
  • Srv2DecompressData
  • Smb2GetHonorCompressionAlgOrder
  • Smb2SelectCompressionAlgorithm
  • Smb2ValidateCompressionCapabilities
三、漏洞分析

>>>>

1、基础数据结构

这里主要看一下SMB2 COMPRESSION_TRANSFORM_HEADER结构:c2d62366b6cd2ea36c05fb377f75e15a.png首先,说明了结构使用的场景:客户端或服务器在发送压缩消息时使用SMB2 COMPRESSION_TRANSFORM_HEADER。此可选标头仅对SMB 3.1.1 dialect有效。可以通过以下链接查看SMB 3.1.1 dialect(https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/a64e55aa-1152-48e4-8206-edd96444e7f7#Appendix_A_69)也就是说,在进行压缩数据传输时,底层使用的是SMB2的COMPRESSION_TRANSFORM_HEADER,但是会有SMB 3.1.1 dialect的验证特征。然后,对以上各字段做简要说明:74367c9c940a6698aae12463640bc936.pngCompressionAlgorithms字段中指定的算法:5f957831fc053d7aca2a5f17f7fb2bf9.pngFlags字段可选的固定值:e5e90009d58d6541fb24ec99f251297f.png了解了以上数据结构,可以方便PoC构造和观察流量特征。

>>>>

2、静态分析

srv2.sys文件拖入IDA,先观察函数实现:(1)SMB首先调用srv2!Srv2ReceiveHandler函数接收数据包,并根据ProtocolId设置对应的处理函数:50d849daba48819501c12763f42c0163.png02ce49167ea2bb4fc193ed24cfb06432.png如果判断数据包中为压缩的数据(ProtocolID = 0xfc4d5342),则调用处置函数--Srv2DecompressMessageAsync函数。(2)srv2!Srv2DecompressMessageAsync函数会继续调用 Srv2DecompressData函数:4b021901f5613c58730c1fa283560af7.pngSrv2DecompressMessageAsync函数并不是实际处理压缩数据的函数,而是继续调用了Srv2DecompressData函数,跟进查看Srv2DecompressData函数:7817e81408cdc73c11cf83ec9cf6bdd8.png在Srv2DecompressData函数中可以看到数据处理的部分:在进行buffer分配时,会调用SrvNetAllocateBuffer进行分配。但是在调用时,并未对OriginalCompressedSegmentSize和Offset/Length的长度进行任何检查,对二者相加的和也未进行安全检查。此处就存在一个整数溢出,如果二者的和为一个特别大的值,会超出内存存储范围,值会变成一个很小的值。(3)srv2!Srv2DecompressData函数调用SmbCompressionDecompress函数,进而调用nt!RtlDecompressBufferXpressLz函数进行实际的数据解压过程。nt!RtlDecompressBufferXpressLz函数位于ntoskrnl.exe中,该函数实际进行的处理就是:5b7d12e829c82f552e1a356f64a704ed.png由上面的代码可以看到在进行数据解压缩时,首先进行smb compress协议数据包的解析,获取其中包含的需要解压缩的数据的大小,并和之前通过SrvNetAllocateBuffer分配的buffer的OriginalCompressedSegmentSize值进行比较,确认其大小不大于OriginalCompressedSegmentSize,然后进行内存拷贝。若v21大于OriginalCompressedSegmentSize,则返回0xC0000242错误。因为在2中进行内存分配时没有做长度检查,所以如果传入一个很大的OriginalCompressedSegmentSize值触发整数溢出。此时v21就可以设置一个极大值,但可以通过对decompress size的判断,最终调用qmemcpy拷贝一个极大的size导致缓冲区溢出。

>>>>

3、crash的PoC复现

首先是靶机只是开机,未登录的状态:b2cb9ca2457b9cfb31291395ee7227b6.png直接执行PoC,可以成功执行:c611ac92c185727eec77014d9abd3583.png正常登录后的执行,只是正常登录,并未进行任何文件或文件夹的共享设置:4e01379ad104d292a3afa169f4657431.png同样可以造成蓝屏:b2967826d7dc091c7285747383b4fe03.png所以,不管存在漏洞的系统是否登录、是否开启了共享,都可以正常执行PoC。联想到EXP,只要可以获取到受影响系统的IP地址,即可进行漏洞攻击。

>>>>

4、PoC代码分析

考虑到PoC尚未大范围传播,此处不放出完整代码,只对关键代码进行解释:

// 设置头部\xfc\x53\x4d\x42// 设置OriginalCompressedSegmentSize字段,此值为多少,后续就要跟多少填充数据\x32\x00\x00\x00// 设置CompressionAlgorithm字段,确定使用的压缩算法\x01\x00// 设置Flags字段\x00\x00// 设置Offset/Length字段\xff\xff\xff\xff其中主要的是要OriginalCompressedSegmentSize + Offset/Length 可以产生溢出,所以这两个字段的值可以更改,最终使用的是两个字段的和。

>>>>

5、更新后的srv2.sys文件

主要是对Srv2DecompressData函数进行了更新,添加了一些数据长度的检查。b72f7f8906821ebffbc9343e6b5f509a.png

>>>>

6、流量分析

使用两个不同的PoC造成的蓝屏的流量截图如下:(1)设置Offset/Length字段为ffffffff63d2b775f0afc415b9eaa0397c09fb83.png(2) 设置OriginalCompressedSegmentSize字段为ffffffff:3139cdd03b0409160a634f3950da75d4.png

>>>>

7、漏洞防御策略

熟悉了漏洞原理后,可以在流量测进行防御,针对已公开的poc,可以比如使用Snort的byte_math关键字判断两个字段的和是否会发生整数溢出,发生了证明可能存在恶意流量。但目前来看,这种防御策略是可以被绕过的。四、缓解措施及安全更新(1)缓解措施:使用以下PowerShell命令禁用SMBv3压缩功能:

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" DisableCompression -Type DWORD -Value 1 -Force使用下面的命令解禁用SMBv3压缩功能:

  Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" DisableCompression -Type DWORD -Value 0 -Force(2)考虑到该漏洞影响较广,且crash的PoC已经公开,强烈建议及时安装官方安全补丁,补丁链接如下:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0618五、备注网上看到一些大佬的分析,定位到了压缩算法里的漏洞,本人能力有限,可能没有分析足够透彻,望包涵。六、参考链接https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/1d435f21-9a21-4f4c-828e-624a176cf2a0#Appendix_A_Target_69https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/78e0c942-ab41-472b-b117-4a95ebe88271http://blogs.360.cn/post/CVE-2020-0796.htmlhttps://www.synacktiv.com/posts/exploit/im-smbghost-daba-dee-daba-da.htmlhttps://www.fortinet.com/blog/threat-research/cve-2020-0796-memory-corruption-vulnerability-in-windows-10-smb-server.html9367fa5d3df7517385f2dfdfd765c351.gif- End -af372df6c79b4b03b4a13ec75ac692cd.png

看雪ID:有毒

https://bbs.pediy.com/user-779730.htm 

*本文由看雪论坛 有毒 原创,转载请注明来自看雪社区。445b5d212fcec61804b9a9bd328874d2.png

推荐文章++++

13f2811451c92b889b9520b08d47540c.png

* 一个深网灰色直播APP的逆向研究

* 捆绑包驱动锁首病毒分析

* **游戏逆向分析笔记

* 对宝马车载apps协议的逆向分析研究

* x86_64架构下的函数调用及栈帧原理

好书推荐a8f9166f1c3c35979646619d529ac12c.png

﹀﹀﹀ebcf5681b1693e195a097b524fafe8f5.png公众号ID:ikanxue官方微博:看雪安全商务合作:wsc@kanxue.com22e30722f7246855f97a93499c99a11b.gif


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 范式转移:构建超级应用——胖应用 + 胖协议
    范式转移:构建超级应用——胖应用 + 胖协议 ... [详细]
  • Bro是一款强大的网络安全工具,以及协议识别与统计的工具。Broisapowerfulnetworkanalysisframeworkthatismuchdifferentfro ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
染伊沐2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有