CVE-2017-8620 Windows Search远程代码执行漏洞简单分析
CVE-2017-8620 Windows Search远程代码执行漏洞简单分析
一、漏洞信息
1. 漏洞简述
- 漏洞名称:Windows Search Remote Code Execution Vulnerability
- 漏洞编号:CVE-2017-8620;Bugtraq ID:100034
- 漏洞类型:Remote Code Execution
2. 组件概述
Windows搜索是一个桌面搜索平台,具有针对大多数常见文件类型和数据类型的即时搜索功能。 它的主要组件是WSearch Windows Service,它负责索引,组织和提取有关本地文件系统的信息。 此外,它实现了通用搜索服务(GSS),它是向搜索查询提供结果所需的后端功能。 客户端使用Windows搜索协议(WSP)向托管GSS的服务器发出查询。 WSP依靠名为管道协议的服务器消息块(SMB)进行消息传输和身份验证。
Microsoft Windows的所有版本均附带服务器消息块(SMB)协议的实现。 SMB是本机Windows网络框架,支持文件共享,网络打印,远程过程调用和其他功能。在Windows系统上,SMB协议通过附加的安全性,文件和磁盘管理支持扩展了CIFS协议。 通过各种SMB命令和子命令类型提供这些功能。
3. 漏洞概述
Windows搜索处理内存中的对象时,存在远程执行代码漏洞,成功利用此漏洞的攻击者可以控制受影响的系统。虽然漏洞与SMB协议本身无关,但攻击者可SMB目标作为攻击媒介,因此该漏洞面临着与Wannacry类似的大规模利用风险。CNVD对该漏洞的技术评级为“高危”。
4. 漏洞影响版本
• Microsoft Windows 10 for 32-bit Systems • Microsoft Windows 10 for x64-based Systems • Microsoft Windows 2012 R2 • Microsoft Windows 8.1 for 32-bit Systems • Microsoft Windows 8.1 for x64-based Systems • Microsoft Windows RT 8.1 • Microsoft Windows Windows 7 for 32-bit Systems Service Pack 1 • Microsoft Windows Windows 7 for x64-based Systems Service Pack 1 • Microsoft Windows Server 2008 for 32-bit Systems SP 2 (Server Core) • Microsoft Windows Server 2008 for 32-bit Systems SP2 • Microsoft Windows Server 2008 for Itanium-based Systems Service Pack 2 • Microsoft Windows Server 2008 for x64-based systems • Microsoft Windows Server 2008 R2 for Itanium-based Systems Service Pack 1 • Microsoft Windows Server 2012 R2 • Microsoft Windows Server 2012 R2 (Server Core) • Microsoft Windows Server 2016 • Microsoft Windows Server 2016 Server Core
5. 解决方案
获取该漏洞补丁,地址:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-8620
二、漏洞复现
三、漏洞分析
1. 漏洞基本信息
- 漏洞文件:
tquery.dll
- 漏洞函数:
CRegXpr::CRegXpr()
- 漏洞对象:一个
CPropertyRestriction
结构,其prval
具有与VT_LPWSTR
的vType
混淆的VT_LPWSTR
以外的vType
。
2. 背景知识
备注:此处略去SMB相关介绍,漏洞自身与SMB关系不大,SMB只是作为WSP传输的工具协议,使用的pipe名称为MsFteWds。
Windows Search Protocol(WSP)
使用WSP的最小搜索查询其流程大概如下:
|
|
CPMConnectIn
消息开始于客户端和服务器之间的会话,CPMCreateQueryIn
包含查询条件并创建新查询,CPMSetBindingsIn
指定如何在CPMGetRowsOut
中构建搜索结果,CPMGetRowsIn
从服务器返回的查询结果中请求数据。
所有的WSP消息以一个16字节的头部开始,其结构如下:
|
|
_msg
字段标识标头部后面的消息类型(有的一个value表示两种类型,此时要根据数据流的传输方向判定具体代表哪种类型。带"In"字符的是从client到server,带"Out"字符的是从server到client);_status
字段表明所请求操作的状态,由服务器填充;_ulChecksum
包含从_ulReserved2
字段后面开始的消息的校验和;_ulReserved2
字段除了后续的消息为CPMGetRowsIn
之外,都必须设置为0。
跟本漏洞相关的是CPMCreateQueryIn
消息, 此消息创建一个新的搜索查询,其结构如下:
|
|
从上面的结构中可以看出,有很多字段数值大小不是固定的,这对后续的流量监测造成很大困难。
在上面的结构中,需要重点关注的字段是CRestrictionPresent
和RestrictionArray
。 前者标识了RestrictionArray
字段是否存在(CRestrictionPresent
为0时,RestrictionArray
字段不能存在;CRestrictionPresent
字段为非0时,RestrictionArray
字段必须存在),后者包含描述查询命令树的CRestrictionArray
结构。 命令树是为搜索查询指定的限制条件和排序顺序的组合。
CRestrictionArray
的详细结构如下:
|
|
count
字段表明Restriction
字段中包含CRestriction
的数量,该字段必须设置为0x01;isPresent
字段标识Restriction
字段是否存在是否包含CRestriction
结构,值为0(省略)或1(不省略);
CRestriction
指示用于命令树节点的限制类型,类型决定了在该结构的"Restriction"字段中找到的内容,格式如下:
|
|
ulType
标识Restriction
字段中存在的限制结构的类型。 此漏洞涉及具有指定CPropertyRestriction
的ulType
为RTProperty(0x5)
的CRestrictions
。 某些CRestriction
类型可以包含嵌套的CRestrictions
,形成一个限制树。因此,CPropertyRestriction
可以嵌入以下任何限制条件中:
- RTAnd (0x1), Restriction contains a CNodeRestriction structure
- RTOr (0x2), Restriction contains a CNodeRestriction structure
- RTNot (0x3), Restriction contains a CRestriction structure
- RTProximity (0x6), Restriction contains a CNodeRestriction structure
- RTVector (0x7), Restriction contains a CVectorRestriction structure
- RTCoerce_Add (0xA), Restriction contains a CCoercionRestriction structure
- RTCoerce_Multiply (0xB), Restriction contains a CCoercionRestriction structure
- RTCoerce_Absolute (0xC), Restriction contains a CCoercionRestriction structure
- RTPhrase (0x00FFFFFD), Restriction contains a CNodeRestriction structure
上述列表中的限制具有以下结构:
|
|
带注释的字段可以包含更多限制,这些限制也可以包含嵌套限制,从而形成树。 CPropertyRestriction
结构包含从每一行获取的属性,比较运算符和常量。 对于每一行,将行中特定属性返回的值与常量进行比较,以确定它是否具有_relop
字段指定的关系。 其具体结构如下:
|
|
_relop
字段标识比较的类型,例如, 大于,小于,正则表达式等;_Property
字段标识要匹配的属性,而_prval
字段指定与属性相关的值; _prval
字段包含一个CBaseStorageVariant
项,它具有以下结构:
|
|
vType
字段标识存储在vValue
中的值的类型。 此漏洞涉及VT_LPWSTR vType
,该vType
用于存储以null结尾的Unicode字符串。
3. 详细分析
当运行了GSS服务的server接受到CPMCreateQueryIn
消息时,会解析RestrictionArray
并为每个限制条件实例化相关对象。如果服务解析的是一个响应CPropertyR etriction
的CRestriction
,此时ulType
的值为0x5,则解组prval
字段并实例化CBaseStorageVariant
对象。如果CPropertyRestriction
的relop
字段的值为0x6,表示采用的操作是正则表达式比较,则服务开始将正则表达式解析为确定性有限自动机(DFA)。
但是,在解析正则表达式之前,服务未能成功验证prval
字段中的CBaseStorageVariant
对象的类型是否为VT_LPWSTR
。如果类型不是VT_LPWSTR
,则会发生类型混淆。
远程未经身份验证的攻击者可以通过向目标服务器发送恶意CPMCreateQueryIn
消息来利用这些漏洞。成功利用可能会导致在SYSTEM上下文中的目标服务器上执行远程代码。
需要注意,SMB和WSP中的所有多字节整数都以little-endian字节顺序存储
4. 源码分析
使用IDA反编译存在漏洞的文件: tquery.dll version 7.0.7601.23861
|
|
5. 攻击流量
四、漏洞检测和防御
根据漏洞原理,需要对SMB、WSP的诸多命令和结构进行遍历,且WSP命令中存在诸多变量字段,数值和长度无法确定,故很难在流量侧进行防御。