Más de 12 años en Internet
->No hagas click en esta frase.

15 febrero, 2012

Sacando las direcciones MAC de una red local

En ocasiones nos resulta util investigar la dirección MAC de nuestros equipos de red. Una opción es conectarse a cada máquina una a una (ya sea físicamente como en remoto) y realizar el ifconfig de turno, pero esto puede resultar bastante exasperante y costoso. Otra es conectarse al router y sacar un listado de los equipos registrados... no obstante existe la probabilidad de que no tengamos sus claves de acceso o bien que no sepamos utilizar su entorno de configuración.

Otra forma es hacer uso del comando arp, el cual te permite conocer la dirección física (MAC) de los intermediarios involucrados en todas tus conexiones activas. 

sebas@Macbook:~$ arp -n
Dirección                TipoHW  DirecciónHW         Indic Máscara         Interfaz
192.168.0.17            ether   00:0c:30:21:98:e6   C                     eth0
Para ello, siempre que quieras saber la dirección MAC de una máquina concreta, tendrás que forzar una conexión contra ella. Una forma sutil, e inofensiva, de conseguir eso es realizando un simple ping. Es decir, puedes hacer un ping a una dirección local y luego hacer uso de arp para conocer su dirección MAC (partiendo desde la premisa de que la máquina remota no bloquea estas peticiones).

En mi caso he realizado el siguiente script que me permite analizar de forma rápida todas las direcciones MAC de una red local:
#!/bin/bash 
#Variables
max_ping_tries=2
from_host=1
to_host=254
local_network="192.168.0" 
#Rock 'n' roll
echo "Start"
for host_number in `seq ${from_host} ${to_host}`
do
for try_ping in `seq 1 ${max_ping_tries}`
do
ping -c 1 -W 1 ${local_network}.${host_number} >/dev/null 2>/dev/null
if [ $? -eq 0 ]
then
result=`arp -n | awk  -v ip_host="${local_network}.${host_number}" '$1==ip_host'`
if [ ! "${result}" ]
then
echo "Can not scan MAC address for ${local_network}.${host_number}, but it responses to ping"
else
echo ${result}
fi
break
fi
if [ ${try_ping} -eq ${max_ping_tries} ]
then
echo "${local_network}.${host_number} no responses to ping"
fi
done
done
echo "End"
Al ser comandos genéricos de Unix, este script debería funcionar tanto en GNU/Linux como en Mac OS X. Aún así, en la práctica el script falla en Mac OS por culpa del parámetro "-n" del arp. Para solventarlo hay que modificar esa línea:
result=`arp -n | awk  -v ip_host="${local_network}.${host_number}" '$1==ip_host'`
por esta otra:
result=`arp -n ${local_network}.${host_number}` 

2 comentarios:

  1. Hola, interesante script. Se la enorme utilidad que tiene, pero reconozco que los lenguajes de programacion son de lo poco que escapa a mi comprension, y eso que fui de los privilegiados de mi generación que en el colegio pude estudiar BASIC, pero... :-).
    Una duda, creo acordarme que en ubuntu y otros linux es posible cambiar el MAC, ¿no sería buena idea hacerlo por sistema para aumentar el anonimato al navegar por internet?

    ResponderEliminar
  2. Sí, tienes razón, se puede hacer. Por ejemplo desde una Ubuntu resulta muy sencillo, se puede hacer buscando el parámetro "clonar MAC" editando la configuración de red.

    Por si te interesa ese tema, también puedes crearte una máquina virtual (VMWare, VirtualBox...), la cual (con la opción NAT desactivada) te permite crear falsas tarjetas de red virtuales (asignandolas a ip's de tu red local). Con esa opción puedes tener un Windows o un Mac OS X con una dirección MAC inventada. Claro que el rendimiento de una máquina virtual no es tan potente como el de una máquina real... vamos, que no sería aconsejable para el día a día.

    De todas formas, yo entiendo que las fuerzas del estado no suelen darle tanta importancia a las MAC (salvo en casos de robos de videoconsolas). Lo que suelen hacer es identificar por IP y por tramo horario. Esto lo hacen porque por ley las ISP (ONO, Telefónica, ect...) están obligados a tener un registro de las ip's que está empleando cada cliente en cada momento. Eso sí, tengo entendido que por ley de protección de datos ese registro debe contener información inferior a un año. De esta forma pueden ir a casa de fulanito y decirle "alguien en tu casa ha hecho cosas malas", sin necesidad de conocer la MAC.

    ResponderEliminar