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?
- Primero hace un scan en la subred donde se ejecute y detecta los hosts vivos (las IPs activas)
- 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.
- 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.
- 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
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í
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}
Buen tip, aunque requiere de root obligatoriamente.
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.
o mejor aun
echo «test» > /dev/tcp/www.google.com/80
si da error el puerto(80) esta cerrado
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.
Ese script bash es tremendamente inspirador.
Muy entendible el script y muy bueno ademas, gracias me dio buenas ideas, Saludos
estaría buenísimo si lo pusieses en GITHUB, así todos colaboraríamos ahi.
Gracias por compartirlo!
Saludos
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.
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.
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….
Gracias por compartir el script, tendré que hacerle algunas modificaciones pero básicamente es lo que estaba buscando, nuevamente se agradece. Saludos
Justo lo que buscaba, porque necesito que mi raspberry detecte cuando mi teléfono se conecta al wifi para ejecutar otro Bash.
Muchas gracias