cve-2020-0796_微软SMBv3 Client/Server远程代码执行漏洞简单分析(CVE20200796)
>>>>
1、漏洞文件
漏洞存在于srv2.sys文件中。
>>>>
2、漏洞函数
该漏洞涉及到了多个函数:
- Srv2DecompressMessageAsync
- Srv2DecompressData
- Smb2GetHonorCompressionAlgOrder
- Smb2SelectCompressionAlgorithm
- Smb2ValidateCompressionCapabilities
三、漏洞分析
>>>>
1、基础数据结构
这里主要看一下SMB2 COMPRESSION_TRANSFORM_HEADER结构:首先,说明了结构使用的场景:客户端或服务器在发送压缩消息时使用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的验证特征。然后,对以上各字段做简要说明:CompressionAlgorithms字段中指定的算法:Flags字段可选的固定值:了解了以上数据结构,可以方便PoC构造和观察流量特征。
>>>>
2、静态分析
srv2.sys文件拖入IDA,先观察函数实现:(1)SMB首先调用srv2!Srv2ReceiveHandler函数接收数据包,并根据ProtocolId设置对应的处理函数:如果判断数据包中为压缩的数据(ProtocolID = 0xfc4d5342),则调用处置函数--Srv2DecompressMessageAsync函数。(2)srv2!Srv2DecompressMessageAsync函数会继续调用 Srv2DecompressData函数:Srv2DecompressMessageAsync函数并不是实际处理压缩数据的函数,而是继续调用了Srv2DecompressData函数,跟进查看Srv2DecompressData函数:在Srv2DecompressData函数中可以看到数据处理的部分:在进行buffer分配时,会调用SrvNetAllocateBuffer进行分配。但是在调用时,并未对OriginalCompressedSegmentSize和Offset/Length的长度进行任何检查,对二者相加的和也未进行安全检查。此处就存在一个整数溢出,如果二者的和为一个特别大的值,会超出内存存储范围,值会变成一个很小的值。(3)srv2!Srv2DecompressData函数调用SmbCompressionDecompress函数,进而调用nt!RtlDecompressBufferXpressLz函数进行实际的数据解压过程。nt!RtlDecompressBufferXpressLz函数位于ntoskrnl.exe中,该函数实际进行的处理就是:由上面的代码可以看到在进行数据解压缩时,首先进行smb compress协议数据包的解析,获取其中包含的需要解压缩的数据的大小,并和之前通过SrvNetAllocateBuffer分配的buffer的OriginalCompressedSegmentSize值进行比较,确认其大小不大于OriginalCompressedSegmentSize,然后进行内存拷贝。若v21大于OriginalCompressedSegmentSize,则返回0xC0000242错误。因为在2中进行内存分配时没有做长度检查,所以如果传入一个很大的OriginalCompressedSegmentSize值触发整数溢出。此时v21就可以设置一个极大值,但可以通过对decompress size的判断,最终调用qmemcpy拷贝一个极大的size导致缓冲区溢出。
>>>>
3、crash的PoC复现
首先是靶机只是开机,未登录的状态:直接执行PoC,可以成功执行:正常登录后的执行,只是正常登录,并未进行任何文件或文件夹的共享设置:同样可以造成蓝屏:所以,不管存在漏洞的系统是否登录、是否开启了共享,都可以正常执行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函数进行了更新,添加了一些数据长度的检查。
>>>>
6、流量分析
使用两个不同的PoC造成的蓝屏的流量截图如下:(1)设置Offset/Length字段为ffffffff(2) 设置OriginalCompressedSegmentSize字段为ffffffff:
>>>>
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.html- End -
看雪ID:有毒
https://bbs.pediy.com/user-779730.htm
*本文由看雪论坛 有毒 原创,转载请注明来自看雪社区。
推荐文章++++
* 一个深网灰色直播APP的逆向研究
* 捆绑包驱动锁首病毒分析
* **游戏逆向分析笔记
* 对宝马车载apps协议的逆向分析研究
* x86_64架构下的函数调用及栈帧原理
好书推荐
﹀﹀﹀公众号ID:ikanxue官方微博:看雪安全商务合作:wsc@kanxue.com戳
cve-2020-0796_微软SMBv3 Client/Server远程代码执行漏洞简单分析(CVE20200796)相关推荐
- rmi远程代码执行漏洞_微软 Windows DNS Server 远程代码执行漏洞
安全预警 漏洞:微软 Windows DNS Server 远程代码执行漏洞漏洞编号:CVE-2020-1350威胁程度:高影响范围: Windows Server 2008 for 32-bit S ...
- windows server 2012 远程连不上_CVE20201350 | Windows DNS Server远程代码执行漏洞通告
0x00 漏洞概述 CVE ID CVE-2020-1350 时 间 2020-07-15 类 型 RCE 等 级 严重 远程利用 是 影响范围 0x01 漏洞详情 微软于 ...
- 服务器2008操作系统漏洞,【操作系统安全漏洞 】解决CVE-2017-11780:Microsoft Windows SMB Server远程代码执行漏洞...
一.漏洞描述 2017年10月10日,微软漏洞补丁日修复了多个安全漏洞,其中一个为Microsoft WindowsSMB Server远程执行代码漏洞,根据官方描述该漏洞如果被成功利用,远程攻击者可 ...
- oracle11g远程命令执行漏洞,漏洞应急|Oracle Weblogic Server远程代码执行漏洞(CVE-2021-2109)...
近日,锐捷网络CERT安全应急响应团队关注到Oracle官方发布了2021年1月关键补丁更新公告,该补丁中修补了包括 CVE-2021-2109 Weblogic Server远程代码执行漏洞在内的多 ...
- goahead处理json_GoAhead Web Server远程代码执行漏洞分析(附PoC)
*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 本文是关于GoAhead web server远程代码执行漏洞(CVE-2017- ...
- Windows DNS Server 远程代码执行漏洞 (CVE-2021-24078) 的详细原理分析
聚焦源代码安全,网罗国内外最新资讯! 漏洞简介 Windows DNS Server 是 Windows Server 服务器上的一项重要功能组件, 负责调度和处理域内主机的所有DNS相关服务. 奇 ...
- WebLogic Server 远程代码执行漏洞复现 (CVE-2023-21839)
1.产品简介 Oracle WebLogic Server是一个统一的可扩展平台,用于在本地和云端开发.部署和运行企业应用程序,例如 Java.WebLogic Server提供了Java Enter ...
- Windows 2003 Server远程代码执行漏洞集合
目录 MS08-067 CVE-2017-7269 MS08-067 发布日期:2008/10/22 针对端口:139.445 漏洞等级:高危 漏洞影响:服务器服务中的漏洞可能允许远程执行代码 受影响 ...
- fastjson远程代码执行漏洞问题分析
背景 fastjson远程代码执行安全漏洞(以下简称RCE漏洞),最早是官方在2017年3月份发出的声明, security_update_20170315 没错,强如阿里这样的公司也会有漏洞.代码是 ...
最新文章
- 先搞懂这八大基础概念,再谈机器学习入门!
- js中new实例化对象内部过程
- pdo mysql 建库_一帖让PHP小白彻底了解PDO操作数据库的方法
- 【旧文章搬运】Win7可变对象头结构之InfoMask解析
- logback输出日志到sentry
- 【算法】一个简单的k均值(k-means)原理
- VOC 灰度图 索引图
- (五十五)iOS多线程之GCD
- oracle11管理员连接数据库,1.运行 cmd.exe;2.输入 sqlplus / as sysdba,以系统管理员(sysdba)身份连接数据库,进行数据库管理操作。3.连接成功后执...
- 从命令行接收多个数字,求和之后输出结果
- CCF认证历年试题集
- module 'inn' not found:No LuaRocks module found for inn
- 【JAVA错误笔记】 - 【Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法】
- python uiautomator2 toast_Android自动化测试 - 获取toast提示(Appium+Python+UiAutomator2)
- openresty lua集成kafka
- C#中object sender与EventArgs e
- 转:红帽旗下Linux的版本说明RedHat、CentOS、Fedora、OEL等
- n一加关闭小部件_小部件
- JavaScript实现Sleep效果
- 在计算机中无符号整数和有符号整数,无符号整数和有符号整数怎么区分?
热门文章
- htmlselect保留上次选择内容_搬家买什么工具,搬家有什么技巧,搬家选择什么公司?...
- KMP算法总结+Next数组+Nextval数组
- string的compare operator
- (C语言)猴子选大王
- 【干货】js判断url是否是合法http/https
- 【Qt串口波形绘图】基于QCustomPlot的串口波形绘图上位机,源码开放
- 【Qt教程】1.11 - Qt5 标准对话框QMessageBox(关于、错误、信息、警告、问题、颜色、字体、文件对话框)
- 命令行模式下编译多个C/C++源文件
- 【B/S】ASP.NET---验证码-生成和切换
- HDU-2067-小兔的棋盘