Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

domingo, 19 de junio de 2016

Cómo evitar el "ping de la muerte" en Linux

Este domingo os quiero traer un interesante articulo orientado a la seguridad; específicamente orientado de la seguridad a nivel de red relacionada con el protocolo ICMP. El protocolo ICMP generalmente está relacionado con los pings, pings que generalmente se usan para  saber si un destino es accesible. La acción del ping en sí no es dañina, pues su objetivo es únicamente conocer si efectivamente se encuentra un destino disponible (online) o no. Aún así, toda tecnología puede ser de doble filo, y una acción tan simple como un ping, puede resultar fatal. Dicho ping tan destructivo es popularmente conocido como ping de la muerte, un ping que funcionaría como un ataque de denegación de servicio por ICMP...


¿Pero en qué consiste dicho ataque? Generalmente un ping "común" tiene un tamaño de 32 bytes, un ping que el receptor de éste no tiene problema alguno para gestionar... ¿Pero qué ocurre cuando se reciben muchos pings de un tamaño superior al standard y en una gran cantidad?  Se produciría uno de los famosos ataques de denegación de servicio (DoS), haciendo que muchos servicios de red se caigan o no respondan a la velocidad que quieren. Una de las "cualidades" que tiene este ataque es que no requiere instalar ninguna herramienta "especial". Simplemente requiere usar la herramienta ping, pero de una forma ligeramente distinta de la habitual.

Esta prueba esta hecha realizada en una distribución Linux, si bien supongo que con Windows también será posible... Para ello usaremos ping con unos parámetros "especiales"; la sintaxis de uso de un "ping de la muerte" sería la siguiente:

ping $ip -l 65535 -n 1000000 -w 0.00001

Para entender lo que dice este comando, habría que entender qué hace cada parámetro:

  • -l: Se indica el tamaño del paquete en bytes. En caso de poner nada el tamaño sería de 32 bytes, pero se puede poner un tamaño distinto. El valor máximo admitido por el comando sería 65535 bytes, con lo cual usaríamos dicho tamaño.
  • -n: Gracias a este parámetro podemos poner el número de paquetes que queremos enviar. Podríamos haber usado el parámetro -t para que el ping fuese infinito, pero en este caso he optado por poner un número de paquetes muy alto, pero limitado. Por ejemplo, en el comando anterior he puesto que se envíen un millón de paquetes.
  • -w: Con este parámetro especificaríamos el tiempo de respuesta que se quiere tener por parte del receptor de este ping. Es decir, el tiempo de respuesta desde el envío del paquete ping, hasta el retorno de la respuesta. La base principal de todo ataque de denegación es enviar muchos paquetes muy rápido, con lo que a menor el tiempo de respuesta, mayor la cantidad de paquetes que podemos enviar en poco tiempo... Es por ello que intentaremos poner un tiempo de respuesta lo más bajo posible; en este caso 0,00001.

El comando ping debería ser enviado como root, para no tener ningún tipo de problema, con lo cual se podría lograr realizar con éxito el ataque en cuestión, a menos que obviamente se tomen medidas al respecto. 

Las medidas a tomar al respecto, para que un servidor (o un pc de escritorio con Linux) no sea victima de un ataque de DoS mediante ICMP, serían aquellas basadas en el control del tráfico entrante de dicho protocolo ; medidas que pueden ser tomadas de varias formas; algunas más drásticas que otras, pero medidas. La primera medida sería el bloqueo total del protocolo entrante ICMP en el servidor, lo cual se puede lograr de dos formas. La primer sería cambiando un parámetro a nivel de kernel, llamado icmp_echo_ignore_all. Esto se consigue añadiendo esta línea al parámetro /etc/sysctl.conf.

net.ipv4.icmp_echo_ignore_all=1

En vez de modificar el kernel, podemos optar por crear un cortafuegos, o modificar el ya existente para que bloquee todo el tráfico entrante ICMP; lo cual se resumiría un una pequeña línea de iptables.

iptables -A INPUT -p -j DROP

Otra opción es ser un poco más flexibles y optar por un filtro más cómodo. Capar por completo el protocolo ICMP es una solución muy efectiva, pero dicha barrera puede resultar un impedimento en algunas ocasiones... La imposibilidad hacerle un ping o la imposibilidad de poder efectuar algunas tareas que requieran del protocolo icmp, puede ser muy molesto; es por ello que en vez de optar por bloquearlo del todo, lo que podemos hacer es limitar dicho protocolo para que únicamente sea recibido un paquete por segundo (mitigando en gran manera el ataque DoS). Esta medida haría que el servidor estuviese seguro y, al mismo tiempo, poco restrictivo, lo cual se lograría añadiendo estas dos líneas a nuestro cortafuegos.

  1. iptables -A INPUT -p icmp -m icmp -m limit --limit 1/second -j ACCEPT
  2. iptables -A INPUT -p icmp -j DROP

Gracias a estas medidas, sea cual sea la que escojamos, tendremos un servidor mucho más seguro, y si bien obviamente existen multitud de ataques de DoS, que usan otros protocolos que no están basados en ICMP, gracias a esta medida tendremos una preocupación menos con respecto a la seguridad de nuestro servidor.

Espero que os haya resultado útil.

Saludos.

No hay comentarios :

Publicar un comentario