Blindaje post-ataque: medidas de hardening que realmente funcionan en 48 horas
Cuando descubres que tu sitio web ha sido comprometido, el pánico es justificado. Pero lo que haces en las primeras 48 horas marca la diferencia entre una recuperación rápida y semanas de lucha contra el malware. En mi experiencia analizando cientos de webs infectadas, los sitios que aplican un blindaje estructurado post-ataque logran eliminar vectores de riesgo críticos y evitar reinfecciones en menos de dos días.
Te mostraré exactamente qué hacer, con qué herramientas y en qué orden, para levantar defensas reales mientras limpias los restos del compromiso.
Hora 0-2: Aislamiento y diagnóstico de urgencia
Lo primero es contener el daño. No se trata de limpieza profunda todavía, sino de detener el sangrado mientras recopilamos inteligencia.
Desconecta la base de datos de bases de datos remotas. Muchos backdoors usan túneles SFTP o conexiones SSH comprometidas para exfiltrar datos de clientes. Si tu hosting permite, cierra el acceso SFTP/SSH durante 48 horas o cambia las credenciales por unas generadas aleatoriamente que solo tú conoces.
Extrae el wp-config.php (WordPress) o config/settings.php (PrestaShop) a un directorio protegido. Usa WP-CLI para WordPress:
wp config get DB_USER
Anota todas las contraseñas activas. Luego las cambiaremos, pero primero necesitas saber cuáles están comprometidas. En PrestaShop, accede vía phpMyAdmin y ejecuta un volcado de las tablas de usuarios antes de modificar nada.
Genera un reporte rápido con Wordfence CLI. Si tienes acceso SSH, descarga Wordfence CLI y ejecuta:
wordfence scan --output=detailed
Esto te da un mapa de archivos sospechosos en 5-10 minutos. Alternativa si no tienes SSH: usa Sucuri SiteCheck en modo online desde https://sitecheck.sucuri.net. No es tan profundo, pero identifica backdoors obvios y patrones de inyección.
Documenta el incidente en tu log local. Crea un archivo timeline.txt con fecha, hora, qué detectaste y quién tiene acceso. Esto será tu defensa legal y técnica si necesitas reportarlo a AEPD o a tus usuarios.
Hora 2-6: Cambio masivo de credenciales
Aquí es donde la mayoría de sitios falla. Cambiar solo la contraseña de admin de WordPress NO es suficiente. Los atacantes suelen crear cuentas fantasma o modificar usuarios existentes a nivel de base de datos.
WordPress:
- Accede a wp-admin (si aún funciona). Si está bloqueado, usa WP-CLI:
wp user update admin --user_pass="nueva_password_aleatoria_32_caracteres"
- Elimina todos los usuarios excepto los necesarios. En wp-admin, ve a Usuarios y borra cuentas sospechosas. Si usas CLI:
wp user delete [usuario_sospechoso] --reassign=admin
- Cambia el email de recuperación de cada usuario admin a uno que controles:
wp user update admin --user_email="nuevo@dominio.es"
- Genera credenciales nuevas para SFTP, SSH y MySQL. Avisa a tu hosting que necesitas resetear todas (esto puede tardar 30 min).
PrestaShop:
- Accede al back-office. Ve a Administración > Empleados y revisa todas las cuentas. Elimina cualquier que no reconozcas.
- Cambia la contraseña de cada empleado activo desde el mismo panel.
- Ve a Configuración > Tiendas y resetea la contraseña del usuario «Admin» (el usuario root del sistema).
- Comprueba que el archivo config/settings.inc.php solo está accesible por lectura:
chmod 444 config/settings.inc.php
Correos y 2FA (autenticación de dos factores): Si tu proveedor de hosting ofrece 2FA en el panel de control, actívalo ahora. Para WordPress, instala Google Authenticator o Authy en tu teléfono y configura 2FA en wp-admin usando un plugin de confianza como Two Factor (desarrollado por WordPress Security Team).
Hora 6-12: Eliminación de puertas traseras y ficheros sospechosos
Este es el momento técnico más delicado. Los backdoors modernos no siempre se ven. Pueden estar comprimidos en base64, ofuscados en PHP, o incrustados en ficheros legítimos.
Busca archivos recién modificados. Accede por SFTP o línea de comandos y ordena por fecha de modificación:
find /var/www/html -type f -mtime -2 -name "*.php" | head -20
Esto te muestra todos los PHP modificados en los últimos 2 días. Descárgalos y abre cada uno en un editor de texto. Los backdoors suelen tener características reconocibles: funciones eval(), system(), shell_exec(), $_REQUEST o $_POST sin validar, o código en base64.
Elimina plugins y temas desactualizados (WordPress). La mayoría de infecciones entran por aquí. Ve a Plugins > Plugins instalados y desactiva todo lo que no uses. Luego:
wp plugin delete [nombre] --allow-root
Para temas, si no es Twenty Twenty-Three o superior (temas oficiales de WordPress), considera eliminarlo también:
wp theme delete [nombre] --allow-root
Deshabilita la edición de archivos en WordPress. Añade esto al final de wp-config.php:
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);
Esto impide que un atacante (incluso con acceso a wp-admin comprometido) pueda editar funciones.php o plugin files.
En PrestaShop, elimina módulos no verificados. Ve a Módulos y desinstala cualquier módulo de fuente desconocida, especialmente relacionados con pagos o email. Los skimmers Magecart se disfrazan de módulos legales.
Hora 12-24: Fortalecimiento de permisos y acceso
Ahora que el sitio está más limpio, blindamos los puntos de entrada.
Corrige permisos de directorios. Los permisos incorrectos son una rampa de acceso directa para atacantes. Para WordPress:
find /var/www/html -type d -exec chmod 755 {} ;
find /var/www/html -type f -exec chmod 644 {} ;
chmod 600 /var/www/html/wp-config.php
chmod 700 /var/www/html/wp-content/uploads
Para PrestaShop:
chmod 755 app/config/ chmod 644 app/config/parameters.php chmod 700 var/ chmod 755 modules/
Protege wp-login.php (WordPress). Añade a tu .htaccess una regla que limite intentos de fuerza bruta:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} wp-login.php
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule ^.*$ - [F,L]
</IfModule>
O usa una solución más robusta: redirige wp-login.php a una URL privada. En wp-config.php:
define('WP_HOME', 'https://tudominio.es');
define('WP_SITEURL', 'https://tudominio.es');
define('ADMIN_COOKIE_DOMAIN', 'tudominio.es');
Luego instala Hide My WP o un plugin equivalente que cambie la ruta de acceso al panel.
Establece límite de intentos de login. En el .htaccess, añade:
<IfModule mod_limit.c> <Limit GET POST> order allow,deny allow from all </Limit> </IfModule>
O usa el plugin Wordfence (versión gratuita) que incluye rate limiting nativo.
Hora 24-36: Refuerzo de configuración HTTP y CSP
Las cabeceras HTTP son tu escudo contra ataques cliente y exfiltración de datos. Muchos sitios las ignoran.
Implementa Content Security Policy (CSP). Añade a tu .htaccess o a wp-config.php (via plugin):
Header set Content-Security-Policy "default-src 'self'; script-src 'self' cdn.ejemplo.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; frame-ancestors 'none';"
CSP previene inyecciones de código malicioso (XSS) y exfiltración de datos vía CORS.
Añade HSTS (HTTP Strict Transport Security).
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Esto obliga a HTTPS permanente y previene downgrade attacks.
Protege contra clickjacking y MIME sniffing:
Header set X-Frame-Options "SAMEORIGIN" Header set X-Content-Type-Options "nosniff" Header set X-XSS-Protection "1; mode=block"
Desactiva la indexación de directorios. Si hay una carpeta sin index.php o index.html, los atacantes pueden explorar archivos:
<IfModule mod_autoindex.c> Options -Indexes </IfModule>
En PrestaShop, asegúrate de que admin/index.php esté protegido con IP whitelist en el .htaccess del directorio admin/:
<Files "index.php"> order deny,allow deny from all allow from 192.168.1.1 </Files>
(Sustituye la IP por la tuya o la de tu oficina.)
Hora 36-48: Monitoreo y verificación
Las últimas 12 horas son para verificar que todo funciona y configurar alertas.
Ejecuta un escaneo completo post-limpieza. Usa MalCare o Sucuri SiteCheck nuevamente. Debe salir completamente limpio. Si detecta malware residual, vuelve al paso de búsqueda de backdoors.
Configura logging y alertas. En WordPress, instala WP Security Audit Log o similar. Configura alertas por email para:
- Nuevos usuarios creados
- Cambios en plugins o temas
- Acceso a wp-admin desde IPs nuevas
- Errores 404 o 403 frecuentes (intentos de acceso a archivos protegidos)
Monitorea la base de datos. En phpMyAdmin, ejecuta una consulta para buscar inyecciones SQL residuales:
SELECT * FROM wp_posts WHERE post_content LIKE '%<iframe%' OR post_content LIKE '%eval%' OR post_content LIKE '%base64%';
Si encuentras algo, edita o elimina ese post.
Notifica a Google Search Console. Reporta que el sitio fue hackeado. Ve a Seguridad > Problemas de seguridad. Google puede tomar días en limpiar el index, pero es obligatorio informar.
Cumple con normativa AEPD si manejabas datos personales. Si almacenabas datos de clientes (emails, teléfonos, direcciones), debes reportar la brecha a la Autoridad de Protección de Datos. El plazo es máximo 72 horas desde que descubriste el incidente.
Checklist de 48 horas (para imprimir)
- ☐ Cambio de todas las credenciales (MySQL, SFTP, SSH, wp-admin, panel hosting)
- ☐ Búsqueda y eliminación de backdoors (archivos recientes, code review)
- ☐ Eliminación de plugins/temas desactualizados o sospechosos
- ☐ DISALLOW_FILE_EDIT y DISALLOW_FILE_MODS en wp-config.php
- ☐ Permisos corregidos (644 archivos, 755 directorios, 600 wp-config.php)
- ☐ Protección de wp-login.php y admin con rate limiting
- ☐ CSP, HSTS y cabeceras de seguridad en .htaccess
- ☐ 2FA activado en hosting y wp-admin
- ☐ Escaneo post-limpieza con Sucuri o MalCare
- ☐ Reporte a Google Search Console y AEPD (si corresponde)
¿Y después de 48 horas?
El blindaje inicial está hecho, pero esto no es permanente. Los atacantes evolucionan, y tu defensa debe también. Después de estos dos días, necesitas:
- Actualizaciones automáticas: Activa actualizaciones de seguridad automáticas en WordPress para core, plugins y temas.
- Backups diarios: Configura backups automáticos con UpdraftPlus o Backwpup que se almacenen fuera del servidor (AWS S3, Dropbox, Google Drive).
- Monitoreo 24/7: Usa Wordfence, MalCare o Sucuri (versión premium) para alertas en tiempo real.
- Auditoría trimestral: Cada tres meses, pide un análisis profesional. Mi equipo en ManuelFolgar.com lo hacemos rutinariamente a clientes recuperados.
Errores que NO debes cometer
No reinstales WordPress o PrestaShop sobre el sitio comprometido. Es tentador hacer table rasa, pero si un backdoor está en tu hosting o en credenciales compartidas, volverá a infectar.
No confíes en plugins «de limpieza automática». Algunos como WP Hacked Help prometen limpiar automáticamente. En mi experiencia, son lentos y dejan restos. Es mejor un análisis manual rápido que una falsa seguridad.
No publiques en redes que fuiste hackeado sin estar seguro de que está limpio. Los atacantes monitorean búsquedas sobre sus víctimas y pueden reinfectar si ven que están limpios pero vulnerables.
No olvides cambiar contraseñas de email asociadas. Si tu dominio está registrado con un email [email protected] y fue comprometido, un atacante puede resetear el dominio o certificados SSL. Cambia también esa contraseña.
En ManuelFolgar.com hemos visto sitios que, sin ayuda profesional, tardan 2-3 semanas en estar seguros. Con este plan de 48 horas, aceleramos significativamente. Pero si en algún momento sientes que el malware se resiste, que tu acceso está bloqueado o que no sabes identificar código malicioso, contáctame para una auditoría completa y limpieza profesional. Garantizo que en 48-72 horas tu sitio estará limpio, blindado y monitoreado.
El tiempo es tu aliado en un ciberataque. Actúa rápido, sigue este orden, y recuerda: la mejor defensa es que no te haqueen. Pero si ya pasó, que al menos sea una lección aprendida.