[转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
https://www.freebuf.com/vuls/197309.html MS17- 再现的感觉。。。
一 漏洞背景
2月12日,微软发布2月份月度例行安全公告,修复了多个高危漏洞,其中包括Windows DHCP Server远程代码执行漏洞CVE-2019-0626。当攻击者向DHCP服务器发送精心设计的数据包并成功利用后,就可以在DHCP服务中执行任意代码,漏洞影响范围较大。针对此漏洞,启明星辰ADLab第一时间对其进行了详细分析。
二 漏洞影响版本
Windows 7
Windows 8.1
Windows 10
Windows Server 2008
Windows Server 2012
Windows Server 2016
Windows Server 2019
三 协议简介
DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议。DHCP通常用于集中管理分配IP地址,使client动态地获得IP地址、Gateway地址、DNS服务器地址等信息。DHCP客户端和DHCP服务端的交互过程如下图所示。

传输的DHCP协议报文需遵循以下格式:

DHCP包含许多类型的Option,每个Option由Type、Length和Data三个字段组成。

Type取值范围1~255,部分Type类型如下图所示。

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

ExtractOption函数如下所示。 v6 = (unsigned__int64)&a1[a3 - 1];指向报文末尾位置;v10=a1+240;指向报文中Option结构。在for循环中处理不同类型的Option结构,当type=43(Vendor Specific Information),传入指针v10和指针v6作为参数,调用ParseVendorSpecific函数进行处理。


ParseVendorSpecific函数内部调用UncodeOption函数。UncodeOption函数参数a1指向option起始位置,a2指向报文的末尾位置。UncodeOption函数存在安全漏洞,下面结合POC和补丁比对进行分析。
四 漏洞分析
构造一个DHCP Discovery报文,POC如下所示,POC包含两个vendor_specific类型的Option结构。vendor_specific1是合法的Option结构,Length取值0x0a等于Data的实际长度(0x0a),vendor_specific2是不合法的Option结构, Length取值0x0f大于Data的实际长度(0x0a)。

(1)DHCP服务器收到Discovery请求报文,对数据包进行处理。首先执行ExtractOptions处理Options,当处理vendor_specific类型的Option时,进入到ParseVendorSpecific进行处理。POC中构造一个合法的vendor_specific1,目的是为了绕过84~85行的校验代码,使程序顺利执行到ParseVendorSpecific函数。

(2)ParseVendorSpecific调用UncodeOption函数。
a. 32~43行在do-while循环中计算Option结构的 Length值之和,保存到v13,作为分配堆内存长度。POC中包含两个vendor_specific结构,首先处理vendor_specific1,计算v13,即vendor_specific1长度a,并且使v12指向下一个Option结构vendor_specific2,当进入43行while条件判断,由于vendor_specific2长度不合法,do-while循环结束。
b. 48行调用HeapAlloc分配堆内存,分配的内存大小v13=a。
c. 51~58行在for循环中依次将vendor_specific结构中的Data拷贝到分配的堆内存中。进入第一次循环时,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。由于分配的堆内存大小只有a个字节,而拷贝的总长度=0x0a+0x0f,从而导致堆溢出。

五 补丁比对
补丁后的版本添加了对Length字段的有效性判断。

六 安全建议
及时安装安全补丁:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0626
[转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)的更多相关文章
- CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析
[CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110) Microsoft Wi ...
- CVE-2012-1876Microsoft Internet Explorer Col元素远程代码执行漏洞分析
Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏览器. Microsoft Internet Explorer 6至9版本中存在漏 ...
- Spring框架的反序列化远程代码执行漏洞分析(转)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- thinkphp5.0.22远程代码执行漏洞分析及复现
虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...
- Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现
0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...
- CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析
漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...
- CVE-2018-7600 Drupal核心远程代码执行漏洞分析
0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...
- phpMoadmin CVE-2015-2208 远程代码执行漏洞分析
原文:http://www.thinkings.org/2015/03/05/cve-2015-2208-phpmoadmin-exec-vul.html phpMoAdmin 是一个用PHP 开发的 ...
- Thinkphp5-0-X远程代码执行漏洞分析(2019-1-11)
周五下午爆洞能不能让人们好好休个周末! 分析过程 本次漏洞关键位置:/thinkphp/library/think/Request.php,lines:501由图可以看到在method函数中引入了可控 ...
随机推荐
- 设计模式のTemplatePattern(模板模式)----行为模式
一.产生背景 在程序设计中,可能每个对象都有共同的地方,而此时如果每个对象定义一次,如下例子,每个对象都写Stay()方法,这样在每个类中都有很多相同的代码,此时,我们需要用到模板设计模式,来解决这个 ...
- C#反射の一个泛型反射实现的网络请求框架
点击下载源码 C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转)
- LDAP概念
1.1.LDAP目录结构 此图为树形目录结构,我将此跳过去了,因为这个是按照“国家这种结构来划分的”.如果你喜欢这样看更好,如下还有一种: 树也可以根据互联网域名组主.这种命名方式正越来越受欢迎, ...
- public private protected default
public private protected default 这几个限定访问控制符只是在编译阶段起作用,在运行阶段不起作用 private修饰符 , 本类可以访问 default修饰符 , 本类, ...
- jupyter notebook中No module named 'tensorflow'
当我们在jupyter notebook中运行时可能会遇见没有某个包的情况,如下: ---------------------------------------------------------- ...
- Spring Security(十一):4. Samples and Guides (Start Here)
If you are looking to get started with Spring Security, the best place to start is our Sample Applic ...
- 环境部署(四):Linux下查看JDK安装路径
在安装好Git.JDK和jenkins之后,就需要在jenkins中进行对应的设置,比如在全局工具配置模块,需要写入JDK的安装路径. 这篇博客,介绍几种常见的在Linux中查看JDK路径的方法... ...
- 我的微软最有价值专家(Microsoft MVP)之路
一.写在前面 2018年对我来说是幸运的一年,对我来说最幸运的事情有两个,一个是在离驾照考试过期还有一个月(报名之后一直没去考)终于拿到了我的驾照,还有一件事莫过于获得了微软MVP.期间,一直有朋友问 ...
- Microsoft.Extensions.DependencyInjection不同版本导致EF出现内存泄露。
我的代码里将IServiceProvider放入ServiceLocator中遇到的问题. 注:以下所有例子都是Console里的结论,AspNetCore里不管怎么玩都没有问题,有其他帖子测试出在A ...
- 面试:用 Java 逆序打印链表
昨天的 Java 实现单例模式 中,我们的双重检验锁机制因为指令重排序问题而引入了 volatile 关键字,不少朋友问我,到底为啥要加 volatile 这个关键字呀,而它,到底又有什么神奇的作用呢 ...
2019-03-15共23605人围观 ,发现 4 个不明物体