Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
NotSecDrv — 一个针对CVE-2018-7249的PoC | Kitploit
工具/GitHubGitHub/alonhr/notsecdrv
内存取证漏洞分析漏洞利用逆向工程学习与教育二进制利用
GitHubalonhr/notsecdrv

NotSecDrv

一个针对CVE-2018-7249的PoC

查看仓库
1531年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

NotSecDrv - CVE-2018-7249 的概念验证代码

概述

在 Microsoft Windows Vista、Windows 7、Windows 8 和 Windows 8.1(KB3086255 之前的版本)以及 Macrovision SafeDisc 所附带的 secdrv.sys 驱动程序中,发现了一个问题。两次精确计时的 IOCTL 0xCA002813 调用可导致竞争条件,进而引发释放后使用。成功利用此漏洞后,非特权攻击者可在内核中执行任意代码。

该漏洞已报告给 Microsoft,由于它不影响已更新至最新版本的 Windows 系统(仅影响 KB3086255 之前的版本),因此 Microsoft 不会采取任何措施。已在 Windows 7 x86 上成功测试和利用。

另请参见 CVE-2018-7250。

截图

Alt text

详细信息

本文记录了我对 secdrv.sys 驱动程序的一些小研究。所有描述的行为均来自逆向分析,可能不正确或不准确。

IOCTL(0x0CA002813)输入缓冲区偏移量 0x4 处包含一个数字,我将其称为 TYPE。 该 IOCTL(0x0CA002813)的主处理函数 sub_11A88 接收三种不同的类型:0x96、0x97 和 0x98。

  • 0x96 分配一个 PagedPool 块,将其存储在一个大小为 0x64 的数组中,对其进行初始化(某种程度上 :)),并将其一部分复制到用户提供的缓冲区的偏移量 0x10 处。
  • 0x97 使用先前通过 0x96 分配的块(它通过标签在提到的数组中查找正确的块),并使用某种修改后的异或加密例程对用户输入缓冲区进行加密。然后调用另一个结构中存储的函数,该结构由分配块中的某个字段指向。
  • 0x98 释放通过 0x96 分配的块。它通过搜索分配过程中给定的标签来查找正确的块。

信息泄露 (CVE-2018-7250)

在 IOCTL 类型 0x96 分配一个新块并对其进行初始化(但未完全完成)后,它会将该块复制到用户模式。新分配的块中有 16 位未被初始化,包含先前 PagedPool 分配的数据。未初始化的位随后通过 REP MOVSD 指令在 .text:00011BE9 处复制到用户模式。PoC 代码在此处。

任意代码执行 (CVE-2018-7249)

当调用 IOCTL 类型 0x97 时,它会根据标签查找先前通过类型 0x96 分配的所需块。如果该分配已被 IOCTL 类型 0x97 释放,DeviceIoControl 将返回错误。此处的漏洞在于,类型 0x97 所使用的分配在其操作期间(因为未使用同步机制)可以被释放,因此如果赢得竞争条件,就会导致释放后使用。 如果攻击者设法在 IOCTL 类型 0x97 的操作期间(使用类型 0x98)释放该块,并在完全相同的内存位置分配一个攻击者控制的新块,那么他可以覆盖指向另一个结构的指针,该结构包含一个函数指针,最终可用于劫持驱动程序执行流并在 ring 0 中执行任意代码。 由于加密例程是在用户提供的缓冲区上执行的,该缓冲区可能非常大,因此加密执行可能需要很长时间,从而为 IOCTL 类型 0x98 释放仍在使用中的块提供了完美的时机。这个时间窗口可能非常长(超过 1 秒!),以至于竞争条件可以在首次尝试时可靠地获胜。释放后使用从 .text:00011B68 开始,实际被劫持以跳转到 shellcode 的调用发生在 .text:00011B86。

成功利用此漏洞的步骤如下:

  • 释放之前使用我们计划稍后使用的标签分配的所有块,确保所有 IOCTL 都在同一个 PagedPool 块上操作。
  • 喷射 PagedPool 并创建与 IOCTL 类型 0x96 分配大小(0x30 字节)匹配的空洞。这是为了稍后能够可靠地分配一个假的替换块来替换被释放的块。
  • 使用 IOCTL 类型 0x96 分配一个块。该块将被分配到之前创建的一个空洞中。
  • 分配一大片用户空间内存并调用 IOCTL 类型 0x97。这片大内存区域将确保释放该分配的线程有足够的时间赢得竞争条件。
  • 启动一个新线程,该线程将调用 IOCTL 类型 0x98 并释放另一个线程正在操作的块。
  • 在新线程中再次喷射池(在块被释放之后),以便用攻击者控制的分配替换被释放的块。这个假块应包含指向必要结构的有效指针。
  • 将 shellcode 的地址放在我们创建的假结构中函数指针的正确偏移处,然后等待它被调用(它将在 IOCTL 类型 0x97 完成加密后被调用)。
  • 享受吧!

测试环境

操作系统: Windows 7 Kernel Version 7600 MP (1 procs) Free x86 compatible Built by: 7600.16385.x86fre.win7_rtm.090713-1255 虚拟机: 4GB RAM, 1 CPU 硬件: Windows 10 Pro 64位,主板 Gigabyte Z370 HD3,16GB RAM,Intel i5-8400 2.80GHz (6 CPUs)

下载工具