博威---云架构决胜云计算

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2878|回复: 3

windows最新0day 本地提权 通杀所有版本XP 2K 2K3 2K8 VISTA WIN7

[复制链接]
发表于 2010-2-4 11:23:50 | 显示全部楼层 |阅读模式
谷歌工程师首发:windows最新0day 本地提谷歌果然卧虎藏龙,存在17年的漏洞编译至今通杀
测试英文版系统user提权没问题
中文有的会蓝屏 有的直接提权

此漏洞导致大部分系统可以提权,目前还没出补丁,及时利用吧。
windows最新0day 通杀所有版本
通杀 XP  2K 2K3 2K8 VISTA WIN7
用法:以普通用户登录windows
执行exp 弹出一个cmdshell  这个shell即为 system权限的
请各位系统管理员注意

漏洞利用动画
win_0day[1].mp4 (3.42 MB, 下载次数: 1, 售价: 10 金钱)

漏洞利用工具
tnJgQoRBog.zip (319.8 KB, 下载次数: 2, 售价: 10 金钱)

这个漏洞发生于内核处理VDM(Virtual DOS Maching)的过程中。VDM是微软为了兼容老式的16位MS-DOS程序而存在于Windows中的一个子系统,运行于V86模式下,模拟16位实模式环境。它由三个主要部分组成:
1、提供DOS环境模拟的代码,包括在系统目录下的ntdos*.sys和ntio*.sys等文件,并向虚拟机监控进程提交请求;
2、一个是在用户态的虚拟机监控进程ntvdm.exe,负责处理虚拟机里的绝大多数事件;
3、一个是内核(ntoskrnl.exe)中的部分,包括由控制进程调用的系统调用接口NtVdmControl及下层具体实现功能代码,负责DOS程序的初始化、执行、查询和延迟中断、查询文件等。和两个异常处理程序:第0x6号无效操作码异常处理程序和第0xd号一般保护错误异常处理程序,前者负责响应DOS环境模拟代码的请求并分派到监控进程中,后者处理DOS程序中的直接IN/OUT的IO,并分派到控制进程中。但有少数例外,就是DOS模拟代码提交的FastRead和FastWrite请求并不分派到控制进程中,而是由内核直接完成。
      IOPL, I/O Privilege Level,指定了当前哪个权限级别可以执行特权指令,默认为0,也就是RING0才能执行特权指令。在V86下的特权指令完全与保护模式下的特权指令完全不同,它包括:CLI、 STI、 PUSHF、 POPF、 INT n和IRET,在运因为行V86模式时CPL总是为3,所以当IOPL小于3时,执行了以上任何一条特权指令都会引发第0xd号一般保护性异常,Windows相关异常处理程序是KiTrap0D。
      监控进程ntvdm.exe通过调用NtVdmControl(VdmInitialize, pServiceData)来初始化虚拟机,在内部会最终调用VdmpInitialize函数,包括将物理内存的第一个页包含实模式下的代码拷贝到虚拟地址空间中的第一个页、映射BIOS代码、初始化VdmObject结构等。
      漏洞发生于如果在系统调用VdmpIntialize之前就通过执行ZwContinue函数切换进V86模式,因为还没有调用 VdmpInitialize函数,这时监控进程ntvdm.exe的EPROCESS结构中对应的VdmObject为0。如果事先分配了从0开始的地址,就可以控制VdmTib指针为任意地址,里面包含了两个CONTEXT结构,一个CONTEXT结构保存V86模式下的环境,在 VdmTib+0xcd0处;一个CONTEXT结构保存监控进程ntvdm.exe主线程的环境,在VdmTib+0xa04处。 VdmSwapContexts函数中会把当前V86环境保存到VdmTib+0xcd0的CONTEXT结构里,并把VdmTib+0xa04的 CONTEXT结构的数据复制到堆栈中的TRAP_FRAME结构里,准备返回KiTrap0D后恢复为该环境。因为V86环境是由我们控制的,且 VdmTib可以指向任意地址,所以可以向任意地址写入内容。
      通过调用ZwAllocateVirtualMemory系统调用(调用VirtualAllocEx函数则不行)可以分配从0开始的虚拟内存,虽然不可能直接指定从0开始分配,但可以设置BaseAddress为0到4095之间任何一个地址,就会按页对齐分配从0开始的内存,且 AllocationType必须为MEM_COMMIT(而不是往常的MEM_COMMIT | MEM_RESERVE)。
      用来引发一般保护性异常的特权指令我选择了sti,系统对这个指令的处理过程相对简单点,又能达到我们目的。不过要让这个指令在V86模式下触发一般保护性异常,除了要设置EFLAGS里的VM位外还要设置VIP位。还有处理过程要注意VdmFixedStateLinear,该变量保存了一些有关 VDM的状态,具体地址在0x1000以内,也就是第一个页里。
      
      虽然可以覆盖任意地址,但是因为会把VdmTib+0xa04的CONTEXT结构的数据复制到堆栈中的TRAP_FRAME结构里并最后返回到该环境,且VdmTib+0xa04的CONTEXT结构是我们所无法控制的,所以这样的复制是非常脆弱的,应当尽可能减少复制的次数。且因为 VdmSwapContexts实际上只会复制CONTEXT结构中的一部分,不可能做到大数据量的复制。由以上两点限制,选择HOOK内核中一个正常情况下系统不会调用的系统调用函数如NtVdmControl并触发个不会引起系统崩溃的异常来返回,这个返回可以利用前面复制到TRAP_FRAME的那个VdmTib+0xa04的CONTEXT结构,只要保证TRAP_FRAME里的EFlags置位了VM位,也就是0x20000,就能让系统在 KiServiceExit返回用户态时产生异常(因为CS、EIP全是非正常值)自动终止ntvdm.exe并恢复正常执行。只用复制几个字节,让该函数跳到一个用户态地址(也就是exploit进程里的提权代码的地址),然后回到exploit进程里执行该系统调用,既可在RING0权限下执行用户态提权代码。提权代码需要把前面被HOOK的函数恢复回原来的代码,以恢复系统的正常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|boway Inc. ( 冀ICP备10011147号 )

GMT+8, 2024-11-22 10:14 , Processed in 0.129032 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表