科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道XP核心驱动本地权限提升漏洞

XP核心驱动本地权限提升漏洞

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

和之前的Symtdi.sys的提权漏洞一样,去HOOK一个不常用的系统调用,然后我们自己出发系统调用,来使系统运行我们的特权代码。我们可以直接在GDT中添加调用门,或者在HOOK IDT中的中断处理例程。

作者:安全中国 2007年10月29日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

  Windows XP 核心驱动 secdrv.sys 本地权限提升漏洞,这个内核提权的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的情况)。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章