Script Bash: Comparar MAC de todos los equipos de una red con una específica

Aquí les hablaré de un script en bash que hice para una finalidad muy específica, que dudo que otros tengan esta situación pero, ya que lo programé… no me cuesta nada compartirlo 🙂

Arriba, ¿de qué va esto?

Sucede que en mi ciudad hay una red bastante grande, muchos nos conectamos de forma cableada (un cable de red a un switch, enlazado a otro, ya sí muchos switches jeje), pero los enlaces grandes (que no pueden ser por cable) se hacen con equipos wifi, de esta forma se tiene una red con varios miles de usuarios, que si bien no hay servicio de correo ni muchísimo menos internet, sí se juega WoW (entre otros), se aprende, comparte información, etc.

El caso es que se ha dado el caso de que se banea o expulsa de la red a determinado equipo wifi, bien porque su dueño incumple normas de la red, o por lo que sea. Entonces, se hace necesario hacer un scan cada X tiempo para revisar si la MAC del equipo expulsado alguien lo ha vuelto a conectar, y aquí es donde entra este script.

De forma simple, ¿qué hace el script?

  1. Primero hace un scan en la subred donde se ejecute y detecta los hosts vivos (las IPs activas)
  2. Luego, revisa si alguna de esas IPs es un Ubiquiti (equipos que se usan para los enlaces). En realidad solo detecta si el puerto 443 está abierto en cada una de las IPs anteriores.
  3. Saca la MAC de cada equipo vivo y con el puerto 443 abierto, mientras que al mismo tiempo va comparando cada MAC extraída con la que se busca.
  4. En caso de que encuentre una coincidencia, genera un reporte.

Venga, al code!

Válido aclarar que para su funcionamiento necesita los siguientes paquetes instalados: nmap … nc … arping

Pues con nmap hace el mapeo para detectar IPs activas, con nc luego comprueba cuál tiene el puerto 443 abierto, y finalmente con arping extrae la MAC.

Sí, sé que con nmap se puede hacer todo esto, pero demoraba varios segundos (o minutos más), preferí usar varias herramientas en vez de solo una para que funcione todo más rápido.

Ahora sí…. el code!

#!/bin/bash
#
# Requiere tener instalados los paquetes:
#  nmap , arping , nc
#
# Author: KZKG^Gaara

clear

# Declarando variables
DATE=`date +'%Y-%m-%d_%H-%M'`
INTERFAZ='wlo1'
WANTEDMAC='C8:CB:B8:B1:DA:E6'
YOURIP=`ifconfig | grep "192.168" | awk '{print $2}'`
YOURZONE=`echo $YOURIP | awk -F "." '{print $3}'`

# Sacando los Hosts Alive en la red (su IP)
nmap -sn 192.168.$YOURZONE.0/24 | grep "report for" | awk '{print $5}' > hosts-ip

# Viendo cuales de esos Hosts pueden ser un Nano al tener el puerto 443 abierto
rm hosts-nanos &> /dev/null
for TMPVAR in `cat hosts-ip`
do
    nc -zv -w 2 $TMPVAR 443 &> /dev/null
    if [ $? -ne 1 ]; then
        echo "$TMPVAR" >> hosts-nanos
    fi
done

# Sacando MAC de Nanos en la red
rm hosts-mac &> /dev/null
for TMPVAR in `cat hosts-nanos`
do
    arping -I $INTERFAZ -f $TMPVAR | grep "reply from" | awk '{print $5}' | cut -d'[' -f2 | cut -d']' -f1 >> hosts-mac
done

# Comparando MACs extraidas con la buscada
for MAC in `cat hosts-mac`
do
    if [ "$MAC" = "$WANTEDMAC" ]; then
        MACLINE=`cat hosts-mac | grep -n $MAC | cut -d':' -f1`
        IPMAC=`cat hosts-nanos | sed $MACLINE'q;d'`
        echo -e "\n\t ALERTA, MAC de equipo robado detectada: $MAC ... Con IP: $IPMAC"
        echo -e "\t ... Generando Reporte ..."
        echo -e "Reporte generado por SpyMac\n"  > final_report_$YOURZONE.info
        echo -e "Momento del reporte: $DATE\n" >> final_report_$YOURZONE.info
        echo -e "MAC de equipo robado detectada: $WANTEDMAC\n" >> final_report_$YOURZONE.info
        echo -e "IP que usa actualmente ese equipo: $IPMAC\n" >> final_report_$YOURZONE.info
        echo -e "Reporte generado por: $YOURIP\n" >> final_report_$YOURZONE.info
    fi
done

exit

En caso de que se encuentre una coincidencia, nos mostrará la MAC encontrada y además, la IP que usa ese equipo.

Esto (aún) tiene lagunas jeje

server

Sé que hay cosas que mejorar, por ejemplo las MACs se pueden falsear, se le puede cambiar la MAC al equipo y listo, aún estoy buscando cómo ver la MAC real y no la falsa si se da el caso.

También, agregando otro ciclo for puedo hacer que se comparen varias MACs al mismo tiempo y no comparar/buscar solo una en específico, o sea, que se busquen las MACs que estén en un listado, 5, 10, las que sean. Es algo que tengo por hacer aún.

A lo mejor es un Nano pero tiene el puerto 443 bloqueado, sé cómo poder con total seguridad saber si es un equipo Ubiquiti o no, o sea con curl (o wget) puedo sacar el formulario de login y compararlo con uno de un Ubiquiti, este es un método más seguro que con el puerto 443. Es otro detalle a agregar en futuras versiones.

También me gustaría (cosa que ya sí me resultará difícil) generar un pequeño script o inclusive un APK para tener esta herramienta en mi Android. Sé que no podré ponerla en el Play Store pero…. bueh, tampoco es que quiera 😀

Ah, los usuarios de iPhone… ni aunque pueda (por conocimientos y tiempo) portaría esta herramienta a iOS … JUAZ JUAZ JUAZ … busquen en su App Store a ver si de casualidad tienen algo parecido, cosa que dudo 😀

Fin

Bueno es todo. Repito, creo que el script en específico tal vez no les sea de utilidad a muchos (es para una situación bastante específica), pero tal vez partes del code sí, ojalá y sea así 😀


Deja tu comentario

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

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   angelblade dijo

    Con nmap puedes obtener las MAC ADDRESS sin requerír hacer ese mapeo de ips y esa verificación con nc y ese uso de arping

    la opción es -PR

    algo así
    sudo nmap -sn IpAddress/netmask -PR | grep MAC | awk ‘{print $3}

    1.    eliotime3000 dijo

      Buen tip, aunque requiere de root obligatoriamente.

  2.   daryo dijo

    por lo general bash es bastante ilegible a menos que sea uno mismo el que hizo el script . pero tus codigos si son comprensibles xD

    otra cosa que puedes hacer es un simple ping a las diferentes ip luego miras las tablas arp con el comando arp -a(en algunos casos hay que instalar net tools) y queda guardada las direcciones mac a las que se les hizo ping creo que es la solucion mas rapida.

  3.   daryo dijo

    o mejor aun
    echo «test» > /dev/tcp/www.google.com/80
    si da error el puerto(80) esta cerrado

  4.   Mario dijo

    Hola, podrias implementar SNMP para poder identificar temas como que tipo de equipo es, que marca, que capacidades posee, tambien puede ser la respuesta al caso una MAC cambiada o virtual; incluso puedes llegar a «administrar» si la conf. del servicio snmp es floja. Solo una opinion, abriendo el abanico de posibilidades de tu script. Muy bueno el Blog, me alegro de haberlos encontrado, los leo seguido! abrazo.

  5.   Frank Alexander dijo

    Ese script bash es tremendamente inspirador.

  6.   firecold dijo

    Muy entendible el script y muy bueno ademas, gracias me dio buenas ideas, Saludos

  7.   Pegasusonline dijo

    estaría buenísimo si lo pusieses en GITHUB, así todos colaboraríamos ahi.

    Gracias por compartirlo!
    Saludos

  8.   Luciano Lagassa dijo

    hola, muy bueno tu script bash, por mi parte te recomiendo que para mejorar la seguridad podrian implementar un metodo de autenficación, como los wisp, para asi poder evitar que ingresen usuarios no autorizados o expulsados. hay mucho softeware que pueden utilizar.

  9.   dhunter dijo

    Al falsear una mac lo que se hace es enviar la mac falsa en los paquetes (layer 2 OSI), no puedes descubrir la real a menos que se le reinicie la tarjeta de red al atacante.

  10.   alexander seijas dijo

    me interesa tu script… bueno he estado buscando uno un poco mas complejo o quizas sencillo..

    la cosas es que tengo una red grande de 250 maquinas y existen puntos wifi pero compraten la misma trama…

    sabras como podria hacer que una mac se compare con una ip y que previamente deberia estar declarada, asi cuando hay un gracioso que se cambia la ip tener una alerte de que no coinciden la ip y la mac..

    espero haberme explicado….

    aun que he buscado por todos lados no encuentro nada sobre eso….

  11.   Hotmail dijo

    Gracias por compartir el script, tendré que hacerle algunas modificaciones pero básicamente es lo que estaba buscando, nuevamente se agradece. Saludos

  12.   Isidoro dijo

    Justo lo que buscaba, porque necesito que mi raspberry detecte cuando mi teléfono se conecta al wifi para ejecutar otro Bash.
    Muchas gracias