Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: Grado 33 en 21 Agosto 2017, 18:35 pm



Título: C++ Winsockets como reconectar un cliente al server
Publicado por: Grado 33 en 21 Agosto 2017, 18:35 pm
Muy buenas, he estado aprendiendo algo de sockets en windows, y trasteando, me he dado cuenta de como podría hacer un RAT (remote administration tool) a base de comandos.

Pero, me gustaría saber como puedo hacer que el CLIENTE, estando conectado al servidor, detecte si el servidor de repente ha cortado la comunicación con el cliente (bien porque yo haya manualmente cerrado el servidor, o por ejemplo porque apague el PC), y de ser así, que el cliente intente RECONECTARSE al servidor hasta que lo consiga.

Se me ha ocurrido hacer un thread que, en paralelo al main, haga una especie de ping y si el servidor no responde, el cliente intenta reconectarse al servidor tras un sleep o el intervalo de tiempo que sea. El "problema", es que no se como hacer ese ping (olvidense de system ping) o si hay otra manera de hacerlo más eficiente...

perdonad si la pregunta es muy obvia, muchas gracias...


Título: Re: C++ Winsockets como reconectar un cliente al server
Publicado por: Yuki en 21 Agosto 2017, 22:44 pm
Ese es uno de los problemas mas generales al usar sockets, en Windows cuando un socket se cierra por lo general se puede detectar de varias maneras, como por ejemplo cuando se deja de recibir datos de una conexión o estos son inválidos.

Si estas usando un lenguaje de alto nivel (como VB.NET, C#, Java, Python) podrías llegar a encontrar un evento especifico para este trabajo (socket_close).

Y por tu mensaje puedo entender que estas escribiendo un RAT de conexión directa, te recomendaría hacerlo de conexión inversa, pero cada quien con sus gustos.

También te dejo un poco de información extra (https://stackoverflow.com/questions/283375/detecting-tcp-client-disconnect).


Título: Re: C++ Winsockets como reconectar un cliente al server
Publicado por: Grado 33 en 21 Agosto 2017, 23:11 pm
Estoy en C++ compilando con Dev C++, y estoy haciendo uno de conexion inversa... (o eso creo lol)
ahora miro el link y te comento, gracias


Título: Re: C++ Winsockets como reconectar un cliente al server
Publicado por: fary en 22 Agosto 2017, 21:36 pm
Aquí te dejo un pequeño escrito de E0N, seguramente te servirá de ayuda.

http://foro.elhacker.net/analisis_y_diseno_de_malware/creando_un_troyano_en_vb6_c-t177919.0.html

Código sacado del enlace que te eh adjuntado:

Código
  1. while (len!=0) //Mientras que permanezcamoos conectados
  2.   {
  3.      len = recv(sock,Buffer,1023,0); //Recibimos los datos que envie
  4.  
  5.      if (len>0)  //Si seguimos conectados...
  6.  {
  7.  
  8. Buffer[len]=0; //Ponemos los datos recibidos al final de la cadena
  9.  
  10.            //Aki hay q poner el conjunto de if's para las acciones
  11.  
  12.          }
  13.    }

saludos.


Título: Re: C++ Winsockets como reconectar un cliente al server
Publicado por: Grado 33 en 26 Agosto 2017, 03:22 am
Código
  1.  
  2.  
  3. int recv_size;
  4.  
  5.  
  6.  
  7.  
  8.      while(1)
  9.     {
  10.     comando = 0;
  11.    //Recibir respuesta del servidor
  12.    if((recv_size = recv(s , (char*)&comando , sizeof(int) , 0)) == SOCKET_ERROR)
  13.    {
  14.        puts("recv fail, reconectando");
  15.        closesocket(s);
  16.        if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
  17.    {
  18.        printf("No se pudo crear el socket : %d" , WSAGetLastError());
  19.    }
  20.         while (connect(s , (struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
  21.    {
  22.        puts("Conexion fallida. Reconectando");
  23.        closesocket(s);
  24.        if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
  25.        connect(s , (struct sockaddr *)&server , sizeof(server));
  26.        Sleep(3000);
  27.  
  28.    }
  29.    }
  30.     else
  31.    {
  32.    puts("Comando recibido\n");
  33.    }  
  34.  
  35.  
  36.    std::cout << comando;
  37.  
  38.    switch(comando)
  39.    {
  40.  
  41.    case 1: funcion();
  42.    break;
  43.    case 2: funcion2();
  44. //etc...
  45.    break;
  46.    default: break;
  47.    }
  48. }



Que les parece... esto me ha servido


Título: Re: C++ Winsockets como reconectar un cliente al server
Publicado por: Yuki en 26 Agosto 2017, 03:44 am
Lo ideal seria (en Cramel):

Código
  1. Var hSock:Entero
  2. Repetir
  3.    hSock = TCPConectar("ip/host",666)
  4.    Si hSock Entonces
  5.        Repetir
  6.            Var Datos:Cadena
  7.            Datos = TCPRecibir(hSock,1024)
  8.            Seleccionar Datos
  9.                Caso "mostrar mensaje"
  10.                    Mensaje("Se ha recibido un mensaje del cliente!")
  11.                Caso Otro ' Si los datos son equivocados o nulos salimos del bucle.
  12.                   TCPDesconectar(hSock) ' Cerramos por si las moscas...
  13.                   Salir Repetir
  14.             FinSeleccionar
  15.        PorSiempre
  16.    FinSi
  17. PorSiempre

Creo que es obvio, pero por si no se entendió, intentamos conectar desde un bucle infinito, si se conectó recibimos datos hasta que estos sean equivocados o nulos, si esto ultimo sucede, salimos del segundo bucle y se intentará conectar automáticamente.

De esta manera no vas a necesitar que el cliente este enviando o verificando si el servidor sigue vivo ya que el estado es absoluto.


Título: Re: C++ Winsockets como reconectar un cliente al server
Publicado por: Grado 33 en 26 Agosto 2017, 04:13 am
Puedes comentar mi codigo??


Título: Re: C++ Winsockets como reconectar un cliente al server
Publicado por: Grado 33 en 26 Agosto 2017, 04:15 am
Lo ideal seria (en Cramel):

Código
  1. Var hSock:Entero
  2. Repetir
  3.    hSock = TCPConectar("ip/host",666)
  4.    Si hSock Entonces
  5.        Repetir
  6.            Var Datos:Cadena
  7.            Datos = TCPRecibir(hSock,1024)
  8.            Seleccionar Datos
  9.                Caso "mostrar mensaje"
  10.                    Mensaje("Se ha recibido un mensaje del cliente!")
  11.                Caso Otro ' Si los datos son equivocados o nulos salimos del bucle.
  12.                   TCPDesconectar(hSock) ' Cerramos por si las moscas...
  13.                   Salir Repetir
  14.             FinSeleccionar
  15.        PorSiempre
  16.    FinSi
  17. PorSiempre

Creo que es obvio, pero por si no se entendió, intentamos conectar desde un bucle infinito, si se conectó recibimos datos hasta que estos sean equivocados o nulos, si esto ultimo sucede, salimos del segundo bucle y se intentará conectar automáticamente.

De esta manera no vas a necesitar que el cliente este enviando o verificando si el servidor sigue vivo ya que el estado es absoluto.

Oye y los troyanos son """"simplemente"""" eso?? enviar un comando, que no es mas que un numero o una string (en definitiva un dato/variable) y dependiendo de cual sea, el cliente ejecuta una acción u otra??


Título: Re: C++ Winsockets como reconectar un cliente al server
Publicado por: dapz en 28 Agosto 2017, 16:33 pm
Oye y los troyanos son """"simplemente"""" eso?? enviar un comando, que no es mas que un numero o una string (en definitiva un dato/variable) y dependiendo de cual sea, el cliente ejecuta una acción u otra??

a muy grosso modo si, son eso, una aplicación cliente-servidor. Sin embargo hoy en día las cosas no son tan simples. El cliente del troyano tiene que esconderse por razones obvias. Tiene que esconder llaves del registro, archivos, procesos etc, y eso se consigue con dlls que al fin y al cabo son una forma de ejecutable, necesarios para hacer hooks en windows