2019年8月,微软发布了一套针对远程桌面服务的修复程序,其中包括两个关键的远程执行代码(RCE)漏洞,CVE-2019-1181和CVE-2019-1182。与之前修复的“BlueKeep”漏洞(CVE-2019-0708)类似,也具有蠕虫特性,即利用这些漏洞的恶意软件可能会在无需用户交互的情况下在易受攻击的机器间进行传播。

本文主要通过对CVE-2019-1182漏洞进行分析,让大家对于漏洞的成因及漏洞修复有一个更加全面的认识。

系统版本:Windows 10 1903

补丁:windows10.0-kb4512508-x64_1893edc9a11d760be11e49d2500170ceee8026d7

漏洞危害

公网开放RDP服务的主机数量巨大,影响面极大。危险等级:严重,请用户尽快升级更新。

成因分析

分别提取补丁前和补丁后rds(Remote Desktop Service)进程相关bin文件及相关驱动模块,经过ida和bindiff分析后定位到rdpbase.dll。该模块改动很少(只有一处函数差异),可以很快定位到问题函数,如下图所示。

分析差异函数DecompressUnchopper::Decompress发现存在一处整型溢出漏洞。

上图左边是patch之后的代码,右边是patch之前的代码,可以看到pcach之前指令eax+0x2000作为函数new的参数使用,patch后增加了对size的校验,会判断edx+0x2000是否大于edx,什么情况下一个值加上0x2000会大于之前的值呢?对于无符号整数来说当0xffffe000<size<0xffffffff时,size+0x2000将位于(0,0x2000)这个区间,size style="font-size: inherit;color: inherit;line-height: inherit;">size+0x2000.补丁后的反编译代码如下</size<0xffffffff时,size+0x2000将位于(0,0x2000)这个区间,size>

patch的思路很简单,当size>size+0x2000时,new(-1)后续逻辑函数直接return。

下面我们根据DecompressUnchopper::Decompress的逻辑梳理一下该漏洞可能的利用思路。

如上图所示,可以看到函数尾部调用了memcpy,第一个参数dest指向的内存为前面new分配的内存空间。如果我们把decompressedSize设置为[0xffffe000,0xffffffff]的一个值,当加上0x2000后decompressedSize小于原值,此时如果buff还是原来的大小,会导致memcpy的操作覆盖掉dest后面buff-(decompressedSize+0x2000)个字节,如果后面的地址空间保存有虚表指针之类的地址则可以导致控制流劫持。

poc构造

以上的分析基于对相关模块的逆向分析及靠经验猜测,为了验证思路是否正确首先需要能够有触达漏洞函数的rdp包。下面的叙述基于对CVE-2019-0708 poc的理解以及微软官方提供的rdp协议文档。

首先看一下微软的官方公告[1]:

从公告的描述来看这个漏洞跟CVE-2019-0708类似,都可以造成蠕虫传播的效果,所以也是不需要进行登录认证即可利用该漏洞远程代码执行,感觉大部分代码可以复用所以决定在CVE-2019-0708的poc [2]基础上构造CVE-2019-1182的poc。

通过研究CVE-2019-0708的poc和微软官方文档[3]可以了解到rdp协议的通信流程,如下图所示:

至此找不到触达漏洞函数的任何线索,思路还是要回到逆向漏洞函数周围的处理逻辑上。交叉引用并没有发现对DecompressUnchopper::Decompress的静态调用,搜索一下DecompressUnchopper这个类相关的函数:

经过分析发现是DecompressRdp8__CreateInstance这个函数创建了DecompressUnchopper对象,继续查看DecompressRdp8__CreateInstance没有找到对此函数的静态调用,发现这个函数是个导出函数,最后经过搜索发现该函数在rdpserverbase.dll中进行了导入,交叉引用发现有两处调用:

上图中可以看到是在CRdpDynVC这个类的成员函数中进行了调用,因此猜测可能和rdp的dvc(Dynamic Virtual Channel)信道有关,关于dvc信道的详细信息可参考微软官方文档[4]。通过查阅官方文档初步定位到通过dvc信道发送加密数据可能会触达漏洞函数。

dvc信道的建立流程如下:

(1) dvc init.

(2) dvc open

(3) dvc send&recv data

dvc信道可分片传输超大数据(最大不超过2^32-1字节),并支持非加密和加密数据传输。

(4) dvc close

基于以上的研究,下面尝试构造一个可触达漏洞函数的dvc pdu。加密的dvc pdu结构如下图所示,详细信息参见官方文档。

发送的数据包:

dvc_send = ( #pdu header "0300004002F08064000503EC70322A00000003000000" #1st byte cid length "68" + channel_id[-2:] + "01110000" #data "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" ) tls.sendall(Packer(dvc_send).bin_unpack())

对DecompressUnchopper::Decompress下断,运行脚本,触发断电,证明之前的猜测是正确的。

通过调试分析及参考官方文档,构造如下数据包可导致crash:

dvc_send2 = ( "0300004002F08064000503EC70322A00000003000000" "68" + channel_id[-2:] + "01E0FFFF" "e122550e0ffff080000002690ce0a2b9f6401070000002630d2b4fc0402" ) tls.sendall(Packer(dvc_send).bin_unpack())

崩溃现场:

调试分析导致crash的原因如下: DecompressedSize为0xffffe001,加0x2000之后为1,new(1)分配了一个字节的堆空间,memcpy多次像new分配的内存拷贝数据,导致数据一直向后覆盖,图中覆盖到了RdpBoundsAccumulator对象,当执行clear操作时访问无效地址造成memory corruption。

关于利用的一些思考:精准控制memcpy拷贝长度,覆盖到某对象的虚表指针或其他可劫持控制流的内存单元,可导致任意代码执行,需要考虑cfg等漏洞利用缓解措施的bypass。

点击【阅读】,获取更多信息~

References:

[1] https://msrc-blog.microsoft.com/2019/08/13/patch-new-wormable-vulnerabilities-in-remote-desktop-services-cve-2019-1181-1182/

[2] https://github.com/algo7/bluekeep_CVE-2019-0708_poc_to_exploit

[3] https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpbcgr/5073f4ed-1e93-45e1-b039-6e30c385867c

[4] https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpedyc/3bd53020-9b64-4c9a-97fc-90a79e7e1e06

干货|微软远程桌面服务蠕虫漏洞(CVE-2019-1182)分析的更多相关文章

  1. [转帖]安全公告【安全公告】CVE-2019-0708远程桌面服务远程代码执行漏洞

    [安全公告]CVE-2019-0708远程桌面服务远程代码执行漏洞 https://www.landui.com/help/nshow-9716.html 漏洞层出不穷 漏洞信息: 2019年5月14 ...

  2. CVE-2019-0708远程桌面服务远程执行代码漏洞exp利用过程

    CVE-2019-0708远程桌面服务远程执行代码漏洞 上边这洞是啥我就不多说了,描述类的自行百度. 受影响系统版本范围: Windows Server 2008 R2 Windows Server ...

  3. Windows CVE-2019-0708 远程桌面代码执行漏洞复现

    Windows CVE-2019-0708 远程桌面代码执行漏洞复现 一.漏洞说明 2019年5月15日微软发布安全补丁修复了CVE编号为CVE-2019-0708的Windows远程桌面服务(RDP ...

  4. 登录服务器windows2008出现:远程桌面服务当前正忙,因此无法完成您尝试执行的任务。(或者出现黑屏界面)

    问题:有段时间登录服务器总是提示:远程桌面服务当前正忙,因此无法完成您尝试执行的任务. 在微软找到的原因是:Csrss.exe 进程和某些应用程序 (例如,Microsoft Excel 或 Micr ...

  5. 远程桌面服务当前正忙,因此无法完成您尝试执行的任务-win2008R2

    远程桌面服务当前正忙,因此无法完成您尝试执行的任务,近来我服务器出现这情况, 到达主机房看主机...不可以登陆,也没有登陆框.只能关机. 在微软找到的原因是:Csrss.exe 进程和某些应用程序 ( ...

  6. 在工作组的环境中配置Windows 2012 R2的远程桌面服务

    在工作组的环境中配置Windows 2012 R2的远程桌面服务 How to configure Remote Desktop Service in Windows 2012 R2 workgrou ...

  7. 用Powershell启用Windows Azure上的远程桌面服务

    [题外话] 某天不小心点了XX管家的自动修复,虽然及时点了取消也看到了远程桌面服务成功被关闭,但是忙完该干的事以后竟然忘记了这件事,在断开远程桌面服务之前也忘记再次打开.以至于之后几天一直以为Azur ...

  8. [windows]禁止指定用户使用远程桌面服务登录

    windows2003下禁止用户远程登录的方法如下: 1.打开控制面板 > 管理工具 > 本地安全策略 2.安全策略-->本地策略-->用户权限分配-->通过终端服务拒绝 ...

  9. 启用Win8(中文版/核心版)中被阉割的远程桌面服务端

    Windows 8/8.1 标准版(中文版/核心版)中取消了远程桌面服务端,想通过远程连接到自己的电脑就很麻烦了,第三方远程桌面速度又不理想(如TeamViewer).通过以下方法可让系统恢复远程桌面 ...

随机推荐

  1. 部署 Prometheus Operator【转】

    本节在实践时使用的是 Prometheus Operator 版本 v0.14.0.由于项目开发迭代速度很快,部署方法可能会更新,必要时请参考官方文档. 下载最新源码 git clone https: ...

  2. imple-unpack---攻防世界

    拿到题目查壳没有发现.题目已经明确说了,基本上是有壳的,Linux下面看看 应该就是upx的壳了,下载upx进行脱壳,https://sourceforge.net/projects/upx/file ...

  3. windows系统下使用mycat实现mysql数据库的主从复制,从而实现负载均衡

    在之前有记录过在一台系统中安装多台数据库,同时实现主从复制,但是那个主从复制只是一个基于dosc命令的,再实际的开发中我们不会去直接连接数据库,一般情况下我们也是通过间接的采用一些中间件去连接,本来是 ...

  4. node - 处理跨域 ( 两行代码解决 )

    1,安装 cors 模块 : npm install cors 2,代码 : var express = require('express') var app = express() var cors ...

  5. android:imeOptions

    转自:http://www.cnblogs.com/qiengo/archive/2012/05/03/2480857.html 默认情况下软键盘右下角的按钮为“下一个”,点击会到下一个输入框,保持软 ...

  6. 剑指offer圆圈中最后剩下的数字 和 迭代器总结

    迭代器只有++ ,--,==,!=四种运算方法,不能将iter = iteration+ 1,因为迭代器是指针类型,1是整数类型,不能直接相加赋值给一个指针. 题目描述 每年六一儿童节,牛客都会准备一 ...

  7. 020、Java中字母大小写转换

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  8. DevOps - 与敏捷方法区别

    章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...

  9. restfulframework详解

    restfulframework详解 第一篇 RESTful规范

  10. HihoCoder第七周:完全背包问题

    1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时 ...