Ogni interfaccia di rete ha un identificativo univoco denominato MAC address (Media Access Control) assegnato dal produttore. Quest'ultimo è assegnato a livello hardware ma è spesso possibile modificarlo a livello software.

Nel livello più basso del modello di rete l'indirizzo MAC è sostanzialmente utilizzato per far comunicare due interfacce di rete collegate a una rete. Oltre al suo uso classico nell'ambito networking, un indirizzo MAC viene utilizzato anche per altri scopi:

  • I server DHCP lo usano per impostare reservation di determinati indirizzi ip
  • Alcune reti consentono l'accesso solo a MAC address specificati (MAC address filtering, MAC authentication)
  • Per il suo essere univoco, può essere utilizzato per il device tracking

Il cambio del MAC address o MAC spoofing di un'interfaccia di rete non è necessariamente un'operazione malevola, ma in alcuni casi si. Cambiando MAC address è infatti possibile, per esempio, presentarsi con un MAC valido alle ACL di un router, oppure saltare in una specifica VLAN per effettuare successivamente uno sniffing.

Di seguito uno script python per la modifica del MAC address di un'interfaccia di rete in ambiente Linux.

#!/usr/bin/env python

import subprocess
import optparse


def get_arguments():
    parser = optparse.OptionParser()
    parser.add_option("-i", "--interface", dest="interface", help="Interfaccia da selezionare per il cambio MAC address")
    parser.add_option("-m", "--mac", dest="new_mac", help="Nuovo MAC address nel formato 00:00:00:00:00:00")

    (options, arguments) = parser.parse_args()
    if not options.interface:
        parser.error("[-] Specifica una interfaccia, usa --help per maggiori informazioni")
    elif not options.new_mac:
        parser.error("[-] Specifica un mac address, usa --help per maggiori informazioni")
    return options


def change_mac(interface, new_mac):
    print("[+] Cambio MAC address per l'interfaccia " + interface)

    subprocess.call(["ifconfig", interface, "down"])
    subprocess.call(["ifconfig", interface, "hw", "ether", new_mac])
    subprocess.call(["ifconfig", interface, "up"])


options = get_arguments()
change_mac(options.interface, options.new_mac)

E' possibile utilizzare il codice salvandolo in un file .py e richiamandolo come segue:

python mac_changer.py [opzioni]

Le opzioni da parsare allo script sono -i nomeinterfaccia e -m indirizzomac.

es.: python mac_changer.py -i eth0 -m 00:11:22:33:44:55