我们一起分析一下这个刚刚修复的RDP漏洞CVE-2019-0708

写在前面的话
在微软今年五月份的漏洞更新安全公告中,提到了一个跟远程桌面协议(RDP)有关的漏洞。我们之所以要在这里专门针对这个漏洞进行分析,是因为这个漏洞更新涉及到Windows XP以及其他多个Windows操作系统,而众所周知,Windows XP已经很多年没有过更新了。那么为什么微软这一次要修复这个高危漏洞呢?别着急,我们现在一起来看一看!
根据微软发布的安全公告,这是一个非常严证的安全漏洞,它将导致攻击者在目标设备上实现远程代码执行,并植入蠕虫等恶意软件。这也就意味着,一旦目标组织的其中一台设备受到了感染,整个网络系统内其他未受安全保护的计算机设备也将“无一幸免”。在这份安全公告中,微软提到了著名的网络蠕虫“WannaCry”。在2017年三月份,微软修复了针对该恶意软件的相关漏洞(MS17-010),但是在此之前,很多攻击者都在使用“WannaCry”进行网络攻击。
鉴于该漏洞的安全威胁等级(高危漏洞),攻击者很有可能会在这段时间内开发出相应的漏洞利用工具,McAfee高级威胁研究团队也对该漏洞以及相关的威胁场景进行了深度分析,我们建议广大用户尽快修复漏洞CVE-2019-0708。
受影响的操作系统
Windows 2003
Windows XP
Windows 7
Windows Server 2008
Windows Server 2008 R2
RDP协议
远程桌面协议(RDP, Remote Desktop Protocol)是一个多通道(multi-channel)的协议可以帮助用户(客户端或称“本地电脑”)与提供微软终端机服务的电脑(服务器端或称“远程电脑”)建立通信连接。目前,市场上大部分的Windows都安装了远程桌面协议。其他操作系统也有相关的客户端软件,例如Linux、FreeBSD和Mac OS X等等。
该协议是对国际电信联盟发布的一个国际标准的多通道会议协议T.120 的一个扩展。RDP协议在终端服务推出后已有四个版本,即4.0、5.0、5.1、5.2。一般来说,版本是根据windows的版本确定的。从客户端的角度来说,5.X版本间提供的功能差别不是很大,相对于4.0版本,它提供了用户带密码直接登录、客户端驱动器资源映射、客户端音频回放、最高24位色显示和符合FIPS加密级别连接。另外,从4.0协议开始变提供的客户羰功能有:高、中、低三种数据加密级别,客户端自定义初始登录环境,客户端打印机映射,客户端LPT端口映射,客户端com端口映射,剪贴板映射,客户登录的个性化设置(包括键盘、显示界面大小等)。7.0版:这是最新的版本,仅支持Windows Server 2008 R2 或 Windows 7及以上版本。
漏洞概览
蠕虫病毒可以在受感染的网络系统内进行自我复制和传播,并在受感染的远程主机上自动运行,而不需要用户任何的额外交互。如果一款恶意软件的主要攻击载体是网络的话,那么它就应该被归类为蠕虫。
远程桌面协议(RDP)定义了通信双方在虚拟信道间的数据通信方式,支持客户端建立点到点的连接。这种虚拟信道为双向数据通道,可以扩展RDP的功能。Windows Server 2000在RDP v5.1中定义了32种静态虚拟信道(SVC),但是由于其中涉及还到大量动态虚拟信道(DVC),因此可用的信道数量以及种类会受到一定限制。SVC是在会话开始时创建的,并在会话终止前保持不变,但DVC不同,因为它是根据用户需求来创建和删除的。
漏洞分析
漏洞CVE-2019-0708涉及到了RDP驱动器termdd.sys中的_IcaBindVirtualChannels 和_IcaRebindVirtualChannels。我们可以从下图中看到,系统初始化了RDP连接序列,并且会在安全机制启用前完成信道的建立,这就导致了漏洞CVE-2019-0708的可蠕虫化,因为它可以通过开放端口3389在目标网络系统内实现自我复制和传播。

先给大家简单介绍一下“MS_T120”这个静态虚拟信道,它的RDP信道编号为31,位于GCC会话初始序列中。这是一个微软内部使用的信道名称,而且在客户端通过一个SVC来请求建立连接时,不会显示关于“MS_T120”这个信道的使用信息。
下图显示的是GCC会话初始化序列的信道请求信息,我们可以看到其中不涉及到任何关于MS_T120信道的信息。

但是在GCC会话初始化的过程中,客户端提供的信道名称并不在服务器端的白名单中,因此攻击者将能够设置另一个名为“MS_T120”的SVC信道(而不是之前编号为31的合法信道)来让目标系统发生堆内存崩溃,或实现远程代码执行。
下图显示的是GCC会话初始化过程中的非正常信道请求(“MS_T120”信道编号为4):

MS_T120信道管理中涉及到的组件我们在下图中进行了标注。MS_T120参考信道会在rdpwsx.dll中创建,堆内存也会在rdpwp.sys中分配内存池。当MS_T120参考信道在信道编号非31的场景下建立时,便会发生堆内存崩溃。

下图显示的是微软的漏洞修复情况,微软在termdd.sys的_IcaBindVirtualChannels和_IcaRebindVirtualChannels函数中的客户端连接请求部分添加了针对信道名称“MS_T120”的检测代码,并确保该信道会跟信道序列31进行绑定。

在对Windows 2003和Windows XP的漏洞补丁进行了分析之后,我们弄清楚了RDP协议在安装补丁之前以及安装补丁之后的信道解析流程,因此我们打算针对这个漏洞开发一份漏洞概念验证代码,并尝试在目标设备上利用该漏洞来实现远程代码执行,然后启动计算器程序。
下图为我们PoC程序的执行截图:

经过简单配置之后,我们在目标设备上启用了远程桌面协议,并且在运行概念验证代码前确保了该设备没有安装漏洞补丁。
我们通过研究分析,确认了PoC代码的有效性,并成功在目标系统上实现了远程代码执行。但是,如果目标系统启用了网络等级认证功能,那么这份PoC代码就无法正常运行了。不过攻击者如何能够获取到目标网络系统的管理员凭证,那么他们仍然能够绕过这种安全保护机制。
由于微软已经针对该漏洞发布了相应的漏洞补丁,因此我们就不再详细讨论针对该漏洞的利用方法了,而且出于对广大用户的安全性负责的角度考虑,我们也不打算对外公开我们的PoC代码。
缓解方案
1、 确保我们的Windows系统已安装了针对漏洞CVE-2019-0708的安全补丁,我们强烈建议广大用户尽快安装该补丁。
2、 禁止设备在外网使用远程桌面协议,并将其限制在内网使用。如果可以的话,建议广大用户直接禁用远程桌面协议,因为该协议如果被禁用,那么设备安全也就完全不会受到该漏洞的影响了。
3、 在远程桌面协议的GCC会话初始化序列时,将“MS_T120”与信道编号31进行绑定,如果请求的信道编号不正确,则禁止建立连接。
需要注意的是,我们还可以在注册表中修改默认的RDP端口,重启之后我们就可以使用新的通信端口了:

但是,恶意软件在获取到了目标系统的管理员权限之后,是可以修改这种配置参数的,并且在注册表中写入新的通信端口。
McAfee用户须知
McAfee NSP在2019年5月21日增加了如下所示的签名验证保护,因此McAfee NSP用户不会受到此类攻击的影响:
0x47900c00 “RDP: Microsoft Remote Desktop MS_T120 Channel Bind Attempt”
我们一起分析一下这个刚刚修复的RDP漏洞CVE-2019-0708的更多相关文章
- 高危预警|RDP漏洞或引发大规模蠕虫爆发,用户可用阿里云免费检测服务自检,建议尽快修复
2019年9月6日,阿里云应急响应中心监测到Metasploit-framework官方在GitHub空间公开了针对Windows远程桌面服务远程命令执行漏洞(CVE-2019-0708)的利用代码. ...
- 关于centos7和centos6中平滑升级nginx到新版本v1.12.1修复nginx最新漏洞CVE-2017-7529的解决方案
关于centos7和centos6中平滑升级nginx到新版本v1.12.1修复CVE-2017-7529漏洞的解决方案 漏洞描述 2017年7月11日,Nginx官方发布最新的安全公告,在Nginx ...
- 【我的第一个现实漏洞分析】 CVE-2017-17215 华为智能路由器HG532 漏洞分析笔记
0x00 基本信息 2017.11.27 Check Point团队报告华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215),Mirai的升级版变种中已经使用该漏洞. 华为HG53 ...
- 全网连夜修复的Log4j漏洞,如何做到一行代码都不改?
GitHub 21.5k Star 的Java工程师成神之路,不来了解一下吗! GitHub 21.5k Star 的Java工程师成神之路,真的不来了解一下吗! Apache Log4j2 远程代码 ...
- Hacker(20)----手动修复Windows系统漏洞
Win7系统中存在漏洞时,用户需要采用各种办法来修复系统中存在的漏洞,既可以使用Windows Update修复,也可使用360安全卫士来修复. 一.使用Windows Update修复系统漏洞 Wi ...
- 从Java角度修复SQL注入漏洞
很多情况因为过滤不严导致很多网站存在sql注入,这里以用户登陆为例,简单举例 首先创建一个测试的数据库 比较基础,不写创建过程了 java代码如下: package cn.basic.jdbc; im ...
- 从Java的角度简单修复Cookie越权漏洞
技术实在是有限,讲解cookie越权的时候可能有点简单和粗糙.这里就简单记录学习下. 首先自己写一段存在漏洞的代码code: sendCookie.java package cookie; impor ...
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
2018/01/31,Spring Boot团队发布了Spring Boot 1.5.10. Maven: <parent> <groupId>org.springframew ...
- CentOS修复“OpenSSL Heartbleed漏洞”方法
转载 http://www.coolhots.net/article/229.shtml
随机推荐
- 【Redis】基本数据类型及命令操作(超详细)
一.String 1.1 概述 1.2 相关命令列表 1.3 命令示例 二.List 2.1 概述: 2.2 相关命令列表: 2.3 命令示例: 2.4 链表结构的小技巧: 三.Hashes 3.1 ...
- MySQL Backup--innobackupex操作日志
备份脚本: innobackupex \ --defaults-file="/export/servers/mysql/etc/my.cnf" \ --host="loc ...
- linux学习记录--比较基本的文件档案知识
[档案类型权限,连接数,档案拥有者,档案所属群组,档案容量,修改日期,档名],对应了上面的每一列的参数属性. 档案类型权限那一部分总共有十个字母,第一个字母代表档案类型: 当为[ d ]则是目录,例如 ...
- Python sorted 函数用法
1.背景 在python中,通常需要使用排序函数.而对字典针对一个键值进行排序会经常使用到.记录sorted 函数的键值排序用法. 2.代码 data 一个list,list 中的元素由字典组成 ...
- opencv摄像头读取图片
# 摄像头捕获图像或视频import numpy as np import cv2 # 创建相机的对象 cap = cv2.VideoCapture(0) while(True): # 读取相机所拍到 ...
- [转]Linux网络 - 数据包的发送过程
转, 原文:https://segmentfault.com/a/1190000008926093 -------------------------------------------------- ...
- Python开发笔记之-字符串函数
1.首字母大写 >>> s = 'yuanzhumuban' >>> s.capitalize() 'yuanzhumuban' 2.replace,替换 > ...
- nginx配置白名单
配置如下: http模块: http { include mime.types; default_type application/octet-stream; #log_format main '$r ...
- 团队协作editconfig与eslint
editconfig root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf ins ...
- linux 中截取字符串
shell中截取字符串的方法有很多中,${expression}一共有9种使用方法.${parameter:-word}${parameter:=word}${parameter:?word}${pa ...