这期内容当中小编将会给大家带来有关如何进行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修复前和修复后的版本区别。
分析后发现,其中只有一个函数被修改了。首先,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 3391Example2 python3 rdg_scanner_cve-2020-0609.py 192.168.1.1/24 --webcheck # check webpage for RD gatewayExample3: python3 rdg_scanner_cve-2020-0609.py 192.168.1.1Example4: python3 rdg_scanner_cve-2020-0609.py fakewebsiteaddress.comExample5: python3 rdg_scanner_cve-2020-0609.py as15169Example6: python3 rdg_scanner_cve-2020-0609.py file:hostfile.txtusage: rdg_scanner_cve-2020-0609.py [-h] [--port PORT] [--webcheck][--verbose]targetNo installation required.Debian/Kali needs: apt-get install python3-netaddr
上述就是小编为大家分享的如何进行RDG中两个漏洞的分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/tech/safety/222009.html