P. 1
Occams Razor 04 01

Occams Razor 04 01

|Views: 93|Likes:
Publicado porCoopsolpy

More info:

Published by: Coopsolpy on May 13, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

05/13/2011

pdf

text

original

Si observamos con detenimiento la información que
nos proporciona tcpdump, veremos que hay un mon-
tón de datos en los paquetes que enviamos que a priori
no podemos modificar. Datos como las direcciones IP
o el TTL, se encuentran en la cabecera IP, la cual,
hasta el momento, hemos dejado que la manejara el
sistema operativo.

Pero eso se acabó. Vamos a modificar nuestro escáner
para poder controlar absolutamente toda la informa-
ción que nos muestra tcpdump. Para ello, tenemos que
hacer algunas modificaciones adicionales en nuestro
pequeño programa.

Utilizando la syscall setsockopts
podremos acceder a la cabecera
IP

El primer cambio es que ya no necesitamos dos estruc-
turas de datos para enviar y para recibir los paquetes.
Ahora vamos a manejar la cabecera IP tanto en trans-
misión como en recepción, así que solo necesitaremos
la siguiente definición.

typedef struct {

struct iphdr ip ;

struct tcphdr tcp ;

TCP_PHDR

tcp_phdr ;

} PKT;

Esta nueva estructura substituye a las anteriores PKT
y PKT_RX. Mantenemos el nombre de la primera, por-
que mola y para tener que hacer menos cambios al
programa.

45| OCCAM’s Razor

REVERSO TENEBROSO

Además, necesitamos decirle al kernel que no maneje
las cabeceras por nosotros. Esto lo conseguimos ac-
tivando la opción IP_HDRINCL (IP Header Included...
obviamente) de nuestro socket RAW. Esto lo hacemos
en una nueva función que os mostramos a continua-
ción.

int

cfg_socket (int s)
{

int val = 1;

if ( setsockopt (s , IPPROTO_IP, IP_HDRINCL,

&val , sizeof ( val )) < 0)
perror ("setsockopt␣(IPHDRINCL): " );

return s ;

}

Como hicimos en el ejemplo anterior, antes de meter-
nos en los detalles de la generación de los paquetes,
vamos a ver como quedaría nuestra función main.

Solamente vamos a reproducir la primera parte de la
función, en la que se envía el paquete, ya que el resto
no necesita ningún cambio. De hecho, en esta primera
parte solo vamos a modificar dos líneas.

int main (int argc , char ∗argv [ ] ) {

int s , data_size ;
PKT

pkt ;

PKT

syn ;
char tmp[1024];

struct sockaddr_in dest ;

s = crea_socket (IPPROTO_RAW);
cfg_socket ( s );

/∗ Construimos paquete ∗/

dest . sin_family = AF_INET;
inet_aton ( argv [1] , &dest . sin_addr );
dest . sin_port = htons( atoi (argv [ 2]) ) ;

memset (&syn , 0, sizeof (PKT));
ip_pkt (&syn , argv [1] , argv [ 3]) ;
tcp_pkt (&syn , argv [1] , atoi (argv [2]) ,
argv [3] , atoi (argv [ 4] )) ;

. . .

Lo primero que podemos ver es que ahora estamos uti-
lizando como protocolo IPPROTO_RAWy a continuación
estamos llamando a nuestra nueva función para decir-
le al kernel que nosotros proporcionamos las cabeceras
IP (cfg_socket).

En este caso concreto, podríamos haber mantenido el
protocolo IPPROTO_TCP, pero IPPROTO_RAW es formal-
mente más correcto.

El segundo cambio que observamos es la llamada a la
función ip_pkt. Sí, efectivamente, esa es la función
que rellena la cabecera IP. Como en la capa IP no
existen los puertos, no es necesario que se los envie-
mos.

Sin grandes sorpresas hasta aquí. Le decimos al kernel
que nosotros manejamos las cabeceras IP, y añadimos
una función para manejarlas.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->