CVE-2018-8453从BSOD到Exploit(下)

简介: 非常感谢A-Team发表EXPLOIT编写的思路,阅览后受益匪浅,因此本文不再阐述漏洞细节,专注于EXPLOIT编写.

0x00 :

Windows10 1709 X64 无补丁

 

0x01 :

非常感谢A-Team发表EXPLOIT编写的思路,阅览后受益匪浅,因此本文不再阐述漏洞细节,专注于EXPLOIT编写.

 

通过上文(CVE-2018-8453BSODExploit())得知,触发异常是因为调用win32kfull!xxxEndScroll函数释放了由win32kfull!xxxSBTrackInit函数创建的tagSBTrack结构,接着win32kfull!xxxSBTrackInit函数再次释放了tagSBTrack导致Double Free.

但是该漏洞的利用方案不唯一,在构造EXPLOIT的时候(1703),笔者首先尝试的是通过释放Kernel Pool让保存tagSBTrack结构的块与其他Free的块合并使其变成更大的块,并使用其他保存在Session Pool里的结构重引用这块内存,通过win32kfull!xxxSBTrackInit函数再次释放后,再次申请该结构,修改结构的某些位后转换成ARW Primitives,但是不管笔者怎么操作都没办法合并,只能使用另外一种利用方法,因此实验环境更新为Windows10 1709,不过再1703上利用该漏洞也是一样的,1709Poc稍作修改即可再1703上使用.

第二种方法是A-Team在文章中提到的,通过win32kbase!HMAssignmentUnlock函数将父窗口引用彻底清0,接着会从被释放的保存tagSBTrack的内核池中读取函数指针来调用win32kbase!HMAssignmentUnlock函数来解除引用的窗口,但是由于保存tagSBTrack结构的内核池已经被释放了,所以我们可以去重引用这块内存,并将其内容修改,通过win32kbase!HMAssignmentUnlock函数来构造一个任意地址 -1的漏洞,这样就可以转换成ARW Primitives.

 

 

通过逆向win32kbase!HMAssignmentUnlock函数我们发现,该函数会将[[rcx]+8]处内存+(-1)也就是减1,正好我们可控rdx,这样我们离System就更进了一步.

 

如何引用被释放的内存呢,这块内存为0x80字节大小,分配在Session Pool,我们可以通过创建窗口类,设置lpszMenuName属性,来分配任意大小的块.

 

EXPLOIT,笔者分配了0x1000TagCls结构,TagCls中保存指向lpszMenuName结构的指针,该结构分配Pool的大小为0x80,正好通过这个复用tagSBTrack结构被释放的内存,通过设置MenuName的内容,我们现在已经得到了一个任意地址 - 1 Or -2的一个漏洞了,但是怎么样才能转化成任意地址读写呢?

这里我们可以考虑使用PALETTE调色板的结构,GDI函数在Windows10 1709并没有被Type ISOLaTion保护,并且也被分配在Session Pool,所以我们可以通过泄露PALETTE结构的地址来覆写其中的某些结构实现任意地址读写.

如何泄露调色板结构在内核中的地址呢,没错,还是用我们的lpszMenuName,这里我们通过MenuName创建一个0x1000字节的Pool,接着我们释放该窗口类,这样这块内存就会被释放为Free状态了.

 

 

但是问题来了,即使我们确定PALETTE结构可以重引用被释放的Pool,但是我们如何获取到MenuName的地址呢.

我们可以使用HMValidateHandle()函数,该函数有两个参数,参数1为传入的Windows Object句柄,参数2为句柄属性,该函数会返回查找Windows Object结构在用户态映射下的地址(用户态桌面堆).

但是获取了映射的桌面堆地址,此时依然无法获取到TagCls在内核中的地址,不过TagWnd结构中保存了该结构在内核桌面堆中的地址,我们可以通过 (内核地址-用户地址)得到一个偏移,通过偏移即可算出任意结构在内核桌面堆中的地址了.

 

 

TagWnd结构中保存了TagCls结构的内核地址,我们只需要用偏移减去TagCls的内核地址就可以获取到TagCls结构在用户桌面堆的映射了.

通过保存在用户桌面堆映射下的TagCls结构找到保存MenuName的地址这样我们就可以得到PALETTE结构的地址了.

 

现在我们就要考虑,到底要修改PALETTE中的什么结构才能造成ARW PrimItives?众所周知,Palette结构中的PFirstColor指针指向保存调色板项的地址,修改PFirstColor指针即可任意地址读写.

但是问题来了,我们只能任意地址 -1 Or -2,虽然说可以连续触发漏洞多次减,但是没办法直接修改一块内存地址的内容为我们想要的值,这样就不能修改PFirstColor(其实也可以大家可以自行尝试,毕竟思路是活的,类似修改PFirstColor指针指向上面的PALETTE结构,利用读写范围去覆写上面PALETTEPFristColor指针),这里笔者修改的是cEntries结构,改结构为判断调色板读写范围的,修改了该结构后,可以导致调色板结构越界读写内存(OOB).

 

这里我们可以看到,笔者设置的cEntries0x1D5,这样会分配一个0x800字节大小的内核池,我们之前释放了一个0x1000字节的,分配两个0x800字节的,重新引用MenuName的内存,这样分配在一起,修改cEntries结构造成越界读写,修改下面块的PFirstColor即可任意内存读写了.

 

经过两次-1,Palette结构的cEntries变成了0xffffffd5,这样我们就可以越界读写后面PALETTE结构的内容了!

 

首先越界读取第二块PALETTE结构的句柄,保存在Data,判断越界和池分配是否正常,如果正常再进行下一步,当然如果不正常肯定是蓝屏的,除非在该进程中再次触发漏洞修复异常的Kernel Pool.


通过SetPaletteEntries()以及GetPaletteEntries()函数,即可在Ring3来任意内存读写了,此时我们的任务基本上就完成了,但是还有一点很重要,就是如果这样结束进程,那么一定会蓝屏(BSOD),为什么呢,因为我们用了TagCls结构中的lpszMenuName来重新引用tagSBTrack这个被释放的内存后,再次被win32kfull!xxxSBTrackInit给释放了,如果我们不做点什么的话,结束进程会立刻蓝屏.

不过不要怕,在写EXPLOIT的时候笔者以及解决这个问题了,笔者创建了一个0x1000个项的ULONG64数组,保存了我们用于占位的TagCls中指向lpszMenuName的地址,此时该派上用场了!


接着我们用调色板结构的任意地址读写将TagCls中保存lpszMenuName的结构赋值为0,这样释放TagCls时系统就会认为没有申请lpszMenuName,因为保存lpszMenuName的结构为0.


处理好善后工作后本文就结束了,十分感谢大家的观看.

相关文章
|
安全 JavaScript 前端开发
阿里云先知安全沙龙(西安站) ——浅谈XSS漏洞挖掘与构造思路
本文介绍了DOM-XSS构造、运算符的威力和模板字符串妙用三个主题。通过多个实例图解,详细展示了如何利用DOM特性构造XSS攻击、JavaScript运算符在代码中的巧妙应用,以及模板字符串在开发中的灵活运用。这些内容对提升Web安全意识和编程技巧具有重要参考价值。
|
8月前
|
人工智能 API 定位技术
MCP 开发实战:手把手教你封装高德地图与 arXiv API
本教程为 MCP(Model Context Protocol)开发实战第二阶段,带你从零封装第三方 API 为 AI 模型可用工具。通过高德地图地理编码与 arXiv 论文检索两个实例,涵盖项目搭建、工具声明、资源定义、错误处理等核心内容,助你快速上手 MCP 开发并集成至 Claude 使用。
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生<audio>标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
549 12
|
人工智能 自然语言处理 前端开发
从文案到设计,我用通义版Artifacts生成了365张灵感日历
本文介绍了如何利用通义AI的“代码模式”功能,轻松制作个性化日历。作者通过实例展示了从设计日历样式、推荐每日生活小事到赋予小事新解的过程,强调了AI在创意实现上的强大助力。此外,还探讨了AI代码生成技术对未来创造力的影响,以及通义AI代码模式如何降低创作门槛,提高效率,让每个人都能成为应用开发者。
|
机器学习/深度学习 存储 人工智能
ONNX 与安全:保护模型免受攻击
【8月更文第27天】随着人工智能和机器学习模型的应用越来越广泛,模型的安全性也成为了人们关注的重点。Open Neural Network Exchange (ONNX) 作为一种开放的标准格式,不仅可以促进不同框架之间的模型共享,还面临着如何保护模型不被恶意攻击的风险。本文将探讨 ONNX 在模型安全方面的考虑,以及如何利用 ONNX 和其他技术来保护模型免受攻击。
1134 4
|
监控 算法 安全
视频实景三维---实时视频与三维融合,数字孪生的升级版
实时视频与三维融合技术将监控视频与三维模型有机结合,实现室内外连续、实时、动态的三维全景展示。该技术通过先进算法,将视频内容精准映射到三维场景中,提供直观、立体的监控视角,增强场景理解与感知,广泛应用于安防、智慧城市、建筑设计、应急救援和工业生产等领域,提升监控效率和决策准确性。
1744 0
|
数据采集 SQL 算法
大代码时代的基建:CodeFuse-Query代码大数据分析平台
在当前的静态分析领域,CodeFuse-Query 带来了一种新的范式。它不仅满足了大规模、复杂的代码库分析需求,还能适应不断变化和多元化的静态分析场景。CodeFuse-Query 的以数据为中心的方法,使得其在处理大数据环境中的代码分析问题时具有独特优势。CodeFuse-Query 的设计,旨在解决大规模软件开发环境中的静态分析问题。它能够将源代码和分析结果视作数据,使得其可以灵活地融入大型组织的各种系统中。这种方法不仅可以有效地处理大规模的代码库,还可以应对各种复杂的分析需求,从而使得静态分析工作变得更加高效和准确。
797 2
|
JSON JavaScript 安全
XSS 检测神器:XSStrike 保姆级教程
XSS 检测神器:XSStrike 保姆级教程
|
Linux 程序员 Shell
【Linux】详解core dump文件的作用以及用法&&ubuntu20.04下无法形成core dump文件的解决办法
【Linux】详解core dump文件的作用以及用法&&ubuntu20.04下无法形成core dump文件的解决办法
1257 0
|
Python
在Python中文件异常
在Python中文件异常
193 1