Me hackean, y la pelea fue de larga duración, pero se logro!

Latest Comments

No hay comentarios para mostrar.

Era un viernes cualquiera, a punto de terminar la jornada laboral. Entré al portal web donde trabajo, como hacía cada día, pero algo andaba mal. En la parte inferior de la página comenzaron a aparecer enlaces extraños, textos con palabras sin sentido y publicidad que no pertenecían a nuestro sitio.

Al principio pensé que podría ser un error de caché o algún plugin que se había actualizado mal. Pero al recargar, los enlaces seguían ahí. Peor aún, al revisar la base de datos descubrí un registro que se regeneraba solo cada vez que lo borraba.

No había duda: nos habían hackeado.

Lo que siguió fue una lucha contracorriente para limpiar archivos, rastrear backdoors y entender cómo un simple código malicioso podía esconderse tan profundo, infectando la base de datos y el FTP al mismo tiempo. Este artículo es el registro paso a paso de esa batalla y de cómo logramos recuperar el control del sitio.

1. Síntomas iniciales

  • Aparecía texto con enlaces de spam (ej. damabetyakabet, etc.) en la parte inferior del sitio.
  • Se generaba un registro en la tabla wp_options llamado _transient_wp_social_sm_bar_inline con código CSS malicioso.
  • Al borrar el registro, reaparecía al activar cualquier plugin, indicando un mecanismo de reinfección persistente.

2. Diagnóstico del mecanismo de reinfección

  • Se descartaron lugares comunes: mu-plugins (no existía), wp-config.php (limpio), .htaccess (se limpiaron reglas sospechosas que redirigían bots a readme.php).
  • Se encontró que el malware se regeneraba porque existían backdoors ocultos en archivos del sistema.

3. Búsqueda sistemática de backdoors (vía SSH)

  • Se utilizaron comandos grep para buscar patrones maliciosos:bashgrep -rl –include=”*.php” “wp_set_auth_cookie” /home/la2/ grep -rl –include=”*.php” “eval(base64_decode” /home/la2/
  • Se identificaron los siguientes archivos infectados:
    • /home/la2/sitemap.php (backdoor que permitía iniciar sesión como administrador sin contraseña)
    • /home/la2/wp-links-opml.php (contenía código eval(base64_decode(...)))
    • /home/la2/wp-content/plugins/shortcodes-for-divi.php (plugin falso con el mismo código ofuscado)

4. Limpieza de los archivos maliciosos

  • sitemap.php y wp-links-opml.php se eliminaron por completo (vía FTP o SSH).
  • shortcodes-for-divi.php no se pudo eliminar por permisos del sistema, por lo que se editó el archivo y se borró únicamente la línea que contenía eval(base64_decode("ZXZhb...")).

5. Limpieza de la base de datos

  • Se eliminó el registro persistente en wp_options:sqlDELETE FROM wp_options WHERE option_name = ‘_transient_wp_social_sm_bar_inline’;
  • Se verificó que no quedaran otras opciones maliciosas (ej. _hdra_core).

6. Verificación final

  • Se reactivaron todos los plugins.
  • Se recargó el sitio y se comprobó que el texto de spam no volvió a aparecer.
  • Se confirmó que el registro en la base de datos no se regeneró.

7. Medidas de seguridad posteriores (recomendadas)

  • Cambiar todas las contraseñas: hosting, FTP, base de datos, usuarios WordPress.
  • Actualizar WordPress, temas y plugins a sus últimas versiones.
  • Eliminar temas y plugins no utilizados.
  • Instalar un firewall y escáner de seguridad (Wordfence o Sucuri).
  • Configurar copias de seguridad automáticas diarias.

Análisis Técnico del Caso

Basado en las imágenes y en la descripción, esto es lo que descubrí:

  1. Naturaleza del Malware: Es un código malicioso persistente que utiliza la tabla wp_options de tu base de datos para almacenar e inyectar publicidad y enlaces de spam (como los que muestran las imágenes) en tu sitio web . No es un simple archivo, sino un sistema complejo.
  2. Mecanismo de Reinfección: El hecho de que el registro en la base de datos se regenere automáticamente después de que lo borras, especialmente cuando activas los plugins, es la clave del problema.
    • Lo más probable es que uno de tus plugins (o tu tema) tenga una puerta trasera (backdoor). Al activar los plugins, el código malicioso se ejecuta, detecta que el registro en la base de datos no existe y lo vuelve a crear inmediatamente .
    • También es muy posible que haya un script oculto en los archivos principales de WordPress, como wp-cron.php, que se ejecuta periódicamente para verificar y restaurar el malware . Las imágenes de tu phpMyAdmin también confirman que el código inyectado se aloja directamente en la base de datos, una técnica común para persistir .

Guía de Limpieza Paso a Paso

Necesitamos un enfoque más agresivo. Sigue estos pasos en orden. Es importante que seas meticuloso.

Paso 1: Coloco el sitio en modo mantenimiento

Use el plugin como “WP Maintenance Mode” o añade un archivo .html temporal para que los visitantes vean un aviso mientras limpias. Esto evita que el malware se propague o que los usuarios vean contenido malicioso.

Paso 2: La “Limpieza Profunda” desde el hosting (Método más efectivo)

Olvídate del escritorio de WordPress por ahora. Conéctate directamente a tu hosting vía cPanel o FTP.

  1. Renombra la carpeta plugins: Dentro de wp-content, renombra la carpeta plugins a plugins_old. Esto desactivará todos los plugins de golpe.
  2. Cambia las contraseñas de todo: Usa un gestor de contraseñas para crear claves nuevas y robustas para:
    • Tu usuario administrador de WordPress.
    • Tu base de datos (usuario y contraseña).
    • Tu cuenta de FTP y la de acceso al panel de hosting (cPanel).
  3. Reemplaza los archivos centrales de WordPress:
    • Descarga una copia nueva y limpia de WordPress desde wordpress.org.
    • Elimina las carpetas wp-admin y wp-includes de tu servidor.
    • Sube las carpetas wp-admin y wp-includes de la copia limpia que descargaste.
    • Reemplaza todos los archivos de la raíz de WordPress (excepto wp-config.php y la carpeta wp-content). Esto eliminará cualquier backdoor en los archivos del núcleo .
  4. Inspecciona wp-config.php: Ábrelo y busca cualquier línea sospechosa al principio o al final, especialmente código PHP extraño o peticiones a sitios web externos.

Paso 3: Limpieza radical de la base de datos (Usa phpMyAdmin)

Entra al phpMyAdmin de tu hosting y selecciona la base de datos de tu WordPress.

  1. Localiza el registro malicioso: Ve a la tabla wp_options (o el prefijo que uses).
  2. Borra el registro transient_wp_social_sm_bar_inline que viste en la captura. Pero no te detengas ahí.
  3. Busca más basura:
    • Ejecuta esta consulta SQL en la pestaña “SQL” para buscar otros “transients” maliciosos que puedan tener nombres similares:
    • Busca manualmente cualquier option_name que contenga URLs extrañas o nombres como _hdra_corewp-antymalwarycron_cleanup, etc. Si encuentras algo que no reconoces y parece código, bórralo .
    • Revisa la tabla wp_posts: Busca en la columna post_content entradas que contengan código iframe o scripts maliciosos. A veces el malware crea páginas ocultas.

Paso 4: Caza el archivo “zombie” (El que regenera todo)

Este es el paso más importante. El malware necesita un archivo para regenerarse. Los lugares más comunes son:

  • Carpeta wp-content/mu-plugins: Revisa si existe y si contiene algún archivo .php extraño. Los “Must-Use Plugins” no se ven en el escritorio y son muy usados por los hackers .
  • Carpeta wp-content/uploads: Busca archivos .php aquí. No deberían existir. Revisa especialmente dentro de carpetas con años (ej. 2023/2024/).
  • Archivo wp-cron.php de la raíz: Descarga una copia limpia de WordPress y compara el archivo wp-cron.php que tienes en tu servidor con el original. Es probable que esté modificado .
  • Carpeta wp-includes: Busca archivos con nombres que imiten a los legítimos pero que sean maliciosos, como class-wp-change.php o wp-user.php .

Pro-tip: Usa el administrador de archivos de tu hosting y ordena los archivos por fecha. Los archivos maliciosos suelen ser los más recientes.

Paso 5: Un truco para detener la reinfección (Mientras limpias)

Si identificas el nombre de la carpeta del plugin malicioso que se recrea (por ejemplo, wp-antymalwary-bot), puedes usar el “truco del archivo vacío” para bloquearlo temporalmente :

  1. Ve a la carpeta wp-content/plugins/.
  2. Crea un archivo vacío (no una carpeta) con el mismo nombre exacto que la carpeta del malware.
  3. Usa el gestor de archivos para cambiar los permisos de ese archivo a 000. Esto hará que el script malicioso no pueda crear la carpeta y falle su intento de reinfección.

Después de la limpieza: Prevención

  • Actualiza todo: WordPress, cada uno de tus plugins y tu tema a la última versión.
  • Elimina lo que no uses: Borra cualquier plugin o tema inactivo que tengas.
  • Instala un firewall: Usa un plugin de seguridad como Wordfence o Sucuri, y mantenlo activo y actualizado.
  • Cambia tus hábitos: No uses “admin” como usuario y activa la autenticación de dos factores (2FA) si es posible.

Pasamos a revisar el archivo .htaccess el cual tenia componentes extraños, los cuales se eliminaron:

Lo que es MALICIOSO (lo que está después)
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider|google|msnbot|yahoo) [NC]
RewriteRule ^.*$ readme.php [L]

¿Qué hace este código malicioso?

  1. Detecta a los motores de búsqueda: La condición %{HTTP_USER_AGENT} revisa si quien visita el sitio es un “bot” o “spider” de Google, Yahoo, etc.
  2. Redirige a los bots a readme.php: En lugar de mostrar tu página normal, cuando un motor de búsqueda (Google, Bing, etc.) intenta indexar tu sitio, es redirigido a un archivo llamado readme.php.
  3. El propósito: Este readme.php (que probablemente también existe en tu servidor) contiene código malicioso que se ejecuta cuando los bots lo visitan. Esto puede servir para:
    • Hacer que Google indexe versiones con spam de tu sitio.
    • Mostrar contenido diferente a los bots (cloaking).
    • Mantener activo el malware.

Activar plugins uno por uno (El detective)

Este es el paso más importante. Vas a activar tus plugins de uno en uno hasta que el malware reaparezca.

¿Cómo hacerlo?

  1. Activa UN SOLO plugin (elige uno, preferiblemente el que no sea esencial o el más sospechoso).
  2. Revisa si el malware volvió:
    • Abre tu sitio web en una ventana de incógnito (Ctrl+Shift+N).
    • Busca en la parte inferior si aparecen los enlaces de spam.
    • También revisa en phpMyAdmin la tabla wp_options buscando el registro transient_wp_social_sm_bar_inline.
  3. Si no hay malware: desactiva ese plugin y pasa al siguiente.
  4. Si aparece malware: ¡lo encontraste! Anota el nombre del plugin y no lo actives más.

¿En qué orden activar?

Te sugiero este orden (de más a menos sospechoso):

  1. Plugins de redes sociales (por el nombre wp_social_sm_bar_inline)
  2. Plugins de caché o rendimiento
  3. Plugins que no reconoces o que instalaste de fuentes no oficiales
  4. Plugins gratuitos de repositorios externos
  5. Plugins oficiales y conocidos (dejando los más confiables para el final)

Importante: Si al activar un plugin el malware reaparece, no lo desactives todavía. Anótalo y luego lo eliminamos.

Una vez identificado el plugin malicioso

Cuando encuentres qué plugin está generando el malware:

Opción A: Si es un plugin legítimo pero vulnerado

  • Elimínalo completamente (no solo desactivar, bórralo de wp-content/plugins).
  • Descarga una versión limpia y actualizada desde el repositorio oficial de WordPress o desde la página del desarrollador.
  • Instala la versión limpia.
  • Verifica que el malware no reaparezca.

Opción B: Si es un plugin pirata, desconocido o sospechoso

  • Elimínalo y no lo vuelvas a usar.
  • Busca una alternativa segura y confiable.

Limpieza profunda de la base de datos

Incluso después de eliminar el plugin, pueden quedar residuos. Ve a phpMyAdmin y ejecuta estas consultas SQL (una por una):

sql

-- Buscar opciones transients maliciosas
DELETE FROM wp_options WHERE option_name LIKE '%_transient%wp_social%';

-- Buscar opciones que contengan código ofuscado
DELETE FROM wp_options WHERE option_value LIKE '%base64_decode%' AND option_value LIKE '%eval%';

-- Buscar opciones con enlaces sospechosos (cambia el dominio por el tuyo)
DELETE FROM wp_options WHERE option_value LIKE '%librarylea.com%' OR option_value LIKE '%evoldrone.com%' OR option_value LIKE '%leasun.com%';

-- Limpiar transients expirados (seguro de hacer)
DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_value LIKE '%a:0:%';

Precaución: Si no estás seguro, haz una copia de seguridad de la base de datos antes de ejecutar estas consultas.

Revisar archivos del tema (especialmente si usas Divi)

Como usas Divi, revisa estos lugares:

4.1 Funciones del tema

  • Ve a wp-content/themes/Divi/functions.php
  • Busca al final del archivo código extraño (especialmente después del ?> final, si es que existe).
  • Busca funciones como add_action('wp_head' o add_action('wp_footer' que llamen a URLs externas.

4.2 Tema hijo (si usas uno)

  • Si tienes un tema hijo de Divi, revisa su functions.php también.

4.3 Carpeta de opciones de Divi

  • A veces el malware se esconde en wp-content/uploads/et_temp/ o en wp-content/uploads/divi/
  • Revisa si hay archivos .php en esas carpetas (no deberían existir).

Medidas finales de seguridad

Una vez que el sitio esté limpio y funcionando:

5.1 Cambia todas las contraseñas

  • WordPress (todos los usuarios administradores)
  • Base de datos
  • FTP
  • Panel de hosting (cPanel, Plesk, etc.)

5.2 Instala un firewall y escáner de seguridad

  • Wordfence o Sucuri Security (versión gratuita es suficiente)
  • Ejecuta un escaneo completo

5.3 Actualiza todo

  • WordPress a la última versión
  • Todos los plugins
  • El tema Divi

5.4 Elimina lo que no uses

  • Plugins inactivos
  • Temas que no estés usando (excepto el tema por defecto de WordPress como fallback)

5.5 Configura copias de seguridad automáticas

  • Usa UpdraftPlus o el sistema de backup de tu hosting
  • Programa copias diarias o semanales


Resumen de tu plan de acción ahora mismo
PasoEstadoAcción
.htaccess limpio✅ COMPLETADO
readme.php eliminado✅ COMPLETADO

La Limpieza Quirúrgica de la Base de Datos

Entra a phpMyAdmin. IMPORTANTE: Antes de hacer esto, exporta una copia de seguridad de tu base de datos.

Ejecuta esta consulta SQL (copia y pégala en la pestaña “SQL”) para buscar los “nombres fantasma” en la tabla wp_options:

sql

SELECT * FROM `wp_options` WHERE `option_name` REGEXP '^[0-9a-f]{32}$' AND `option_value` LIKE '%base64%'

¿Qué hace esto? Busca registros cuyo option_name sea un código de 32 caracteres (como un hash) y cuyo contenido esté ofuscado .

  • Si la consulta devuelve resultados: Anota los option_name y luego elimina esos registros.
  • Si no devuelve resultados: Busca manualmente cualquier option_name que sea una cadena larga y sin sentido, o que contenga _hdra_core .

Buscar solo archivos que contengan código malicioso conocido

Ejecuta este comando en SSH:

bash

grep -rl --include="*.php" "wp_set_auth_cookie" /home/XX

¿Qué hace? Busca recursivamente todos los archivos PHP que contengan la función wp_set_auth_cookie, que es la que usaba el backdoor sitemap.php para iniciar sesión sin contraseña.

Si el comando devuelve resultados, copia la lista de archivos aquí.

Si no devuelve nada, ejecuta este otro:

bash

grep -rl --include="*.php" "eval(base64_decode" /home/XX

La maldita cadena, estaba ocultada en estos archivos:

eval(base64_decode(“ZXZhbChnemluZmxhdGUoYmFzZTY0X……)

¿Qué es exactamente este código?

Es un “cargador” (loader) malicioso que funciona así:

  1. Primera capaeval(base64_decode(...)) → Ejecuta código PHP ofuscado.
  2. Segunda capa: Dentro hay gzinfalate() → Descomprime datos comprimidos.
  3. Tercera capa: Más base64_decode → Revela el código malicioso real.

Lo que hace este código es crear y mantener activo el malware en tu sitio, incluyendo el registro transient_wp_social_sm_bar_inline que has estado eliminando.

Búsqueda con Comandos (La Opción Más Certera)

Si tienes acceso a la terminal de tu servidor (vía SSH), esta es la forma más rápida y efectiva de encontrar código malicioso. Si no, no te preocupes, pasaremos a la búsqueda manual.

Conéctate a la raíz de tu WordPress y ejecuta estos comandos en este orden:

  1. Buscar archivos maliciosos recientes: Esto te mostrará cualquier archivo que se haya creado o modificado en los últimos 7 días, un periodo muy sospechoso.bashfind . -type f -mtime -7Analicemos: Te dará una lista. Revisa cada ruta. Presta especial atención a archivos .php en ubicaciones inesperadas como wp-content/uploads/ o archivos con nombres extraños. Si ves algo que no reconoces, puede ser el backdoor.
  2. Buscar dentro de los archivos: Ahora buscaremos el “código madre” dentro de los archivos.bashgrep -r “transient_wp_social_sm_bar_inline” .Analicemos: Este comando busca el nombre exacto del registro que se regenera. El archivo que contiene esta línea podría ser el que lo escribe en la base de datos.
  3. Buscar funciones peligrosas comunes: Los hackers suelen usar funciones PHP específicas para ocultar su código. Ejecuta estos comandos uno tras otro.bashgrep -r “eval(” . grep -r “base64_decode” . grep -r “gzuncompress” . grep -r “str_rot13” .Analicemos: Te mostrarán todos los archivos que contienen estas funciones. Sabemos que ya tenías una línea con eval(base64_decode(...)), así que esto te ayudará a encontrar si hay más código similar escondido en otros lugares.

Limpieza final de la base de datos

Después de eliminar el archivo malicioso, haz esto:

  1. Borra el registro transient_wp_social_sm_bar_inline de wp_options (como ya has hecho).
  2. Ejecuta esta consulta SQL para buscar otros posibles residuos:sqlDELETE FROM wp_options WHERE option_value LIKE ‘%librarylea.com%’ OR option_value LIKE ‘%evoldrone.com%’ OR option_value LIKE ‘%leasun.com%’;

Conclusión

El malware utilizaba múltiples backdoors (especialmente en archivos de los plugin) que se ejecutaban al activar cualquier plugin, regenerando el código en la base de datos. Al eliminar esos archivos (o limpiar su contenido ofuscado) y borrar el registro persistente, el problema se resolvió definitivamente.

¿Por Dónde Es Más Probable que Entraron?

El ataque que viviste fue complejo y persistente, lo que apunta a un punto de entrada sólido. Los vectores más comunes para este tipo de infección suelen ser:

  • Vulnerabilidades en Plugins o Temas (la causa más probable): Esta es, con diferencia, la puerta de entrada más común en este tipo de ataques. Los hackers buscan de forma activa y masiva vulnerabilidades conocidas en plugins y temas populares. Un plugin o tema desactualizado es un blanco perfecto. En tu caso, infectaron archivos de plugins legítimos como shortcodes-for-divi.php (que es un nombre falso) y otros, lo que es una práctica habitual. La magnitud del ataque, con sus mecanismos de reinfección, también apunta a una vulnerabilidad crítica, como las que permiten la ejecución remota de código (RCE) sin necesidad de autenticarse.
  • Credenciales de Acceso Comprometidas: Otra posibilidad es que el atacante obtuviera tus credenciales de FTP, SFTP, el panel de control de hosting o un usuario administrador de WordPress. Con este acceso, pudieron subir los archivos maliciosos sitemap.php y shortcodes-for-divi.php directamente. Esto pudo deberse a un ataque de fuerza bruta, phishing o a que usaras una contraseña débil o reutilizada.
  • Infección a Través de un Plugin Legítimo Comprometido: En los últimos años, ha habido incidentes en los que atacantes lograron inyectar código malicioso directamente en plugins alojados en el repositorio oficial de WordPress. Si instalaste o actualizaste un plugin durante un período en el que estuvo comprometido, es posible que la infección viniera de una fuente “oficial” sin que tú lo supieras.

Blindaje Post-Infección (Pasos Clave)

Independientemente de por dónde entraron, estos son los pasos OBLIGATORIOS para blindar tu sitio ahora:

  1. Contraseñas nuevas y robustas: Cámbialas todas: la de tu base de datos, la de tu cuenta de hosting/FTP, la de cualquier usuario con rol de administrador y la de los editores clave.
  2. Actualización forzosa: Actualiza WordPress, todos los plugins y todos los temas. Deshazte de los que no uses.
  3. Capa extra de seguridad: Firewall y 2FA: Es fundamental que instales un plugin de seguridad como Wordfence o Sucuri y habilites la autenticación de dos factores (2FA) para todos los usuarios con privilegios.
  4. Monitoreo y copias de seguridad: Configura copias de seguridad automáticas diarias (externas a tu servidor) y activa el monitoreo de integridad de archivos que ofrecen estos plugins de seguridad. Así te avisarán si algo vuelve a cambiar sin tu permiso.

Comments are closed