Colección de citas famosas - Slogan de motivación - ¿Cuáles son los campos de tipo y código del mensaje de tiempo de espera ICMP?

¿Cuáles son los campos de tipo y código del mensaje de tiempo de espera ICMP?

Conceptos básicos: primero echemos un vistazo a la estructura de datos de ICMP. //encabezado ICMP

typedef struct _ tagX _ icmphdr

{

Carácter sin firmar i _ type//type

Ninguno Carácter de símbolo i_code//código

I_cksum//checksum corto sin firmar

Id_id//identificador corto sin firmar

I_seq//número de serie corto sin firmar

Unsigned long i_timestamp//current time=(unsigned long integer)::GetTickCount();} xincmpheader; varios mensajes ICMP Los primeros 32 bits son tres campos de longitud fija: campo de tipo (8 bits), campo de código (8 bits) , campo de suma de comprobación (16 bits), tipo de 8 bits y campo de código de 8 bits, que juntos determinan el tamaño del tipo de mensaje ICMP. Los más comunes son:

Tipo 8, código 0: Solicitud de reflexión inversa.

Tipo 0, código 0: respuesta de eco.

Tipo 11, código 0: tiempo de espera.

Campo de suma de verificación de 16 bits: la suma de verificación de todo el Protocolo de mensajes de control de Internet, incluidos los datos, se calcula de la misma manera que la suma de verificación del encabezado ICMP. La siguiente figura muestra el formato de encabezado de los mensajes de solicitud y respuesta de eco ICMP. Para los mensajes de solicitud y respuesta de eco ICMP, el siguiente es el campo identificador de 16 bits: se utiliza para identificar este proceso ICMP.

Finalmente, el campo de número de secuencia de 16 bits se utiliza para determinar el datagrama de respuesta de respuesta. Los mensajes ICMP se incluyen en datagramas IP y pertenecen a un usuario de IP. El encabezado IP está justo delante del mensaje ICMP. Un mensaje ICMP incluye un encabezado IP (20 bytes) y un encabezado ICMP (8 bytes). El valor de protocolo del encabezado IP del mensaje ICMP es 1, lo que significa que se trata de un mensaje ICMP. El campo de tipo en el encabezado ICMP se utiliza para explicar la función y el formato del mensaje ICMP. Además, hay un campo de código que especifica el tipo de mensaje ICMP específico. Todos los datos se utilizan con gran detalle. RFC define 13 formatos de mensajes ICMP, de la siguiente manera: Descripción del código de tipo 0 ECHO-REPLY) 3 Inalcanzable 4 Supresión de fuente 5 Redireccionamiento 8 Solicitud de respuesta (ECHO-REQUEST) 11 Tiempo de espera 12 Fallo de parámetro 13 Solicitud de marca de tiempo 14 Respuesta de marca de tiempo 15 Solicitud de información (*Obsoleto ) 16 Respuesta de información (* Obsoleto) 17 Los siguientes son varios mensajes ICMP comunes: 1. Los pings más utilizados para solicitudes de respuesta son solicitudes de respuesta (tipo=8) y respuestas (tipo=0). El host envía un mensaje ICMP de tipo = 8 al nodo. Si no hay excepciones en el camino (como que el enrutador lo descarte, el destino no responde a ICMP o la transmisión falla), el destino devuelve un mensaje ICMP con Tipo = 0, que indica este host. 2. Los mensajes de destino inalcanzable, origen suprimido y tiempo de espera tienen el mismo formato. El mensaje de destino inalcanzable (tipo=3) se utiliza cuando un enrutador o host no puede entregar el datagrama. Por ejemplo, cuando queremos conectarnos a un puerto del sistema inexistente (número de puerto menor que 1024), se devolverá un mensaje ICMP con Tipo=3 y Código=3, que nos dirá: "¡Oye! Los tipos inalcanzables comunes incluyen red inalcanzable (código = 0), host inalcanzable (código = 1) y protocolo inalcanzable (código = 2) La supresión de fuente actúa como una función de control de flujo, notificando al host que reduzca el tráfico de datagramas tan pronto como se detenga el mensaje debido a. ICMP se restaurará gradualmente. Finalmente, el problema de una red sin conexión es que los datagramas se perderán, o la red deambulará durante mucho tiempo y no podrá encontrar el objetivo, o el host no podrá volver a ensamblar los segmentos del datagrama dentro del mismo. tiempo especificado debido a la congestión, lo que activará un mensaje de tiempo de espera ICMP generado. El campo de código del mensaje de tiempo de espera tiene dos valores: Código = 0 indica tiempo de espera de transmisión, Código = 1 indica tiempo de espera de segmento de reensamblaje 3. Mensaje de solicitud de marca de tiempo (Tipo =). 13) y mensaje de respuesta de marca de tiempo (Tipo = 14) Se utiliza para probar el tiempo de transmisión de datagramas entre dos hosts. Al enviar, el host completa la marca de tiempo original y el receptor completa la marca de tiempo de recepción después de recibir la solicitud y regresa. en el formato de mensaje de Tipo=14. El remitente calcula esta diferencia horaria.

Aunque ICMP es un protocolo de capa de red, los mensajes ICMP deben enviarse en IP pública. * * * encabezado compuesto por un tipo de 1 byte.

Código y suma de comprobación de 2 bytes.

El campo de tipo y el campo de código se utilizan para identificar varios mensajes ICMP. Se han definido hasta ahora

Tres tipos, los mensajes ICMP se pueden dividir en dos categorías según el valor del tipo. El tipo 1 es un mensaje de error, su valor varía de 1 a 127 y el tipo 2 es un. mensaje informativo. Mensaje cuyo valor es mayor a 128.

1 Mensaje de error de que no se puede llegar al destino.

2 Mensaje de error de paquete de datos demasiado grande

3 Mensaje de error de tiempo de espera

4 Mensaje de error de problema de parámetro

Mensaje de solicitud de eco 128

p>

129 Mensaje de respuesta de eco

130 Consulta de miembro del grupo

131 Informe de miembro del grupo

132 Terminación de la membresía del grupo

133 Solicitud de enrutador

134 Anuncio de enrutador

135 Solicitud de vecino

136 Anuncio de vecino

137 Introducción a la redirección 1

Aquí hay un concepto: ¿Qué es el escaneo de host? El escaneo de host, como su nombre indica, escanea los hosts que existen en la red. Entonces, ¿cómo se escanea si existe un host específico? La respuesta se determina enviando paquetes de protocolo ICMP. Entonces, ¿qué es un paquete ICMP?

Estoy haciendo una analogía inapropiada. Los paquetes ICMP son como mensajeros de correos. Si desea escanear si existe un host, enviará un mensajero a la dirección (IP) del host y la oficina de correos le notificará si la entrega se realizó correctamente. Entonces sabrá si la dirección de red existe. Entonces, ¿cómo puedo analizar el recibo de correos para conocer la información de la otra parte? Luego necesitamos analizar la forma de devolución de ICMP, un paquete 'exprés'.

No entraré en detalles sobre la estructura específica. Hay muchos en línea, puedes consultarlos tú mismo.

En Linux, estructura de datos ICMP (

estructura icmp

{

u_int8_t icmp_type/* tipo de mensaje, ver más abajo*/

u _ int8 _ t icmp _ code/*Escribe subcódigo*/

u _ int 16 _ t icmp _ cksum;/*Una de las estructuras Suma de comprobación del complemento*/

Alianza

{

u _ char ih _ pptr/* ICMP_PARAMPROB */

struct in _ addr ih _ gwaddr/*dirección de puerta de enlace* /

struct ih_idseq /* echo datagrama*/

{

u _ int 16 _ t ICD _ id;

u _ int 16 _ t ICD _ seq;

} ih _ idseq

u _ int32 _ t ih _ void

/* ICMP _ unreach _ need frag -Descubrimiento de MTU de ruta (RFC1191) */

Estructura ih_pmtu

{

u _ int 16 _ t IPM_void;

u_int 16_t IPM_nextmtu;

} ih_pmtu

Estructura ih_rtradv

{

u_int8_t irt_num_adrs

u_int8_t irt_wpa

u_int 16_t IRT_lifetime;

p>

}ih_rtradv

} icmp _ hun

# define icmp _ pptr icmp _ hun . ># definir icmp _ id icmp _ hun . ih _ id seq . definir icmp _ void icmp _ hun . ih _ void

# definir icmp _ pm void icmp _ hun . ih _ pmtu . IPM _ nextmtu

# define icmp _ num _ addrs icmp _ hun . . ih _ RTR adv . IRT _ wpa

# define icmp _ life icmp _ hun . /p>

Estructura

{

u_int32_tits_otime

u_int32_tits_rtime

u _ int32 _ t its _ ttime

} id _ ts

Estructura

{

struct ip idi _ ip

/*Opciones y datos de 64 bits*/

} id_ip

struct icmp_ra_addr id_radv

u_int32_t id_mask

u_int 8_t id_data[1];

} icmp_dun

# define icmp_ otime icmp _ dun . id _ ts . su _ otime

# define icmp _ rtime icmp _ dun . id_ts.es_ttime

# define icmp_IP icmp_dun.

# define icmp_mask icmp_dun .id_mask

# define icmp_data icmp_dun .id_data

};

DE & gt

Entonces la pregunta ahora es ¿cómo ensamblamos nosotros mismos el paquete ICMP, es decir, nuestro paquete? La respuesta está a continuación.

void make _ icmp _ paquete(struct icmp * icmp, int len, int n)

{

memset((char *)icmp, 0, len);

gettimeofday((struct time val *)(icmp-& gt;icmp_data), (struct timezone *)0);

//Generar encabezado ICMP

icmp->icmp_type=ICMP_ECHO

icmp->icmp_code=0;

icmp->icmp_id= getpid();

icmp->icmp_seq=n;

//icmp->icmp_cksum=0;//Comprueba y, sí o no.

icmp->icmp_cksum=checksum((u_short*)icmp,len);

}

Este es un programa de suma de comprobación. Descargué downe en línea y todos pueden usarlo.

u_suma de comprobación corta (u_short *datos, int len)

{

u _ suma larga = 0;

for( ;len & gt1;longitud=2)

{

suma+= * datos++;

if(suma &0x80000000)

suma = (suma & 0x ffff)+(suma & gt;& gt16);

}

if(len==1)

{

u _ short I = 0;

*(u _ char *)(& i)=*(u_char*)datos;

suma+= I;

}

mientras(suma & gt;& gt16)

{

suma =(suma & amp; 0x ffff)+(suma & gt; & gt16);

}

retorno (suma==0xffff)? sum:~ sum;

}

Si se requiere escaneo, naturalmente se necesita un temporizador para controlar el tiempo de espera.

void tvsub(estructura timeval* out, estructura timeval *in)

{

out-& gt; seg

}

Bien, todo está listo. Ahora podemos comenzar el viaje de escaneo del host.

# incluir & ltstdio.h & gt

# incluir & ltunistd.h & gt

# incluir & ltsys/select

p>

# incluir & ltstring.h & gt

# incluir & ltnetinet/IP _ icmp

# incluir & ltnetinet/. en . h & gt ;

# incluir & ltnetinet/IP

# incluir & ltsys/types

#. incluir & ltsys/socket .h>

# incluir & ltarpa/inet .h>

#Definir longitud_paquete 72

#Definir tamaño de búfer 4096

int main(int argc, char *argv[])

{

Estructura sockaddr _ in send _ sa

//Estructura s;

int i=0, j = 0;

int scan _ icmp _ socket

char send _ buff[PACK _ LEN]

; p>

char recv_buff[BUFSIZE];

struct in_addr start_addr, end_addr

TV estructurada;

fd_set readfd_ set

Estructura ip * ip

struct icmp * icmp

int hlen//Longitud del encabezado

send _ sa.sin _ family = AF_INET

scan_ICMP_socket = socket(AF_INET,SOCK_RAW,IP proto_ICMP);

if(scan_icmp_socket<0 )

{

error(" scan_icmp_socket: ");

return-1;

}

char IP _ addr[17];

//Dirección IP del bucle

for(j = 1;j & lt254;j++)

{

memset(ip_addr, ' \0 ', sizeof(IP _ addr));

sprintf(ip_addr, " %s.%d ", argv[1], j );

send_sa.sin_addr.s_addr = inet_addr(IP_addr);

printf("escanear %s\n ", inet_ntoa (send_sa.sin_addr));

fflush(stdout);

for(I = 0;i<3;i++)

{

hacer _ icmp _ paquete((struct icmp *)enviar _ buff, PACK_LEN, I

if ((sendto(scan_icmp_socket, send_buff, PACK_LEN, 0, (struct sockaddr *)& send_sa, sizeof(send_sa)))<0 )

{

error("enviar a");

}

//Establece el tiempo de espera en 0,4.

TV.TV_sec = 0;

TV.TV_usec = 400 * 1000;

FD_ZERO. readfd_set);

FD_SET(scan_icmp_socket & readfd_set);

mientras(1)

{

if(select(scan_icmp_socket+1 ,&readfd_set,NULL,NULL&tv)<=0)

{

break

}

//Después de esperar; 0,4 minutos, si hay una respuesta a los datos, comienza a recibir paquetes IP que contienen paquetes ICMP.

if (recvfrom(scan_icmp_socket, recv_buff, BUFSIZE, 0, NULL, NULL)<=0)

{

error(" recvfrom:" ) ;

Salir (0);

}

IP = (struct IP *)recv _ buff

//Obtener IP; longitud del paquete;

hlen = IP-& gt;ip _ hl & lt& lt2;

//En función de si la IP de origen de la IP es la misma que la suya, determine si lo recibió usted mismo de los paquetes de datos.

if(IP->;IP_src.s_addr = = send_sa.sin_addr.s_addr)

{

icmp =(struct icmp *)(recv _ buff +hlen);

//Analizar la información del contenido del paquete icmp

if(icmp-& gt;icmp_type==ICMP_ECHOREPLY)

{

printf("%-15s ", inet_ntoa( *(struct in_addr*)

& amp(IP->;IP_src.s_addr )));

//Comparar el hora actual del sistema con el contenido de datos en el paquete ICMP.

gettimeofday(& tv, NULL);

TV sub(& tv, (struct time val *)(icmp->icmp_data)); printf(":RTT=%8.4f ms\n ",TV . TV _ sec+TV . TV _ usec/1000.0

Pausa

}

;

Otro

{

printf("Estado ICMP: %d\n ",ICMP->icmp_type);

p>

}

}

}

}

}

cerrar(escanear _ icmp _ socket

);

Return 0;

}

Hasta ahora, hemos completado el principio y la implementación del escaneo del host, entonces, ¿para qué sirve el escaneo del host?

Sí, si se puede acceder al host es el primer paso en las pruebas de seguridad de la red. Además, cada vez que alguien envía un paquete ICMP, su computadora debe recibirlo. Si muchas personas envían paquetes ICMP a su computadora al mismo tiempo, es decir, la oficina de correos envía 1000 paquetes al mismo tiempo, es posible que no pueda hacer frente a ello. La situación en este momento es que su computadora está bloqueada en línea o no se puede acceder a ella en absoluto. Entonces, ¿cómo puedo prevenir ataques ICMP o no quiero que otros sepan si mi computadora está en línea? Muy simple, instale un firewall y verifique rechazar ICMP.

De hecho, se ha dicho durante mucho tiempo que ICMP se usa principalmente para ataques DOS. Se basa principalmente en una sola máquina, tiene un ancho de banda pequeño y baja eficiencia, y no causará grandes daños. la persona que está siendo escaneada. Bueno, la mayoría de los ataques a la red actuales se realizan en forma de computación en la nube. No es divertido cuando miles de gallos te atacan.