葡京游戏平台

安全事件
当前位置: 葡京游戏 >> 信息安全 >> 安全事件 >> 正文
Windows DHCPServer远程代码执行漏洞
发布时间:2019年02月21日 09:16  点击:[]

一 漏洞背景

2月12日,微软发布2月份月度例行安全公告,修复了多个高危漏洞,其中包括Windows DHCPServer远程代码执行漏洞CVE-2019-0626。当攻击者向DHCP服务器发送精心设计的数据包并成功利用后,就可以在DHCP服务中执行任意代码,漏洞影响范围较大。

二 漏洞影响版本

Windows 7

Windows 8.1

Windows 10

Windows Server 2008

Windows Server 2012

Windows Server 2016

Windows Server 2019

三 协议简介

DHCP,动态主机配置协议(以前称为BOOTP)是LAN网络协议。 DHCP通常用于集中管理IP地址的分配,使客户端能够动态获取IP地址,网关地址和DNS服务器地址等信息。 DHCP客户端和DHCP服务器之间的交互过程如下图所示。

9B8C0E2C3B698472E1D8D704569_00A0E52A_13061.jpg

传输的DHCP协议数据包必须采用以下格式:

6B420523F60B555ACFA67D1F073_DDB93FEF_C298.jpg

DHCP包含多种类型的Option,每个Option包含三个字段:Type,Length和Data。

BF74380027C6CE9366E66A2B506_938164D7_13A8.jpg

类型范围为1到255,某些类型如下所示。

9E82394D825BD5CCE11EECBAC9B_A7BC7CB4_3A82E.jpg

DHCP服务在处理VendorSpecific类型的Option结构(Type=43)时存在安全漏洞。首先,查看DHCP服务程序对Option的处理过程。 ProcessMessage函数负责处理收到的DHCP消息,调用ExtractOptions函数来处理DHCP的Option字段,并将函数ExtractOptions的参数1(v7)传递给DHCP消息指针,参数3(*(unsigned int *) )(v5 + 16))对应于指针偏移位置+16的数据,即Len字段。

B53F3AE1CB7F3946606CB198793_BFD1DCBE_9091.jpg

ExtractOption功能如下所示。 V6=(unsigned__int64)& a1 [a3 - 1];指向消息的结尾; v10=a1 + 240;指向消息中的Option结构。在for循环中,处理不同类型的Option结构。当type=43(VendorSpecific Information)时,指针v10和指针v6作为参数传递,并且调用ParseVendorSpecific函数进行处理。

590D98DE9BDCE89CAD1A6E5EC15_476BF64F_17475.jpg306DAB27170CBCD292587695942_1C30F55E_39F46.jpg

ParseVendorSpecific函数在内部调用UncodeOption函数。 UncodeOption函数参数a1指向选项的起始位置,a2指向消息的结束位置。 UncodeOption功能存在安全漏洞。以下分析基于POC和补丁比较。

四 漏洞分析

构造DHCP Discovery消息。 POC如下。 POC包含vendor_specific类型的两个Option结构。 Vendor_specific1是合法的Option结构。长度0x0a等于数据的实际长度(0x0a)。 Vendor_specific2是无效的Option结构。长度0x0f大于数据的实际长度(0x0a)。

8F182FB6D016EFB5779A21A3A8B_BC8387EF_13ADD.jpg

(1)DHCP服务器接收发现请求消息并处理该数据包。首先,执行ExtractOptions以处理选项。处理vendor_specific类型的选项时,将处理ParseVendorSpecific。在POC中构造有效的vendor_specific1以绕过84~85行的校验码并使程序顺利执行到ParseVendorSpecific函数。

10FB4A76F0812628C68A190A79C_0BD1CFDF_2AACE.jpg

(2)ParseVendorSpecific调用UncodeOption函数。

一个。 32~43行计算do-while循环中Option结构的Length值之和,并将其保存到v13作为分配的堆内存长度。 POC包含两个vendor_specific结构。首先,处理vendor_specific1。计算v13,即vendor_specific1长度a,并将v12指向下一个Option结构vendor_specific2。当输入43行while条件时,do-while循环结束,因为vendor_specific2的长度无效。

湾第48行调用HeapAlloc来分配堆内存,分配的内存大小为v13=a。

C。第51行到第58行依次将vendor_specific结构中的Data复制到for循环中的已分配堆内存中。当进入第一个循环时,v1指向vendor_specific1,v8指向结束位置,并且满足条件v1< v8。第55行调用memcpy将vendor_specific1的Data字段复制到分配的堆内存,复制长度Length=a。输入第二个循环,v1指向vendor_specific2,v8指向结束位置,仍然满足条件v1< v8,并再次调用memcpy将vendor_specific2的Data字段复制到分配的堆内存,复制长度Length=0xf。由于分配的堆内存大小只是一个字节,并且副本的总长度是0x0a +0x0f,因此会发生堆溢出。

4D46336DC5084CA1580E1D31DFE_6F7EE9CA_2BE24.jpg

五 补丁比对

修补后的版本增加了Length字段的有效性。

4BDEDDD80EE457A1EB8A376FF9B_44C742B8_2CEEA.jpg

六 安全建议

及时安装安全补丁:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0626

上一条:WinRAR目录穿越漏洞 下一条:2018安全事件汇编

关闭

办公地点:图书馆204、207;办公时间:周一至周五 8:00-11:30 14:30-17:30;
*办理个人业务请携带本人身份证件
0535-6903622(内线63622)网络故障
0535-6903644(内线63644)信息服务
0535-6885632(内线65632)一卡通
办公电话:
版权所有 山东葡京游戏平台工商学院 葡京游戏平台