Cómo recuperar un WordPress hackeado

Publicada en WordPress.

¡Vaya! Sinceramente espero que estés leyendo esta entrada por curiosidad y por tus ganas de aprender. Si no es así, si has entrado en tu WordPress y has visto que ahí estaba ese horrible aviso indicándote que has sido hackeado… en fin, lo peor que le podía pasar a tu web (parece que) ha pasado. ¿Y ahora qué?

Lo primero que debes hacer es ponerte en contacto con tu proveedor de hosting (o la persona que te gestione la web). Si son un equipo medianamente decente (en otras palabras, si no fuiste muy tacaño a la hora de buscar dónde hospedar tu web), es posible que tengan una copia de seguridad bastante reciente de tu site, con lo que deberías poder restaurarlo rápidamente y tenerlo funcionando con normalidad con un par de clics. Si no tienes esa suerte, tendrás que ponerte manos a la obra y corregir el desaguisado que te han montado.

En la entrada de hoy voy a explicarte, paso a paso, qué hacer para recuperar tu WordPress y, aún más importante, para evitar que vuelva a suceder. Ya te advierto de que el camino no es sencillo, hay mucho trabajo por delante y, si no tienes ni idea de lo que estás haciendo, el remedio puede llegar a ser peor que la enfermedad*.

* Hay momentos en los que es mejor contratar los servicios de un WProfesional para que te solucione el problema y aceptar que, quizás, no eres el más indicado para solucionar el problema que tienes. Recuerda que ahora tu prioridad es (o debería ser) recuperar tu web lo antes posible; ya tendrás tiempo de aprender qué hay que hacer y cómo hacerlo en el futuro.

Cómo detectar que hemos sido hackeados

Si estás leyendo esta entrada por que quieres estar preparado de cara al peor escenario posible (¡bien por ti! 😀 me gusta que seas precavido), lo primero que debes tener en cuenta es que necesitarás poder detectar si tu web ha sido hackeada. Evidentemente, si no tienes ningún problema con tu WordPress, ¿para qué molestarse en repararlo, no?

Hazard! Freehand Nail Art de Neil Milne
Fotografía de Neil Milne.

En marzo de 2012, ZDNet nos decía que:

…más del 90% [de propietarios de webs infectadas] no habían detectado ninguna actividad extraña, a pesar de que su web estaba mandando spam, enlazaba páginas de phishing o distribuía malware.

Hay algunos indicadores que nos permiten identificar cuándo una web cualquiera ha sido hackeada:

  1. Aparecen popups que no hemos añadido nosotros.
  2. Aparecen textos raros en el pie de página.
  3. El contenido de nuestra web incluye enlaces sospechosos que estamos seguros de no haber añadido nosotros y que apuntan a páginas de extraña reputación.
  4. Si echamos un vistazo al código fuente (y estábamos familiarizados con el aspecto que debería tener una instalación limpia), vemos que aparecen scripts ofuscados cuyo origen desconocemos.
  5. Cuando accedemos a la web, ésta nos redirecciona enseguida (o al cabo de un ratito) a otra web.
  6. Vemos picos inusuales en el tráfico o uso de ancho de banda.

Por suerte, existen herramientas y plugins para WordPress que automatizan este proceso. Si tuviera que destacar un par de ellas, me quedaría con Google Webmaster Tools y Sucuri para WordPress.

Google Webmaster Tools

Google Webmaster Tools es un servicio de Google que nos ayuda a monitorizar y mantener un buen posicionamiento en los resultados de las búsquedas en Google. Para ello, nos da información sobre cualquier problema que los robots de indexación de Google tengan a la hora de acceder a nuestros contenidos. Una de las funcionalidades que incluye es la detección de software malicioso y software no deseado.

Otra de las funcionalidades que resulta especialmente útil para el caso que nos ocupa es el reenvío de mensajes al correo electrónico. Activando esta opción puedes estar relativamente tranquilo, puesto que recibirás un correo electrónico tan pronto como Google detecte que tu site ha sido infectado. Si este es el caso, y teniendo en cuenta que Google suele tener una tasa de acierto muy alta, es hora de ponerte en modo alerta roja y seguir los pasos que describimos hoy en esta entrada.

Tal y como puedes ver en el enlace anterior, para activar el envío de correos, simplemente:

  1. haz clic en el icono de rueda dentada que aparece en la página principal de Search Console,
  2. pulsa en Preferencias y, finalmente,
  3. en la opción Reenviar mensajes, selecciona la dirección de correo electrónico que quieras utilizar.

Sucuri para WordPress

Sucuri Security es un fantástico plugin de seguridad para WordPress. Su escáner de malware utiliza diferentes bases de datos (Google Safe Browsing, Norton Safe Web, SiteAdvisor…), así como sus propios criterios de búsqueda, para detectar elementos sospechosos en tu web. Simplemente instalando este plugin en nuestro WordPress, no sólo conseguiremos detectar cuándo hemos sido infectados, sino que también añadiremos una capa de protección extra que dificultará que la infección llegue a ocurrir.

Paso a paso: la receta de la recuperación

Fotografía de una receta, de Ginny
Con una receta que te explique los pasos a seguir, todo es más sencillo. Fotografía de Ginny.

Una vez hemos detectado y confirmado que nuestro WordPress ha sido infectado, es hora de ponerle remedio. A continuación tienes una receta que, con sólo 10 pasos, debería servirte para solucionar el follón que han montado en tu web. Básicamente, lo que haremos a continuación es:

  • Poner nuestro sitio offline.
  • Detectar hasta qué punto se ha corrompido nuestra web.
  • Trabajar en la solución.
  • Volver a poner nuestro WordPress online, pero ahora corregido y con un plus de seguridad que antes (probablemente) no teníamos.

Paso 1. Activa el modo mantenimiento

Antes que nada, tenemos que poner WordPress en modo mantenimiento. Esto te permitirá trabajar en la solución «tranquilamente» y, además, evitarás que tus usuarios se vean perjudicados. Ten en cuenta que es importante hacerlo correctamente; de no ser así, podríamos perjudicar nuestro SEO.

Para poner la web en modo mantenimiento, simplemente tenemos que configurar nuestro servidor para que devuelva el código HTTP 503 (servidor temporalmente fuera de servicio). Cuando un buscador se encuentra con este código, entiende que se trata de una situación temporal y no te penalizará. Para devolver el error, basta con crear/añadir un fichero llamado 503.php en la raíz de tu servidor web con las siguientes líneas:

<?php
header( 'HTTP/1.1 503 Service Temporarily Unavailable' );
header( 'Status: 503 Service Temporarily Unavailable' );
header( 'Retry-After: 3600' );
?><html>
  <head><title>P&aacute;gina en mantenimiento</title></head>
  <body>
    <h1>P&aacute;gina en mantenimiento</h1></h1>
    <h2>Pronto volveremos a estar online.</h2>
  </body>
</html>

y luego configura tu .htaccess para que todas las páginas de tu web sean redireccionadas (de forma temporal, con el código de redirección 302) a la página de mantenimiento:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{REMOTE_ADDR} !^00.00.00.00
RewriteCond %{REQUEST_URI} !^/503.php$ [NC]
RewriteRule .* /503.php [R=302,L]

Lo interesante de esta configuración es que, si conocemos nuestra IP pública, podemos dejar el sitio activo para nosotros y mostrar la página de mantenimiento a todos los demás usuarios. Por ejemplo, si tu IP pública es 88.88.123.456, puedes cambiar la cuarta línea y poner lo siguiente:

RewriteCond %{REMOTE_ADDR} !^88.88.123.456

Paso 2. Cambia todas las contraseñas

Vintage Bank Vault de Brook Ward
¡La seguridad ante todo! Fotografía de Brook Ward.

El siguiente paso es bastante sencillo, pero muy importante: ¡cambia todas las contraseñas! No olvidemos que hemos sido infectados, así que es de suponer que nuestro atacante tiene acceso a nuestro servidor. Como no sabemos exactamente a qué partes en concreto tiene acceso, hay que modificar todas las contraseñas y, así, cortarle el acceso de raíz:

  • Contraseñas de todos los usuarios admin de tu WordPress.
  • Contraseña de acceso al panel de control de tu servidor.
  • Contraseñas de los usuarios de FTP.
  • Contraseña de tu servidor de base de datos.

Recuerda que cambiar la contraseña de la base de datos requiere actualizar un fichero de configuración de tu WordPress. En concreto, tienes que acceder a wp-config.php, buscar la línea donde se define la contraseña de la base de datos define( 'DB_PASSWORD', 'contraseña-vieja' ) y cambiarla por la que acabamos de definir.

Paso 3. Realiza un backup de ficheros y carpetas

Por si aún no te ha quedado claro, las copias de seguridad son el único y verdadero salvavidas que tienes en el mundo digital. Ahora mismo estamos a punto de realizar una limpieza extrema de nuestro WordPress, puesto que hemos sido atacados y tenemos que eliminar toda la porquería que nos hayan metido. Pero como podemos equivocarnos durante el proceso y acabar borrando algo que no debíamos, lo primero que hay que hacer es una copia de seguridad de la web infectada. En caso de error, tendremos a mano el equivalente a un botón de «Deshacer».

Usando tu cliente de FTP favorito, baja los siguientes ficheros y directorios a tu ordenador:

  • /wp-content/. Es el directorio que incluye todos los ficheros de tus temas y plugins, todas las imágenes que hayas subido a tu WordPress, etc.
  • /wp-config.php. Configuración específica de tu WordPress (acceso a la base de datos, idioma, …).
  • /.htaccess. Fichero de configuración del servidor.
  • /.robots.txt. Información para los buscadores sobre qué y cómo indexar en tu web.
  • /favicon.icon. El icono que aparece en las pestañas asociado a tu web.

Estos ficheros son únicos en cada instalación de WordPress y, por ello, es importante que los conserves en un lugar seguro. Ten en cuenta que el proceso puede tardar bastante rato, dependiendo sobretodo de la velocidad de tu conexión a Internet, la velocidad de tu servidor y del volumen de ficheros (sobretodo, imágenes) que puedas tener en /wp-content/uploads/.

Paso 4. Realiza un backup de tu base de datos

Después de haber realizado la copia de tus ficheros (o mientras se hace, si va muy lento), lo más importante es disponer de una copia de seguridad de tu base de datos. Allí tienes todas tus páginas, tus entradas del blog, los comentarios, los usuarios… básicamente, todo el contenido que has creado está ahí metido, así que te interesa tenerlo también a buen recaudo, ¿no?

Existen varias fórmulas para realizar la copia de seguridad, pero la más habitual es usar phpMyAdmin. Básicamente, phpMyAdmin es una interfaz web que te permite gestionar tu base de datos; es decir, puedes ver tus tablas, sus contenidos, puedes realizar consultas SQL, puedes importar y exportar datos… Pues bien, con phpMyAdmin (que deberías tener disponible desde el panel de administración de tu proveedor de hosting) podrás realizar una copia de seguridad completa de tu WordPress.

Paso 5. Escanea ficheros y directorios en busca de malware

Antes de empezar a seguir la guía, te comentaba que hay que detectar las infecciones que se produzcan en nuestro site. Con herramientas como las que hemos visto puedes llegar a detectar qué ficheros contienen fragmentos de malware o indeseados y eliminarlos a mano.

En mi opinión, sin embargo, la mejor solución suele ser hacer borrón y cuenta nueva (que es lo que te explico en los próximos dos pasos). Esto sólo lo podrás hacer si dispones de una versión original no infectada de tu tema y tienes la posibilidad de descargarte de nuevo todos los plugins pero, insisto, si puedes hacerlo, tira por esta vía, porque es más rápido y más seguro.

Si te ves obligado a hacer la limpieza a mano, el proceso consiste básicamente en, como te decía, ir detectando qué ficheros han sido infectados y eliminar los enlaces, los scripts, etc. que sobren. También es posible que el atacante no solo haya modificado los ficheros existentes de WordPress, sino que también haya añadido ficheros nuevos. En ese caso, tendrás que detectarlos y borrarlos.

Buscaminas de Marines
Por suerte, buscar código malicioso no supone el mismo riesgo que buscar minas. Fotografía de Marines.

¿Qué cosas tienes que buscar y dónde? Pues, por desgracia, hay un montón de sitios y elementos que pueden haberse visto afectados. De hecho, siento decirte que tendrás que repasar todos* los ficheros y directorios de tu site (prestando especial atención a los que hemos salvado en el paso 3) y buscar:

  • Bloques de código ininteligibles (en plan %aa%bb/%aa/986/).
  • Busca iframes ocultos en las plantillas de tu tema.
  • Repasa los (¿últimos?) comentarios que se hayan añadido en tu blog, puesto que pueden haberte infectado aprovechando alguna vulnerabilidad por allí. En realidad, cualquier cosa que pueda haber sido introducida por un usuario a través de formularios, es susceptible de contener código malicioso, así que repásalo (por ejemplo, las entradas que generan plugins como Gravity Forms cuando un usuario completa un formulario cualquiera).
  • Repasa el fichero .htaccess y asegúrate que todas las reglas que contiene, o bien las has añadido tú, o bien las ha generado WordPress. Si no estás seguro de algo, investiga por Google e intenta determinar si es o no malicioso. En caso de duda, bórralo.

* La única cosa que puedes ahorrarte es repasar los ficheros propios de WordPress, puesto que, como veremos a continuación, vamos a reinstalarlo de cero.

Aunque es importante ser cuidadoso con lo que se hace, puesto que no te interesa borrar más de la cuenta, puedes estar tranquilo. Recuerda que en el paso 3 hemos realizado una copia de seguridad de los ficheros que tenías, así que si te equivocas en algo y al llegar al final del proceso descubres que algo que funcionaba ya no funciona, tienes toda la información disponible en esa copia de seguridad.

Paso 6. Instala una versión limpia de WordPress

Descarga la última versión estable de WordPress y descomprímela en tu servidor web. Si has echo borrón y cuenta nueva, tendrás un WordPress pelado sin ningún tipo de configuración, que habrá que ir completando y configurando con la información que tenemos en el backup. Si no es así, como mínimo habrás sobrescrito todos los ficheros de WordPress que pudieran estar corrompidos por una versión fresca y limpia.

Paso 7. Restaura los ficheros de tu instalación

A continuación tenemos que restaurar los ficheros específicos de nuestra instalación. Para ello, echaremos un vistazo a los ficheros que habíamos metido en la copia de seguridad del paso 3 y los recuperaremos todos, salvo, de momento, el directorio /wp-content/. A medida que vayas añadiendo estos ficheros ( wp-config.phprobots.txt, etc), los cuales hemos limpiado en el paso 5, iremos reconstruyendo nuestra web.

Lo único que nos queda llegados a este punto es asegurarnos de que tenemos el directorio /wp-content/ limpio y en condiciones. Este directorio contiene, como sabes, todos tus plugins, temas y ficheros de la librería de medios. En mi opinión, la mejor solución es reinstalar de cero todos los plugins y temas que usamos (eliminando así la posibilidad de que quede algún fichero infectado por allí) y repasar que no queda nada malicioso en /wp-content/uploads/.

Paso 8. Limpia la base de datos y elimina los administradores topo

Por fin vamos llegando al final de este arduo proceso. Si todo ha ido bien, en este momento deberías tener una instalación de WordPress totalmente limpia, con los ficheros base de WordPress, de tu tema y los plugins descargados de wordpress.org y con todo lo que fuera sospechoso eliminado para siempre de tu servidor. ¿Qué nos queda? Comprobar que tenemos la base de datos limpia y en buenas condiciones.

La mayoría de infecciones suelen afectar a los ficheros de tu instalación, con lo cual los problemas deberían estar ya resueltos a estas alturas. Sin embargo, es posible que haya contenido infectado en nuestra base de datos. En el paso 5 ya te he explicado que una de las cosas a repasar es la información generada por usuarios; es decir, comentarios o envíos de formulario. Esta información se almacena en tu base de datos, así que no estaría de más que buscases contenido malicioso en, como mínimo, las tablas wp_contentwp_options y wp_posts.

Otra cosa que es importante es eliminar los administradores topo. Para ello, comprueba qué usuarios hay registrados en tu WordPress y cuáles de ellos tienen permisos de administración. Cabe la posibilidad que alguno de ellos haya sido creado durante la infección, así que te conviene eliminarlo. Este proceso es, también, manual, pero como no deberías tener demasiados usuarios admin, tampoco debería llevarte mucho tiempo… 😉

Paso 9. Cambia de proveedor de hosting

Si has tenido que realizar todos los pasos previos hasta llegar aquí es porque, probablemente, no tenías ninguna copia de seguridad de tu web. A día de hoy, esto es imperdonable (ya lo hemos dicho muchas veces), especialmente si tenemos en cuenta que cualquier proveedor de hosting o agencia web con cara y ojos debería estar haciéndolos por ti.

Así pues, busca un proveedor que incluya copias de seguridad diarias y que te permita crear otras cuando tú quieras (por ejemplo, justo antes de instalar un nuevo plugin o tema). Hay otros factores que pueden ser relevantes, tales como priorizar la seguridad del site u ofrecer entornos de producción y desarrollo, pero como mínimo deberían garantizarte que en caso de desastre, podrías recuperar tu web en unos pocos minutos.

Paso 10. Activa de nuevo tu web

Finalmente, sólo nos queda volver a publicar la web. Para ello, sólo tendrás que eliminar el código que hemos añadido en el fichero .htaccess en el paso 2 y eliminar el fichero 503.php. Comprueba que el site funciona correctamente y manda a través de las Google Webmaster Tools una petición a Google para que escanee tu web de nuevo y elimine el aviso de sitio infectado.

Finalmente, y por si acaso, vuelve a cambiar las contraseñas y las claves de autentificación de tu web. Puede parecer un paso redundante, pero no olvidemos que mientras has estado corrigiendo tu site (con las contraseñas nuevas del paso 2), éste todavía estaba infectado, así que ahora que está limpio es un buen momento para poner otras contraseñas y asegurarnos que nadie tiene acceso.

Cómo evitar que vuelva a ocurrir

Freedom de Josef Grunig
Cuando todo está bajo control es el momento de sentirse libre y respirar tranquilo. Fotografía de Josef Grunig.

En una entrada anterior hablamos de cómo aumentar la seguridad de nuestro WordPress. Allí te explicaba la importancia de usar contraseñas seguras y de cambiarlas con regularidad, por qué implementar algunos mecanismos de seguridad adicionales tales como la limitación del número de intentos de login o las ventajas de estar siempre actualizado.

Recuerda estar siempre actualizado

Normalmente, la mayoría de las infecciones se producen cuando el atacante se aprovecha de alguna vulnerabilidad del código. Ningún código es 100% seguro, pero la comunidad de WordPress trabaja muy duro para que, cuando aparece un problema, éste se corrija rápidamente y las webs se puedan actualizar antes de que alguien explote la vulnerabilidad detectada.

Como te puedes imaginar, de poco sirve ese trabajo si nosotros, los usuarios, no prestamos atención a las actualizaciones de seguridad que salen. Intenta estar siempre a la última y no uses código viejo y obsoleto. Y, por supuesto, siempre que descargues cualquier cosa, hazlo desde las fuente oficiales; no comprometas la seguridad y fiabilidad de tu site descargando contenido de redes P2P o páginas de software pirata, porque, créeme, las consecuencias que puede tener valen mucho más que los cuatro euros que te ahorras.

Haz Automatiza la creación de copias de seguridad

Supongo que ya te ha quedado claro, pero lo diré una vez más hoy. ¡Ten copias de seguridad de tu web! Si puede ser, no asumas la responsabilidad de realizarlas tú a mano; busca la manera de que se creen automáticamente cada día a una cierta hora y ten copias de seguridad diarias. Si tienes mucho volumen de tráfico, plantéate hacerlas cada 12 horas, o cada 6, o cada 3. Insisto, las copias de seguridad nunca están de más. Todo el trabajo que has tenido que realizar hoy se hubiese podido solucionar en tres pasos si hubieras tenido una copia reciente en condiciones:

  1. Restauras la última copia de seguridad disponible (y no infectada, claro).
  2. Actualizas todo el software para eliminar la vulnerabilidad de la que se ha aprovechado tu atacante.
  3. Cambias todas las contraseñas y claves para evitar que si alguien se ha hecho con ellas durante el período de infección pueda volver a entrar.

¡Y ya está! Rápido y sencillo.

Y, ahora, respira tranquilo…

Espero que te haya gustado pero, sobretodo, espero que nunca tengas que utilizar esta guía. También confío en que ahora estés más convencido que nunca sobre la importancia de implementar medidas de seguridad más duras y, especialmente, de la utilidad de las copias de seguridad.

Si te han atacado alguna vez… ahora es el momento de compartir tu experiencia y explicarnos hasta qué punto sufriste 😉

Imagen destacada de la Universidad de Michigan (School of Natural Resources & Environment)

FlojaNo está malBienMuy bien¡Impecable! (Ninguna valoración todavía)
Cargando…

4 comentarios en «Cómo recuperar un WordPress hackeado»

  1. Magnífico artículo. Soy de los que ha entrado por curiosidad, pero creo que el artículo es de mucha utilidad, por lo que paso a compartirlo de inmediato.

    Enhorabuena de nuevo.

  2. Hola.

    Yo hasta el paso 6 llego perfectamente (tenía copia de la B.D. y de los ficheros), pero una vez que subo wp-includes (que sobreescribe ficheros de la copia nueva de wordpress), wordpress deja de funcionar. No puedo acceder al dashboard.

    Es una copia antigua de wordpress 3.5.2 que quiero restaurar y luego actualizar.

    Se te ocurre algo.
    Gracias

    1. Hola David,

      Si tienes una copia de la base de datos, yo intentaría empezar con una instalación «limpia» de WordPress 3.5.2. Es decir, borraría la base de datos (de la cual, insisto, tenemos un backup) y empezaría de 0 para asegurarme de que todo funciona correctamente. Una vez hayas verificado que la instalación limpia funciona (si no lo hiciera, ponte en contacto con tu proveedor de hosting y pregúntales qué está pasando), es hora de ir recuperando la información poco a poco. Puedes seguir los pasos de Antonio para realizar una migración:

      Restaurar usuarios
      Restaurar entradas
      Restaurar comentarios
      etc.

      Es un proceso bastante lento, pero no se me ocurre ninguna otra idea.

      ¡Ya nos irás informando sobre tus progresos!

      Un saludo,
      David

Deja un comentario

No publicaremos tu correo electrónico. Los campos obligatorios están marcados con: •

He leído y acepto la Política de privacidad de Nelio Software

Al marcar la casilla de aceptación estás dando tu legítimo consentimiento para que tu información personal se almacene en SiteGround y sea usada por Nelio Software con el propósito único de publicar aquí este comentario. Contáctanos para corregir, limitar, eliminar o acceder a tu información.