Bloquear respuestas ICMP – echo reply

Para ilustrar el ejemplo de como bloquear es bueno conocer antes como funciona un poco el subprotocolo encapsulado en IP ICMP. Para ilustrarlo he optado por scapy.

En debian se puede instalar así:

 

# apt-get install scapy

 

Abrimos nuestro editor de textos favorito (nano por ejemplo o vim o joe o emacs o el que te de la real gana) y creamos un archivo. Yo voy a usar GNU nano ya que tiene poco prestigio pero tu puedes usar otro editor con el que te sientas más cómodo/a.

Creamos un archivo llamado: echo_request.py

 

$ nano echo_request.py

 

Con este contenido:

 

from scapy.all import *
import sys

ip_target = "37.228.132.136"
data = "hola mundo"
ip = IP()
icmp = ICMP()
ip.dst = ip_target
icmp.type = 8
icmp.code = 0
sr(ip/icmp/data)

 

Cambiamos esa IP del target por la de la maquina que queremos que no responda a PING. Aunque inicialmente queremos que si lo haga claro.

El motivo de importar scapy de esa forma es para poder usarlo tal y como lo usaríamos en su propio interprete pero desde python.
El icmp.type e icmp.code los podemos obtener del RFC correspondiente que define el protocolo pero creo se ve aquí bien:

 

Type	Name					Reference
----	-------------------------		---------
  0	Echo Reply				 [RFC792]
  1	Unassigned				    [JBP]
  2	Unassigned				    [JBP]
  3	Destination Unreachable			 [RFC792]
  4	Source Quench			 	 [RFC792]
  5	Redirect				 [RFC792]
  6	Alternate Host Address			    [JBP]
  7	Unassigned				    [JBP]
  8	Echo					 [RFC792]
  9	Router Advertisement			[RFC1256]
 10	Router Selection			[RFC1256]
 11	Time Exceeded				 [RFC792]
 12	Parameter Problem			 [RFC792]
 13	Timestamp				 [RFC792]
 14	Timestamp Reply				 [RFC792]
 15	Information Request			 [RFC792]
 16	Information Reply			 [RFC792]
 17	Address Mask Request                     [RFC950]
 18	Address Mask Reply			 [RFC950]
 19	Reserved (for Security)			   [Solo]
 20-29	Reserved (for Robustness Experiment)	    [ZSu]
 30	Traceroute				[RFC1393]
 31	Datagram Conversion Error		[RFC1475]
 32     Mobile Host Redirect              [David Johnson]
 33     IPv6 Where-Are-You                 [Bill Simpson]
 34     IPv6 I-Am-Here                     [Bill Simpson]
 35     Mobile Registration Request        [Bill Simpson]
 36     Mobile Registration Reply          [Bill Simpson]
 37     Domain Name Request                     [Simpson]
 38     Domain Name Reply                       [Simpson]
 39     SKIP                                    [Markson]
 40     Photuris                                [Simpson]
 41-255 Reserved				    [JBP]

 

Para la petición especificamos el 8 y para la respuesta el type 0 (aunque la respuesta nos va a dar lo mismo ya que vamos a bloquear directamente icmp type 8 de entrada)

Nos conectamos a la maquina de la IP que hemos especificado. Allí instalamos ngrep y tcpdump así por ejemplo si es una debian o derivada:

 

# apt-get install ngrep tcpdump

 

En nuestra maquina tenemos el script python que tira de scapy que será el que mandará la petición ICMP echo request o echo a secas (type 8).
Tendremos en otra terminal abierto tcpdump con este comando en nuestra maquina:

 

# tcpdump -nni eth0 -e icmp[icmptype] == 0 -vv

y con ngrep también en nuestra maquina en otra terminal:

 

# ngrep -d eth0 -q '.' 'icmp'

Donde eth0 lo cambias por tu interface.

 

En la maquina que va a llegarle la petición (la que hemos especificado en el target) hacemos lo mismo con la interface de red adecuada:

# tcpdump -nni venet0 -e icmp[icmptype] == 8 -vv
# ngrep -d venet0 -q '.' 'icmp'

En dos terminales a ser posible. De ese modo ya podemos mandar la petición que hemos creado.

 

$ python echo _request.py

 

Y veremos como funciona el tinglado. veremos como llegan las peticiones echo request y como llegan las echo reply con el contenido que hemos metido.

 

Ante eso solo queda que en la maquina target metamos una regla de iptables:

 

# iptables -A OUTPUT -p icmp -o venet0 -j DROP

 

Cambiando vnet0 por tu interface claro.

 

Con eso si probamos de nuevo no tendría que llegar petición a quien la solicita, es decir, mandan un echo request y no obtienen un echo reply.

Fin de la historia.

 

¿Le ha gustado el contenido?

Si le ha gustado y le ha sido de utilidad puede donar aquí https://paypal.me/mierdatv .  
También puede escribir un comentario si lo considera oportuno.  
 

Comentarios 2

  • ¿Para qué alguien querría bloquear un echo ICMP? ICMP es un protocolo que sirve para controlar el buen funcionamiento de la red. Si tienes un equipo conectado a Internet no es recomendable bloquear ICMP y si tienes un equipo en casa… El propio router con la NAT te está bloqueando cualquier ICMP. En definitiva un echo ICMP solo va a decir que en esa IP tiene una interfaz de red asignada pero ni mucho menos sería la única forma de saber si existe algo detrás de esa IP (y de hecho no sería lo más eficiente, yo por ejemplo lo haría usando el protocolo ARP, de nivel inferior, encargado de la traducción IP a MAC), así que como excusa de privacidad tampoco es útil bloquear el echo ICMP.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *