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:
- GNU Binutils
- GNU C Compiler (GCC)
- Cmake 2.6 (o superior)
- GNU Make
- GNU C Library (Glibc) with POSIX Threads (Pthreads)
- GNU C Library (Glibc) with Realtime Extensions (Librt)
- Libpcap with development libraries 1.0.0 (o superior)
- Libnet1 with development libraries 1.1.2.1 (o superior)
- Libdnet with development libraries 1.11 (o superior)
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ón | Modo de Configuración | Recomendado en entornos con DHCP | Configuración adicional en archivo de configuración |
---|---|---|---|
SARPI (Static ARP Inspection) | Estático | No | Sí (para entradas estáticas en ARP) |
DARPI (Dynamic ARP Inspection) | Dinámico | Sí | No (gestiona dinámicamente las entradas ARP) |
HARPI (Hybrid ARP Inspection) | Mixto (Estático y Dinámico) | Sí | 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