
En el direccionamiento IPv6 es más difícil localizar hosts dentro de una red, debido a que el rango para estos es muy alto en comparación a IPv4. Los hosts pueden obtener su dirección mediante el proceso SLAAC (Stateless Address Autoconfiguration), como ya comente aquí en una entrada anterior, el método SLAAC se puede derivar en dos partes:
- SLAAC Solo: donde el host solicita mediante un paquete RS parte de la información del direccionamiento como: prefijo, duración del prefijo ( /64 por ejemplo) y la información del Gateway. En este método el router no proporciona la porción de la parte de host, esto sería con el método SLAAC+DHCPv6, o solo DHCPv6. La parte restante de la dirección IPv6 se obtiene mediante el proceso EUI-64, en el que se realiza la siguiente operación:
- Se toma la dirección MAC de la interfaz.
- El primer grupo de la dirección MAC se pasa a binario.
- El séptimo bit menos significativo, se cambia a 1 si es 0, y viceversa.
- Se divide la mac en dos y se inserta en medio dos hextetos FFFE.
- Se obtiene la porción restante de la IPv6
- SLAAC+DHCPv6: como dije en el punto anterior se utiliza el mismo procedimiento pero la porción restante de la IP se obtiene por DHCPv6, no mediante EUI-64.

Si entramos en una red en la que no podemos localizar los hosts en IPv6, podríamos por lo menos localizar su dirección IPv6 de Enlace Local, esto lo haríamos esnifando tráfico de la red con tcpdump y posteriormente pasandole el archivo con los datos esnifados al script, este se encargaría de buscar todas las direcciones MAC en el archivo y realizarles el proceso EUI-64, pasando el primer hexteto a binario, cambiando el bit menos significativo a 0 si es 1 y viceversa, volviendo a pasar a hexadecimal dicho valor y finalmente añadiendo fe80:: (direcciones IPv6 de enlace local) al inicio y ff:fe en medio de la dirección mac, además el script comprobará el estado de las direcciones, para saber si los hosts están UP o DOWN.
Nota: el script ha sido modificado, ahora se encuentra en mi github, aquí.
# -*- coding: UTF-8 -*- # - EUI 64 Discover import os, commands as cmd filename = "eui64discoverdump" os.system("echo ' ________ ___________ __ __ ____ _________ __________ _ ____________'") os.system("echo ' / ____/ / / / _/ ___// // / / __ \/ _/ ___// ____/ __ \ | / / ____/ __ \'") os.system("echo ' / __/ / / / // // __ \/ // /_ / / / // / \__ \/ / / / / / | / / __/ / /_/ /'") os.system("echo ' / /___/ /_/ // // /_/ /__ __/ / /_/ // / ___/ / /___/ /_/ /| |/ / /___/ _, _/'") os.system("echo '/_____/\____/___/\____/ /_/ /_____/___//____/\____/\____/ |___/_____/_/ |_|'") os.system("echo 'by @deividgdt'") os.system("echo ''") os.system("echo Buscando direcciones MAC en el fichero: %(filename)s" %locals()) os.system("sleep 3") #Funcion principal def llipv6add(macrq): bitsgp = bin(int((cmd.getoutput("echo %(macrq)s | cut -f 1 -d':' 2> /dev/null" %locals())), 16))[2:].zfill(8) bitslst = [] for bit in bitsgp: bitslst.append(bit) if bitslst[6] == "0": bitslst[6] = "1" else: bitslst[6] = "0" hexf = hex(int("".join(bitslst), 2))[2:].zfill(2) macf = hexf+macrq[2:] ipv6 = "fe80::"+macf[:2]+macf[3:6]+macf[6:8]+"ff:fe"+macf[9:12]+macf[12:14]+macf[15:18] return ipv6 #Extraccion de MACs macslst = [mac for mac in (cmd.getoutput("sudo tcpdump -er %(filename)s | egrep -o '(..:){5}..' | sort | uniq" %locals())).split()] del(macslst[:7]) #Bucle para la parte final del proceso EUI-64. ipv6lst = [] for mac in macslst: ipv6final = llipv6add(mac) ipv6lst.append(ipv6final) os.system("echo 'Comprobando el estado de los dispositivos en IPv6...'") os.system("sleep 3") #Comprobacion del estado de los host IPv6 for ipv6 in ipv6lst: stoutping6 = os.system("ping6 -c1 %(ipv6)s 1> /dev/null" %locals()) if stoutping6 != 0: hstate = "--> Host down" else: hstate = "--> Host up" print ipv6+hstate
El script daría como resultado lo siguiente:

El script busca un archivo de nombre dumpsniff en el directorio actual, la variable filepath contiene el nombre de este.
Hace poco he terminado un curso de Python Basics, en codecademy, y con este script he estado practicando un poco, para que no se me olvide lo aprendido, así que si hay algún gurú programador leyendo, que disculpe de antemano, y me comprenda.
Un saludo!