HEVD内核攻击:驱动程序的编译、安装、加载及调试(一)

本文讲的是HEVD内核攻击:驱动程序的编译、安装、加载及调试(一)

HEVD是HackSys的一个Windows的训练项目,是一个存在漏洞的内核的驱动,里面存在多个漏洞,通过ControlCode控制漏洞类型,这个项目的驱动里几乎涵盖了内核可能存在的所有漏洞,从最基础的栈溢出,到池溢出,释放后重用等等类型,是一个非常好的项目。非常适合我们熟悉理解Windows内核漏洞的原理,利用技巧等等。

项目地址:https://github.com/hacksysteam/HackSysExtremeVulnerableDriver

编译驱动程序

我们需要安装Visual Studio 2015以及最新的SDK。还要安装Windows驱动程序工具包(WDK)。因为我们想要的目标为Windows 7的 64位操作系统,所以我还要下载了Windows 7的SDK。

所有安装都是我们从github所下载的HEVD源代码的zip文件,而且我们还会把驱动程序源代码提取到一个目录。接下来,打开Visual Studio并启动一个新项目。安装WDK后,我们就可以选择创建一个空的内核模式驱动程序,然后为这个新项目命名一个易于识别的名称(例如HEVD-win7x64),然后点击OK:

右键单击解决方案资源管理器中右侧的Header Files文件夹,然后单击添加>现有项目……,直到我们浏览到驱动程序源代码目录,然后将这些目录导入所有.h文件。这些操作完成后,我们就可以对解决方案资源管理器中的源文件文件夹执行相同操作,并导入所有.c文件。现在在项目菜单下,选择HEVD-win7x64属性……直到打开项目属性对话框。不过要实现新项目的正常工作,我们还要进行一些操作,单击C / C ++节点并将“Treat Warnings As Errors”更改为“No (/WX-)”,另外还需要向下滚动到代码生成子节点,将安全检查选项更改为“Disable Security Check (/GS-)”,以便我们可以使用此缓冲区溢出,而不会出现其他"并发攻击"。单击驱动程序设置节点,并确保目标操作系统是Windows 7,目标工作平台在桌面。在Build菜单下,单击Build Solution,如果一切正常,我们应该在x64  Release中的项目文件夹下找到HEVD-Win7x64.sys:

安装驱动程序

Windows 7 x64不允许安装任何旧版的驱动程序。从Windows Vista开始,所有64位版本的Windows都需要驱动程序代码为驱动程序加载数字签名。Microsoft提供了各种解决方法来测试驱动程序,但我们认为最简单的选项是使用TESTSIGNING引导配置选项,因为这能允许我们使用Visual Studio对驱动程序签名的测试证书,并且不需要完全信任的验证链。

打开管理员命令提示符,并发出以下命令:

加载驱动程序

通常,驱动程序是使用安装程序创建的,但是为了到达测试效果,我们还是要选择使用OSR驱动程序加载程序。从此链接下载实用程序并解压缩OSRLOADER.exe。不过要想加载新编译的驱动程序,我们还需要先“注册服务”,注册完毕,点击“开始服务”就可以了!

内核调试

显然,在VMWare工作环境中,我们为内核调试配置共享串行端口管道是很轻松的,但是OSX上的VMWare Fusion没有正式支持它。因为一些最有用的链接已过时:

然后在关闭debugee VM(Win7x64之一)之前,我们需要使用另一个bcdedit命令。打开管理员命令提示符并输入以下内容:

然后关闭它。打开debugee的.vmx文件,将以下内容附加到其中:

在此,我们建议与这两个VM共享/ private / tmp文件夹。

无论如何,启动调试VM并打开WinDBG AMD64。单击文件>内核调试……直到启动内核连接对话框。单击串行选项卡,将COM1更改为COM2,然后单击确定。现在启动Win7x64 debugee VM。如果一切顺利,我们应该能在调试器中看到下图所示的情形:

如果我们注册的HEVD驱动程序能自动启动,那么它应该已经被加载并准备好调试了。我们可以通过在调试器中发出一个Break并发出lmkm HEVD_Win7x64命令来进行检查:

如果发现在自动启动的状态下,没有加载,我们就需要使用OSRLOADER.exe再次启动它,不过在这样做之前,我们需要对调试环境做一个快速调整,必须在每个内核调试会话期间发出以下命令(意味着重新启动后):

一旦完成,输入g继续执行debugee VM,以便我们可以重新加载驱动程序。 现在继续使用OSRLOADER.exe来启动驱动程序服务。如果一切顺利,内核调试结果如下所示:

因为在的下一篇关于HEVD 内核攻击的文章中,我们将会用到这些代码。

原文发布时间为:2017年3月23日

本文作者:xiaohui

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2025-01-21 04:37:47

HEVD内核攻击:驱动程序的编译、安装、加载及调试(一)的相关文章

HEVD内核攻击:漏洞的使用(二)

本文讲的是HEVD内核攻击:漏洞的使用(二), 上一章我们已经把调试环境给设置好了,本章我们就来说说如何来来利用这些漏洞. https://github.com/hacksysteam/HackSysExtremeVulnerableDriver上有很多有趣的漏洞.我们之所以会使用这些有漏洞的驱动程序,是因为我们更熟悉Ring0模式下的有效载荷(Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3.Windows只使用其中的两个级别RING0和RING3,RI

HEVD 内核攻击:漏洞攻击的完全实现及SMEP绕过(四)

本文讲的是HEVD 内核攻击:漏洞攻击的完全实现及SMEP绕过(四), 到目前为止,我们还没有完全实现漏洞的攻击.让我们回顾一下第2篇里为DoS PoC创建的漏洞利用步骤,现在我们可以修改其中一些步骤,来实现SYSTEM shell. 第一步,生成cmd.exe进程 虽然这一步非常简单,但是要在Python中实现,还是需要一些额外的代码,与C语言代码相比,我们将使用Kernel32.dll中的CreateProcess API来启动shell.查看函数原型,该函数需要为调用设置两个结构体,其中一

HEVD 内核攻击: 编写Shellcode(三)

本文讲的是HEVD 内核攻击: 编写Shellcode(三), 在上一篇文章中,我们已经能以可控的方式使用内核了.但是,当创建Windows内核漏洞利用时,目标通常都是希望以某种方式获得更高的权限,通常是SYSTEM权限.这时我们就必须用到内核有效载荷. 窃取进程token 使用这个方法的最终目标是使用SYSTEM级别访问权限打开命令提示符.一旦我们在 ring 0中获取了执行的控制权限,就有办法来打开命令提示符.最常用的方法是窃取特权进程的进程token, Windows安全模型非常复杂的,不

《Linux设备驱动开发详解 A》一一3.4 Linux内核的编译及加载

3.4 Linux内核的编译及加载 3.4.1 Linux内核的编译 Linux驱动开发者需要牢固地掌握Linux内核的编译方法以为嵌入式系统构建可运行的Linux操作系统映像.在编译内核时,需要配置内核,可以使用下面命令中的一个: make conf?ig(基于文本的最为传统的配置界面,不推荐使用) make menuconf?ig(基于文本菜单的配置界面) make xconf?ig(要求QT被安装) make gconf?ig(要求GTK+被安装) 在配置Linux内核所使用的make c

Excel 2007无法安装加载项解决办法

今天打开邮件看到一位朋友给我发来一封邮件,全文如下(略有删改): 最近在学数学模型,用规划求解来计算.以前用Excel XP,知道在工具中加载相关的宏,然后很顺利地就能求解.但是用Excel 2007就找不到北了: 首先是加载宏,点击左上角Office标志图标-"Excel选项"-"加载项",在下面的管理下拉列表中选择"Excel加载项",转到,弹出"加载宏"对话框,勾选"规划求解加载项",确定,弹出一个对

asp.net-急求:ASP.net中Web office插件,vs加载excel2013 调试时出现内存不足的问题

问题描述 急求:ASP.net中Web office插件,vs加载excel2013 调试时出现内存不足的问题 解决方案 如果不是系统兼容的问题 那就是office本身的问题 打开excel 文件-选项-信用中心-信用中心设置-受信用位置-添加新位置-注意勾选-"同时信任此位置的子文件夹"按确定 重启excel 文件阻止设置,找到你的Excel对应的版本,勾选打开

IIS预编译提升加载速度

  当我们把网站部署在IIS7或IIS6S的时候,每当IIS或是Application Pool重启后,第一次请求网站 反应总是很慢,原因大家都知道(不知道可以参考这个 动画说明ASP.NET网页第一个Request会比较慢的原因 ).所以每次网站更新都会给第一个用户代号不好的用户体验,因此之前大家得通过撰写仿真模拟访问动作或预编译来解决此问题.但自从Windows 2012出来之后,这部分Application Initialization功能已经有内含在IIS8之中,可以直接进行设定就可以.

bootm命令中地址参数,内核加载地址以及内核入口地址

bootm命令只能用来引导经过mkimage构建了镜像头的内核镜像文件以及根文件镜像,对于没有用mkimage对内核进行处理的话,那直接把内核下载到连接脚本中指定的加载地址0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag是由bootloader提供的,在u-boot下默认是由bootm命令建立的).   通过mkimage可以给内核镜像或根文件系统镜像加入一个用来记录镜像的各种信息的头.同样通过mkimage也可以将内核镜像进行一次压缩(指定-

Android中的动态加载机制的学习研究_Android

在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定