Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 1 Octubre 2015, 10:01 am



Título: Clientes/servidores y threads
Publicado por: Kaxperday en 1 Octubre 2015, 10:01 am
Hola, tengo un problema con el MITM, cuando las victimas se van a conectar a mi servidor el servidor recibe la respuesta y reenvia la petición al servidor destino a través de un send(), luego recibe la respuesta de ese servidor y la reenvía la víctima tal cual.

El problema es que cuando haya 30 víctimas ¿como tendré que programar esto?, ¿tendría que crear un subproceso para cada cliente conectado al servidor? ¿sería viable? ¿alguna otra posible solución?.

Os dejo el code, que cambiaríais??.

Código
  1. while (*on_mitm){
  2.  
  3. int victima;
  4. sockaddr_in addr;
  5. addr.sin_family = AF_INET;
  6. int len = sizeof(addr);
  7.  
  8. if ((victima = accept(servidor, (struct sockaddr*)&addr, &len)) == INVALID_SOCKET){
  9. closesocket(victima);
  10. Sleep(100);
  11. continue;
  12. }
  13. else{
  14. cout << "conectadoo";
  15. setsockopt(victima, SOL_SOCKET, SO_RCVTIMEO, (char*)&tiempo_espera, sizeof(timeval));
  16. setsockopt(victima, SOL_SOCKET, SO_SNDTIMEO, (char*)&tiempo_espera, sizeof(timeval));
  17.  
  18. u_char *ip_victima = new u_char[4]();
  19. u_long num_victima = inet_addr(inet_ntoa(addr.sin_addr));
  20.  
  21. if (num_victima == INADDR_NONE){
  22. closesocket(victima);
  23. Sleep(100);
  24. break;
  25. }
  26.  
  27. ip_victima = (u_char*)&num_victima;//busco en la lista ultima.
  28.  
  29. string respuesta;
  30. char *bloque = new char[3000]();
  31. setsockopt(victima, SOL_SOCKET, SO_RCVTIMEO, (char*)&tiempo_espera, sizeof(timeval));
  32. while (int res = recv(victima, bloque, 3000, 0) > 0)
  33. respuesta += string(bloque);
  34.  
  35. cout << "recibido";
  36. if (respuesta.length() == 0){
  37. closesocket(victima);
  38. Sleep(100);
  39. break;
  40. }
  41.  
  42. int cliente;
  43. sockaddr_in cli_local;
  44.  
  45. cout << respuesta << endl;
  46. respuesta = eliminar_encoding(respuesta, true);
  47. cout << respuesta << endl;
  48.  
  49. if ((cliente = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){
  50. cout << "falla socket" << GetLastError();
  51. Sleep(REINTENTAR_PROXY * 1000);
  52. continue;
  53. }
  54.  
  55. cli_local.sin_family = AF_INET;
  56. cli_local.sin_port = htons(80);
  57. cli_local.sin_addr.s_addr = inet_addr("217.160.43.9");
  58.  
  59. if (connect(cliente, (struct sockaddr*)&cli_local, sizeof(cli_local)) == SOCKET_ERROR){
  60. cout << "error conectar" << GetLastError();
  61. closesocket(cliente);
  62. }
  63. else{
  64. if (send(cliente, respuesta.c_str(), respuesta.length(), 0) == SOCKET_ERROR){
  65. cout << "error enviar" << GetLastError();
  66. closesocket(cliente);
  67. }
  68. else{
  69. respuesta = "";
  70. while (recv(cliente, bloque, 3000, 0) > 0)
  71. respuesta += string(bloque);
  72.  
  73. if (respuesta.length() == 0){
  74. closesocket(cliente);
  75. closesocket(victima);
  76. Sleep(100);
  77. break;
  78. }
  79.  
  80. cout << "respuesta server: " << respuesta << endl;
  81. respuesta = eliminar_encoding(respuesta, false);
  82. cout << respuesta << endl;
  83.  
  84. if (send(victima, respuesta.c_str(), respuesta.length(), 0) == SOCKET_ERROR)
  85. cout << "fallo reenvio a cliente " << GetLastError();
  86. else
  87. cout << "se envio al cliente";
  88. }
  89. }
  90. }
  91. Sleep(100);
  92. }

Saludos.


Título: Re: Clientes/servidores y threads
Publicado por: ivancea96 en 1 Octubre 2015, 10:24 am
Está bien un socket por por thread. Mientras los controles, jaja.


Título: Re: Clientes/servidores y threads
Publicado por: Kaxperday en 1 Octubre 2015, 11:13 am
Jajaja la muerte.

Código
  1. if ((victima = accept(servidor, (struct sockaddr*)&addr, &len)) == INVALID_SOCKET){
  2. closesocket(victima);
  3. Sleep(100);
  4. continue;
  5. }

Despues de esto (la conexión) podría abrir un thread pasando el socket "victima", y que interactue con el. Y haga lo demás que hay en el bucle en el otro thread.

Luego al acabar el proceso ese thread moriría.

También para colmo tengo que ir a la lista (con el ** mutex) y obtener el ultimo dominio que redirigí al usuario pues cuando llega la petición al server y la voy a reenviar no tengo ni la ip destino correcta ni el dominio en el paquete, luego... tengo que pasarselo de la lista, muchos subthreads, muchos mutex, muerte y destrucción jajaja.

Cada vez lo veo menos viable, pero no se me ocurre otra manera de reestructurarlo.

Saludos.


Título: Re: Clientes/servidores y threads
Publicado por: ivancea96 en 1 Octubre 2015, 15:56 pm
Un ordenador puede con muchos threads y muchos sockets, no temas.
Además, lo llaman programación estructurada y programación orientada a objetos. Son dos paradgimas que te ayudarán mucho a cumplir tu tarea.