Cómo encontrar y cambiar la dirección MAC en ESP32

¡Hola equipo! Bienvenidos a un nuevo tutorial en Ingtelecto Pro. Hoy vamos a tocar un tema de "hacker ético" que es fundamental para proyectos de IoT avanzados: la Dirección MAC.

Seguramente te ha pasado: intentas conectar tu proyecto a la red de la universidad o del trabajo y ¡Zas! No conecta. Resulta que tienen un filtro de seguridad que solo permite dispositivos conocidos. ¿La solución? Aprender a leer y, más importante aún, a cambiar (spoofear) la dirección MAC de tu ESP32.

En este tutorial dominaremos la identidad de nuestro microcontrolador. No solo veremos el código, sino que entenderemos cómo el ESP32 genera múltiples identidades para WiFi, Bluetooth y Ethernet a partir de una sola dirección base. ¡Manos a la obra! 🕵️‍♂️📡

Analogía del Mundo Real: Tu DNI vs. Tu Disfraz

Piensa en la Dirección IP como tu dirección de correo postal: puedes mudarte de casa y tu dirección cambia. Es temporal y depende de dónde vivas (a qué red te conectes).

En cambio, la Dirección MAC es como tu huella digital o tu número de DNI: naciste con ella y, en teoría, no cambia nunca. Viene grabada de fábrica en el silicio del chip.

Sin embargo, hoy vamos a aprender a ponernos un "disfraz digital". Le enseñaremos al ESP32 a presentarse ante el router con una identidad falsa (una MAC diferente) para saltar restricciones o aumentar nuestra privacidad.

[Pega aquí el iframe de YouTube]
Índice de contenido
  1. Materiales Necesarios
  2. Fundamentos Técnicos: La Identidad del Chip
  3. Paso 1: Encontrar la Dirección MAC de Fábrica 🔍
    1. El Código de Lectura
    2. Explicación del Código
  4. Paso 2: Cambiar la Dirección MAC (Spoofing) 🎭
    1. Código para Cambio de MAC
    2. Análisis Profundo del Cambio
  5. Solución de Problemas Comunes
  6. Conclusión y Siguientes Pasos

Materiales Necesarios

Para esta práctica de software, el hardware es minimalista.

Lista de Componentes ✅

  • 1 x Placa de Desarrollo ESP32 (Cualquier versión: DevKit V1, NodeMCU-32S, ESP32-CAM, etc.)
  • 1 x Cable Micro-USB (Asegúrate de que sea de datos, no solo de carga)
  • Tu ordenador con Arduino IDE instalado

Fundamentos Técnicos: La Identidad del Chip

Antes de tirar código, necesitamos entender qué estamos manipulando.

¿Qué es una Dirección MAC?

Las siglas vienen de Media Access Control. Es un identificador único de 48 bits (6 pares de números hexadecimales, ej: AA:BB:CC:11:22:33) asignado a cualquier hardware de red.

  • Los primeros 3 pares (OUI): Identifican al fabricante (Espressif Systems).
  • Los últimos 3 pares (NIC): Son el número de serie único de tu dispositivo.

ESP32

Microcontrolador

El ESP32 es especial. No tiene una sola MAC, ¡tiene cuatro!

  • MAC para WiFi Estación (STA)
  • MAC para WiFi Punto de Acceso (AP)
  • MAC para Bluetooth (BT)
  • MAC para Ethernet (ETH)

El truco es que todas se derivan de una MAC Base. Si cambias la Base, cambias todas automáticamente.

Paso 1: Encontrar la Dirección MAC de Fábrica 🔍

Lo primero es saber quiénes somos. Vamos a usar un código que extrae la "MAC Base" del eFuse (la memoria permanente del chip) y calcula las derivadas.

El Código de Lectura

Copia y pega este sketch en tu Arduino IDE.

// TUTORIAL INGTELECTO.COM

// Lectura de Direcciones MAC en ESP32
#include
void setup() {

Serial.begin(115200);

delay(1000); // Damos tiempo al monitor serie para arrancar
Serial.println("\n--- IDENTIDAD DEL DISPOSITIVO ---");
// Variable auxiliar para guardar los bytes de la MAC

uint8_t baseMac[6];
// 1. Obtener y mostrar MAC de WiFi Estación (STA)

// Esta suele ser igual a la MAC Base

esp_read_mac(baseMac, ESP_MAC_WIFI_STA);

printMAC("WiFi Station", baseMac);
// 2. Obtener y mostrar MAC de WiFi SoftAP

// Generalmente es MAC Base + 1

esp_read_mac(baseMac, ESP_MAC_WIFI_SOFTAP);

printMAC("WiFi SoftAP", baseMac);
// 3. Obtener y mostrar MAC de Bluetooth

// Generalmente es MAC Base + 2

esp_read_mac(baseMac, ESP_MAC_BT);

printMAC("Bluetooth", baseMac);
// 4. Obtener y mostrar MAC de Ethernet

// Generalmente es MAC Base + 3

esp_read_mac(baseMac, ESP_MAC_ETH);

printMAC("Ethernet", baseMac);
Serial.println("---------------------------------");

}
void loop() {

// No hacemos nada en el loop

}
// Función auxiliar para imprimir la MAC de forma legible

void printMAC(String tipo, uint8_t *macArr) {

Serial.print(tipo + ": ");

for (int i = 0; i < 5; i++) {

Serial.printf("%02X:", macArr[i]);

}

Serial.printf("%02X\n", macArr[5]);

}

Explicación del Código

  • Librerías: Incluimos #include porque contiene las definiciones de las estructuras MAC.
  • Función esp_read_mac(): Esta es la clave. Es una función nativa del SDK de Espressif. Recibe dos parámetros: dónde guardar los datos (baseMac) y qué interfaz leer (ESP_MAC_WIFI_STA, ESP_MAC_WIFI_SOFTAP, etc.).
  • Formato Hexadecimal: Usamos Serial.printf("%02X") para que los números se vean como 0A en lugar de solo A o 10. Esto es vital para leer correctamente la MAC.

Paso 2: Cambiar la Dirección MAC (Spoofing) 🎭

Ahora viene lo divertido. Vamos a decirle al ESP32 que ignore su programación de fábrica y use una dirección personalizada.

Esto es extremadamente útil si quieres reemplazar un dispositivo dañado en una red con filtrado MAC sin tener que llamar al administrador de la red para que registre el nuevo aparato.

Código para Cambio de MAC

Carga este nuevo código. **¡Ojo!** Modifica la variable newMAC con los números que tú quieras.

// TUTORIAL INGTELECTO.COM

// Cambio de Dirección MAC (Spoofing) en ESP32
#include

#include // Necesaria para esp_base_mac_addr_set
// --- CONFIGURACIÓN ---

// Define aquí tu nueva identidad.

// Formato: {0xHex, 0xHex, ...}

// Ejemplo: DE:AD:BE:EF:FE:ED

uint8_t newMAC[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
void setup() {

Serial.begin(115200);

delay(1000);
Serial.println("\n--- INICIANDO CAMBIO DE IDENTIDAD ---");
// PASO 1: El WiFi debe estar APAGADO antes de cambiar la MAC

// Si intentas cambiarla con el WiFi encendido, fallará.

WiFi.mode(WIFI_OFF);
// PASO 2: Inyectar la nueva MAC Base

// Esto cambia la MAC en la RAM, no quema el chip permanentemente.

if (esp_base_mac_addr_set(newMAC) == ESP_OK) {

Serial.println("✅ ¡Éxito! Dirección MAC suplantada correctamente.");

} else {

Serial.println("❌ Error: No se pudo cambiar la MAC.");

}
// PASO 3: Reactivar WiFi (Opcional, para verificar)

// Al iniciar WiFi.begin() o similar, usará la nueva MAC.

WiFi.mode(WIFI_STA);
// Verificamos el resultado

Serial.println("\n--- NUEVA IDENTIDAD ---");

imprimirEstadoActual();

}
void loop() {}
void imprimirEstadoActual() {

uint8_t baseMac[6];

esp_read_mac(baseMac, ESP_MAC_WIFI_STA);

Serial.print("Nueva MAC WiFi: ");

for (int i = 0; i < 5; i++) {

Serial.printf("%02X:", baseMac[i]);

}

Serial.printf("%02X\n", baseMac[5]);

}

Análisis Profundo del Cambio

  1. Librería esp_wifi.h: Necesitamos incluir esta librería de bajo nivel porque la función de cambio de MAC no está en la librería estándar de Arduino WiFi.
  2. Apagar el WiFi (WIFI_OFF): Este es el error número 1 de los novatos. No puedes cambiar la matrícula del coche mientras vas conduciendo por la autopista. Primero detienes el coche (apagas WiFi), cambias la placa, y luego arrancas.
  3. Función esp_base_mac_addr_set(): Esta función sobrescribe la dirección en la memoria volátil. Importante: Este cambio no es permanente. Si reinicias el ESP32 (botón Reset o quitar energía), volverá a tener su MAC de fábrica. Por eso, este código debe estar siempre en el setup() de tu proyecto final.

Solución de Problemas Comunes

¿Algo salió mal? Revisa esto:

  • El cambio de MAC falla: Asegúrate de haber puesto la línea WiFi.mode(WIFI_OFF); antes de intentar cambiar la dirección. Es obligatorio.
  • La MAC no es la que puse: Recuerda que la dirección que cambias es la MAC BASE.
    • La MAC de WiFi Station será igual a la Base.
    • Pero la MAC de Bluetooth o SoftAP podría ser tu MAC + 1. ¡Tenlo en cuenta si estás filtrando por MAC en el router!
  • El Bit de Multicast: Evita usar un número impar en el primer byte de tu MAC personalizada (ej: evitar 01, 03, etc.) ya que en redes Ethernet eso indica una dirección "Multicast" y algunos routers pueden rechazarla para un dispositivo individual.

Conclusión y Siguientes Pasos

¡Misión Cumplida, Hacker! 🕵️‍♂️

Acabas de tomar el control total de la capa de red de tu ESP32. Ya sabes cómo leer su huella de fábrica y cómo enmascararla con una nueva identidad mediante software.

¿Para qué puedes usar esto?

  • Proyectos de Seguridad: Crear un "clon" de un dispositivo autorizado para pruebas de penetración.
  • Mesh Networks: Asignar IDs lógicos a tus nodos ESP-NOW basados en su MAC.
  • Privacidad: Evitar el rastreo en redes públicas.

Si te ha gustado, no olvides revisar nuestra guía sobre ESP-NOW donde usamos la dirección MAC intensivamente para comunicar dispositivos sin router. ¡Sigue programando!

Carlos Julián

Carlos Julián es el fundador de Ingtelecto, es Ingeniero Mecatrónico, Profesor y Programador, cuenta con una Maestria en Ciencias de la Educación, creador de contenido educativo en redes sociales. Lee más sobre mi trayectoria aquí.

Estos temas te pueden interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir