cómo obtener una dirección IP a partir de una dirección MAC?
A veces es necesario obtener una dirección IP a partir de una dirección MAC. Por ejemplo, si estamos monitoreando nuestra red local y nos encontramos con tráfico de protocolos por debajo de la capa de red o tráfico IPv6.


Utilizando Wireshark es posible obtener todos los paquetes que tienen la dirección MAC determinada mediante el filtro eth.src==MACADDR. Si el host que posee la MAC envió tráfico IP podremos determinar la dirección IP inspeccionando los paquetes filtrados.
También es posible consultar la caché ARP para ver si existe una entrada con la dirección MAC.
Si se utiliza DHCP dentro del segmento y tenemos acceso al servidor DHCP, es posible determinar la dirección IP consultando la asignación de leases.
Pero si no hay una entrada con la dirección MAC correspondiente dentro de la caché ARP y no tenemos acceso al servidor DHCP, podemos realizar fuerza bruta sobre todas las direcciones IP dentro del segmento de red para encontrar la IP buscada.

El siguiente script bash busca la dirección IP correpondiente con una dirección MAC utilizando fuerza bruta sobre el rango de direcciones IP especificado. Básicamente lo que hace es un pedido ARP para cada IP del rango, si la MAC obtenida coincide con la MAC suministrada hemos encontrado la dirección IP correspondiente. El pedido de ARP se puede hacer de varias formas. Por ejemplo, es posible forzarlo enviando un paquete de una capa superior, como un ICMP echo request, y luego consultar la caché ARP y buscar la MAC deseada para obtener la IP correspondiente. También es posible utilizar directamente la herramienta arping utilizando cada dirección IP como parámetro.

#!/bin/bash

START_IP=192.168.0.1
END_IP=192.168.0.254

if [ $# -lt 2 ]
then
echo "usage: $0 <mac-addr> <start-ip> <end-ip>"
exit -1
fi

MAC_ADDR=$1
START_IP=$2
END_IP=$3

IP=(${START_IP//./ })
IP_FIN=(${END_IP//./ })

timestamp=$( date +"%s" )

echo -n "Scan progress"

for (( A=${IP[0]}; A<=${IP_FIN[0]}; A++ ))
do
for (( B=${IP[1]}; B<=${IP_FIN[1]}; B++ ))
do
for (( C=${IP[2]}; C<=${IP_FIN[2]}; C++ ))
do
for (( D=( ${IP[3]} ); D<=${IP_FIN[3]}; D++ ))
do
IP_ADDR="$A.$B.$C.$D"
echo -n "."
#ARPING_OUT=$( arping -c 1 $IP_ADDR 2> /dev/null )
ping -c 1 $IP_ADDR &> /dev/null
ARP_OUT=$( arp -n | grep -i $MAC_ADDR )
#if [[ "$ARPING_OUT" =~ $MAC_ADDR ]]
if [[ "$ARP_OUT" =~ $MAC_ADDR ]]
then
echo ""
echo $ARP_OUT
IP_FIN[0]=$A
IP_FIN[1]=$B
IP_FIN[2]=$C
IP_FIN[3]=$D
fi
done
done
done
done

endtimestamp=$( date +"%s" )
scantime=$(( endtimestamp - timestamp ))
echo ""
echo "Done ($scantime seconds)"

Ahora veamos el script en acción:

1 comentarios:

Jorge Lopez dijo...

gracias......es lo único que me soluciono el problema

Publicar un comentario