原文:zerodayinitiative
在2019年5月的补丁周期中,Microsoft在其远程桌面服务(RDS)中发布了一个远程代码执行错误补丁。远程未经身份验证的攻击者可以通过将精心设计的RDP消息发送到目标服务器来利用此漏洞。成功利用可能会导致执行具有管理权限的任意代码。虽然我们对此漏洞的初步研究主要集中在缓解和保护上,但趋势科技安全研究团队的Pengsu Cheng,Kamlapati Choubey和Saran Neti致力于彻底分析漏洞。以下是趋势科技漏洞研究服务报告的摘录,内容涵盖CVE-2019-0708,并进行了一些最小的修改。

漏洞

Microsoft远程桌面服务(以前称为终端服务)允许用户远程打开交互式Windows会话。远程桌面服务提供与基于终端的环境类似的功能,其中多个终端(客户端)可以连接到单个主机(服务器)。远程用户可以登录到远程主机并访问主机上的数据,运行应用程序等。远程桌面连接默认使用远程桌面协议(RDP)通过端口3389 / TCP与远程服务器通信。

RDP指定多个会议参与者如何查看和协作共享程序。该协议是ITU-T T.128应用程序共享协议的Microsoft扩展。该协议利用T.120标准中较低层协议提供的其他服务,例如T.124通用会议控制(GCC),T.122多点通信服务(MCS)等。

RDP连接以连接序列消息开始,由远程桌面协议:基本连接和图形远程处理(MS-RDPBCGR)协议定义,如下所示:

每条消息的格式可以在[ 1 ]中找到。该漏洞与“MCS Connect Initial and GCC Create”请求有关。

收到“X.224连接确认”响应后,从客户端发送到服务器的“MCS Connect Initial and GCC Create”请求。“MCS Connect Initial and GCC Create”请求包含与安全相关的信息,虚拟通道创建信息以及其他受支持的RDP客户端功能。“MCS Connect Initial and GCC Create”请求的结构如下:

除tpktHeader字段外,所有多字节整数都是小端字节顺序。

•X.224层通常可以具有多种PDU类型并由任意长度组成,但“MCS Connect Initial and GCC Create”数据包具有3字节x224结构。
•mcsCi结构是T.125 MULTIPOINT-COMMUNICATION-SERVICE连接初始PDU,使用ASN.1 DER进行编码。
•gccCrq结构是T.124 GCC(Generic Conference Control) ConnectData结构。

“Settings Data Block”是一个或多个“Settings Data Block”的串联,其中每个具有以下格式:

存在各种类型的“Settings Data Block”,包括CS_CORE(0xC001),CS_SECURITY(0xC002),CS_NET(0xC003)等。
该tpktHeader字段具有下列结构:

tpktHeader中的所有多字节整数都是big-endian字节顺序。version必须为0x03,tpktLength指定整个数据包的长度。该漏洞与 “CS_NET”块也称为clientNetworkData)有关。
该clientNetworkData字段包含请求的虚拟频道列表。clientNetworkData字段的结构如下:

clientNetworkData的CS_NETHeader字段是0xC003,小端表示是\ x03 \ xc0。 channelCount字段指示请求的静态虚拟通道。 channelNamen(其中n是1,2,...,N)字段定义了通道的8字节空终止名称,channelOption_n字段指定了通道的属性。
RDP协议支持静态虚拟通道,旨在用作各种RDP组件和用户扩展的通信链路。 这些通道以其8字节通道名称而闻名,并包括标准的Microsoft假设通道,如“rdpdr”(重定向),“rdpsnd”(声音),“cliprdr”(剪贴板共享)等。用户可以使用 RDP API支持其他渠道。 除上述通道外,Microsoft默认创建两个通道:MS_T120(用于RDP本身)和CTXTW(用于Citrix ICA)。 客户不应通过网络创建这些渠道; 相反,当建立连接时,这些通道由Windows RDP系统在内部初始化。

使用termdd!IcaCreateChannel()创建通道,它首先检查指定的命名通道是否存在,如果不是,则分配通道结构来创建通道。 指向通道结构的指针,这个指针我们称为ChannelControlStructure,它的结构存储在一个表中,这个表我们称为ChannelPointerTable。 所有RDP连接都以ChannelPointerTable开头,如下所示(前五个插槽不是用户控制的,因此不显示。而是将插槽号0作为第一个客户端可写通道):

在上表中,每个槽都可以存储一个ChannelControlStructure指针,其中标记为Empty的存储空指针。 当RDP客户端通过在clientNetworkData中指定它们来连接和打开通道时,将创建相应的ChannelControlStructures,并将其指针存储在从Slot 0开始的ChannelPointerTable中。请注意,CTXTW始终存在于插槽7中,而MS_T120存在于插槽0x1F中。

Microsoft Windows RDP内核驱动程序termdd.sys中存在“UAF”漏洞。在接收到包含clientNetworkData的“MCS Connect Initial and GCC Create”分组时,创建其中指定的信道的ChannelControlStructures。如果指定了名为“MS_T120 \ x00”的通道(例如,在插槽10中),则termdd!IcaCreateChannel()调用termdd!IcaFindChannelByName()并返回由插槽0x1F中的MS_T120结构指向的ChannelControlStructure。该指针(与插槽0x1F中的指针相同)存储在函数termdd!IcaBindVirtualChannels()中的用户指定插槽(在此示例中为插槽10)中。接下来,当使用MCS通道。加入请求打开通道时,MS_T120通道也会成功打开。如果攻击者随后将制作的数据发送到MS_T120频道,则termdd.sys会尝试通过发送错误消息并使用termdd!IcaCloseChannel()关闭该频道来响应该消息,后者又调用termdd!IcaFreeChannel(),从而释放 MS_T120 ChannelControlStructure并清除ChannelPointerTable中用户控制的插槽(运行示例中的插槽10)中的指针。但是,插槽0x1F中的相同指针不会被清除。随后,当连接终止时,调用RDPWD!SignalBrokenConnection(),然后调用termdd!IcaChannelInputInternal()并尝试使用Slot 0x1F处的指针写入释放的ChannelControlStructure。这导致了“UAF”状态。
远程未经身份验证的攻击者可以通过在打开MS_T120通道时与目标服务器建立RDP连接并向其发送精心设计的数据来利用此漏洞。 成功利用将导致攻击者能够使用管理(内核级)权限执行任意代码。

源代码演示

以下代码段取自termdd.sys版本6.1.7601.24056。 趋势科技添加的评论已经突出显示。

要检测利用此漏洞的攻击,检测设备必须监视和解析分配端口上的流量,默认情况下为3389 / TCP。
RDP连接以连接序列消息开始,由远程桌面协议:基本连接和图形远程处理(MS-RDPBCGR)协议定义,如下所示:

注意:
•此检测指南涉及消息“MCS Connect Initial和GCC Create”。
•RDP有两种类型的加密:自定义RDP加密,一种使用TLS。在前一种情况下,“MCS Connect Initial和GCC Create”是纯文本,而在后一种情况下,“MCS Connect Initial和GCC Create”是RDP客户端在TLS建立后发送的第一个数据包。
•在交换第一个请求和响应之后,可以使用TLS加密流量。确定这一点的最简单方法是检查到服务器的第二个传入数据包是否以“\ x16 \ x03”(TLS记录类型和TLS客户端Hello的高版本号)开头。

检测设备必须能够检查和分析RDP服务器与RDP客户端之间的RDP通信。如果RDP通信使用TLS,则检测设备必须在继续执行后续步骤之前解密流量。
检测设备必须查找传入的“MCS Connect Initial and GCC Create”请求。“MCS Connect Initial and GCC Create”请求的结构如下:


除tpktHeader字段外,所有多字节整数都是小端字节顺序。
•X.224层通常可以具有多种PDU类型并由任意长度组成,但“MCS Connect Initial和GCC Create”数据包具有3字节x224结构。
• mcsCi结构是T.125 MULTIPOINT-COMMUNICATION-SERVICE连接初始PDU,使用ASN.1 DER进行编码。
•gccCCrq结构是T.124通用会议控制ConnectData结构.
“Settings Data Block”是一个或多个“Settings Data Block”的串联,每个该块具有以下格式:


存在各种类型的“Settings Data Block”,包括CS_CORE(0xC001),CS_SECURITY(0xC002),CS_NET(0xC003)等。

如果找到“MCS Connect Initial and GCC Create”请求,则检测设备必须检查每个“Settings Data Block”并查找类型为CS_NET(0xC003)的设置。这样的“Settings Data Block”称为clientNetworkData,具有以下结构:


如果找到clientNetworkData,则检测设备必须遍历每个channelName_n(其中n是1,2 ..,N)并检查任何channelName n字段的值是否包含不区分大小写的字符串“MS_T120”。如果找到这样的频道,则应将流量视为恶意; 利用此漏洞的攻击正在进行中

触发漏洞

在将调试程序附加到目标系统时触发漏洞时,会发生以下错误检查:

结论

当Microsoft为其支持的操作系统修补此漏洞时,他们决定还为现在不支持的Windows XP和Windows Server 2003系统发布补丁。这表明他们认为这个漏洞有多严重。还有一些关于检测到主动攻击的讨论,但毫无疑问这个漏洞的可利用性。此错误明显获得其关键评级,受影响的系统应尽快修补。对于那些仍然在Windows XP或Server 2003上的人来说,这是另一个提醒,要求制定升级计划。微软可能已经发布了针对此漏洞的补丁,但是每次发布时,他们为这些现在古老的系统发布未来补丁的可能性会降低。
请注意,Microsoft补丁IcaBindVirtualChannels()和IcaReBindVirtualChannels()修复了termdd.sys中的两个易受攻击的函数。这两个函数暴露了两个不同但相似的攻击向量。我们的分析侧重于IcaBindVirtualChannels()公开的攻击媒介。

特别感谢趋势科技安全研究团队的Richard Chen,Pengsu Cheng,Kamlapati Choubey和Saran Neti对此漏洞提供了如此全面的分析。我们当然希望将来可以看到更多的漏洞分析。

参考文献:

[1] [MS-RDPBCGR]:Remote Desktop Protocol: Basic Connectivity and Graphics Remoting, https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-RDPBCGR/[MS-RDPBCGR].pdf
[2] Network-specific data protocol stacks for multimedia conferencing, ITU-T Recommendation T.123, https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-T.123-200701-I!!PDF-E&type=items
[3] Client Network Data (TS_UD_CS_NET), Microsoft, https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpbcgr/49f99e00-caf1-4786-b43c-d425de29a03f
[4] T.125, Multipoint communication service protocol specification, ITU, https://www.itu.int/rec/T-REC-T.125
[5] T.124, Generic Conference Control, ITU, https://www.itu.int/rec/T-REC-T.124

点击收藏 | 1 关注 | 1 打赏
  • 动动手指,沙发就是你的了!
登录 后跟帖