欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

CVE-2010-2734提权漏洞分析(附POC)

CVE-2010-2734提权漏洞分析(附POC)

这个漏洞是在分析Stuxnet途中发现的,但是应为当时微软没有发布补丁,所以没有第一时间贴出来,上周补丁已出,所以发出来和大家分享一下。

1 漏洞描述
这是一个提权漏洞,是没有正确处理Keyboard Layout文件导致的
CVE描述(CVE-2010-2743):
http://cve.mitre.org/cgi-bin/cvename...=CVE-2010-2743
微软公告(MS10-073) Microsoft Windows Win32K Keyboard Layout (981957)
http://www.microsoft.com/technet/sec...letin/ms10-073
我最早看到相关描述是在Symantec的Blog里:
http://www.symantec.com/connect/blog...ulnerabilities

2 keyboard layout文件
Keyboard Layout文件在注册表HKLM\SYSTEM\CURRENT CONTROL SET\CONTROL\KEYBOARD LAYOUTS下可以找到, 它们都是PE文件

Win32k! ReadLayoutFile函数负加载Keyboard layout文件,该函数会将layout文件中的信息读入内存中, 其中一个步骤是设置win32K.sys! gpKbdNlsTbl, 指向当前的NLSTable (这里的名字是我自己给的,不是官方名字)
Struct NLSTable{
…..
+0x4  dwNumEntries
+0x8  pNLSData
}
pNLSData是一个buffer, 每一个成员大小为0x84字节,所以总大小为dwNumEntries*0x84,里面的数据都来自keyboard layout文件。下面是一个keyboard layout文件的示例:这里dwNumEntries为一,pNLSData的起始为0x1C2

3 漏洞触发
当用户敲击键盘的某个键时,Win32k.sys里的xxxKENLSProcs会被调用,传入按键的扫描码,然后程序会查找前面的NLSTable里的每个成员(前面提到过,每个成员大小为0x84自节), 直到找到某个成员,该成员的第一个字节等于传入的扫描码,然后取该成员的第二个字节作为index来调用_aNLSVKFProc(一个函数数组)中的函数:

这里的问题在于,_aNLSVKFProc中只有三个有效的函数,因此我们可以构造一个特殊的keyboard layout文件,让这个函数call越界
 
比如,我们设计NLSTable里的一个成员,他的头俩个字节是 00 05, 然后发送一个扫描码为0的按键消息,于是_aNLSVKFProc[5] 会被调用,在我的机子上是0x60636261
接下来大家都知道怎么做了
keyboard layout.zip

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功