Localización de hosts en IPv6 mediante EUI-64. Script en Python

as
Imagen 1. EUI64 Discover

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.
ipv6eui64
Imagen 2. Proceso 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:

Selection_002
Imagen 3. Resultado del script.

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!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s