Etiqueta: webshells

  • Cómo limpiar errores causados por plugins maliciosos

    Cómo limpiar errores causados por plugins maliciosos

    Cómo limpiar errores causados por plugins maliciosos en WordPress

    Cuando analizo un sitio WordPress comprometido, los plugins maliciosos son casi siempre el culpable número uno. No es casualidad: representan el 40% de las vulnerabilidades que detecto en mis auditorías. El problema es que muchos propietarios no saben cómo identificar y limpiar los daños que dejan atrás. En esta guía te enseñaré exactamente qué buscar y cómo eliminar cada rastro de infección.

    ¿Qué daño causa realmente un plugin malicioso?

    Un plugin comprometido no solo se instala y se olvida. Durante los meses que permanece activo, puede dejar modificaciones profundas en tu base de datos, archivos principales y configuración. Lo que recomiendo siempre es entender primero la magnitud del problema antes de actuar:

    • Puertas traseras (backdoors): Código oculto que permite acceso no autorizado incluso después de desactivar el plugin
    • Inyecciones de base de datos: Publicaciones, usuarios o tablas completamente nuevas creadas para exfiltrar datos
    • Modificaciones en wp-config.php y .htaccess: Cambios que persisten aunque elimines el plugin
    • Archivos webshell: Scripts PHP independientes distribuidos por toda tu carpeta /uploads
    • Redirecciones invisibles: Código inyectado en funciones.php que redirige tráfico a sitios de spam o phishing
    • Minería de criptomonedas: Scripts que consumen recursos del servidor sin que lo notes

    Lo crítico es que simplemente desactivar o eliminar el plugin desde el panel de WordPress no limpia estos daños colaterales. Necesitas un enfoque sistemático.

    Paso 1: Identifica qué plugins están realmente comprometidos

    Mi primer paso siempre es hacer un inventario honesto. Accede al panel de WordPress y ve a Plugins. Abre Google Search Console y comprueba si Google ha marcado tu sitio con avisos de malware.

    Luego, haz una búsqueda rápida en NVD (National Vulnerability Database) con el nombre de cada plugin instalado. Busca también en el repositorio oficial de WordPress si el plugin sigue activo o ha sido marcado como inseguro.

    Herramientas que uso constantemente:

    • Wordfence CLI: wp wordfence threat-defense status te muestra amenazas detectadas
    • WP-CLI: wp plugin list lista todos con versión y estado
    • Sucuri SiteCheck: Análisis rápido en línea que detecta inyecciones obvias
    • VirusTotal: Sube la carpeta del plugin sospechoso y escanéala contra 70+ antivirus

    Paso 2: Limpia la base de datos de cambios maliciosos

    Aquí es donde la mayoría de personas comete errores. Cuando un plugin malicioso está activo durante meses, modifica tu base de datos. Necesitas buscar:

    Usuarios fantasma: Accede a phpMyAdmin o usa WP-CLI:

    wp user list --format=table

    Busca cuentas creadas recientemente que no reconozcas, especialmente con nombres genéricos como «admin2», «backup», «test» o «wordpress». Elimínalas con:

    wp user delete ID --reassign=1

    Publicaciones y páginas ocultas: A menudo los plugins inyectan contenido spam o puerta trasera en posts:

    wp post list --post_type=any --status=any --format=table

    Si encuentras posts con títulos raros o creados en fechas sospechosas, elimínalos.

    Opciones de base de datos comprometidas: Los plugins maliciosos a menudo guardan datos en la tabla wp_options. Usa phpMyAdmin para revisar:

    SELECT * FROM wp_options WHERE option_name LIKE '%s99%' OR option_name LIKE '%malware%' OR option_name LIKE '%shell%'

    Borra cualquier entrada sospechosa.

    Paso 3: Busca y elimina webshells y archivos maliciosos

    Este es el paso más tedioso pero esencial. Los plugins maliciosos típicamente dejan archivos PHP ocultos en:

    • /wp-content/uploads/ (es el lugar favorito porque es accesible directamente por URL)
    • /wp-content/plugins/ (incluso aunque desactives el plugin)
    • Raíz de WordPress o /wp-admin/
    • /wp-includes/ (muy peligroso si logran acceso)

    Conéctate por SFTP y busca archivos sospechosos. Signos de alerta:

    • Archivos .php en carpetas que deberían ser solo imágenes (/uploads)
    • Nombres ofuscados: d8h3jd.php, img_load.php, function.php (confunde con wp-content/themes/tu-tema/functions.php)
    • Fechas de modificación recientes en archivos que no tocaste
    • Archivos con pesos inusuales: 50KB+ cuando deberían pesar 2-5KB

    Usa la terminal SSH para buscar de forma más inteligente:

    find /home/usuario/public_html/wp-content/uploads -name "*.php" -type f

    Cualquier archivo .php en uploads es sospechoso 99% del tiempo. Elimínalo.

    También revisa archivos que hayan sido modificados recientemente:

    find /home/usuario/public_html -name "*.php" -mtime -30 -type f

    Esto te muestra todos los .php editados en los últimos 30 días. Revísalos uno a uno.

    Paso 4: Limpia modificaciones en archivos de configuración críticos

    Los plugins maliciosos sofisticados modifican archivos que WordPress respeta incluso después de su desinstalación:

    wp-config.php: Revísalo línea por línea. Busca:

    • Nuevas definiciones de constantes extrañas
    • Includes o requires de archivos desconocidos
    • Código ofuscado o base64

    Si lo encuentras, elimina esas líneas pero sé cuidadoso: no borres nada relacionado con tu base de datos o claves de seguridad legítimas.

    .htaccess: Abre el archivo .htaccess en la raíz. Los backdoors suelen añadir redirecciones o modificaciones del módulo rewrite:

    • Redirecciones a dominios desconocidos
    • Reglas que ocultan archivos .php específicos
    • RewriteCond que redirigen tráfico a phishing

    Lo más seguro es regenerar un .htaccess limpio: en WordPress, ve a Ajustes > Enlaces permanentes y guarda sin cambiar nada. Esto sobrescribe el archivo con valores seguros.

    themes/tu-tema/functions.php: Los plugins a veces inyectan código en el tema activo porque es código que se ejecuta en cada carga de página:

    wp theme get --field=stylesheet-path

    Abre ese archivo y busca líneas que:

    • Hayan sido añadidas hace poco (diferentes al resto del código)
    • Contengan eval(), base64_decode(), create_function()
    • Llamen a URLs externas desconocidas
    • Creen usuarios administrativos automáticamente

    Si no eres desarrollador, compara con una copia limpia de tu tema descargada directamente del repositorio oficial.

    Paso 5: Verifica el .htaccess y las reglas del servidor

    Además del archivo .htaccess que mencioné, algunos plugins maliciosos sofisticados modifican la configuración de Apache directamente o crean archivos .htaccess ocultos en subcarpetas:

    find /home/usuario/public_html -name ".htaccess" -type f

    Si encuentras múltiples .htaccess en diferentes carpetas (debería haber solo uno en raíz), inspecciónalos. Cualquier línea que no reconozcas, bórrala.

    Luego, reconstruye uno limpio con estas reglas básicas de seguridad que recomiendo siempre:

    # Proteger wp-config.php
    <Files wp-config.php>
      Order allow,deny
      Deny from all
    </Files>
    
    # Bloquear acceso a wp-admin excepto para ti
    <FilesMatch "wp-login.php">
      Order allow,deny
      Allow from XXX.XXX.XXX.XXX
      Deny from all
    </FilesMatch>
    
    # Prohibir ejecución de PHP en /uploads
    <Directory /uploads>
      php_flag engine off
      AddType text/plain .php
    </Directory>

    Paso 6: Cambia todas las contraseñas y regenera claves de seguridad

    Si un plugin malicioso estuvo meses activo, el atacante probablemente:

    • Creó cuentas de administrador secundarias (que ya eliminaste, pero verifica de nuevo)
    • Capturó cookies de sesión
    • Tuvo acceso a wp-config.php (donde están las claves de autenticación)

    Por eso, obligatorio:

    1. Cambia la contraseña de todos los usuarios, especialmente administradores: wp user update ID --prompt=user_pass
    2. Regenera las claves de seguridad en wp-config.php. Usa el generador oficial de WordPress y reemplaza las líneas AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY, NONCE_KEY (y sus variantes _SALT)
    3. Regenera tokens de API si usas cualquier integración externa

    Esto expulsa a cualquier atacante que tenga sesiones activas o cookies viejas.

    Paso 7: Realiza un escaneo antimalware profesional

    Después de limpiar manualmente, ejecuta un escaneo automatizado para confirmar que no quedó nada:

    Wordfence Premium: Escaneo profundo de archivos, base de datos y comportamiento:

    wp wordfence scan execute --scan_type=all

    MalCare: Muy efectivo detectando webshells y código obfuscado que otros pierden.

    Sucuri Security (plugin gratuito): Más ligero pero confiable para sitios pequeños.

    No confíes en un solo scanner. Si usas dos herramientas diferentes y ambas dan clean, puedes dormir tranquilo.

    Paso 8: Audita eventos en logs y revisa Google Search Console

    Aquí es donde vemos si el atacante dejó más sorpresas:

    Access logs del servidor: Accede a logs/access_log (o similar según tu hosting) y busca requests sospechosos a archivos .php en uploads:

    grep "wp-content/uploads.*.php" /var/log/apache2/access.log

    Esto te muestra si alguien ejecutó webshells. Si ves requests POST grandes o desde IPs desconocidas a tus archivos, es confirmación de que estuvo comprometido.

    Google Search Console: Abre la consola, ve a Seguridad y acciones manuales. Si Google detectó malware, verás un informe detallado. Una vez que hayas limpiado, solicita un análisis de seguridad nuevamente:

    Seguridad y acciones manuales > Problemas de seguridad > Solicitar revisión

    Google típicamente responde en 24-72 horas.

    Paso 9: Instala protección para evitar que vuelva a ocurrir

    Limpiar una vez no es suficiente. Necesitas un escudo permanente. Lo que recomiendo siempre es:

    • Wordfence Firewall: Bloquea intentos de explotación de plugins vulnerables antes de que lleguen a tu servidor. Configura para bloquear bots de fuerza bruta en wp-login.php
    • Actualizaciones automáticas: define('WP_AUTO_UPDATE_CORE', true); en wp-config.php
    • 2FA en wp-admin: Wordfence o Google Authenticator. Si no pueden entrar al panel, no pueden instalar plugins maliciosos
    • Limpieza automática de plugins inactivos: Elimina cualquier plugin que no uses realmente. Cada uno que no tengas es una puerta cerrada
    • Auditorías de plugins regularmente: Una vez al mes, verifica que cada plugin tiene actualizaciones disponibles y que la última versión no tiene vulnerabilidades reportadas

    ¿Qué pasa si todo está muy comprometido?

    A veces encuentro sitios donde un plugin malicioso ha estado tan tiempo que el daño es profundo: múltiples webshells escondidos, inyecciones en 50+ publicaciones, claves de seguridad expuestas, etc.

    En estos casos, la limpieza manual es arriesgada. Podrías dejar algo atrás y tener un segundo ataque en una semana.

    Mi recomendación es siempre clara: si no estás 100% seguro, busca ayuda profesional. En ManuelFolgar.com realizamos análisis exhaustivos, limpieza completa y hardening posterior. Es mejor 300€ en seguridad ahora que 3000€ en pérdida de datos o reputación después.

    Resumen de acciones inmediatas

    1. Identifica plugins comprometidos con NVD, Sucuri SiteCheck y Wordfence
    2. Limpia usuarios, posts y opciones sospechosas de base de datos
    3. Busca y elimina webshells en /uploads y /plugins
    4. Revisa wp-config.php, .htaccess y functions.php del tema
    5. Cambia todas las contraseñas y regenera claves de seguridad
    6. Escanea con múltiples herramientas antimalware
    7. Revisa logs y solicita revisión a Google
    8. Instala Wordfence, activa 2FA y configura actualizaciones automáticas

    Si necesitas ayuda profesional en cada uno de estos pasos, o si quieres que un experto haga la auditoría completa mientras tú descansas tranquilo, contacta conmigo en ManuelFolgar.com. Ofrezco análisis sin compromiso y planes de limpieza adaptados a tu sitio.