Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: _TTFH_3500 en 11 Febrero 2020, 17:39 pm



Título: Ayuda con HTML Proxy en C
Publicado por: _TTFH_3500 en 11 Febrero 2020, 17:39 pm
Supongamos que tengo una página web en un servidor Apache corriendo en 192.168.1.1:80 y quiero acceder a él desde 127.0.0.1:8080 (las ip y puertos son solo de ejemplo).

El siguiente programa me muestra la página pero las imágenes no cargan, tampoco puedo hacer login. No se que es lo que tengo mal.

Código
  1. // g++ -Wall -Werror tcp_proxy.cpp -o tcp_proxy -lpthread -lws2_32
  2.  
  3. #include <ctype.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <pthread.h>
  9. #include <winsock2.h>
  10. #include <ws2tcpip.h>
  11.  
  12. #define Localhost "127.0.0.1"
  13. #define ProxyPort 8080
  14. #define HTTP_Server "192.168.1.1"
  15. #define HTTP_Port "80"
  16.  
  17. #define MaxUsersQueue 10
  18. #define MaxMsgSize 2048
  19.  
  20. struct sockets {
  21. int source;
  22. int dest;
  23. };
  24.  
  25. void* conectarProxy(void*);
  26. void* pushData(void*);
  27.  
  28. int main(int argc, char* argv[]) {
  29. WSADATA wsaData;
  30. WSAStartup(MAKEWORD(2, 2), &wsaData);
  31.  
  32. int proxy_socket = socket(AF_INET, SOCK_STREAM, 0);
  33.  
  34. sockaddr_in server_addr;
  35. server_addr.sin_family = AF_INET;
  36. server_addr.sin_addr.s_addr = inet_addr(Localhost);
  37. if (argc < 2)
  38. server_addr.sin_port = htons(ProxyPort);
  39. else // Usar puerto pasado desde la terminal
  40. server_addr.sin_port = htons(atoi(argv[1]));
  41.  
  42. int server_addr_size = sizeof(server_addr);
  43. bind(proxy_socket, (sockaddr*) &server_addr, server_addr_size);
  44.  
  45. listen(proxy_socket, MaxUsersQueue);
  46.  
  47. while (true) {
  48. sockaddr_in client_addr;
  49. int client_addr_size = sizeof(client_addr);
  50. int socket_client = accept(proxy_socket, (sockaddr*) &client_addr, &client_addr_size);
  51.  
  52. pthread_t hilo_conectarProxy;
  53. pthread_create(&hilo_conectarProxy, NULL, conectarProxy, &socket_client);
  54. }
  55. close(proxy_socket);
  56. return 0;
  57. }
  58.  
  59. void* conectarProxy(void* sc_param) {
  60. int socket_client = *((int*)sc_param);
  61.  
  62. int httpServerSock = socket(AF_INET, SOCK_STREAM, 0);
  63. addrinfo hints;
  64. memset(&hints, 0, sizeof(hints));
  65. hints.ai_family = AF_INET;
  66. hints.ai_socktype = SOCK_STREAM;
  67. addrinfo* res;
  68. getaddrinfo(HTTP_Server, HTTP_Port, &hints, &res);
  69. connect(httpServerSock, res->ai_addr, res->ai_addrlen);
  70. freeaddrinfo(res);
  71.  
  72. sockets* cliente_proxy = new sockets{socket_client, httpServerSock};
  73. pthread_t hilo_cliente_proxy;
  74. pthread_create(&hilo_cliente_proxy, NULL, pushData, cliente_proxy);
  75.  
  76. sockets* proxy_cliente = new sockets{httpServerSock, socket_client};
  77. pthread_t hilo_proxy_cliente;
  78. pthread_create(&hilo_proxy_cliente, NULL, pushData, proxy_cliente);
  79.  
  80. pthread_join(hilo_cliente_proxy, NULL);
  81. pthread_join(hilo_proxy_cliente, NULL);
  82. return NULL;
  83. }
  84.  
  85. void* pushData(void* args) {
  86. sockets* src_dst = (sockets*)args;
  87. int src = src_dst->source;
  88. int dst = src_dst->dest;
  89. char* data = new char[MaxMsgSize];
  90. char buffer[MaxMsgSize];
  91. while (true) {
  92. strcpy(data, "");
  93. strcpy(buffer, "");
  94. int msg_size = 0;
  95. do {
  96. msg_size += recv(src, buffer, MaxMsgSize, 0);
  97. if (msg_size == 0) break;
  98. if (msg_size == -1) break;
  99. printf("%d->%d Recibido: %d bytes\n", src, dst, msg_size);
  100. strcat(data, buffer);
  101. } while (strchr(data, '\n') == NULL);
  102. if (msg_size == -1) break;
  103. int sent_msg_size = send(dst, data, msg_size, 0);
  104. printf("%d->%d Enviado: %d bytes\n", src, dst, msg_size);
  105. if (sent_msg_size == -1) break;
  106. }
  107. delete (sockets*)args;
  108. delete[] data;
  109. close(src);
  110. close(dst);
  111. return NULL;
  112. }
  113.  


Título: Re: Ayuda con HTML Proxy en C
Publicado por: kub0x en 11 Febrero 2020, 17:51 pm
Viendo el código no veo que envies cabeceras HTTP para la request, creo por ahí va la cosa.


Título: Re: Ayuda con HTTP Proxy en C
Publicado por: _TTFH_3500 en 14 Febrero 2020, 16:08 pm
Ok, encontre el error, las imagenes no terminan con un salto de linea. Primero se envia un HTTP request con el tamaño del archivo y luego los datos del archivo.

Código
  1. void* pushData(void* args) {
  2. sockets* src_dst = (sockets*)args;
  3. int src = src_dst->source;
  4. int dst = src_dst->dest;
  5. char* data = new char[1048576];
  6. while (true) {
  7. strcpy(data, "");
  8. int msg_size = recv(src, data, 1048576, 0);
  9. if (msg_size > 0) {
  10. printf("%d->%d Reenviando %d bytes\n", src, dst, msg_size);
  11. send(dst, data, msg_size, 0);
  12. }
  13. }
  14. delete (sockets*)args;
  15. delete[] data;
  16. close(src);
  17. close(dst);
  18. return NULL;
  19. }