OD: Kernel Vulnerabilities Analyze
内核漏洞大多出没于 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的更多相关文章
- OD: Kernel Vulnerabilities
内核漏洞概述 内核漏洞的分类 运行在 Ring0 上的操作系统内核.设备驱动.第三方驱动能共享同一个虚拟地址空间,可以完全访问系统空间的所有内存,而不像用户态进程那样拥有独立私有的内存空间.由于内核程 ...
- OD: Vulnerabilities Analyze Skills
第五篇了,漏洞分析案例 漏洞利用的灵活程度让这门技术变得似乎没有什么原则可言,只有实践后总结提高才能挥洒自如. 漏洞分析方法 目标:弄清攻击原理.评估潜在利用方式及风险等级.扎实的漏洞利用技术是进行漏 ...
- OD: Kernel Exploit - 2 Programming
本节接前方,对 exploitme.sys 进行利用. exploitme.sys 存在任意地址写任意内容的内核漏洞,现在采用执行 Ring0 Shellcode 的方式进行利用. 获取 HalDis ...
- OD: Kernel Exploit - 1
第 22 章,内核漏洞利用技术 首先编写具有漏洞的驱动 exploitme.sys,再展开内核漏洞利用思路和方法: /***************************************** ...
- OD: ActiveX Vulnerabilities
通过一个精心构造的页面 exploit 第三方软件中的 ActiveX 已经成为一种惯用攻击手段,众多知名软件公司都曾被发现其注册的 ActiveX 中存在严重的缓冲区溢出漏洞,一个被广泛使用的第三方 ...
- OD: File Vulnerabilities & Protocols & Fuzz
IE.Office 等软件有个共同点,即用文件作为程序的主要输入,但攻击者往往会挑战程序员的假定和假设. 文件格式 Fuzz 就是利用畸形文件测试软件的稳健性,其流程一般包括: * 以一个正常文件作为 ...
- Windows Kernel Security Training Courses
http://www.codemachine.com/courses.html#kerdbg Windows Kernel Internals for Security Researchers Thi ...
- Topics
Topics Introduction (starting with old devices) How to handle a new Firmware How to set up your Mac ...
- iOS安全相关学习资料
https://github.com/zhengmin1989/iOS_ICE_AND_FIRE (冰与火代码) http://weibo.com/zhengmin1989?is_hot=1 (蒸米 ...
随机推荐
- QLineEdit
The QLineEdit widget is a one-line text editor. Header: #include <QLineEdit> qmake: QT += widg ...
- BZOJ 1049 数字序列
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个数 ...
- [Forward]Visual Guide: Setting up My Sites in SharePoint 2013
from http://blog.sharedove.com/adisjugo/index.php/2012/07/25/visual-guide-setting-up-my-sites-in-sh ...
- ios入门之c语言篇——基本函数——5——素数判断
参数返回值解析: 参数: m:int,需要判断的值: 返回值: 0:非素数 1:素数 函数解析: 注意:函数没有对输入进行判断,请自己屏蔽非法输入 int prime(int m) { int tem ...
- 程序员面试宝典题目重温-P1-100
int f(int x ,int y){ return (x&y) + ((x^y)>>1)} f(729,271)输出是什么? x&y表示按位与,结果是x,y相同位 ...
- Snowflake Snow Snowflakes(哈希,大素数取模)
Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 27277 Accepted: 7197 Description You ...
- 动态规划:NOI 2009 管道取珠
[NOI2009] 管道取珠 输入文件:ballb.in 输出文件:ballb.out 简单对比 时间限制:1 s 内存限制:512 MB #include <iostream> ...
- 图论 BZOJ 3669 [Noi2014]魔法森林
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
- 如何更改项目所使用的C#版本
- 《傲慢与偏见》(Pride and Prejudice)
<傲慢与偏见>(Pride and Prejudice)改编自英国作家简·奥斯汀的同名小说,1940年上映.讲述了19世纪初期英国的一个普通的中产家庭中五姐妹的爱情与择偶故事.片中因为男主 ...