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.
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?
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
- 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
#includeporque 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 como0Aen lugar de soloAo10. 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
- 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. - 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. - 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 elsetup()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!
Deja una respuesta

Estos temas te pueden interesar