Saltar la navegación

Sniffer ICMP

El acceso a sockets sin procesar en Windows es ligeramente diferente que en sus hermanos de Linux, pero queremos tener la flexibilidad de implementar el mismo sniffe en múltiples plataformas. Crearemos nuestro objeto socket y luego determinaremos en qué plataforma estamos corriendo. Windows requiere que establezcamos algunos indicadores adicionales a través de un control de entrada / salida de socket (IOCTL), que habilita el modo promiscuo en la interfaz de red. En nuestro primer ejemplo, simplemente configuramos nuestro sniffer de socket sin procesar, leemos en un solo paquete y luego salimos, a continuación se muestra el código:

Descargar código

Decodificación de mensajes ICMP

Ahora que podemos decodificar por completo la capa de IP de cualquier paquete rastreado, debemos ser capaces de decodificar las respuestas ICMP que nuestro escáner generará al enviar datagramas UDP a puertos cerrados. Los mensajes ICMP pueden variar mucho en su contenido, pero cada mensaje contiene tres elementos que se mantienen consistentes: el tipo, el código y los campos de suma de verificación. Los campos de tipo y código le indican al host receptor qué tipo de mensaje ICMP está llegando, lo que luego determina cómo decodificarlo correctamente.
Para los fines de nuestro escáner, estamos buscando un valor de tipo de 3 y un valor de código de 3. Esto corresponde a la clase de mensajes ICMP de destino inalcanzable, y el valor de código de 3 indica que se ha causado el error de puerto inalcanzable. Como se muestra en la siguiente figura:

Como puede ver, los primeros 8 bits son del tipo y los segundos 8 bits contienen nuestro código ICMP. Una cosa interesante a tener en cuenta es que cuando un host envía uno de estos mensajes ICMP, en realidad incluye el encabezado IP del mensaje de origen que generó la respuesta. También podemos ver que verificaremos dos veces los 8 bytes del datagrama original que se envió para asegurarnos de que nuestro escáner generó la respuesta ICMP. Para hacerlo, simplemente cortamos los últimos 8 bytes del búfer recibido para extraer la cadena necesaria que envía nuestro escáner.
Agreguemos un poco más de código a nuestro sniffer anterior para incluir la capacidad para decodificar paquetes ICMP.

Descargar el código

Jesus Fernando Daniel Tehozol