专栏名称: 深信服千里目安全实验室
深信服科技旗下安全实验室,致力于网络安全攻防技术的研究和积累,深度洞察未知网络安全威胁,解读前沿安全技术。
目录
相关文章推荐
哔哩哔哩  ·  纪录片首曝,《哪吒2》的幕后秘密 ·  17 小时前  
哔哩哔哩  ·  如何应对“致命”流感? ·  17 小时前  
哔哩哔哩  ·  全网1亿粉丝的毒舌大神,来B站了! ·  17 小时前  
安徽省发展改革委  ·  安徽省新能源汽车产业集群建设企业巡展——【2 ... ·  昨天  
安徽省发展改革委  ·  安徽省新能源汽车产业集群建设企业巡展——【2 ... ·  昨天  
51好读  ›  专栏  ›  深信服千里目安全实验室

CVE-2020-16898 "Bad Neighbor " Windows TCP/IP远程代码执行漏洞分析

深信服千里目安全实验室  · 公众号  ·  · 2020-10-16 17:14

正文


漏洞信息


1. 漏洞简述

漏洞名称: Windows TCP/IP Remote Code Execution Vulnerability

漏洞编号: CVE-2020-16898

漏洞类型: Design Weakness

漏洞影响: Code Execution

CVSS评分: 9.8

利用难度: Medium

基础权限: 不需要

2. 组件概述

TCP/IP是Internet上使用的通信协议。在Windows的早期版本中,TCP/IP是一个单独的可选组件,可以像其他任何协议一样删除或添加。从Windows XP/Server 2003开始,TCP/IP成为操作系统的核心组件,无法删除。将TCP/IP作为Windows的核心组件是非常有意义的,因为它的功能在Microsoft Windows Server上对网络操作和Active Directory域环境尤为重要。整个Active Directory架构基于DNS层次结构,依赖于TCP/IP 传输协议 。
Microsoft Windows中的TCP/IP功能在内核级别运行,并由驱动程序tcpip.sys提供。该驱动程序处理所有传入和传出的TCP/IP通信信息,包括解析从网络接口接收到的数据包,并将其传递给更高级别的组件。

3. 漏洞利用

该漏洞主要是由于Windows TCP/IP堆栈在处理选项类型为25(0x19,递归DNS服务器选项)且长度字段值为偶数的ICMPv6的路由广播数据包时,处理逻辑存在纰漏,导致存在远程代码执行漏洞。成功利用该漏洞的攻击者可以在目标机器(主机或服务器)上执行任意代码。

4. 漏洞影响

  • Microsoft Windows 10 1709

  • Microsoft Windows 10 1803

  • Microsoft Windows 10 1809

  • Microsoft Windows 10 1903

  • Microsoft Windows 10 1909

  • Microsoft Windows 10 2004

  • Microsoft Windows Server 2019

  • Microsoft Windows Server, version 1903

  • Microsoft Windows Server, version 1909

  • Microsoft Windows Server, version 2004


5. 解决方案

官方解决方案:
微软官方针对该漏洞已发布安全更新补丁,补丁地址:
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-16898
临时解决方案:
管理员启动powershell或cmd,输入以下命令检查所有网络IPv6接口的列表以及相应的索引号:

netsh int ipv6 sh int

样例输出如下:

确认网络接口的RDNSS功能开启情况:

netsh int ipv6 sh int Idx number

执行以下命令关闭RDNSS功能(将Idx number替换为要关闭的网络接口的Idx值):

netsh int ipv6 set int Idx number rabaseddnsconfig=disable

样例输出如下:

此时再次确认接口的RDNSS开启情况,RDNSS功能已被关闭:


漏洞复现


1. 环境搭建

  • 靶机:Windows 10 1809 x64

  • 靶机操作:无需任何操作,可正常与攻击机通信即可

2. 复现过程

1. 通过各种手段获取目标主机的IPv6地址和MAC地址(具体方法可自行探索,较为简单)

2. 攻击机python3运行poc:

3. 靶机crash:


漏洞分析


1. 基本信息

  • 漏洞文件:tcpip.sys

  • 漏洞函数:Ipv6pUpdateRDNSS()函数

  • 漏洞对象:ICMPv6路由广播中的option结构


2. 背景知识

限于篇幅问题,此处不对用于DNS配置的IPv6路由广播进行详细介绍,更详细资料可参考RFC8106。

2.1 基本知识

I Pv6 Router Advertisment (RA) options,也称为DNS RA options,允许IPv6的路由器向IPv6的主机广播DNS Recursive Server Address(DNS递归路由器地址)列表和DNS Search List(DNS搜索列表),其主要用途为在IPv6的主机上进行DNS名称解析以及域后缀的处理。
IPv6 Neighbor Discovery(ND,IPv6邻居发现)和IPv6 Stateless Address Autoconfiguratioin(SLAAC,IPv6无状态地址自动配置)提供了使用一个或多个IPv6地址,默认路由器以及一些其他参数配置固定节点或移动节点的方法。
当漫游主机每次连接到另一个网络时,无法进行手动配置。虽然可以进行静态配置,但是在诸如笔记本电脑之类的通用主机上通常不建议这样操作。例如,如果主机运行直接连接到全局DNS的自己的递归名称服务器,那么本地定义的名称空间对主机来说就不可用了。访问DNS是几乎所有主机的基本要求,因此IPv6 SLAAC在没有任何DNS配置支持的情况下,不能在任何实际的网络环境中单独作为替代部署模型。
对于IPv4环境中的DNS服务器来说,这些问题都很容易解决。但是对于IPv6的网络环境,这些问题显得比较棘手。因此,RFC8106定义了一种基于DNS RA选项的机制,以允许IPv6主机执行自动DNS配置。
在通过IPv6 SLAAC自动配置IPv6主机地址并且没有DHCPv6基础结构或一些主机没有DHCPv6客户端的网络环境中,可以使用基于RA的DNS配置作为替代。但是,对于需要分发其他信息的网络,可能仍然会使用DHCPv6。在这些网络中,可能不需要基于RA的DNS配置。基于RA的DNS配置允许IPv6主机获取主机连接到的链接的DNS配置(即DNS递归服务器地址和DNSSL)。此外,主机会从提供链接配置信息的同一RA消息中学习此DNS配置

2.2 名词解释

  • Recursive DNS Server (RDNSS):递归DNS服务器,提供递归DNS解析服务的服务器,用于将域名转换为IP地址或解析成RFC1034和RFC1035中定义的PTR记录。

  • RDNSS Option:一个用于向IPv6主机传送RDNSS信息的IPv6的RA option【RFC4861】。

  • DNS Search List (DNSSL):Pv6主机在执行DNS查询搜索时使用的DNS后缀域名列表,用于搜索简短的不合格域名。

  • DNSSL Option:一个IPv6 RA选项,用于将DNSSL信息传递到IPv6主机。


3 详细分析

3.1 基础分析

RFC8106标准化了RDNSS option,其中包含RDNSSes的地址。该信息使用现有ND message(例如RA)作为载体。IPv6主机可以通过RA消息配置一个或多个RDNSS的IPv6地址。

3.1.1 邻居发现扩展

RFC8106中定义的在邻居发现中使用的IPv6 DNS配置算法需要用到2种ND options:RDNSS option和DNSSL option。与该漏洞相关的是RDNSS option,另外一种则与 CVE-2020-16899相关。

3.1.2 RDNSS Option Structure

对于Length字段,如果该选项中仅包含一个IPv6地址,则最小值为3。每增加一个RDNSS地址,长度就会增加2。接收的主机使用该字段来确定选项中IPv6地址的数量。

3.1.3 Procedure in IPv6 Hosts

当主机接收到RA消息中的DNS的options时,其处理过程如下:
  • 首先检查Lengh字段的合法性:是否大于等于最小值3,以及是否满足(Length - 1) % 2 == 0;

  • 对于RDNSS option,还会检查Address字段是否为一个单播地址;

  • 如果以上验证通过,则主机应按顺序将选项的值复制到DNS存储库和解析器存储库中。否则,主机必须丢弃这些选项。

3.1.4 Crash分析

首先分析dmp文件,查看crash现场:

并没有发现明显的较为有价值的Call Stack信息,但是发现最终的crash原因的是GS机制的Security Cookie校验失败,也就是说该值被覆盖掉了。那么很有可能是一个溢出。除此之外,只发现了tcpip!Ipv6pHandleRouterAdvertisement+0x1269函数,再往后就直接报gsfailure了。

3.2 静态分析

分析使用的文件为Windows 10 1809 x64的tcpip.sys文件,版本为10.0.17763.316。

3.2.1 函数调用链

根据crash现场信息,获取到关键函数tcpip!Ipv6pHandleRouterAdvertisement(),首先确认该函数到漏洞函数的前后调用链。
首先查看其交叉引用关系:

其上层调用函数为Icmpv6ReceiveDatagrams(),跟进,并查看交叉引用关系:

没有再发现显式的函数调用。转而向tcpip!Ipv6pHandleRouterAdvertisement()的下层搜索:

发现漏洞函数调用。至此,函数调用链可以简单概括为:
Icmpv6ReceiveDatagrams() -> tcpip!Ipv6pHandleRouterAdvertisement() -> Ipv6pUpdateRDNSS()

3.2.2 漏洞函数分析

经过简单分析可以明确,调用链的顶层函数Icmpv6ReceiveDatagrams()没有发现实质性的与该漏洞相关的处理代码,而在tcpip!Ipv6pHandleRouterAdvertisement() 函数中发现了对漏洞函数Ipv6pUpdateRDNSS()的调用。根据crash分析,最后报了gsfailure,而且关键函数为tcpip!Ipv6pHandleRouterAdvertisement(),在该函数的起始位置确实发现了GS校验:






请到「今天看啥」查看全文