草庐IT

CVE-2021-33739 EOP漏洞分析

Taoist 2023-03-28 原文

背景

  CVE-2021-33739是一个UAF漏洞,成因是由于在对象CInteractionTrackerBindingManagerMarshaler与对象CInteractionTrackerMarshaler双向绑定的前提下,再对双方绑定进行解绑,CInteractionTrackerMarshaler指向前者的指针虽被清除,但CInteractionTrackerBindingManagerMarshaler中指向CInteractionTrackerMarshaler的指针仍然存在,之后释放CInteractionTrackerMarshaler对象,CInteractionTrackerBindingManagerMarshaler中的指针仍然指向被free的内核地址,从而导致UAF漏洞。

分析

  首先创建一个CInteractionTrackerBindingManagerMarshaler(id=1)和两个CInteractionTrackerMarshaler对象资源(id=2、3)。创建方式是利用用户态win32u.dll模块的导出函数NtDCompositionProcessChannelBatchBuffer,通过和信道关联的缓冲区pMappedAddress指定创建资源类型(ResourceType)和指令(nCmdCreateResource),在内核中创建指定id的相应资源。信道通过调用函数NtDCompositionCreateChannel创建。

  系统调用NtDCompositionProcessChannelBatchBuffer支持的指令如下,每个指令都有自己不同的缓冲区大小和格式。当前漏洞涉及到了其中的nCmdCreateResource(1)、nCmdReleaseResource(3)、nCmdSetResourceBufferProperty(12)。

  nCmdCreateResource指令对应的缓冲区(pMappedAddress)格式和大小:

  调用后,执行至win32kbase!DirectComposition::CApplicationChannel::CreateResource,再根据isSharedResource参数执行CreateInternalSharedResource或CreateInternalResource,漏洞在CreateInternalResource中。

  win32kbase!DirectComposition::CApplicationChannel::CreateInternalResource根据Resource Type创建不同资源对象。

  对象全部创建成功后,指定处理指令nCmdSetResourceBufferProperty,将两种不同类型指令进行绑定。缓冲区格式如下:

  该指令将执行至CInteractionTrackerBindingManagerMarshaler::SetBufferProperty,该函数位于CInteractionTrackerBindingManagerMarshaler对象偏移0xA8处。

  如果CInteractionTrackerBindingManagerMarshaler没有绑定对象,且nCmdSetResourceBufferProperty指令对应pMappedAddress中由用户指定的EntryID(Data偏移+0x8处)不为0,则将TrackerManager(CInteractionTrackerBindingManagerMarshaler)和两个Tracker(CInteractionTrackerMarshaler)互相绑定。

  由TrackerManager向Tracker的绑定方式是创建一个TrackerEntry结构,指针放在TrackerManager偏移+0x38处。TrackerEntry结构大小为32字节:
pTracker1(QWORD) | pTracker2(QWORD) | entry_id(QWORD) | 1(QWORD)
  绑定后的TrackerManager:

  而从Tracker向TrackerManager的绑定由SetBindingManagerMarshaler函数实现。该函数先判断Tracker偏移0x190处指针是否指向待绑定的TrackerManager,在确认未绑定的条件下先将TrackerManager偏移0x14处的资源引用值加1,接着在Tracker对象偏移0x190处写入TrackerManager对象指针值,实现绑定。

  指令完成后,再次执行上一步nCmdSetResourceBufferProperty指令操作,不过变动是需要指定EntryID为0(szBuff+0x8)。

  再次执行至SetBufferProperty,此时流程将进入另一分支,因为此时在TrackerManager对象偏移0x50处值由0变成1,应该和TrackerEntry关联。之后又根据用户给的Tracker1和Tracker2二者ID从channel对象关联的pMappedAddress中取出各自对应下标的指针值,和TrackerManager中TrackerEntry绑定的两个Tracker ID进行比较,相同则继续,不同则跳转至绑定分支。

  顺利执行下来,又对用户指定的EntryID判断为0的话,将调用RemoveBindingManagerReferenceFromTrackerIfNecessary,该函数将解除TrackerManager和Tracker的绑定关系。然而漏洞就是出现在此处,因为RemoveBinding...函数只是将Tracker中的TrackerManager指针值置0,而TrackerManager中的TrackerEntry仍然存在。

  之后释放(nCmdReleaseResource)两个Tracker资源,再调用NtDCompositionCommitChannel提交channel数据后将触发BSOD。可以看到,最终是在调用CInteractionTrackerBindingManagerMarshaler::EmitBoundTrackerMarshalerUpdateCommands发生错误。

利用

目前公开的POC,是利用构造的Palette对象去占用被释放的两个Tracker的原本空间,之后再借助NtDCompositionCommitChannel触发利用。

  每释放一个Tracker,就紧接着通过大量创建Fake_Palette对象的方式去占用目标空间。为了能准确地实现占用,构造的Fake_Palette对象大小应和原本被释放的Tracker对象大小一致,可以在之前的windbg中使用命令!pool中看到Tracker的size为0x1A0。

  在分析部分,可以知道最终是在CInteractionTrackerBindingManagerMarshaler::EmitBoundTrackerMarshalerUpdateCommands函数除触发的BSOD。
  查看该函数,可以看到会调用 (*pTracker)+0x50 地址处的函数,应该是原本已释放Tracker的虚表函数调用。

  通过构造Palette,可指定函数调用,POC中选用了nt! SeSetAccessStateGenericMapping,可将16字节内容写入可控地址,可用于替换_KTHREAD中的PreviousMode(1:usermode;0:kernelmode),内核中的完整性检查是在previousmode为1前提下,意味着previousmode被覆写为0可进行跟高权限操作。

  查看nt!SeSetAccessStateGenericMapping,其中rdx指向channel缓冲区的偏移0xB8处的16字节。多次调试后发现该位置前8字节为一个不明指针值,后8字节为0值,因此覆写时,向后移动了9字节,以保证0值覆盖previousmode字段。

  POC代码中似乎还尝试修改Token,但是rdx不可控,似乎没起作用。
  另外在EmitBoundTrackerMarshalerUpdateCommands中,需要TrackerEntry的ID不为0方才能调用虚表中的函数。但是解绑Tracker2和Tracker3时,TrackerEntry被重新设置为了0,因此POC除了创建Tracker2和Tracker3,还需要创建第三个Tracker(Tracker4)。在绑定和释放Tracker2和Tracker3且Fake_Palette成功占用二者原来空间后,再绑定Tracker4和TrackerManager,指定TrackerEntry不为0,如POC中的0xffff。

  成功占用后的空间情况,可以看到都是大小为0x1A0的相同连续空间分布。

  PreviousMode覆写前后:

  之后将shellcode注入winlogon.exe,启动system权限的cmd.exe。

参考

https://www.anquanke.com/post/id/245427
https://www.zerodayinitiative.com/blog/2021/5/3/cve-2021-26900-privilege-escalation-via-a-use-after-free-vulnerability-in-win32k
https://github.com/Lagal1990/CVE-2021-33739-POC/blob/fbbba006a610f4f269c9aefdf060562d86459bf5/CVE-2021-26868 %26 CVE-2021-33739/exp/exp.cpp

有关CVE-2021-33739 EOP漏洞分析的更多相关文章

  1. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

  2. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  3. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  4. 什么是0day漏洞?如何预防0day攻击? - 2

    什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相

  5. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  6. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  7. ruby-on-rails - 如何使用 ruby​​-prof 和 JMeter 分析 Rails - 2

    我想使用ruby​​-prof和JMeter分析Rails应用程序。我对分析特定Controller/操作/或模型方法的建议方法不感兴趣,我想分析完整堆栈,从上到下。所以我运行这样的东西:RAILS_ENV=productionruby-prof-fprof.outscript/server>/dev/null然后我在上面运行我的JMeter测试计划。然而,问题是使用CTRL+C或SIGKILL中断它也会在ruby​​-prof可以写入任何输出之前杀死它。如何在不中断ruby​​-prof的情况下停止mongrel服务器? 最佳答案

  8. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  9. 驱动开发:内核无痕隐藏自身分析 - 2

    在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,

  10. 2023爱分析·流程中台市场厂商评估报告:微宏科技 - 2

     目录1. 研究范围定义2. 流程中台市场分析3. 厂商评估:微宏科技4. 入选证书 1.   研究范围定义近年来,随着外部市场环境快速变化、客户需求愈发多样,企业逐渐意识到,自身业务需要更加敏捷、高效,具备根据市场需求快速迭代的能力。业务流程的自动化能够帮助企业实现业务的敏捷高效,因此受到越来越多企业的关注。企业的“自动化武器库”品类丰富,包括低/零代码平台、RPA、BPM、AI等。企业可以使用多项自动化工具,但结果往往是各项自动化工具处于各自的“自动化烟囱”之中,仅能实现碎片式自动化。例如,某企业的IT团队可能在使用低代码平台、财务团队可能在使用RPA、呼叫中心则可能在使用聊天机器人。自动

随机推荐