Script en Bash para prevenir ataques MITM por ARP Spoofing

a

Hace poco, para el penultimo proyecto de FP, hice este script para preevenir ataques Man In The Middle por ARP Spoofing, éste muy utilizado para hacer sniffing de paquetes de datos, consiste en enviarle un paquete ARP REPLY a la víctima indicando que el Gateway, por ejemplo, tiene  “X” dirección MAC, donde esa MAC es la del equipo atacante.

Quizá antes deberiamos aclarar que en las redes de área local, los paquetes se guían a través de sus direcciones MAC, Capa de enlace de datos, subcapa MAC, del Modelo OSI; entonces, en practica cuando un equipo tiene la IP destino de un equipo, pero no tiene su MAC almacenada, utiliza el protocolo ARP y envia una petición ARP REQUEST a todos los equipos de la red local, estableciendo en el campo, “Direccion de destino” de la trama, la MAC: ff-ff-ff-ff-ff-ff, es decir, la MAC BROADCAST, y preguntando por el equipo que tiene “Y” dirección IP, a esta peticion/solicitud solo responderá el equipo con la dirección IP que se solicita, éste responderá con un paquete ARP REPLY, indicando en su contenido su dirección MAC. Haciendo una breve analogía podríamos decir que su contenido sería: “Oye que la dirección IP ‘Y’ que estas buscando es mia, aqui te envio mi direccion MAC”.

El equipo solicitante guarda la dirección MAC y crea una relación Dirección IP –> MAC en la tabla ARP, la próxima vez que un paquete tenga como destino dicha dirección IP enviará el paquete hacia la dirección MAC en cuestión. El problema es que no se necesita un ARP REQUEST para enviar un ARP REPLY, y esto es lo que se consigue con un ataque ARP Spoofing, falsificar una dirección MAC, por ejemplo, la del Gateway, haciendole creer al equipo victima que la dirección MAC del Gateway es la del equipo atacante.

Este script, en concreto, una vez iniciado, permanece activo, comparando en un bucle infinito que la dirección MAC inicial del gateway, no sea diferente de la que comprueba en cada ‘vuelta’ del ciclo. También esta creado para que detecte una duplicación de MAC en la tabla ARP y de esta forma sea capaz de extraer la dirección del equipo atacante. Cuando detecta un ataque MITM baja las interfaces de red y para los servicios de red para evitar el sniffing de los paquetes.

Nota: el script ha sido modificado. La ultima versión en mi Github, aquí:

#!/bin/bash
function watchspoofing() {
MACINI=`arp | egrep -w $1 | awk '{print $3}' 2> /dev/null` #comprueba la tabla ARP y extrae la mac del gateway que le ha sido pasado por parametro
CNET=`arp | egrep -w $1 | awk '{print $5}' 2> /dev/null` #extrae la tarjeta de red por la cual esta conectado al dispositivo pasado en el parametro posicional $1
echo "Conectado al Router con dirección MAC: $MACINI, mediante $CNET"
echo "[OK] SpoofProtection ACTIVADO."
while true; do #mantiene el script vivo
MACFIN=`arp | egrep -w $1 | tail -1 | awk '{print $3}' 2> /dev/null` #extrae nuevamente la mac del gateway
if [ $MACINI != $MACFIN ] && [ $(arp | egrep $MACFIN | wc -l ) -gt 1 ]; then #compara la mac del gateway inicial con la mac que extrae en cada secuencia del ciclo while
MACDUPL=`arp | egrep -vw $1 | egrep -w $MACFIN | awk '{print $1}' 2> /dev/null` #extrae la dirección IP del dispositivo que esta realizando el ataque ARP
echo "[+] ALERTA: duplicación de la MAC detectado en la tabla ARP, ¡posible ataque MITM!"
echo "[+] Bajando interfaz $CNET para prevenir sniffing de paquetes de datos"
echo "[+] El presunto atacante es el host con la IP: $MACDUPL"
sudo ifdown $CNET 2> /dev/null #baja la tarjeta de red
sudo service networking stop || /etc/init.d/networking stop 2> /dev/null # detiene el servicio de red, si no existe el programa service, detiene el servicio desde init.d
read -p "Desea prevenir futuros ataques MITM por ARP Spoofing (s|n): " RESP1
case $RESP1 in
s|S)
read -p "Escriba las direcciones IP: " DIRCS
for ip in $DIRCS; do
read -p "Escriba la dirección MAC de $ip: " MACS
echo "Estableciendo entradas estaticas en la tabla ARP para $ip ..."
sleep 1
sudo arp -s $ip $MACS 2> /dev/null # establece entradas en la tabla ARP como estáticas, por tanto no se puede cambiar mediante paquetes ARP REQUEST
done
echo "Estos valores no permaneceran una vez reiniciado el equipo"
;;
n|N)
echo "Saliendo..."
exit 2
;;
*)
echo "Opción desconocida..."
exit 1
;;
esac
fi
done
;;
esac
fi
}
if [ $# -ne 1 ]; then #si el número de parámetros es diferente de 1
echo "Uso: `basename $0` [ | -m ]" #basename 0, hace referencia al nombre del script
exit 1
elif [ $1 != "-m" ]; then #si el parametro posicional $1 es diferente de m
watchspoofing "$1"
else
echo "Bienvenido a SpoofProtection"
echo -ne "1)Activar SpoofProtection \n2)Prevenir ataques MITM \nElija una opcion: "; read OPCION
case $OPCION in
1)
read -p "Escriba la dirección IP: " DIRIP
echo "RECOMENDACIÓN: CTRL+Z detiene el proceso, despues escriba bg en el terminal y lo establecerá en segundo plano."
watchspoofing "$DIRIP" # llama la funcion principal pasandole el parametro $DIRIP
;;
2)
read -p "Escriba las direcciones IP: " DIRCS
for ip in $DIRCS; do
read -p "Escriba la dirección MAC de $ip: " MACS
echo "Estableciendo entradas estaticas en la tabla ARP para $ip ..."
sleep 1
sudo arp -s $ip $MACS 2> /dev/null #establece entrada estatica en la tabla arp
done
;;
esac
fi

2 comentarios sobre “Script en Bash para prevenir ataques MITM por ARP Spoofing

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s