内核漏洞大多出没于 ring3 到 ring0 的交互中。从 ring3 进入 ring0 的通道,以及操作系统提供的 API 都有可能存在漏洞。例如:驱动程序中 IoControl 的处理函数,SSDT 和 Shadow SSDT 中的系统服务函数(无论是否被 hook 都有可能存在漏洞),系统回调函数,内核钩子程序等。从漏洞数量来看,驱动程序中 IoControl 的处理函数中的漏洞最为多见,尤其是第三方的驱动程序。

本节对几种典型的内核漏洞,用几个真实的内核漏洞案例来详细分析。

远程拒绝服务内核漏洞

对 CVE-2009-3103 / 2009-09-08 Microsoft SMB2 SRV2.sys Remote DOS 36299 进行分析:实现 SMB v2 协议相关的 srv2.sys 没有正确处理包含畸形 SMB 头结构数据的 NEGOTIATE PROTOCOL REQUEST(客户发送给 SMB 服务器的第一个 SMB 查询,用于识别 SMB 语言并用于之后的通信)请求。如果远程攻击者在发送的 SMB 报文的 Process Id High 头字段中包含畸形数据,就会在 srv2.sys 驱动中的 _Smb2ValidateProviderCallback() 触发越界内存引用,导致内核态执行任意指令或发生系统崩溃。漏洞利用无须额外认证过程,只要系统开放了通常的文件共享打印服务并允许远端访问。

书中简单地介绍了下 SMB 数据报的结构,使用了 IDA 来进行分析。通常 SMB 运行于 TCP/IP 之上,其数据报总体结构如下,其它内容见原书。

IDA 载入文件后默认以反汇编的方式显式,不过 Hex-Rays 插件可以显示为 C 语言。安装完 Hex-Rays 后,用鼠标定位到要翻译的反汇编程序段,点击 View - Open Subviews - Pseudocode 或者 F5 即可将代码段用 C 语言显示出来。

本地拒绝服务内核漏洞

对 CVE-2010-1734 / 2010-04-22 Microsoft SfnINSTRING win32k.sys Local DOS 39631 进行分析:win32k.sys 模块在 DispatchMessage 时,会最后调用到 xxxDefWindowProc(),这个函数在处理某些消息时会调用 gapfnScSendMessage() 这个函数表中的函数来处理,其中 Windows 2000/xp/2003 在处理 0x18d 号消息时,会有一个名为 SfnINSTRING() 的函数,这个函数当 lParam 不为空时,直接认为 lParam 是内存指针,并直接从地址中取出数据。虽然使用了 SEH,但只要传递错误内核地址,就会引发系统崩溃。

缓冲区溢出内核漏洞

对 2009-07-31 ALWIL avast4.8.1335_Professionnal aswmon2.sys Local Buffer Overflow - Privilege Escalation 进行分析:aswmon2.sys 对驱动派遣例程的处理中,IoControlCode 为 0xB2C8000C 时,当两次调用这个 IoControl 处理函数后,会导致内存中的函数指针被覆盖成一个固定的 DWORD,该值为 0x57523C00,而这个地址的内存可以在用户态分配。

任意地址写任意数据内核漏洞

对 2010-01-23 Rising Antivirus_2008/2009/2010 RsNTGdi.sys 37951 进行分析:在对驱动派遣例程的处理中,switch 语句对 IoControlCode=0x83003C0B 的处理存在漏洞:首先检查 InputBufferLength 和 OutputBufferLength 是否都大于 4,如果是,则调用 VidSetTextColor(),并将 VidSetTextColor() 的返回值结果写入 UserBuffer,VidSetTextColor() 的参数是 *Type3InputBuffer,即用户态输入的 4 字节 UINT 值。VidSetTextColor() 由 bootvid.dll 导出,该函数会将输入的参数保存到一个全局变量中,并返回这个全局变量之前的值,而瑞星会将这个返回值写入到未验证的 irp->UserBuffer 中。

利用时,调用两次 DeviceIoControl()。第一次将要写入的值(*Type3InputBuffer)用这个 IoControlCode 写入到全局变量中;然后将 UserBuffer 设置为要写入数据的内核地址,再调用这个 IoControlCode,就可以把要输入的值(*Type3InputBuffer)写入到任意的内核地址了。

任意地址写固定数据内核漏洞

对 2009-07-30 Microsoft NtUserConsoleControl win32k.sys Local Privilege Escalation 进行分析。该内核漏洞存在于 XP sp2/sp3 的系统服务函数 NtUserControlControl 中,这个函数在 win32k.sys 中实现。用 IDA 反汇编 win32k.sys 并加载该模块的 PDB 符号文件,可以找到 NtUserConsoleControl()。

函数中通过 PsGetCurrentProcess() 获取当前进程的 PEPROCESS,和 csrss.exe 进程的 PEPROCESS 进行对比,如果不同,将返回值设置为 0XC0000022(STATUS_ACCESS_DENIED),表示访问被拒绝;如果相同,则继续调用 xxxConsoleControl(),参数就是 NtUserConsoleControl() 的前两个参数。

继续关注 xxxConsoleControl(),其对第一个对数 UNIT a1 的处理中,当 al==7 时,Object[3]=0 是将 Object 指向的句柄数组中的第 4 个句柄置 0,但整个过程没有对 Object 指针进行任何检查。也就是说,从 Ring3 传递进来的 Object 指针,经过该函数可以将 Object 指针执行的第 4 个句柄置 0.

OD: Kernel Vulnerabilities Analyze的更多相关文章

  1. OD: Kernel Vulnerabilities

    内核漏洞概述 内核漏洞的分类 运行在 Ring0 上的操作系统内核.设备驱动.第三方驱动能共享同一个虚拟地址空间,可以完全访问系统空间的所有内存,而不像用户态进程那样拥有独立私有的内存空间.由于内核程 ...

  2. OD: Vulnerabilities Analyze Skills

    第五篇了,漏洞分析案例 漏洞利用的灵活程度让这门技术变得似乎没有什么原则可言,只有实践后总结提高才能挥洒自如. 漏洞分析方法 目标:弄清攻击原理.评估潜在利用方式及风险等级.扎实的漏洞利用技术是进行漏 ...

  3. OD: Kernel Exploit - 2 Programming

    本节接前方,对 exploitme.sys 进行利用. exploitme.sys 存在任意地址写任意内容的内核漏洞,现在采用执行 Ring0 Shellcode 的方式进行利用. 获取 HalDis ...

  4. OD: Kernel Exploit - 1

    第 22 章,内核漏洞利用技术 首先编写具有漏洞的驱动 exploitme.sys,再展开内核漏洞利用思路和方法: /***************************************** ...

  5. OD: ActiveX Vulnerabilities

    通过一个精心构造的页面 exploit 第三方软件中的 ActiveX 已经成为一种惯用攻击手段,众多知名软件公司都曾被发现其注册的 ActiveX 中存在严重的缓冲区溢出漏洞,一个被广泛使用的第三方 ...

  6. OD: File Vulnerabilities & Protocols & Fuzz

    IE.Office 等软件有个共同点,即用文件作为程序的主要输入,但攻击者往往会挑战程序员的假定和假设. 文件格式 Fuzz 就是利用畸形文件测试软件的稳健性,其流程一般包括: * 以一个正常文件作为 ...

  7. Windows Kernel Security Training Courses

    http://www.codemachine.com/courses.html#kerdbg Windows Kernel Internals for Security Researchers Thi ...

  8. Topics

    Topics Introduction (starting with old devices) How to handle a new Firmware How to set up your Mac ...

  9. iOS安全相关学习资料

    https://github.com/zhengmin1989/iOS_ICE_AND_FIRE  (冰与火代码) http://weibo.com/zhengmin1989?is_hot=1 (蒸米 ...

随机推荐

  1. 写个自己的Xcode4插件(二)

    补充上一篇: 一.在XCode5里面,要在info.plist里面再加入以下两个字段: 1. 内容要保持一致喔,别问我为什么,我也不知道,是参考其他许多插件发现的,那些插件都用了这个字段,而且内容一样 ...

  2. 关于org.openqa.selenium.ElementNotVisibleException

    最近在使用Selenium,编写最简单的百度search脚本,结果使用name来定位元素抛出了如下exception: 在定位百度的输入框,使用By.name()定位失败,但是使用By.id()和By ...

  3. ExtJS 4 树

    Tree Panel是ExtJS中最多能的组件之一,它非常适合用于展示分层的数据.Tree Panel和Grid Panel继承自相同的基类,所以所有从Grid Panel能获得到的特性.扩展.插件等 ...

  4. 2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果

    原文:2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果 相信刚入门的菜鸟跟我一样找遍了百度谷歌解决最大化遮挡任务栏的方法大多方法都是HOOK一大堆API声明 最近在敲代码的时候无意中发现有 ...

  5. 浅谈RDD

    RDD(Resilient Distributed Datasets)弹性分布式数据集,是在集群应用中分享数据的一种高效,通用,容错的抽象,是Spark提供的最重要的抽象的概念, 它是一种有容错机制 ...

  6. ArrayList LinkedList Vector

    ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...

  7. 使用next-key locks 用于搜索和索引扫描,可以防止幻读

    Next-Key Locks A next-key lock is a combination of a record lock on the index record and a gap lock ...

  8. C++ Primer 随笔 Chapter 2 变量和基本类型

    2.1C++内置类型 C++ 算术类型 类型 含义 最小存储空间(随机器不同而不同) bool 布尔型 --- char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 i ...

  9. bzoj3339 bzoj3585

    两题本质是一样,只不过3585要离散化这种不修改,不强制的问题,显然先考虑离线算法这道题的思路和bzoj1878非常像考虑到如果只是求每个前缀的mex,我们是很容易扫一遍就得出来的我们设为这个位置的m ...

  10. kafka在zookeeper中的存储结构

    参考site:http://kafka.apache.org/documentation.html#impl_zookeeper 1.zookeeper客户端相关命令 在确保zookeeper服务启动 ...