SMBv3远程代码执行漏洞(CVE-2020-0796)是今年三月份爆出的windows系统漏洞,而后又在网上爆出了poc和exp,由于之前对smb协议不太了解,所以没有仔细去复现,后面又忙其他的事耽误了,总算到年底抽一些时间复现一下漏洞。

0x01 漏洞原理

Windows 10和windows server 2019引入了SMB 3.1.1,本次漏洞源于SMBv3没有正确处理压缩的数据包,在解压数据包的时候使用客户端传过来的长度进行解压时,并没有检查长度是否合法,最终导致整数溢出。

0x02 影响版本

因为smb3.1.1是比较新的smb协议,所以影响版本存在于windows和windows server的高版本中。

  • Windows 10 Version 1903 for 32-bit Systems
  • Windows 10 Version 1903 for ARM64-based Systems
  • Windows 10 Version 1903 for x64-based Systems
  • Windows 10 Version 1909 for 32-bit Systems
  • Windows 10 Version 1909 for ARM64-based Systems
  • Windows 10 Version 1909 for x64-based Systems
  • Windows Server, version 1903 (Server Core installation)
  • Windows Server, version 1909 (Server Core installation)

0x03 初版POC

最初版本的POC是客户端在smb版本协商的时候,添加进支持smb3.1.1,如果服务端响应支持smb3.1.1和smb压缩,就报存在该漏洞。如果打完补丁,用该POC仍然会报Vulnerable。
初版POC地址:https://github.com/ollypwn/SMBGhost
脚本检测服务端响应的Negotiate Protocol Response中的Dialect的字节流是否为11 03,表明smb协议协商版本3.1.1,NegotiateContextCount的字节流否为02 00,表明启用压缩。
DeepinScrot-3213.png

0x04 蓝屏POC

蓝屏POC地址:https://github.com/eerykitty/CVE-2020-0796-PoC
该POC利用这个缓冲区溢出漏洞可以将目标打蓝屏,以此确认该目标存在该漏洞。
在smb身份认证的后半阶段,客户端发送压缩的smb数据,OriginalSize字段表示原始的未压缩数据大小,offset字段表示压缩数据的大小,OriginalCompressedSegmentSize+Offset小于实际需要分配的内存大小,从而在后续调用解压函数SmbCompressionDecompress过程中存在越界读取或者写入的风险。这里的蓝屏poc的offset即为伪造的长度。
蓝屏POC伪造的offset长度

0x05 msf的正向shell POC

msf的正向shell POC:https://github.com/chompie1337/SMBGhost_RCE_PoC
该POC的详细利用过程这篇文章《从CVE-2020-0796到Meterpreter后渗透攻击》上有,主要注意把msfvenom生成的shellcode替换到exp脚本中去,以及关闭目标机器上的防火墙和windows defender。
攻击流量把shellcode传入Compressed SMB3 data字段中,虽然每次身份认证服务端会RST会话,但是shellcode分配在内存中没有丢失,最后接受msf的正向shell连接。
exp中伪造未压缩数据长度.png
服务端接收正向shell.png

参考文档:
https://www.freebuf.com/vuls/233263.html
https://blog.riskivy.com/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%8E%A2%E7%B4%A2smbv3%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9Epoc/
Last modification:December 2nd, 2020 at 12:38 am