¿Qué es una dirección MAC? #
Una dirección MAC es un identificador único asignado a cada tarjeta de red (NIC) por el fabricante. Tiene una longitud de 48 bits y generalmente se representa en formato hexadecimal, como 00:1A:2B:3C:4D:5E
. Las direcciones MAC se utilizan para identificar dispositivos en una red local y gestionar el tráfico de red a nivel de la capa de enlace de datos del modelo OSI.
¿Por qué cambiar la dirección MAC? #
Hay varias razones por las que alguien podría querer cambiar la dirección MAC de su interfaz de red:
- Privacidad: Ocultar la dirección MAC original para dificultar el rastreo de dispositivos en una red.
- Seguridad: Superar restricciones de red que filtran el acceso en función de direcciones MAC específicas.
- Pruebas y Diagnósticos: Simular dispositivos diferentes para probar configuraciones de red o solucionar problemas.
- Bypass de Filtrado MAC: Acceder a redes que utilizan filtrado de direcciones MAC para restringir el acceso.
Código #
import argparse
import re
import subprocess
def get_arguments():
parser = argparse.ArgumentParser(description="Herramienta para cambiar una dirección MAC ")
parser.add_argument("-i", "--interface", required=True, dest="interface", help="Nombre interfaz de red")
parser.add_argument("-m", "--mac", required=True, dest="mac_address", help="Nueva dirección MAC")
return parser.parse_args()
def validate(interface, mac):
valid_interface = re.match(r'^[e][n|t][s|h|o]\d{1,2}$', interface)
valid_mac = re.match(r'^([A-Fa-f0-9$]{2}[:]){5}[A-Fa-f0-9]{2}$', mac)
return valid_interface and valid_mac
def change_mac(interface, mac):
if validate(interface, mac):
subprocess.run(["ifconfig", interface, "down"])
subprocess.run(["ifconfig", interface, "hw", "ether", mac])
subprocess.run(["ifconfig", interface, "up"])
print("\nLa MAC ha sido cambiada exitosamente")
else:
print("\nLos datos introducidos no son correctos")
def main():
args = get_arguments()
change_mac(args.interface, args.mac_address)
if __name__ == '__main__':
main()
Cómo funciona? #
1. Función get_arguments()
#
argparse.ArgumentParser
: Crea un nuevo objeto de análisis de argumentos.add_argument
: Define los argumentos que el script espera.-i
o--interface
: Argumento obligatorio que especifica la interfaz de red.-m
o--mac
: Argumento obligatorio que especifica la nueva dirección MAC.
parse_args()
: Analiza los argumentos de la línea de comandos y los devuelve como un objeto.
Función validate()
#
-
re.match()
: Compara una cadena con una expresión regular. -
valid_interface
: Verifica que la interfaz de red comience cone
,n
,t
,s
,h
oo
y esté seguida por uno o dos dígitos. -
valid_mac
: Verifica que la dirección MAC esté en el formatoXX:XX:XX:XX:XX:XX
, dondeX
es un dígito hexadecimal.
Función change_mac()
#
validate()
: Llama a la función de validación.subprocess.run()
: Ejecuta comandos del sistema:ifconfig <interface> down
: Desactiva la interfaz.ifconfig <interface> hw ether <mac>
: Cambia la dirección MAC.ifconfig <interface> up
: Reactiva la interfaz.
print()
: Muestra un mensaje de éxito o error según corresponda.