elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Enviar paquetes TCP/IP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Enviar paquetes TCP/IP  (Leído 11,042 veces)
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Enviar paquetes TCP/IP
« en: 27 Marzo 2012, 16:24 pm »

Buenas!

Quiero hacer un programa para enviar paquetes TCP y paquetes IP, solo enviar. ¿Me podeis decir alguna libreria e instrucciones basicas para poder hacerme el programa?
El programa lo voy ha hacer en C y sobre linux.

Gracias, un saludo!


En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
vikour92

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Enviar paquetes TCP/IP
« Respuesta #1 en: 27 Marzo 2012, 17:12 pm »

Lo de enviar paquetes yo lo he intentado pero lo he dejado para más tarde ya que quiero ahondar más en C y C++. Pero te voy a pasar información en la que yo me base:

- Mira esta página, explica como va la estructura de la red un poco y como hacer comunicaciones en C.
http://www.chuidiang.com/clinux/sockets/sockets_simp.php

Espero que te sirva de ayuda. Yo supongo que si quieres ahondar más, yo te recomiendo que hagas lo que voy a hacer yo que es comprar un libro sobre eso en particular. Aunque creo que por un hilo del foro había varios libros en PDF.

Un saludo.


En línea

soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: Enviar paquetes TCP/IP
« Respuesta #2 en: 27 Marzo 2012, 20:59 pm »

Gracias por la ayuda.

Yo mas que un libro sobre redes lo que necesito es saber mas de C. La teoria de redes me la se bastante bien, mi problema viene al implementarlo.

Lo que pretendo es hacer un programa tipo hping3. Este es un programa que te permite mandar paquetes TCP (y de mas tipo) dejandote elegir la ip de origen, la ip de destino, el nº de secuencia, el nº de ACK, y los FLAGS de TCP.

Entonces solo necesito (mas o menos) sabes cual es la instruccion de C para enviar un paquete TCP pasandole por parametro los campos de la cabecera de un paquete TCP.

Un saludo.
En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
vikour92

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Enviar paquetes TCP/IP
« Respuesta #3 en: 28 Marzo 2012, 12:33 pm »

Creo recordar, que en el enlace que te he pasado te enseñaba a enviar paquetes TCP/IP con C. Al principio empieza con la teoría pero al final hace un ejemplo práctico, además, te deja descargarte un programa que el de la página hizo para que te sirva como ejemplo.

Lo de libro, me refiero a un libro de C en el que implemente las redes.

Un saludo.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Enviar paquetes TCP/IP
« Respuesta #4 en: 28 Marzo 2012, 14:45 pm »

Me da la impresion de que buscas esto: raw sockets.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: Enviar paquetes TCP/IP
« Respuesta #5 en: 28 Marzo 2012, 17:45 pm »

Muchas gracias!

Eso es precisamente lo que necesitaba.

Bueno por ahora tengo este codigo....y ando un poco atascado.
No se como especificar mi ip de origen, y tampoco se porque me manda los FLAGS: FYN SYN PSH y NS, cuando en realidad solo deberia mandar el SYN....
Código
  1. #include <sys/types.h>
  2. #define __FAVOR_BSD
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <netdb.h>
  6. #include <netinet/ip.h>
  7. #include <netinet/tcp.h>
  8. #include <arpa/inet.h>
  9. #include <string.h>
  10. char data[1024] = "";
  11.  
  12.  
  13.  
  14. unsigned short csum(unsigned short *buf,int nwords)
  15. {
  16. //this function returns the checksum of a buffer
  17. unsigned long sum;
  18. for (sum = 0; nwords > 0; nwords--){sum += *buf++;}
  19. sum = (sum >> 16) + (sum & 0xffff);
  20. sum += (sum >> 16);
  21. return (unsigned short) (~sum);
  22. }
  23.  
  24. int createRaw(int protocol_to_sniff)
  25. {
  26. int raw_fd = socket(AF_INET, SOCK_RAW, protocol_to_sniff);
  27. if (raw_fd < 0)
  28. {
  29. printf("ERROR creating raw socket\n");
  30. return(1);
  31. }else{
  32. printf( "Raw Socket Created! :-D\n");
  33. return raw_fd;
  34. }
  35. }
  36. int bindRaw(int socketToBind,struct sockaddr_in *sin)
  37. {
  38. int err = bind(socketToBind,(struct sockaddr *)sin,sizeof(*sin));
  39. if (err < 0)
  40. {
  41. printf("ERROR binding socket.\n");
  42. return(1);
  43. }else{
  44. printf("Bound socket! :-D\n");
  45. return 0;
  46. }
  47. }
  48.  
  49. int main(int argc,char* argv[])
  50. {
  51. //create raw socket for binding
  52. int bindSocket = createRaw(6);
  53.  
  54. //create structures
  55. struct sockaddr_in sin;
  56. unsigned char packetBuf[4096];
  57.  
  58. //specify port to bind to
  59. bzero((char *)&sin,sizeof(sin));
  60. sin.sin_port = htons(55000);
  61.  
  62. //bind socket
  63. bindRaw(bindSocket,&sin);
  64.  
  65. //inform os of recieving raw ip packet
  66. {
  67. int tmp = 1;
  68. setsockopt(bindSocket, 0, IP_HDRINCL,&tmp,sizeof(tmp));
  69. }
  70.  
  71. //re-use socket structure
  72. //Details about where this custom packet is going:
  73. bzero((char *)& sin, sizeof(sin));
  74. sin.sin_family = AF_INET;
  75. sin.sin_port = htons(55000); //port to send packet to
  76. sin.sin_addr.s_addr = inet_addr("173.194.34.215"); //IP to send packet to
  77.  
  78.  
  79. unsigned short buffer_size = sizeof(struct ip) + sizeof(struct tcphdr);//+ sizeof(data);
  80. //cout << "Buffer size: " << buffer_size << endl;
  81.  
  82. struct ip *IPheader = (struct ip *) packetBuf;
  83. struct tcphdr *TCPheader = (struct tcphdr *) (packetBuf + sizeof (struct ip));
  84.  
  85. //Fill out IP Header information:
  86. IPheader->ip_hl = 5;
  87. IPheader->ip_v = 4; //IPv4
  88. IPheader->ip_tos = 0; //type of service
  89. IPheader->ip_len = htons(buffer_size); //length
  90. IPheader->ip_id = htonl(54321);
  91. IPheader->ip_off = 0;
  92. IPheader->ip_ttl = 255; //max routers to pass through
  93. IPheader->ip_p = 6; //tcp
  94. IPheader->ip_sum = 0; //Set to 0 before calulating later
  95. IPheader->ip_src.s_addr = inet_addr("11.11.11.11"); //source IP address
  96. IPheader->ip_dst.s_addr = inet_addr("173.194.34.215"); //destination IP address
  97.  
  98. //Fill out TCP Header information:
  99. TCPheader->th_sport = htons(55000); //source port
  100. TCPheader->th_dport = htons(55000); //destination port
  101. TCPheader->th_seq = 0;
  102. TCPheader->th_ack = 0; //Only 0 on initial SYN
  103. TCPheader->th_off = 0;
  104. TCPheader->th_flags = TH_SYN; //SYN flag set
  105. TCPheader->th_win = htonl(65535); //used for segmentation
  106. TCPheader->th_sum = 0; //Kernel fill this out
  107. TCPheader->th_urp = 0;
  108.  
  109. //Now fill out the checksum for the IPheader
  110. IPheader->ip_sum = csum((unsigned short *) packetBuf, IPheader->ip_len >> 1);
  111. //cout << "IP Checksum: " << IPheader->ip_sum << endl;
  112. //create raw socket for sending ip packet
  113. int sendRaw = createRaw(6);
  114. if (sendRaw < 0)
  115. {
  116. printf( "ERROR creating raw socket for sending.\n");
  117. return(1);
  118. }else{
  119. printf( "Raw socket created for sending! :-D\n");
  120. }
  121. int sendErr = sendto(sendRaw,packetBuf,
  122. sizeof(packetBuf),0,(struct sockaddr *)&sin,sizeof(sin));
  123.  
  124. if (sendErr < sizeof(packetBuf))
  125. {
  126. //cout << sendErr << " out of " << sizeof(packetBuf) << " were sent.\n";
  127. return(1);
  128. }else{
  129. //cout << "<" << sendErr << "> Sent message!!! :-D\n";
  130. }
  131.  
  132. printf( "Sleeping for 2 seconds");
  133. sleep(1);
  134. printf(".");
  135. sleep(1);
  136. printf(".\n");
  137. char recvPacket[4096] = "";
  138. int newData = recv(bindSocket,recvPacket,sizeof(recvPacket),0);
  139. if (newData <=0)
  140. {
  141. //cout << newData << " returned by recv! :(\n";
  142. return(1);
  143. }else{
  144. //cout << "<" << newData << "> RECIEVE SUCCESSFULL!! :-D\n";
  145. }
  146.  
  147. return 0;
  148. }
  149.  
  150.  

¿alguna idea?

Gracias.
En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: Enviar paquetes TCP/IP
« Respuesta #6 en: 29 Marzo 2012, 17:16 pm »

¡Buenas a todos!

Bueno, dado mi nivel de mediocridad para el lenguaje C al final no he sabido solucionar el problema....pero he encontrado un enlace espectacular donde esta el codigo que necesitaba bien programado. La verdad es que la info de este blog es buenisima y muy recomendable para la gente que quiera programar socket y aprender sobre estos.

http://dlerch.blogspot.com.es/2007/05/raw-sockets.html

Un saludo.
En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
bitBuffer

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Enviar paquetes TCP/IP
« Respuesta #7 en: 15 Enero 2013, 04:53 am »

No logro entender esta linea del codigo:

struct ip *IPheader = (struct ip *) packetBuf;

Porque se declara un array y se hace la conversion?.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Enviar paquetes TCP/IP
« Respuesta #8 en: 15 Enero 2013, 10:36 am »

Comodidad mas que nada, un paquete contiene varias estructuras que varian de acuerdo al tipo (TCP o UDP por ejemplo) y sendto recibe como parametro un puntero a char. En este caso podes ver que usa primero IP y despues TCP en la siguiente linea:

struct tcphdr *TCPheader = (struct tcphdr *) (packetBuf + sizeof (struct ip));

Es decir que justo despues de la estructura IP viene la TCP (para eso usa el tamaño de la estructura ip con sizeof).

Despues de llenar ambas:

int sendErr = sendto(sendRaw,packetBuf,
sizeof(packetBuf),0,(struct sockaddr *)&sin,sizeof(sin));
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Enviar paquetes en hex por winsock
Programación Visual Basic
andoba 2 2,804 Último mensaje 14 Junio 2006, 22:57 pm
por sircid
no enviar paquetes ??
Programación Visual Basic
rembolso 0 1,556 Último mensaje 18 Julio 2009, 04:26 am
por rembolso
Enviar paquetes?
Programación Visual Basic
_F3RN4_ 1 2,389 Último mensaje 21 Octubre 2009, 02:06 am
por BlackZeroX
Enviar paquetes a un proceso
Programación Visual Basic
Rigoberta II 9 5,066 Último mensaje 14 Abril 2012, 16:56 pm
por Rigoberta II
Enviar paquetes
Hacking
andrecid 1 2,175 Último mensaje 30 Junio 2015, 17:34 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines