CVE-2020-0609&CVE-2020-0610:RDG中的两个漏洞分析

栏目: IT技术 · 发布时间: 4年前

内容简介:Remote Desktop Gateway,即远程桌面网关(RDG),之前它的名字叫“Terminal Services Gateway”,即远程桌面(RDP),是一种提供路由功能的Windows服务器组件。在RDG的应用场景中,用户无需直接RDP服务器连接,而是直接连接网关。网关身份验证成功后,,网关会将RDP流量转发至用户指定的地址,因此在这里网关实际上就是一个代理。此时,只有网关需要对外网开放,其他所有的RDP服务端都可以受到防火墙的保护。由于RDP的攻击面更大,因此我们需要正确设置RDG环境,才能

Remote Desktop Gateway,即远程桌面网关(RDG),之前它的名字叫“Terminal Services Gateway”,即远程桌面(RDP),是一种提供路由功能的Windows服务器组件。在RDG的应用场景中,用户无需直接RDP服务器连接,而是直接连接网关。网关身份验证成功后,,网关会将RDP流量转发至用户指定的地址,因此在这里网关实际上就是一个代理。此时,只有网关需要对外网开放,其他所有的RDP服务端都可以受到防火墙的保护。由于RDP的攻击面更大,因此我们需要正确设置RDG环境,才能显著减少可能存在的攻击面。

在2020年1月份的安全更新中,微软修复了RDG中存在的两个漏洞。分配的漏洞编号分别为 CVE-2020-0609 CVE-2020-0610 ,而这两个漏洞都可以允许攻击者在目标设备上实现预认证远程代码执行。

版本区别分析-修复前和修复后

在进行漏洞分析之前,我们需要分析受影响DLL修复前和修复后的版本区别。

CVE-2020-0609&CVE-2020-0610:RDG中的两个漏洞分析

分析后发现,其中只有一个函数被修改了。首先,RDG支持三种不同的协议,即HTTP、HTTPS和UDP。更新后的函数主要负责处理UDP协议。一般来说,我们可以拿更新前和更新后的函数进行对比,但是这个函数的代码量非常大,而且有多处改动。因此,我们这里直接给出该函数对应的伪代码,并且删除了部分不相关的代码:

CVE-2020-0609&CVE-2020-0610:RDG中的两个漏洞分析

RDG处理的UDP协议允许将数据量大的消息拆分为多个独立的UDP报文,因为UDP属于无连接协议,因此报文到达的顺序不定。。该函数的功能是重组消息,确保每个报文都位于正确的位置上。每个报文中都包含一个Header,其中包含如下字段数据:

fragment_id:报文在序列中的具体位置;
num_fragments:序列中报文的总数量;
fragment_length:报文数据的长度。

消息处理函数使用报文的Header数据来确保收到的消息能以正确的顺序进行重组。然而,该函数在实现上存在漏洞,因此攻击者将能够利用该漏洞来实施攻击。

CVE-2020-0609分析

CVE-2020-0609&CVE-2020-0610:RDG中的两个漏洞分析

memcpy_s()函数会将每个分段数据(fragment)拷贝到重组缓冲区中的一个偏移量地址,重组缓冲区在堆上进行分配,每个分段的偏移量由fragment_idx 1000得到。但是,这里的边界检查逻辑并没有考虑到偏移量这个因素。这里我们可以假设buffer_size= 1000,然后我们发送包含2个分段消息。

1、第1个分段消息(fragment_id=0)长度为1。此时this->bytes_written等于0,因此可以通过边界检查。
2、代码将1字节数据写入偏移量为0的缓冲区地址,bytes_written+ 1。第2个分段消息(fragment_id=1)长度为998,此时this->bytes_written= 1,而1 + 998< 1000,因此可以通过边界检查。
3、代码将998字节数据写入偏移量为1000(fragment_id*1000)的缓冲区地址,导致在缓冲区末尾后写入998个字节。

需要注意的是,这里的报文不一定按顺序到达。如果我们发送的第1个报文中fragment_id=65535(最大值),那么就会被写入偏移量为65535x 1000的地址,也就是缓冲区末尾后的65534000个字节。攻击者可以通过修改fragment_id来将最多999个字节的数据写入缓冲区后偏移量为1到65534000的任何地址。与传统的线性堆溢出漏洞相比,这个漏洞的灵活性更强。攻击者不仅可以利用该漏洞来控制写入数据的大小,而且还能控制写入数据的位置。如果再配合使用其他的技术,攻击者将能够实现更为精准的数据写入,以避免出现不必要的数据崩溃。

CVE-2020-0610分析

CVE-2020-0609&CVE-2020-0610:RDG中的两个漏洞分析

上图中的类对象包含一个由32位无符号整数组成数组,其中每个数组元素对应1个分段数据。当收到一个分段数据后,相应的数据值会从0变为1。当所有元素都被设置为1时,代码就完成了消息重组操作,并开始处理完整的消息。这个数组最多能容纳64个元素,但fragment_id的取值范围为0到65535。代码唯一执行的验证操作就是确保fragment_id值小于num_fragments,但后者同样可以被设置为65535。因此,我们可以将fragment_id设置为65到65535之间的任意值,这样我们就可以在数据边界外写入1(TRUE)。你可能会觉得只将1个值设置为1很难实现远程代码执行,但即使一个小小的改动也可以对程序的正常行为带来巨大的影响。

漏洞缓解

如果用户没有安装漏洞修复补丁,那么攻击者将能够利用该漏洞实施攻击。因此,用户还可以直接禁用UDP传输功能,或使用防火墙来阻止UDP端口来解决这个安全问题。

CVE-2020-0609&CVE-2020-0610:RDG中的两个漏洞分析

漏洞检测工具

rdg_scanner_cve-2020-0609:【 点我获取

如何检测

Example: python3 rdg_scanner_cve-2020-0609.py 192.168.1.1/24 # vuln scan for cve-2020-0609 on UDP 3391
Example2  python 3 rdg_scanner_cve-2020-0609.py 192.168.1.1/24 --webcheck # check webpage for RD gateway
Example3: python3 rdg_scanner_cve-2020-0609.py 192.168.1.1
Example4: python3 rdg_scanner_cve-2020-0609.py fakewebsiteaddress.com
Example5: python3 rdg_scanner_cve-2020-0609.py as15169
Example6: python3 rdg_scanner_cve-2020-0609.py file:hostfile.txt
usage: rdg_scanner_cve-2020-0609.py [-h] [--port PORT] [--webcheck]
[--verbose]
target
No installation required.
Debian/Kali needs: apt-get install python3-netaddr

* 参考来源: kryptoslogic ,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM


以上所述就是小编给大家介绍的《CVE-2020-0609&CVE-2020-0610:RDG中的两个漏洞分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

浪潮之巅(第三版)(上下册)

浪潮之巅(第三版)(上下册)

吴军 / 人民邮电出版社 / 2016-5 / 99.00元

一个企业的发展与崛起,绝非只是空有领导强人即可达成。任何的决策、同期的商业环境,都在都影响着企业的兴衰。《浪潮之巅》不只是一本历史书,除了讲述科技顶尖企业的发展规律,对于华尔街如何左右科技公司,以及金融风暴对科技产业的冲击,也多有着墨。此外,这本书也着力讲述很多尚在普及 或将要发生的,比如微博和云计算,以及对下一代互联网科技产业浪潮的判断和预测。因为在极度商业化的今天,科技的进步和商机是分不开的。......一起来看看 《浪潮之巅(第三版)(上下册)》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具