HEVD驱动程序利用之道,Part 2:栈缓冲区溢出(一)

2020-12-08 3,546

概述

在上一篇文章HEVD驱动程序漏洞利用之道,Part 1:搭建环境中,我们详细介绍了搭建测试环境的过程。在本文中,我们将深入考察HEVD驱动程序。首先,我们将为读者介绍逆向工程方面的基础知识,然后,对驱动程序进行深入分析,最后,将为读者介绍栈缓冲区溢出漏洞方面的知识。需要注意的是,我们将同时通过Python和C两种语言编写的示例代码来演示该漏洞的利用过程。

废话少说,让我们开始吧!

驱动程序分析

使用IDA Pro,打开HEVD.sys文件,并导航到Imports窗口,然后找到IoCreateDevice函数。为了使客户端获得驱动程序对象的句柄,驱动程序需要至少公开一个设备对象——该任务正是通过IoCreateDevice函数来实现的。

image.png 

找到IoCreateDevice后,双击该函数,然后,右键单击该函数,选择“Jump to xref to operand”。这样的话,就会显示该驱动程序中指向该函数的所有指针/引用。

image.png 

如我们所见,在驱动程序中只有一个针对IoCreateDevice的引用。让我们继续跳至引用位置,以分析周围的子例程。在该函数中,我们需要寻找的是对HEVD.sys驱动程序公开的设备名称的引用,也就是所谓的符号链接。

 

符号链接通常用于客户端创建设备对象的句柄,以实现客户端和设备驱动程序之间进行通信。不费吹灰之力,我们就能发现正在创建的设备名称为“\\Device\\HackSysExtremeVulnerableDriver”。 

image.png 

在枚举设备名称之后,我们还需要找出HEVD.sys中的IO控制代码。我们知道,由设备驱动程序定义的IO控制代码,都会执行一组独特的动作。识别这些IO控制代码的一个好方法就是通过IDA Pro分析导入的IofCompleteRequest函数。

 

IofCompleteRequest被驱动程序用来指示一个IRP请求已经完成(后跟一个返回状态)。为了确保向驱动程序发出的IRP请求成功完成,需要向驱动程序传递一个有效的IO代码——这使得IofCompleteRequest成为一个识别驱动程序接受的IO代码的有效途径。

 

我们回到Imports窗口,并执行与IoCreateDevice函数相同的处理,我们就可以看到有很多指向IofCompleteRequest函数的指针和引用。在这个指针/引用的列表中,我们看到有一个指向IrpDeviceIoCtlHandler的指针。这正是我们感兴趣的东西,它们用于对来自客户端的IRP请求的有效IO代码进行指纹识别。你可以把DeviceIoCtlHandler看作是客户端IRP请求的管理器。

image.png 

image.png 

image.png 

image.png 

跟踪IrpDeviceIoCtlHandler的引用,并来到子程序代码的顶部后,我们可以找到驱动程序接受的IO代码以及对其处理过程。要想换一种方式查看IO代码的话,可以右键单击窗口,选择Graph视图,如下图所示。这个视图可以帮助可视化计算过程,以及IrpDeviceIoCtlHandler例程内的分支情况。 

image.png 

现在,我们已经确定了驱动程序所暴露的符号链接和接受的有效IO代码列表,这样,我们就可以继续挖掘漏洞并开始构建我们的exploit代码了。

漏洞分析

我们首先要做的是识别哪些IO代码对应堆栈溢出漏洞。幸运的是,HEVD非常冗长,使得识别漏洞类型及其相关的IO代码变得相对容易(不要被惯坏了!)。通过快速查看IrpDeviceIoCtlHandler例程,并分析每个IO代码的条件跳转,我们看到涉及堆栈溢出的IO代码是0x222003。

现在我们需要对相关函数进行分析,看看需要如何触发这个漏洞。

IDA Pro中,我们可以导航到Functions表,搜索包含stack字符串的函数名。我们会看到,有几个函数的名称中含有stack overflow字样。(我们在这篇文章中不会涉及/GS stack cookie版本)。

image.png 

下面,我们跳入TriggerStackOverflow函数,分析一下其中到底发生了什么。

image.png 

在上图中,我们可以看到缓冲区大小被设置为0x800h(十进制值为2048)。再往下分析,我们可以注意到,用户提供的缓冲区大小在传递时没有验证内核缓冲区的大小。实际上,在HackSys Team提供的StackOverflow.c文件中也有相关的描述。 

image.png 

太棒了!至此,我们已经知道:

HEVD供客户端打开驱动程序句柄的符号链接是:“\\Device\\HackSysExtremeVulnerableDriver”。

向栈溢出漏洞发出IRP请求的IO代码为0x222003。

用户提供的缓冲区大小需要大于0x800h(或十进制值2048)才能触发该漏洞。

这些信息足以让我们开始构建我们的exploit。

小结

在本文中,我们为读者介绍了驱动程序以及其中的栈溢出漏洞方面的知识,在接下来的文章中,我们将为读者介绍该漏洞的利用过程。

 

原文地址:https://jb05s.github.io/HEVD-Driver-Exploitation-Part-2-Stack-Overflow-Presented-in-Python-and-C/

本文作者:mssp299

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/149000.html

Tags:
评论  (0)
快来写下你的想法吧!

mssp299

文章数:51 积分: 662

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号