Protegiéndonos de MiTM con ArpOn

por | 3 junio, 2025

Creo que hace un rato no hablaba de herramientas que nos ayudan a protegernos de los peligros en las redes, hoy hablaremos de ArpOn

Antes de entrar en detalle me gustaría dar un pequeño recordatorio sobre el protocolo ARP

Que es el protocolo ARP

El protocolo ARP es el encargado de obtener una MAC específica en la red dada la ip, o viceversa, su funcionamiento es bastante simple, solo hace eso, sin embargo es crucial a la hora de poder comunicarnos por la red,

Como puedo ver el impacto de ARP

Fácil, vamos a crear una entrada ARP con una mac que no existe y la vamos a asociar a nuestro gateway y veremos los resultados, les sugiero no hacer este lab y probar refrescando la página. Para esto lo primero que vamos a hacer es obtener la ip de nuestro gateway y luego vamos a cambiar la mac que tiene asociada

En Linux podemos ver nuestro gateway usando el comando

ip route show | awk '/default/ {print $3}'

Para mi caso tengo la ip 192.168.1.1

$ ip route show | awk '/default/ {print $3}'
192.168.1.1

En el caso de que hagan esta prueba, la ip puede cambiar, es normal, lo importante es que la tengan presente

Luego veremos que mac tiene la ip de mi gateway, que en mi caso es la 192.168.1.1, ustedes tienen que obtener la suya con el comando anterior

$ip neighbor show | grep 1.1
192.168.1.1 dev wlp0s20f5 lladdr 15:A1:15:b5:df:70 REACHABLE 

Ahora, con estos datos procedemos a cambiar la mac por una inexistente

#ip neighbor change 192.168.1.1 lladdr 15:A1:15:b5:df:89 dev wlp0s20f5 

En paralelo a este comando, mantuve un ping hacia mi gateway,

$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=2.95 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=2.96 ms
.
.
.
64 bytes from 192.168.1.1: icmp_seq=43 ttl=64 time=2.63 ms
64 bytes from 192.168.1.1: icmp_seq=44 ttl=64 time=2.52 ms
64 bytes from 192.168.1.1: icmp_seq=71 ttl=64 time=0.982 ms
64 bytes from 192.168.1.1: icmp_seq=72 ttl=64 time=12.3 ms
64 bytes from 192.168.1.1: icmp_seq=73 ttl=64 time=18.8 ms
64 bytes from 192.168.1.1: icmp_seq=74 ttl=64 time=24.5 ms
64 bytes from 192.168.1.1: icmp_seq=75 ttl=64 time=3.54 ms
64 bytes from 192.168.1.1: icmp_seq=76 ttl=64 time=13.2 ms
^C
--- 192.168.1.1 ping statistics ---
76 packets transmitted, 50 received, 34.2105% packet loss, time 75451ms
rtt min/avg/max/mdev = 0.637/3.842/24.499/4.287 ms

Como pueden ver en las secuencias, tenemos una pérdida de paquetes, esto es debido al cambio que realizamos, recuperamos la conectividad una vez que deshacemos los cambios con el comando

#ip neighbor del 192.168.1.1 lladdr 15:A1:15:b5:df:89 dev wlp0s20f5

Ahora, es cierto que puede parecer sin importancia ya que soy yo el que modifica esta mac.

Pero pensemos por un minuto que ocurre si en vez de que nuestra máquina aprenda la mac real y aprende una mac de un equipo especialmente preparado para escuchar, guardar y reenviar los datos que viajan desde nuestro equipo. En este escenario por un lado lo más probable es que no tengamos una perdida de conectividad, sin embargo todos nuestros datos podrían ser leídos por el dueño de esa máquina.

Instalación

La instalación es bastante simple ya que el paquete está incluido dentro de los principales repositorios

En Arch

Partimos con la excepción, en arch debemos utilizar los paquetes AUR, en mi caso yay

yay -S arpon-ng

Debian y derivados

apt install arpon

Rhel y derivados

dnf install ArpON

En todos estos casos esta la última versión debido a que el último release fue en 2016.

Compilar desde las fuentes

Si en tu distribución no existe el paquete, lo puedes compilar desde las fuentes como se indica en su documentación

Dependencias

como dependencias tenemos los siguientes paquetes, recuerden que el nombre del paquete puede variar según la distribución que utilicen:

Código fuente

Una vez que tenemos estos paquetes instalados procedemos a descargar el código fuente de ArpON

wget http://sourceforge.net/projects/arpon/files/latest/download -O arpon.tar.gz 

Creamos la carpeta donde estarán todos los archivos del comprimido y procedemos a descomprimir el archivo

mkdir arpon-files
tar -xvzf arpon.tar.gz -C arpon-files --strip-components=1 
cd arpon-files

Una vez dentro tenemos varias opciones, en mi caso instalaré en /opt/arpon/, las opciones adicionales las podemos ver en la documentación

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX="/opt/arpon"
make
sudo make install 

Configuración

Lo primero que debemos tener claro son los modos de operación de ArpON los que son 3:

SARPI

Este es el modo más seguro, pero en su contra es el que requiere condiciones específicas, como que tengamos una configuración de red fija y no utilicemos DHCP, algo muy inusual desde mi perspectiva

DARPI

Esta es la configuración recomendada por el desarrollador en la documentación, sirve para entornos donde si se utilice DHCP

HARPI

Es un híbrido entre SARPI y DARPI, mezcla tanto entradas estáticas como dinámicas

Tabla resumen

Técnica de protecciónModo de ConfiguraciónRecomendado en entornos con DHCPConfiguración adicional en archivo de configuración
SARPI (Static ARP Inspection)EstáticoNoSí (para entradas estáticas en ARP)
DARPI (Dynamic ARP Inspection)DinámicoNo (gestiona dinámicamente las entradas ARP)
HARPI (Hybrid ARP Inspection)Mixto (Estático y Dinámico)Sí (para entradas estáticas en ARP, no para dinámicas)

Crear el servicio de systemd

Lamentablemente, la paquetería viene sin el demonio para administrarlo con systemd por lo que debemos realizar unos pasos adicionales si utilizamos este administrador de servicios

creamos un archivo en /usr/local/lib/systemd/system/arpon.service con el siguiente contenido

[Unit]
Description=Arp handler inspectiON – a portable Arp handler
[Service]
EnvironmentFile=/etc/conf.d/arpon
PIDFile=/var/run/arpon.pid
ExecStart=/sbin/arpon  -q -i $INTERFACE $OPTIONS
ExecReload=/usr/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target

Luego debemos ejecutar el comando que permite refrescar las configuraciones administradas por systemd

systemctl daemon-reload

Luego debemos crear un archivo en /etc/conf.d/arpon, pueden elegir otro directorio de su agrado pero deben considerar hacer el cambio en el archivo anterior para apuntar a la misma ruta. Dentro de este archivo colocamos la interfaz que queremos proteger y las opciones, un ejemplo sería

INTERFACE=enp2s5
OPTIONS=-g -H

Paso alternativo

Si no desean crear el archivo /etc/conf.d/arpon, pueden configurar directamente el servicio systemd que creamos en /usr/local/lib/systemd/system/arpon.service para definir las opciones que necesitamos, para este ejemplo voy a utilizar las mismas opciones anteriores, por lo que el servicio quedaría

[Unit]
Description=Arp handler inspectiON – a portable Arp handler
[Service]
PIDFile=/var/run/arpon.pid
ExecStart=/sbin/arpon  -q -i enp2s5 -g -H
ExecReload=/usr/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target

El servicio lo iniciamos como cualquier otro servicio.

systemctl enable --now arpon

Y con eso ya tendremos un poco más protegido nuestro equipo y la comunicación por red que genera.

Si conocen otra herramienta similar me gustaría probarla y ver la posibilidad de escribir sobre ella, los leo en los comentarios

Deja una respuesta

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