Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 17 Septiembre 2015, 23:43 pm



Título: Como leer paquetes salientes de un puerto C++
Publicado por: Kaxperday en 17 Septiembre 2015, 23:43 pm
Pues eso, he redirigido los paquetes TCP del puerto 80 al puerto 123 (por ejemplo) y ahora quiero leerlos con un socket o no se con qué por eso creo el hilo. Para poder trabajar con ellos y continuar con mi proyecto de hacking etico.

Saludos.


Título: Re: Como leer paquetes salientes de un puerto C++
Publicado por: BlackM4ster en 18 Septiembre 2015, 12:20 pm
Puedes crear un servidor que escuche por el puerto 80 y establezca la conexión con los clientes, leyendo todo lo que le envían. Si describes mejor tus intenciones, podríamos ayudarte más.
Saludos


Título: Re: Como leer paquetes salientes de un puerto C++
Publicado por: Kaxperday en 18 Septiembre 2015, 13:44 pm
Gracias señorr!!

Vale, lo que pretendo es escuchar el tráfico de un puerto como por ejemplo las peticiones HTTP del puerto 80, y no sé como hacerlo, ¿debería usar sockets? Es lo que estoy intentando, estoy programando en C++, este es el code que llevo hasta ahora:

Código
  1. //Funcion para obtener los paquetes salientes por el puerto 80.
  2. void servidor_HTTP(volatile bool *on_sslstrip)
  3. {
  4. WSADATA wsa;
  5. string contenido;
  6. sockaddr_in dir;
  7. int sock;
  8.  
  9. WSAStartup(MAKEWORD(2, 0), &wsa);
  10.  
  11. while (*on_sslstrip){
  12. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){
  13. WSACleanup();
  14. continue;
  15. }
  16. else{
  17. dir.sin_family = AF_INET;
  18. dir.sin_addr.s_addr = inet_addr("127.0.0.1");
  19. dir.sin_port = htons(80);
  20. bind(sock, (struct sockaddr*)&dir, sizeof(dir));
  21. printf("abiertoo");
  22. system("pause");
  23.  
  24. /*if (std::bind(sock, (struct sockaddr *)&dir, sizeof(dir)) == -1)//SOCKET_ERROR){
  25. closesocket(sock);
  26. continue;
  27. }*/
  28.  
  29.                         //En proceso que debería hacer ahora?
  30. }
  31. }
  32. Sleep(20000);
  33. }

El objetivo final sería desviarlo a otro puerto, escuchar en ese otro puerto y modificar los paquetes, pues no sé si desviando los paquetes http a otro puerto esos paquetes se perderían y no llegarían al destino, por lo que podría recogerlos con sockets y enviarlos a su destino podiendo así modificarlos.

Otra cosa, el bind no me deja igualarlo a -1 entonces ¿como detecto si se ha producido error o no?.

Ayuda pls, gracias y un saludo.


Título: Re: Como leer paquetes salientes de un puerto C++
Publicado por: ivancea96 en 18 Septiembre 2015, 20:22 pm
Código
  1. std::bind
Eso es una función de C++11, que no tiene que ver con los sockets de Windows.


Título: Re: Como leer paquetes salientes de un puerto C++
Publicado por: Kaxperday en 18 Septiembre 2015, 20:54 pm
Código
  1. std::bind
Eso es una función de C++11, que no tiene que ver con los sockets de Windows.

Sii ese es el problema que tengo con bind, que no devuelve un puntero ni "bind", ni "std:bind", no hay manera de llamar a ese bind que tiene que ver con los sockets de windows, ¿alguna idea de como llamar a la de los sockets?.

Saludos y gracias.


Título: Re: Como leer paquetes salientes de un puerto C++
Publicado por: ivancea96 en 18 Septiembre 2015, 20:57 pm
Estás llamando a bind antes de printf.


Título: Re: Como leer paquetes salientes de un puerto C++
Publicado por: Kaxperday en 18 Septiembre 2015, 21:00 pm
ojj acabo de remover de la cabecera el using namespace std; y ya funciona, vamos que hay 2 funciones "bind()", dpm windows XD. ¿como puedo hacerlo con el namespace std? ¿se puede o no?

Saludos.


Título: Re: Como leer paquetes salientes de un puerto C++
Publicado por: ivancea96 en 18 Septiembre 2015, 21:08 pm
Código
  1. ::bind();


Título: Re: Como leer paquetes salientes de un puerto C++
Publicado por: Kaxperday en 18 Septiembre 2015, 21:22 pm
Código
  1. ::bind();

Gracias grande!, esto es lo que tengo hasta ahora:

Código
  1. void servidor_HTTP(volatile bool *on_sslstrip)
  2. {
  3. WSADATA wsa;
  4. string contenido;
  5. sockaddr_in dir_servidor;
  6. int s_servidor;
  7.  
  8. WSAStartup(MAKEWORD(2, 0), &wsa);
  9.  
  10. while (*on_sslstrip){
  11. if ((s_servidor = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){
  12. WSACleanup();
  13. Sleep(20000);
  14. continue;
  15. }
  16. else{
  17. dir_servidor.sin_family = AF_INET;
  18. dir_servidor.sin_addr.s_addr = inet_addr("127.0.0.1");
  19. dir_servidor.sin_port = htons(80);
  20.  
  21. if (::bind(s_servidor, (struct sockaddr *)&dir_servidor, sizeof(dir_servidor)) == SOCKET_ERROR){
  22. closesocket(s_servidor);
  23. WSACleanup();
  24. Sleep(20000);
  25. continue;
  26. }
  27.  
  28. sockaddr_in dir_cliente;
  29.  
  30. while (*on_sslstrip){
  31. int tam = sizeof(dir_cliente);
  32. int s_client = accept(s_servidor, (struct sockaddr *)&dir_cliente, &tam);
  33. if (s_client == INVALID_SOCKET){//SOCKET_ERROR
  34. printf("accept() failed: %d\n", WSAGetLastError());
  35. printf("error");
  36. break;
  37. }
  38. printf("Accepted client: %s:%d\n",
  39. inet_ntoa(dir_cliente.sin_addr), ntohs(dir_cliente.sin_port));
  40.  
  41. }
  42. }
  43. }
  44. }

Pero me da error, y me sale a la primera iteracion del segundo bucle, la idea recuerdo que es escuchar peticiones de salida en puerto 80 y recojer paquetes como por ejemplo un paquete HTTP, lo primero es acceder a esos paquetes, luego los redirigiría de puerto y haría lo mismo en el otro puerto, entonces tengo la esperanza de que el sistema no pueda hacer conexiones http ni por el puerto 80 puesto que redirigi el puerto, y entonces accedería a los paquetes y los mandaría a los servidores modificandolos y los regresaría a los clientes correspondientes de los paquetes.

Pero ahora estamos por la parte de recoger esos paquetes http o no que usen puerto 80.

Saludos y gracias.

Citar
WSAEINVAL
10022
Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.

Buenas, lo que creaba antes era un servidor en el puerto 80 no era lo correcto, he probado con un cliente que trata de conectar a un puerto de nuestro ordenador para sacar los paquetes aquí el code:

Código
  1. string cliente_HTTP()
  2. {
  3. WSADATA wsa;
  4. string contenido;
  5. sockaddr_in dir;
  6. int sock;
  7.  
  8. WSAStartup(MAKEWORD(2, 0), &wsa);
  9.  
  10. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){
  11. WSACleanup();
  12. return "";
  13. }
  14. else{
  15. dir.sin_family = AF_INET;
  16. dir.sin_port = htons(80);
  17. dir.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
  18.  
  19. if (connect(sock, (struct sockaddr*)&dir, sizeof(dir)) == SOCKET_ERROR){
  20. closesocket(sock);
  21. WSACleanup();
  22. cout << "bad";
  23. return "";
  24. }
  25. else{
  26. cout << "Connected to " << inet_ntoa(dir.sin_addr) << "!" << endl;
  27. cout << "hi";
  28. char *respuesta = new char[1000]();
  29. recv(sock, respuesta, 1000, 0);
  30. closesocket(sock);
  31. WSACleanup();
  32. return string(respuesta);
  33. }
  34. }
  35. }

Problema, que da conection refused al hacer el connect(), tiene sentido, pues no podemos conectar a un puerto 80, pues lo tenemos cerrado no se puede conectar, si lo hace si ponemos la ip de google. ¿como entonces accedemos a los paquetes salientes de nuestro ordenador??

Supongo que habrá que buscar esto para windows:

Código:
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port <listenPort>