飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1934|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2024-6-9 16:20
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    发表于 2007-11-14 08:40:16 | 显示全部楼层 |阅读模式
    冷漠提供

        这个内核提权的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的情况)。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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