freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2020-0609&CVE-2020-0610:RDG中的两个漏洞分析
2020-03-08 13:00:20

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

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

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

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

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

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

fragment_id:报文在序列中的具体位置;

num_fragments:序列中报文的总数量;

fragment_length:报文数据的长度。

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

CVE-2020-0609分析

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分析

上图中的类对象包含一个由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端口来解决这个安全问题。

漏洞检测工具

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 python3 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
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者