Cómo expulsar un backdoor persistente de tu instalación WordPress
Un backdoor persistente en WordPress es uno de los problemas más serios que puede sufrir tu sitio. Cuando analizo una web comprometida, el backdoor es habitualmente el último recurso del atacante para mantener acceso indefinido, incluso después de cambiar contraseñas y actualizar plugins. En mi experiencia, estos accesos ocultos pueden permanecer meses sin detección si no sabes dónde buscar.
Te voy a guiar a través del proceso completo de identificación y eliminación de backdoors persistentes, basándome en cientos de auditorías de seguridad que he realizado en WordPress.
Qué es un backdoor persistente y por qué es tan peligroso
Un backdoor persistente es código malicioso incrustado en tu instalación WordPress que permite al atacante acceder a tu sitio sin conocer las credenciales de usuario. Se diferencia de una simple cuenta comprometida en que permanece activo aunque cambies todas tus contraseñas.
Los backdoors más comunes que encuentro en mis auditorías son:
- Webshells: archivos PHP independientes (generalmente con nombres ocultos como «config.php.bak» o «upload.php») que permiten ejecutar comandos del sistema.
- Código inyectado en wp-config.php: líneas maliciosas que crean usuarios administrativos automáticamente o abren puertas de acceso.
- Hooks en functions.php de themes: funciones PHP que se ejecutan en cada carga de página y crean acceso remoto.
- Opciones de base de datos modificadas: valores almacenados en wp_options que contienen código ejecutable.
- Plugins maliciosos ocultos: plugins desactivados en el panel pero con código activo en la carpeta del servidor.
- Modificaciones en .htaccess: reglas que redirigen solicitudes a scripts maliciosos o desactivan seguridad.
La peligrosidad es extrema: mientras el backdoor esté activo, el atacante puede robar datos sensibles, modificar contenido, enviar spam desde tu dominio, instalar malware adicional o usarlo como pivote para atacar a tus clientes.
Señales de alerta que delatan un backdoor
Antes de buscar un backdoor, necesitas confirmar que realmente lo tienes. Estos son los síntomas más claros que he identificado en mis análisis:
- Nuevo usuario administrativo que no creaste, visible en Usuarios > Administrador.
- Cambios en archivos core de WordPress (wp-login.php, wp-admin/index.php) sin que hayas actualizado.
- Plugins desactivados pero presentes en /wp-content/plugins/ que no reconoces.
- Alertas de Google Search Console: «Contenido malicioso detectado» o «Sitio comprometido».
- Redirecciones inesperadas a sitios de spam o phishing.
- Consumo anormal de CPU/RAM sin causa aparente.
- Logs de acceso (access.log) mostrando solicitudes extrañas a rutas inexistentes o con parámetros sospechosos.
- Base de datos creciendo sin motivo o tablas con nombres extraños.
Paso 1: Asegura el acceso al servidor antes de empezar
El primer error que cometen muchos administradores es intentar limpiar el backdoor a través del panel de WordPress. Un backdoor sofisticado detectará esta actividad y puede destruir pruebas o crear accesos alternativos mientras estás trabajando.
Lo que recomiendo siempre:
- Accede via SSH/SFTP directamente al servidor. Necesitas acceso de línea de comandos. Si solo tienes cPanel, usa el Terminal de cPanel o conecta por SSH con tus credenciales root.
- Haz una copia de seguridad completa del servidor. Copia toda la carpeta /home/usuario/public_html/ y la base de datos. Necesitarás referencia para análisis forense.
- Cambia todas las contraseñas de acceso: FTP/SFTP, SSH, cPanel, base de datos, cuenta de hosting. Hazlo desde otra red si es posible.
- Desconecta la web temporalmente. Si el backdoor está activo y lo sabes, considera tomar el sitio offline para evitar más robo de datos mientras limpias.
Paso 2: Busca webshells ocultas en el servidor
Las webshells son archivos PHP que el atacante sube directamente al servidor. En mis auditorías, suelen encontrarse en:
- /wp-content/uploads/ (carpeta más grande, difícil de revisar manualmente)
- /wp-content/plugins/nombreAleatorio/
- Raíz del sitio con nombres como «shell.php», «admin.php», «config.php.bak»
- Carpetas ocultas: /.well-known/, /.git/, /wp-admin/includes/
Desde SSH, usa estos comandos para encontrarlas:
Buscar todos los archivos PHP modificados en los últimos 30 días:
find /home/usuario/public_html -name «*.php» -mtime -30 -ls | sort -k10
Buscar archivos PHP en la carpeta de uploads (muy sospechoso):
find /home/usuario/public_html/wp-content/uploads -name «*.php» -o -name «*.phtml» -o -name «*.php5»
Buscar archivos ejecutables recientes en todo el sitio:
find /home/usuario/public_html -type f ( -name «*.php» -o -name «*.php7» -o -name «*.phtml» ) -newer /home/usuario/public_html/wp-settings.php
Cuando encuentres un PHP sospechoso, no lo ejecutes ni abras en el navegador. Examínalo en el servidor con:
head -20 /ruta/archivo.php
Un backdoor típico tendrá: eval(), system(), exec(), shell_exec(), passthru(), base64_decode(), o variables POST/GET que ejecutan código. Si ves estas funciones fuera de contexto, es malicioso. Bórralo:
rm /ruta/archivo_malicioso.php
Paso 3: Revisa wp-config.php y .htaccess
El wp-config.php es un destino favorito para backdoors persistentes. Abre el archivo:
cat /home/usuario/public_html/wp-config.php | grep -E «eval|system|exec|create_function|preg_replace.*/e»
Busca líneas sospechosas. Un ejemplo de backdoor en wp-config.php que he visto frecuentemente:
@eval($_POST[‘cmd’]); // Permite ejecutar código PHP vía POST
O código ofuscado:
@eval(base64_decode(‘c3lzdGVtKCRfUE9TVFsnd2EnXSk7’));
Si encuentras algo así, edita el archivo (con nano o vi):
nano /home/usuario/public_html/wp-config.php
Elimina las líneas maliciosas. Luego revisa el .htaccess:
cat /home/usuario/public_html/.htaccess
Busca redirecciones sospechosas o reglas que no reconozcas. Un .htaccess limpio de WordPress contiene solo reglas de reescritura estándar. Si ves:
- RewriteRule con dominios externos
- Reglas que permiten acceso a archivos ejecutables en uploads
- Redirecciones a sitios de spam
Reemplaza el .htaccess completo con uno limpio desde wp-cli:
wp rewrite flush –hard
Paso 4: Analiza plugins y themes en busca de código inyectado
Los backdoors frecuentemente se instalan modificando el archivo functions.php de un theme activo o un plugin. Necesitas revisar cada uno.
Lista el theme activo:
wp theme list –status=active
Revisa el functions.php del theme activo:
cat /home/usuario/public_html/wp-content/themes/NOMBREDELTHEME/functions.php | head -50
Busca código sospechoso al inicio o final del archivo. Los backdoors suelen inyectarse al principio (después de <?php) o al final, antes del cierre.
Haz lo mismo con cada plugin activo:
wp plugin list –status=active
cat /home/usuario/public_html/wp-content/plugins/NOMBREPLUGIN/NOMBREPLUGIN.php | head -50
Si encuentras código sospechoso, tienes dos opciones:
- Si el plugin/theme es legítimo: Restaura la versión limpia desde wordpress.org. Primero desactiva y borra, luego reinstala limpio.
- Si no reconoces el plugin/theme: Bórralo completamente.
Paso 5: Limpia la base de datos de opciones maliciosas
Los atacantes sofisticados almacenan backdoors en la tabla wp_options. Estos se ejecutan mediante hooks y generan usuarios admin, redirigen contenido o crean backdoors adicionales.
Conecta a la base de datos MySQL:
mysql -u usuario_base_datos -p nombre_base_datos
Busca opciones sospechosas:
SELECT option_name, option_value FROM wp_options WHERE option_value LIKE ‘%eval%’ OR option_value LIKE ‘%base64_decode%’ OR option_value LIKE ‘%system(%’ LIMIT 20;
Si encuentras algo, examínalo primero:
SELECT * FROM wp_options WHERE option_id = XXX G
Y bórralo:
DELETE FROM wp_options WHERE option_id = XXX;
También busca usuarios sospechosos:
SELECT ID, user_login, user_email, user_registered FROM wp_users;
Si hay un usuario que no creaste con rol de administrador, bórralo:
DELETE FROM wp_users WHERE ID = XXX;
Y elimina sus metadatos:
DELETE FROM wp_usermeta WHERE user_id = XXX;
Paso 6: Verifica logs de acceso en búsqueda de actividad maliciosa
El access.log y error.log te muestran qué ha hecho el atacante. En mis auditorías, esta información es crucial para entender el alcance del compromiso.
Busca solicitudes a archivos sospechosos:
grep -E «.php?.*=» /home/usuario/public_html/../logs/access_log | grep -v «/wp-admin/» | tail -50
Busca POST requests (típicas de webshells):
grep «POST» /home/usuario/public_html/../logs/access_log | tail -50
Documenta cualquier actividad sospechosa (IPs atacantes, fechas, archivos accedidos).
Paso 7: Usa herramientas automáticas como verificación final
Después de la limpieza manual, usa herramientas especializadas para confirmar que no quedan backdoors. Mi recomendación:
WP-CLI Security Audit:
wp plugin list –status=all
wp theme list –status=all
Verifica que no haya plugins/themes desactivados que no reconozcas.
Wordfence CLI (si tienes licencia):
wordfence scan
Realiza un escaneo profundo de malware.
Sucuri SiteCheck (online, gratuito): Sube tu sitio a sitecheck.sucuri.net para una segunda opinión independiente.
Paso 8: Refuerza WordPress para evitar backdoors futuros
Un backdoor regresa si tu seguridad es débil. Lo que implemento siempre en sitios post-compromiso:
- Deshabilita la edición de archivos: Añade a wp-config.php: define(‘DISALLOW_FILE_EDIT’, true);
- Cambia el prefijo de tablas de BD: De wp_ a algo como wp_a7k3_. Esto requiere un plugin especializado o acceso a la BD.
- Protege wp-config.php: Usa .htaccess: <files wp-config.php> deny from all </files>
- Implementa autenticación de dos factores (2FA): Usa Wordfence, Google Authenticator o similar.
- Limita intentos de login: Máximo 5 intentos en 15 minutos. Wordfence o iThemes Security lo hacen automáticamente.
- Actualiza WordPress, plugins y themes regularmente. Los backdoors entran por agujeros de seguridad conocidos.
- Revisa permisos de carpetas: wp-content/uploads debe ser 755, no 777.
Paso 9: Valida que el backdoor está completamente eliminado
Después de 48 horas de la limpieza, realiza una verificación final:
- Inicia sesión en WordPress. Verifica que no hay usuarios sospechosos.
- Revisa Google Search Console. Elimina manualmente cualquier URL sospechosa flagged como maliciosa.
- Ejecuta nuevamente el escaneo de Sucuri SiteCheck. Debe estar limpio.
- Revisa access.log nuevamente. No debe haber solicitudes maliciosas recientes.
- Haz un backup limpio. Este será tu referencia para futuras comparaciones.
Cuándo llamar a un profesional
Si durante este proceso encuentras:
- Múltiples backdoors entrelazados que vuelven a aparecer tras eliminarlos
- Base de datos completamente comprometida (muchas opciones maliciosas)
- Código ofuscado que no puedes descifrar
- Cambios en la raíz del servidor fuera de la carpeta web
- Tu proveedor de hosting ha detectado malware y amenaza con suspender el sitio
Es momento de obtener ayuda profesional. En ManuelFolgar.com realizamos auditorías completas de seguridad y limpieza garantizada de backdoors, con análisis forense incluido.
Resumen final: tu checklist de acción
Aquí está el plan paso a paso que debes seguir:
- Accede al servidor via SSH, cambia contraseñas, haz backup completo.
- Busca webshells con find y comandos grep.
- Revisa wp-config.php y .htaccess línea por línea.
- Analiza functions.php de theme y todos los plugins.
- Limpia la BD de opciones y usuarios maliciosos con MySQL.
- Revisa logs de acceso para entender el compromiso.
- Ejecuta herramientas automáticas (WP-CLI, Wordfence, Sucuri).
- Implementa hardening de seguridad.
- Valida la limpieza con verificaciones finales.
Un backdoor persistente es serio, pero eliminable si actúas rápido y metódicamente. La mayoría de propietarios de sitios comprometen su seguridad precisamente porque no saben por dónde empezar. Tú ahora sí.
Si necesitas ayuda profesional en cualquier paso de este proceso, contacta conmigo en ManuelFolgar.com. Realizo análisis forense completo, eliminación garantizada de backdoors y hardening de WordPress para evitar que vuelvan.