martes, 4 de febrero de 2025

ICMP y la Seguridad de Redes

 

ICMP y la Seguridad de Redes

Introducción a ICMP

  • ICMP (Internet Control Message Protocol) es un protocolo de la capa 3. A menudo se pasa por alto en el mundo del escaneo de redes.
  • No es tan complicado como otros protocolos, y tiene encabezados de paquetes más cortos.
  • A pesar de su simplicidad, ICMP tiene usos críticos y es tan importante como TCP o UDP.
  • Es compatible tanto con IPv4 como con IPv6.

Estructura de un Paquete ICMP

  • El encabezado de ICMP es de solo 8 bytes de largo, y los primeros 4 bytes son la parte principal.
  • El byte de desplazamiento 0 es el tipo de mensaje.
  • Los tipos y códigos de ICMP son esenciales para entender la comunicación en la capa 3.
  • No incluye un número de puerto.


Usos de ICMP en la Seguridad de Redes

  • Identificación de la Red: ICMP ayuda a identificar switches y otros dispositivos en la red.
  • Mapeo de Red: Permite mapear la red, tanto interna como externamente, y ayuda a construir mejores patrones de ruta.
  • Herramientas de Análisis de Red: ICMP se traduce directamente en herramientas comunes para el análisis de redes, como ping y traceroute.
  • Traceroute: Esta herramienta utiliza ICMP para determinar las rutas que toman los paquetes a través de una red. Por ejemplo, traceroute google.com utiliza ICMP para rastrear la ruta. En Windows, se utiliza el comando tracert -4 google.com para obtener la respuesta de traceroute para IPv4.
  • Detección de Hosts: Se utiliza para verificar qué hosts están activos en una red.
  • Descubrimiento de Routers: ICMP también se usa para el descubrimiento de routers en redes Juniper.
  • Mensajes de Error: ICMP se utiliza para enviar mensajes de error, como "host inalcanzable".

ICMP y el Análisis de Paquetes

  • Filtrado en Wireshark: Se pueden utilizar filtros en Wireshark para centrarse solo en el tráfico ICMP usando ip.proto == 1 o escribir icmp
  • Análisis de la Carga Útil (Payload) ICMP: La carga útil de un paquete ICMP se puede analizar para obtener información adicional sobre la comunicación.
  • Tipos de ICMP Un tipo común de ICMP es el "echo ping request", con un valor hexadecimal de 0x08. Si se detecta un destino inalcanzable, el tipo de ICMP sera 3.
Mensaje de puerto inacesible

  • Checksum: Se puede verificar el checksum del payload ICMP para garantizar la integridad de los datos.
  • Secuencia de Eventos: ICMP proporciona información sobre la secuencia de eventos que ocurren durante la comunicación. Estos incluyen un identificador y un número de secuencia, que se utilizan para identificar de forma única las solicitudes y emparejarlas con las respuestas.



Ejemplo Práctico
Consideremos un host Linux que envía dos pings a 192.168.238.2 y otros dos a 69.21.118.171. Podríamos ver lo siguiente:
Identificador 47, Secuencia 1 (ping a 192.168.238.2)
Identificador 47, Secuencia 2 (ping a 192.168.238.2)
Identificador 48, Secuencia 1 (ping a 69.21.118.171)
Identificador 48, Secuencia 2 (ping a 69.21.118.171)

En contraste, un host Windows 10 enviando los mismos pings:
Identificador 1, Secuencia 1 (ping a 192.168.238.2)
Identificador 1, Secuencia 2 (ping a 192.168.238.2)
Identificador 1, Secuencia 3 (ping a 69.21.118.171)
Identificador 1, Secuencia 4 (ping a 69.21.118.171)

En combinación con el identificador, el número de secuencia ayuda a determinar si algún paquete se ha perdido o si se han recibido respuestas fuera de orden

  • Windows 10, el número de secuencia siempre creciente puede ser menos útil para distinguir entre conversaciones, pero aún sirve para el seguimiento de mensajes en general, siendo importante para detectar retransmisiones o pérdidas
  • Relación con otros protocolos: Dentro de la respuesta ICMP, es posible encontrar información de otros protocolos como IGMP, IGRP, GRE, OSPF, etc.


Variedad de Payloads en ICMP

  • Diversidad de Sistemas Operativos: Los payloads de los mensajes ICMP echo varían significativamente según el sistema operativo e incluso entre aplicaciones que se ejecutan en el mismo sistema. Esta diversidad es importante para los analistas de red porque puede ayudar a identificar el tipo de sistema que está enviando los mensajes ICMP.

  • Payloads por Defecto:

    • Linux: Generalmente, los sistemas Linux utilizan un payload que incluye una marca de tiempo, seguida de una secuencia de valores hexadecimales incrementales, comenzando desde 0x10.
    • Windows: Los sistemas Windows, en contraste, suelen utilizar una secuencia de caracteres ASCII incrementales, comenzando con la letra "a" y continuando hasta la "w", luego repitiendo "a" hasta "i".


  • Importancia de los Payloads por Defecto: Es fundamental que los analistas comprendan los payloads predeterminados y el comportamiento normal de los sistemas en su entorno de red. Esto permite detectar sistemas o aplicaciones que puedan ser anómalos o maliciosos. Por ejemplo, si en una red exclusivamente Windows se detectan payloads con el formato hexadecimal incremental típico de Linux, esto podría ser una señal de alerta.

Payloads Inusuales y su Significado

  • Aplicaciones Específicas: Algunas aplicaciones pueden utilizar payloads no estándar para el tráfico ICMP echo. Por ejemplo, se han observado payloads extraños, pero no maliciosos, como los de Microsoft Outlook Autodiscover y Microsoft Telemetry Data.

  • Ejemplos de Payloads Inusuales:

    • Microsoft Outlook Autodiscover: Puede enviar payloads que contienen la palabra "Running".
    • Microsoft Telemetry Data: Envía mensajes con payloads muy cortos (2 bytes) y valores TTL (Time to Live) inusuales (30).
    • Tunelización SSH: Algunos payloads pueden ser usados para tunelizar otros protocolos, como SSH, sobre ICMP echo/echo reply. Esto es una clara señal de actividad sospechosa.
  • Actividad Maliciosa:

    • Aplicaciones maliciosas y canales de comando y control (C2) pueden utilizar ICMP echo/echo reply con payloads no estándar para comunicarse o pasar desapercibidos. Un payload inusual en un mensaje ICMP podría indicar la presencia de malware o una conexión de un C2, lo cual requiere una investigación adicional.


ICMP Echo Reply

  • Similitud con el Echo Request: En general, un mensaje ICMP echo reply debe tener un payload idéntico al del mensaje echo original. La única excepción son los casos en los que haya timestamps, que deberían ser actualizados en la respuesta.
  • Diferencias por Sistema Operativo: Como vimos en la conversación anterior, al enviar un mensaje ICMP tipo 8 con código 4, los sistemas Linux responden cambiando el tipo a 0 y manteniendo el código en 4, mientras que Windows cambia ambos valores a 0. Esta diferencia de implementación puede ser usada para identificar el sistema operativo, aunque no sea un cambio en el payload.

Mensajes ICMP de Tiempo Excedido (Time Exceeded)

  • Estos mensajes tienen el tipo 11.
  • Se utilizan para informar al emisor cuando un paquete no puede llegar a su destino debido a un problema de tiempo de vida (TTL) o tiempo de reensamblaje de fragmentos.
  • Hay dos códigos posibles:
    • Código 0: "Tiempo de vida excedido en tránsito". Se envía cuando el campo TTL de un paquete IP llega a cero, y el sistema descarta el paquete. Esto puede suceder en un enrutador o en el host de destino.
    • Código 1: "Tiempo de reensamblaje de fragmentos excedido". Se envía cuando un host no recibe todos los fragmentos de un paquete fragmentado antes de que se agote el tiempo de espera. El primer fragmento debe haberse recibido para que se envíe este mensaje.
  • Los campos 4 a 7 del encabezado ICMP no se utilizan en estos mensajes y permanecen en cero.
  • La carga útil incluye el encabezado IP y al menos los primeros 64 bits del paquete que causó el error.
  • El comando tracert de Windows utiliza mensajes de tiempo excedido para descubrir la ruta que siguen los paquetes hacia un destino. Aumenta el TTL en cada serie de paquetes ICMP echo, y al llegar a cada enrutador, este decrementa el valor TTL del paquete hasta que llega a 0 y genera un error de tipo tiempo excedido de código 0.

Mensajes ICMP de Destino Inalcanzable (Destination Unreachable)

  • Estos mensajes tienen el tipo 3.
  • Se envían cuando un destino no está disponible, ya sea el host, el puerto o el protocolo.
  • Existen muchos códigos asignados a este tipo de mensaje, del 1 al 15. Estos incluyen notificaciones cuando un puerto o protocolo no está disponible, o cuando el host o red son inalcanzables.
  • El código 4 se utiliza cuando se necesita fragmentar un paquete, pero el bit "no fragmentar" (Don't Fragment - DF) está activado.
  • Al igual que los mensajes de tiempo excedido, estos mensajes no utilizan los bytes de la posición 4 a la 7 del encabezado ICMP y la carga útil incluye el encabezado IP y los primeros 64 bits del paquete original.



Relevancia para el Monitoreo y la Seguridad

  • Los mensajes de error ICMP, como los de tiempo excedido y destino inalcanzable, pueden ser utilizados para el reconocimiento de la red. Por ejemplo, un escaneo de puertos y protocolos puede revelar información sobre los servicios en ejecución de un sistema.
  • Los mensajes de destino inalcanzable podrían revelar información sutil, como el hecho de que un sistema está activo y responde.
  • Es importante entender que tanto tcpdump como tshark pueden obtener resultados diferentes al analizar los mensajes de error ICMP debido a cómo procesan los encabezados de la carga útil. Tshark incluye los encabezados de la carga útil en las búsquedas de filtros, mientras que tcpdump no.
  • Estos mensajes de error pueden revelar información sensible, como direcciones IP internas que no deberían ser visibles desde el exterior.
  • Se pueden utilizar para mapear hosts y redes, identificando enrutadores mediante mensajes de tipo tiempo excedido y servicios no disponibles con mensajes de destino inalcanzable.
  • En condiciones normales, los mensajes ICMP no se deben enviar en respuesta a otros mensajes de error ICMP, paquetes de difusión o fragmentos que no sean el inicial.

Existen ciertas condiciones en las que no se deben enviar mensajes ICMP. Estas condiciones se establecen para evitar bucles de mensajes de error, tráfico innecesario y posibles ataques de denegación de servicio. Aquí están las condiciones principales:

  • En respuesta a otro mensaje de error ICMP: No se debe enviar un mensaje de error ICMP como respuesta a otro mensaje de error ICMP. Esto se hace para evitar un bucle infinito de mensajes de error entre dos hosts. Por ejemplo, si un host recibe un mensaje de "puerto inalcanzable" y trata de responder con otro mensaje de error, se podría generar una cadena sin fin de errores entre los hosts.
  • A una dirección de broadcast de destino: No se deben enviar mensajes de error ICMP en respuesta a un paquete IP con una dirección de broadcast de destino. Si se enviara un paquete UDP a una dirección de broadcast, múltiples hosts podrían responder con errores de "puerto inalcanzable", creando tráfico innecesario en la red.
  • Desde una dirección de origen de broadcast o loopback: No se deben enviar mensajes de error ICMP en respuesta a paquetes con una dirección de origen de broadcast o loopback. Generalmente, los paquetes con estas direcciones de origen son maliciosos y enviar mensajes de error podría llevar a un ataque de denegación de servicio.
  • A fragmentos que no sean el fragmento inicial (offset 0): Solo el fragmento inicial o con offset 0 de un paquete fragmentado debe generar un mensaje de error ICMP. Los fragmentos subsiguientes solo contienen datos, y no tienen el encabezado de protocolo necesario para asociar el error al paquete original.
  • Condiciones temporales: Los mensajes ICMP deben enviarse solo para condiciones no transitorias, es decir, problemas que no es probable que se resuelvan por sí solos. Problemas como corrupción de datos en tránsito no son reportados por ICMP ya que se consideran transitorios y se resuelven si el paquete se envía nuevamente.
  • Paquetes con checksum incorrecto: No se debe enviar un mensaje ICMP de error cuando se recibe un paquete con un checksum incorrecto.

Es importante tener en cuenta que estas condiciones están definidas en el RFC 1122. Estas reglas ayudan a asegurar que los mensajes ICMP se utilicen de manera efectiva y evitar problemas de red.

ICMPv6 

ICMPv6 presenta cambios sustanciales en comparación con ICMP en IPv4. Aquí están las características principales de ICMPv6:

  • Funcionalidades Adicionales: ICMPv6 incluye funcionalidades adicionales como el Protocolo de Descubrimiento de Vecinos (NDP) y funciones de membresía de grupos multicast (MLD).

    • Protocolo de Descubrimiento de Vecinos (NDP): NDP reemplaza a ARP y ofrece funciones para descubrir nodos en la red local, determinar la alcanzabilidad de los nodos y detectar cambios en las direcciones de la capa de enlace. NDP también permite detectar direcciones IP duplicadas en la misma red y posibilita que los hosts soliciten direcciones de routers y que los routers anuncien su presencia.
    • Multicast Listener Discovery (MLD): MLD se incorpora a ICMPv6 para determinar los receptores multicast en un enlace. Las direcciones y funcionalidades multicast se usan más en IPv6 que en IPv4.
  • Cambios en los Tipos de Mensajes: Los valores de tipo de los mensajes ICMP han cambiado significativamente en ICMPv6.

    • Mensajes de error: Tienen valores de tipo entre 0 y 127 y no se deben bloquear.
    • Mensajes informativos: Tienen valores de tipo entre 128 y 255 y pueden bloquearse de manera más segura tanto en la entrada como en la salida.
    • ICMP Echo request: Tipo 128.
    • ICMP Echo reply: Tipo 129.
  • Checksum: A diferencia de ICMP en IPv4, el cálculo de la suma de comprobación en ICMPv6 incluye el pseudo-encabezado. Esto es porque IPv6 no incluye un checksum en el encabezado IP, por lo que se requiere el pseudo-encabezado para el checksum de ICMPv6.

  • Organización de Tipos de Mensajes: Los rangos de tipo están diseñados de tal manera que el bit de orden superior indica si el mensaje es de error (0) o informativo (1).

  • Número de protocolo: ICMPv6 tiene el número de protocolo 58.

En resumen, ICMPv6 no solo mantiene las funciones básicas de ICMP como el reporte de errores y los intercambios de información, sino que también integra nuevas funciones para adaptarse a las necesidades de IPv6. Los cambios más notables son la inclusión de NDP y MLD, la modificación de los tipos de mensajes y el cambio en el cálculo del checksum. Estos cambios hacen que ICMPv6 sea más robusto y funcional en el contexto de las redes IPv6.

No hay comentarios:

Publicar un comentario

Operadores en Python para Ingenieros de Redes: Guia de Estudio (7)

El tipo de dato Booleano (Bullion) en Python: Fue añadido para simplificar la evaluación de condiciones como verdaderas o falsas. Subclase...