内核漏洞大多出没于 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. ASP.NET MVC轻教程 Step By Step 3 ——使用ViewBag

    在上一节我们创建了与Index动作方法对应的Index视图,那么Index动作方法该如何向Index视图传送数据呢?其中一个方法是使用ViewBag(视图包).让我们试试看. 在Index动作方法中添 ...

  2. /proc/sys/net/ipv4/ip_forward

    ip地址分公有地址和私有地址,public address是由INIC(internet network information center)负责,这些ip地址分配给注册并向INIC提出申请的组织机 ...

  3. 《30天自制操作系统》读书笔记(5) GDT&IDT

    梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas    InitialProgramLo ...

  4. 3、MyBatis.Net学习笔记之增删改

    增删改之前先说一下笔记1里提到的一个无法创建ISqlMapper对象的问题. <resultMaps> <resultMap id="FullResultMap" ...

  5. Java版将EXCEL表数据导入到数据库中

    1.采用第三方控件JXL实现 try { //实例化一个工作簿对象 Workbook workBook=Workbook.getWorkbook(new File("F://qzlx.xls ...

  6. 转:Lua简明教程

    需要注意的是:lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里. 这里很奇怪,为什么在函数内部声明的变量默认也是global的呢? 函数的返回值 和Go语言一样,可以一条语句上赋多 ...

  7. mysql处理字符串的两个绝招:substring_index,concat

    mysql处理字符串的两个绝招:substring_index,concat 最近老是碰到要处理数据库中字符串的处理,发现用来用去也就是这两个函数: 1.substring_index(str,del ...

  8. nginx 1.3.9/1.4.0 x86 Brute Force Remote Exploit

    测试方法: 本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! #nginx 1.3.9/1.4.0 x86 brute force remote exploit # copyri ...

  9. 禁用页面及页面所有frame内的右键菜单

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML> <HEAD& ...

  10. HDOJ(HDU) 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你

    Problem Description 当抢救人员发现她的时候,她已经死了,是被垮塌下来的房子压死的,透过那一堆废墟的的间隙可以看到她死亡的姿势,双膝跪着,整个上身向前匍匐着,双手扶着地支撑着身体,有 ...