Microsoft Windows DHCP Server远程代码执行漏洞(CVE-2019-0725)可开发性分析

释放双眼,带上耳机,听听看~!

点击上方“凌天实验室”可订阅哦!


1

事件背景

上月中旬,微软发布了月度安全补丁,除包含一个今年最令人担忧的漏洞之一Windows终端服务漏洞(CVE-2019-0708)外,Windows DHCP服务器中的远程代码执行漏洞(CVE-2019-0725)也成为一个难以忽略的存在,原因如下:


利用Windows DHCP服务器远程代码执行漏洞(CVE-2019-0725),不需要进行任何用户交互,并且此漏洞将影响所有版本的Windows Server。


2

CVE-2019-0725的影响

微软对CVE-2019-0725的 CVSS 3.0评级的基本评分为8.1。成功的攻击将允许系统级代码执行,影响系统的高机密性,完整性和可用性,所有版本的Windows Server中的漏洞严重程度都被评为严重,此外,安装成功攻击不需要特权。

其攻击复杂性评级高意味着该漏洞未完全受到攻击者的控制是主要因素,在这种情况下,该评级少部分是由于漏洞是由竞争条件引起的Use-After-Free,这是由影响其他操作的事件的意外时间引起的缺陷。

这种竞争条件究竟如何运作?先快速了解一般通过DHCP 分配地址的方式。

希望分配IP地址的客户端首先发送DISCOVER消息,通常发送到广播地址(FF:FF:FF:FF:FF:FF,硬件层,255.255.255.255,IP层),如果同一广播域中有DHCP服务器,并且它具有可分配的IP地址,则它将以OFFER消息进行响应,它包含客户端应使用的IP地址的详细信息,以及DNS服务器等其他信息。

然后,DHCP客户端发送REQUEST消息,其中包含有关客户端的其他信息,并确认客户端请求的IP地址(通常是服务器在OFFER消息中发送的地址),如果服务器接受来自客户端的REQUEST消息,它将发送DHCP ACK以通知客户端它现在可以使用分配的IP地址。


3

触发竞争条件


使用DHCP服务器在dhcpssvc.dll中实现并通过svchost.exe运行,传入的DHCP消息由ProcessMessage()函数处理,它首先调用一个函数从传入消息中提取DHCP选项,这种情况很早就会发生,因为DHCP选项包含所请求的IP地址,主机名等信息,最重要的是DHCP消息类型(例如,DISCOVER或REQUEST),ProcessMessage()将根据DHCP消息类型调用处理函数,在DISCOVER消息的情况下,调用的函数是ProcessDhcpDiscover(),这是与漏洞有关的有问题的函数,DHCP服务器在dhcpssvc.dll中实现,并通过svchost.exe运行。

图1. ProcessMessage()检查DHCP消息类型

Windows DHCP服务器跟踪“待处理”的IP地址租约。这意味着IP地址已在内部分配给客户端,但不一定由客户端提供或接受,为了跟踪这些待处理的租约,DHCP服务器使用PendingCtxt结构的引用列表,这些PendingCtxt结构包含在基于堆的缓冲区中,包括客户端硬件地址、租约、续订和重新绑定时间、分配给客户端的IP地址以及指定是否已为此特定项发送了OFFER的标志等信息,首次调用ProcessDhcpDiscover()时,它会检查它是否具有现有的PendingCtxt,通过使用DHCP头中包含的客户端硬件地址作为函数DhcpFindPendingCtxt()的参数实现。

如果没有为特定客户端找到当前的PendingCtxt,则从可用地址池或先前分配给该客户端的地址分配地址,然后调用函数DhcpProcessDiscoverForValidatedAddress()以执行构造将响应DISCOVER发送的OFFER消息所需的剩余任务,DhcpProcessDiscoverForValidatedAddress()检索配置的租约信息,例如服务器上配置的租约,续订和重新绑定时间,然后将该信息以及提供的IP地址和子网掩码传递给函数DhcpAddPendingCtxt(),该函数为新的PendingCtxt结构分配一个基于堆的缓冲区,该结构填充了待处理的租约信息,然后添加到所有待处理租约的列表中。

图2. DhcpAddPendingCtxt()中PendingCtxt结构的分配和填充

添加PendingCtxt结构后,将在函数DhcpRespondToDiscover()中构造OFFER消息并将其发送到客户端。

因为PendingCtxt结构理论上可以在任何时间点由多个服务器线程访问,所以对结构的访问通常包含在DhcpGlobalInprogressCritSect关键部分中,这用于通过仅允许一个线程或进程在任何给定时间在关键部分内运行来限制由于共享访问相同资源而导致的意外行为,在ProcessDhcpDiscover()中,在调用DhcpFindPendingCtxt()之前输入DhcpGlobalInprogressCritSect临界区,如果没有PendingCtxt,或者在现有PendingCtxt结构中的某些信息被验证之后,线程将离开临界区。

图3.在现有PendingCtxt结构上输入初始操作的关键部分

但是,在线程离开这个初始临界区之后,还有一个由位于RBX寄存器中的地址引用的PendingCtxt结构的直接访问,此访问检查“OFFER标志”的值以查看是否已将OFFER发送到此客户端,虽然这种直接访问受到另一个关键部分的保护,但是在离开前一个关键部分和进入新的关键部分之间有一个很小的窗口。

图4.保护对PendingCtxt结构的访问的关键部分之间的说明

由于线程调度的不可预测性,不能保证PendingCtxt结构仍然存在,删除PendingCtxt结构的线程可以选择在ProcessDhcpDiscover()离开第一个临界区之后但在函数进入下一个临界区之前运行,当再次访问PendingCtxt结构时,此竞争条件可导致在空闲后使用。

有几种情况可能导致PendingCtxt结构被释放,这是由函数DhcpDeletePendingCtxt()执行的任务,PendingCtxt可能会过期并被清理,攻击者无法控制,但发送带有服务器无法分配的请求IP地址的REQUEST消息或RELEASE消息将导致调用DhcpDeletePendingCtxt()并释放先前分配的堆缓冲区。

图5. DhcpProcessRelease()查找现有PendingCtxt并删除它(如果存在)


4

注意事项和可利用性


攻击者可以通过发送至少两个DISCOVER消息来触发Use-After-Free,一个用于创建初始PendingCtxt,另一个用于查找和访问创建的PendingCtxt,攻击者还必须发送完美定时的RELEASE或精心制作的REQUEST消息。

实际上,在第一次尝试时是不可能触发这样的竞争条件,攻击者可能必须同时发送大量DISCOVER和RELEASE或REQUEST消息,测试显示,需要10秒到几分钟才能触发竞争状态,客户端也需要一直发送DHCP消息。

触发漏洞看起来很容易,实际上在Use-After-Free获得代码执行是非常具有挑战性的,攻击者需要在网络上创建大量流量才有机会,但由于触发漏洞可能导致DHCP服务器服务崩溃,攻击者可能会使用此拒绝服务功能来运行可用于执行DNS缓存中毒等攻击的恶意DHCP服务器。



5

修复建议

 

  • 及时安装微软发布的安全补丁 

  • 限制只允许受信任的源访问受影响的系统,可以考虑使用基于IP的访问控制列表(ACL)


6

参考资料


https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0725

https://blog.trendmicro.com/trendlabs-security-intelligence/cve-2019-0725-an-analysis-of-its-exploitability/

https://www.agesec.com/1653.html

https://www.secrss.com/articles/10674


凌天
实验室

凌天实验室,是安百科技旗下针对应用安全领域进行攻防研究的专业技术团队,其核心成员来自原乌云创始团队及社区知名白帽子,团队专业性强、技术层次高且富有实战经验。实验室成立于2016年,发展至今团队成员已达35人,在应用安全领域深耕不辍,向网络安全行业顶尖水平攻防技术团队的方向夯实迈进。



“阅读原文”我们一起穿越安百信息安全资讯平台~

本文源自微信公众号:凌天实验室

人已赞赏
安全工具

CVE-2019-9535:iTerm2中一个存在长达7年之久的RCE漏洞

2019-10-14 14:03:03

安全工具

搭建 Selenium 集群过程

2019-10-14 14:03:08

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索