Windows XP 核心驱动 secdrv.sys 本地权限提升漏洞

    [晴 November 13, 2007 13:40 | by ]
Author:  Polymorphours
Email:   Polymorphours@whitecell.org
这个内核提权的0day发现有段日子了,据说最近被 Symantec 拣到并报给了 MS,
经内部讨论后决定把细节公布出来,本意是和大家共同探讨,一起学习提高。此漏洞
程序仅供学习使用,对滥用此漏洞所造成的危害,Whitecell 组织与本人概不负责。
特此声名。

   在分析 Windows 各个驱动程序的时候,无意间发现了一个漏洞,该漏洞可以让
任意用户提升到SYSTEM权限.该漏洞发生在驱动程序 secdrv.sys 的 IRP_MJ_DEVICE_CONTROL
理例程中,因为缺少必要的对必要的参数进行检查,导致可以写任意字节到任意核心内存,
导致D.o.S或者权限提升.下面是出现漏洞的代码分析片断:

DISPATCH处理函数


loc_11D60:                              ; DATA XREF: sub_11AA6+8Bo
.text:00011D60                 push    esi
.text:00011D61                 mov     esi, [esp+0Ch]
.text:00011D65                 push    edi
.text:00011D66                 xor     edi, edi
.text:00011D68                 mov     eax, [esi+60h]
.text:00011D6B                 and     dword ptr [esi+18h], 0
.text:00011D6F                 and     dword ptr [esi+1Ch], 0
.text:00011D73                 mov     al, [eax]
.text:00011D75                 test    al, al
.text:00011D77                 jz      short loc_11D85
.text:00011D77
.text:00011D79                 cmp     al, 0Eh
.text:00011D7B                 jnz     short loc_11D85
.text:00011D7B
.text:00011D7D                 push    esi
.text:00011D7E                 call    sub_11CD8 ;-> 处理IRP_MJ_DEVICE_CONTROL
.text:00011D7E
.text:00011D83                 mov     edi, eax
.text:00011D83
.text:00011D85
.text:00011D85 loc_11D85:                              ; CODE XREF: .text:00011D77j
.text:00011D85                                         ; .text:00011D7Bj
.text:00011D85                 xor     dl, dl
.text:00011D87                 mov     ecx, esi
.text:00011D89                 call    ds:IofCompleteRequest
.text:00011D8F                 mov     eax, edi
.text:00011D91                 pop     edi
.text:00011D92                 pop     esi
.text:00011D93                 retn    8



有问题的函数:


.text:00011CD8 sub_11CD8       proc near               ; CODE XREF: .text:00011D7Ep
.text:00011CD8
.text:00011CD8 arg_0           = dword ptr  8
.text:00011CD8
.text:00011CD8                 push    ebx
.text:00011CD9                 mov     ebx, [esp+arg_0]
.text:00011CDD                 push    ebp
.text:00011CDE                 push    esi
.text:00011CDF                 mov     eax, [ebx+60h]
.text:00011CE2                 push    edi
.text:00011CE3                 cmp     dword ptr [eax+0Ch], 0CA002813h
.text:00011CEA                 jz      short loc_11D07 ; -> 处理 0CA002813H 控制字
.text:00011CEA
.text:00011CEC                 mov     eax, dword_12364
.text:00011CF1                 xor     edi, edi
.text:00011CF3                 cmp     eax, edi
.text:00011CF5                 jnz     short loc_11CFE
.text:00011CF5
.text:00011CF7                 mov     eax, 0C0000010h
.text:00011CFC                 jmp     short loc_11D39
.text:00011CFC
.text:00011CFE ; ---------------------------------------------------------------------------
.text:00011CFE
.text:00011CFE loc_11CFE:                              ; CODE XREF: sub_11CD8+1Dj
.text:00011CFE                 lea     ecx, [ebx+18h]
.text:00011D01                 push    ecx
.text:00011D02                 push    ebx
.text:00011D03                 call    eax
.text:00011D05                 jmp     short loc_11D59
.text:00011D05
.text:00011D07 ; ---------------------------------------------------------------------------
.text:00011D07
.text:00011D07 loc_11D07:                              ; CODE XREF: sub_11CD8+12j
.text:00011D07                 xor     edi, edi
.text:00011D09                 mov     [ebx+18h], edi
.text:00011D0C                 mov     [ebx+1Ch], edi
.text:00011D0F                 mov     ebp, [eax+4]
.text:00011D12                 mov     esi, [eax+10h]
.text:00011D15                 cmp     [eax+8], ebp
.text:00011D18                 jnz     short loc_11D34
.text:00011D18
.text:00011D1A                 push    dword ptr [esi+0Ch]
.text:00011D1D                 lea     eax, [esi+10h]
.text:00011D20                 push    eax
.text:00011D21                 mov     eax, dword_12358
.text:00011D26                 push    eax
.text:00011D27                 push    dword ptr [esi+4]
.text:00011D2A                 push    dword ptr [esi]
.text:00011D2C                 call    dword ptr [eax+10h] ; -> 该函数中没有检查输入输出
.text:00011D2F                 cmp     eax, 0Ah
.text:00011D32                 jz      short loc_11D41     ; -> 如果函数返回 0Ah 那么进行拷贝
.text:00011D32
.text:00011D34
.text:00011D34 loc_11D34:                              ; CODE XREF: sub_11CD8+40j
.text:00011D34                 mov     eax, 0C0000001h
.text:00011D34
.text:00011D39
.text:00011D39 loc_11D39:                              ; CODE XREF: sub_11CD8+24j
.text:00011D39                 mov     [ebx+18h], eax
.text:00011D3C                 mov     [ebx+1Ch], edi
.text:00011D3F                 jmp     short loc_11D59
.text:00011D3F
.text:00011D41 ; ---------------------------------------------------------------------------
.text:00011D41
.text:00011D41 loc_11D41:                              ; CODE XREF: sub_11CD8+5Aj
.text:00011D41                 mov     edi, [ebx+3Ch]  ; -> 在此之前没有对UserBuffer进行检查,直接复制数据到UserBuffer
.text:00011D44                 mov     ecx, ebp
.text:00011D46                 mov     eax, ecx
.text:00011D48                 shr     ecx, 2
.text:00011D4B                 rep movsd
.text:00011D4D                 mov     ecx, eax
.text:00011D4F                 and     ecx, 3
.text:00011D52                 xor     eax, eax
.text:00011D54                 rep movsb
.text:00011D56                 mov     [ebx+1Ch], ebp
.text:00011D56
.text:00011D59
.text:00011D59 loc_11D59:                              ; CODE XREF: sub_11CD8+2Dj
.text:00011D59                                         ; sub_11CD8+67j
.text:00011D59                 pop     edi
.text:00011D5A                 pop     esi
.text:00011D5B                 pop     ebp
.text:00011D5C                 pop     ebx
.text:00011D5D                 retn    4
.text:00011D5D
.text:00011D5D sub_11CD8       endp


看完漏洞代码的片断后,我们知道这个漏洞其实非常好利用

利用方法1:

和之前的Symtdi.sys的提权漏洞一样,去 HOOK 一个不常用的系统调用,然后
我们自己出发系统调用,来使系统运行我们的特权代码

利用方法2:

由于没有写入的数据限制,我们可以直接在GDT中添加调用门,或者在 HOOK IDT
中的中断处理例程 (要注意多CPU的情况)
Bug&Exp | Comments(0) | Trackbacks(0) | Reads(8955)
Add a comment
Emots
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
Enable HTML
Enable UBB
Enable Emots
Hidden
Nickname   Password   Optional
Site URI   Email   [Register]
               

Security code Case insensitive