设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 服务器 > 系统 > 正文

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)(5)

发布时间:2021-01-04 22:39 所属栏目:52 来源:网络整理
导读:有趣的是,函数memcpy的源地址来自RDPWD!WDW_InvalidateRect堆栈上的stRect结构,只有前3个DWORD在RDPWD!WDW_InvalidateRect中设置,如图21所示。剩余内存是堆栈上未初始化的内容,很容易导致信息泄露。此外,使

有趣的是,函数memcpy的源地址来自RDPWD!WDW_InvalidateRect堆栈上的stRect结构,只有前3个DWORD在RDPWD!WDW_InvalidateRect中设置,如图21所示。剩余内存是堆栈上未初始化的内容,很容易导致信息泄露。此外,使用0x808大小的内存来存储12个字节的数据对于堆喷也是很友好的。

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图21. RDPWD!WDW_InvalidateRect stRect结构集

使用此信息,当RDP客户端发送一个具有0xFF的numberOfAreas字段的Refresh Rect PDU时,RDP服务器将调用termdd!IcaChannelInputInternal 0xFF次。每个termdd!IcaChannelInputInternal调用将分配0x828内核池内存并将8个字节的客户端控制的TS_RECTANGLE16结构复制到该内核池。因此,numberOfAreas字段为0xFF的一个Refresh Rect PDU将分配0xFF数量的0x828大小的内核池。理论上,如果RDP客户端发送刷新矩阵PDU 0x200次,则RDP服务器将分配大约0x20000的0x828大小的非分页内核池。考虑到0x828大小的内核池将与0x1000对齐,它们将跨越内核池的非常大的范围,同时,客户端控制的8个字节的数据将被复制到每个0x1000内核池中固定的0x02c偏移量。如图22所示,我们在内核中使用Refresh Rect PDU获得稳定的pool spray。

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图22. RDPWD!WDW_InvalidateRect pool spray

有些情况下,当指针(在图23中表示为变量v14)被termdd!IcaQueueReadChannelRequest修改并且比较将为False时,不会调用ExAllocatePoolWithTag和memcpy,如图23所示,该路由将进入例程IcaCopyDataToUserBuffer,这将导致池分配不成功。但是,当多次发送Refresh Rect PDU时,即使存在一些不成功的池分配,我们仍然可以获得成功的内核池喷射。

此外,有些情况下一些内核池小号的RDP服务器使用完之后可以被释放,但是内核池的内容将不会被清零,使得我们喷到内核有效的利用使用数据。

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

?

?

?

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图23. termdd!IcaChannelInputInternal IcaCopyDataToUserBuffer

5.RDPDR客户端name请求PDU

根据MS-RDPEFS文档,RDPDR客户端名称请求PDU在[远程桌面协议:文件系统虚拟通道扩展]中指定,该扩展在名为RDPDR的静态虚拟通道上运行。MS-RDPEFS协议的目的是将访问从服务器重定向到客户端文件系统。客户端名称请求是从客户端发送到服务器的第二个PDU,如图24所示。

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图24.文件系统虚拟通道扩展协议初始化

客户端名称请求PDU用于客户端将其机器名称发送到服务器,如图25所示。

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图25.客户端名称请求(DR_CORE_CLIENT_NAME_REQ)

标头是四个字节RDPDR_HEADER,其中Component字段设置为RDPDR_CTYP_CORE,PacketId字段设置为PAKID_CORE_CLIENT_NAME。ComputerNameLen字段(4个字节)是一个32位无符号整数,它指定ComputerName字段中的字节数。ComputerName字段(变量)是ASCII或Unicode字符的可变长度数组,其格式由UnicodeFlag字段确定。这是一个标识客户端计算机名称的字符串。

6. ?使用RDPDR客户端name请求PDU将数据写入内核

关于RDPDR客户端名称请求PDU,客户端名称请求PDU可以合法地多次发送,对于每个请求,RDP服务器将分配内核池来存储该信息,最重要的是,PDU的内容和长度可以由RDP客户端完全控制。这使它成为将数据写入内核内存的绝佳选择。

典型的RDPDR客户端名称请求PDU如图26所示。

Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读